今天弄了一下以前买的超声波测距的模块,51 单片机接上12864 液晶,HC-SR04 超声波模块,就可以了,贴个程序吧 源程序: /******************************************************************************/ /* Name: LCD12864(St7920/St7921)+超声波测距模块+STC89C52 */ /* HC-SR04 超声波测距模块 DEMO 程序 */ /* 晶振:11.0592M */ /* 接线:模块TRIG接 P1.2 ECH0 接P1.1 */ /* RS(CS) 接 P3.3; */ /* RW(SID) 接 P3.4; */ /* E(SCLK) 接 P3.5; */ /* PSB 接 GND 串行模式 */ /******************************************************************************/ #include //引脚定义 ***it RX = P1 ^ 1; ***it TX = P1 ^ 2; ***it CS = P3 ^ 3; //片选 高电平有效 单片LCD使用时可固定高电平 ***it SID = P3 ^ 4; //数据 ***it SCLK = P3 ^ 5; //时钟 //Func tion Definition 函数声明 void Delay(int num); void Init_DS18B20(void); unsigned char ReadOneChar(void); void WriteOneChar(unsigned char dat); unsigned int ReadTemperature(void); void clock_out(unsigned char dd); unsigned char clock_in(void); unsigned char read_clock(unsigned charord); void write_clock(unsigned char ord,unsigned char dd); void Disp(void); void id_case1_key(void); void id_case2_key(void); void Set_time(unsigned char sel,bitsel_1); void Timer0_Init(void); void Init_1302(void); void Set_Bell(unsigned char sel, bitsel_1); void Bell(void); //12864 void Write_char(bit start, unsigned charddata); void Send_byte(unsigned char bbyte); void Delaynms(unsigned int di); void Lcd_init(void); void Disp_img(unsigned char *img); void LCD_Write_string(unsigned charX,unsigned char Y,unsigned char *s); void LCD_set_xy( unsigned char x,unsigned char y ); unsigned char codenum[]={"0123456789 :.-"}; unsigned char code waves[]={"超声波测距系统"}; unsigned char code znwk[] ={"智能微控工作室"}; unsigned char code CM[] = {"M"}; unsigned int time=0; longS=0; bit flag =0; unsigned char di***uff[4] ={ 0,0,0,0,}; unsigned char code logo[]={ /*-- 调入了一幅图像:logo.bmp -- */ /*-- 宽度x高度=128x64 欢迎使用本产品LOGO --*/ /*-- 调入了一幅图像:C:Documents and Settingslwd桌面新建文件夹X.bmp --*/ /*-- 宽度x高度=128x64 --*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xE0,0x00,0x00,0x0C,0x00,0x00,0x40,0x70,0x00,0x00,0x00,0x80,0x00, 0x00,0x00,0x00,0xE0,0x00,0x00,0x1E,0x00,0x00,0x60,0x70,0x00,0x00,0x0F,0xE0,0x00, 0x00,0x00,0x01,0xC0,0x00,0x60,0x3C,0x00,0x00,0xE0,0x60,0x00,0x1F,0xFF,0xE0,0x00, 0x00,0x00,0x03,0x80,0x00,0x70,0x70,0x40,0x00,0xE0,0x7E,0x00,0x1F,0xE0,0xC0,0x00, 0x00,0x00,0x03,0x00,0x00,0x73,0xC3,0xF0,0x01,0xC3,0xFC,0x00,0x38,0xE1,0xC0,0x00, 0x00,0x03,0xC6,0x3C,0x00,0x33,0x9F,0xF0,0x03,0x8F,0xC0,0x00,0x30,0xC1,0xC0,0x00, 0x00,0x3F,0xEF,0xFE,0x00,0x03,0x1C,0xE0,0x07,0x01,0xCC,0x00,0x31,0xF1,0x80,0x00, 0x00,0x79,0xDF,0xBC,0x00,0x06,0x18,0xC0,0x0E,0x01,0xFE,0x00,0x77,0xF9,0x80,0x00, 0x00,0x01,0xB0,0x30,0x01,0xC6,0x19,0xC0,0x1E,0x7F,0xDE,0x00,0x6F,0x83,0x80,0x00, 0x00,0x23,0xAC,0x60,0x0F,0xE6,0xF1,0x80,0x3E,0x7B,0x38,0x00,0x61,0x83,0x00,0x00, 0x00,0x37,0x0E,0x00,0x0F,0xC7,0xB7,0x80,0xEC,0x63,0x30,0x00,0xE3,0x03,0x00,0x00, 0x00,0x3E,0x0E,0x00,0x01,0x8F,0x37,0x01,0xCC,0x6F,0xF0,0x00,0xC7,0xF7,0x00,0x00, 0x00,0x1E,0x0C,0x00,0x03,0x1E,0x66,0x03,0x0C,0x7F,0x00,0x01,0xFF,0xE6,0x00,0x00, 0x00,0x1E,0x1C,0x00,0x03,0x1C,0x60,0x02,0x19,0xAC,0x00,0x01,0x96,0x06,0x00,0x00, 0x00,0x3E,0x3E,0x00,0x03,0x18,0x60,0x00,0x19,0xFC,0x00,0x03,0x86,0x0E,0x00,0x00, 0x00,0x7E,0x36,0x00,0x03,0x00,0xC0,0x00,0x38,0x78,0x00,0x03,0x06,0x0C,0x00,0x00, 0x00,0xE6,0x67,0x00,0x03,0x00,0xC0,0x00,0x30,0x78,0x00,0x06,0x0C,0x0C,0x00,0x00, 0x01,0xC6,0xC3,0x80,0x7F,0xF0,0xC0,0x00,0x30,0xFE,0x00,0x0E,0x0C,0x1C,0x00,0x00, 0x03,0x81,0x83,0xC0,0x78,0xFF,0x80,0x00,0x61,0xCF,0x80,0x1C,0x08,0x18,0x00,0x00, 0x06,0x07,0x03,0xE0,0x00,0x1F,0xFF,0xE0,0x67,0x07,0xE0,0x38,0x18,0xF8,0x00,0x00, 0x08,0x0E,0x01,0xF8,0x00,0x07,0xFF,0x80,0xCE,0x03,0xF8,0x60,0x00,0x70,0x00,0x00, 0x00,0x18,0x01,0xF8,0x00,0x01,0xFC,0x00,0xC0,0x01,0xFC,0xC0,0x00,0x70,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0x0C,0xE0,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0E,0x00,0x00,0x00,0x3F,0xE0,0x00,0xFF,0xF0,0x00,0x38,0x00,0xE0,0x00, 0x00,0x00,0x0C,0x00,0x00,0x0F,0xFF,0x80,0x00,0xF8,0xF0,0x00,0x38,0x00,0xE0,0x00, 0x00,0x00,0x0C,0xF0,0x00,0x0F,0xC7,0x00,0x00,0x60,0xE0,0x00,0x38,0x00,0xE0,0x00, 0x00,0x00,0x1F,0xF0,0x00,0x01,0x8E,0x00,0x00,0x60,0xC0,0x00,0x70,0x01,0xC0,0x00, 0x00,0x07,0xFF,0x80,0x00,0x01,0x8C,0x00,0x00,0xE1,0x80,0x00,0x70,0x01,0xC0,0x00, 0x00,0x07,0xF8,0x00,0x00,0x01,0x98,0x00,0x00,0xDF,0xC0,0x00,0x70,0x01,0xC0,0x00, 0x00,0x00,0x78,0x00,0x00,0x01,0xBF,0xE0,0x00,0xFF,0x00,0x00,0x60,0x01,0x80,0x00, 0x00,0x00,0xFC,0x00,0x00,0x7F,0xFF,0xE0,0x00,0xC0,0x00,0x00,0xE0,0x03,0x80,0x00, 0x00,0x01,0xFE,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x00, 0x00,0x03,0xB7,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x3C,0x00,0xC0,0x03,0x00,0x00, 0x00,0x07,0x67,0x00,0x00,0x60,0x00,0x00,0x03,0x9F,0xFE,0x00,0x80,0x02,0x00,0x00, 0x00,0x0E,0x63,0x80,0x00,0xE0,0x00,0x01,0xFF,0xCF,0x1E,0x01,0x80,0x06,0x00,0x00, 0x00,0x1C,0xE1,0xE0,0x00,0xC0,0x00,0x00,0xE3,0x9C,0x38,0x01,0x80,0x06,0x00,0x00, 0x00,0x38,0xC1,0xF8,0x01,0xC0,0x00,0x00,0xC3,0x18,0x30,0x00,0x00,0x00,0x00,0x00, 0x00,0xE0,0xFC,0xFE,0x03,0x80,0x00,0x01,0xC7,0x18,0x60,0x00,0x00,0x00,0x00,0x00, 0x01,0xDF,0xF8,0xFE,0x03,0x00,0x00,0x01,0x8E,0x1B,0xE0,0x07,0x00,0x1C,0x00,0x00, 0x07,0x07,0x80,0x00,0x07,0x00,0x00,0x01,0xFF,0x3F,0xE0,0x07,0x00,0x1C,0x00,0x00, 0x0C,0x03,0x80,0x00,0x0E,0x00,0x00,0x01,0xF0,0x38,0x00,0x0F,0x00,0x3C,0x00,0x00, 0x00,0x03,0x00,0x00,0x1C,0x00,0x00,0x01,0x00,0x20,0x00,0x06,0x00,0x18,0x00,0x00, 0x00,0x03,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; /******************************************************************************/ void Lcd_init(void) //初始化LCD { Delaynms(10);//启动等待,等LCM讲入工作状态 CS=1; Write_char(0,0x30); //8 位介面,基本指令集 Write_char(0,0x0c); //显示打开,光标关,反白关 Write_char(0,0x01); //清屏,将DDRAM的地址计数器归零 } /******************************************************************************/ void Write_char(bit start, unsigned charddata) //写指令或数据 { unsignedchar start_data,Hdata,Ldata; if(start==0) start_data=0xf8; //写指令 else start_data=0xfa; //写数据 Hdata=ddata&0xf0; //取高四位 Ldata=(ddata<<4)&0xf0; //取低四位 Send_byte(start_data); //发送起始信号 Delaynms(5); //延时是必须的 Send_byte(Hdata); //发送高四位 Delaynms(1); //延时是必须的 Send_byte(Ldata); //发送低四位 Delaynms(1); //延时是必须的 } /******************************************************************************/ void Send_byte(unsigned char bbyte) //发送一个字节 { unsignedchar i; for(i=0;i<8;i++) { SID=bbyte&0x80; //取出最高位 SCLK=1; SCLK=0; bbyte<<=1; //左移 } } /******************************************************************************/ void Delaynms(unsigned int di) //延时 { unsignedint da,db; for(da=0;da for(db=0;db<10;db++); } /******************************************************************************/ void Disp_img(unsigned char *img) //图形方式12864显示字模221 横向取膜 { unsignedchar i,j; unsignedint k = 0; Write_char(0,0x36);//图形方式 for(i=0;i<32;i++) { Write_char(0,0x80+i); Write_char(0,0x80); for(j=0;j<16;j++) { Write_char(1,img[k++]); } } for(i=0;i<32;i++) { Write_char(0,0x80+i); Write_char(0,0x88); for(j=0;j<16;j++) { Write_char(1,img[k++]); } } } /******************************************************************************/ void Clr_Scr(void)//清屏函数 { Write_char(0,0x01); } /******************************************************************************/ void LCD_set_xy( unsigned char x,unsigned char y ) { //设置LCD显示的起始位置,X为行,Y为列 unsigned char address; switch(x) { case0: address = 0x80 + y; break; case 1: address = 0x80 + y; break; case2: address = 0x90 + y; break; case 3: address =0x88 + y; break; case4: address = 0x98 + y; break; default:address= 0x80 + y; break; } Write_char(0, address); } /******************************************************************************/ void LCD_Write_string(unsigned charX,unsigned char Y,unsigned char *s) { // 中英文字符串显示函数 LCD_set_xy(X, Y ); while (*s) { Write_char(1, *s ); s ++; Delaynms(1); } } /******************************************************************************/ void LCD_Write_number(unsigned char s)// 数字显示函数 { Write_char(1,num); Delaynms(1); } /******************************************************************************/ void Lcd_Mark2(void) { Clr_Scr();//清屏 LCD_Write_string(1,0,znwk);// LCD_Write_string(2,0,waves);// LCD_Write_string(3,7,CM);// } /********************************************************/ void Conut(void) { time=TH0*256+TL0; TH0=0; TL0=0; S=time*1.87/100; //算出来是CM 11。0592M晶振 if(flag==1) //超出测量 { flag=0; LCD_set_xy( 3, 4 ); LCD_Write_number(13); LCD_Write_number(12); LCD_set_xy( 3, 5 ); LCD_Write_number(13); LCD_Write_number(13); } else { di***uff[1]=S%1000/100; di***uff[2]=S%1000%100/10; di***uff[3]=S%1000%10 %10; LCD_set_xy( 3, 4 ); LCD_Write_number(di***uff[1]); LCD_Write_number(12); LCD_set_xy( 3, 5 ); LCD_Write_number(di***uff[2]); LCD_Write_number(di***uff[3]); } } /********************************************************/ void delayms(unsigned int ms) { unsignedchar i=100,j; for(;ms;ms--) { while(--i) { j=10; while(--j); } } } /********************************************************/ void zd0() interrupt1 //T0中断用来计数器溢出,超过测距范围 { flag=1; //中断溢出标志 } /********************************************************/ void StartModule() //T1中断用来扫描数码管和计800MS启动模块 { TX=1; //800MS 启动一次模块 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; } /********************************************************/ void main(void) { TMOD=0x01; //设T0为方式1,GATE=1 TH0=0; TL0=0; TR0=1; Lcd_init(); //设置液晶显示器 Clr_Scr(); //清屏 Disp_img(logo); //显示欢迎使用本产品LOGO Delaynms(1000); Lcd_init(); //从图形显示状态下返回 Lcd_Mark2(); while(1) { StartModule(); //计算 while(!RX); //当RX为零时等待 TR0=1; //开启计数 while(RX); //当RX为1计数并等待 TR0=0; //关闭计数 Conut(); delayms(80); //80MS } }
|