EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Zedd 于 2018-11-9 09:38 编辑
6 j, I' g$ @5 d5 M2 y" }/ m t% N0 F, y! Y6 ?
多路超声波的程序,让超声波模块避免相互干扰,实现避障小车、跟随小车灯。。 | |
/**************************************************************/ //使用时将US100跳帽拔下,使其设置为电平触发模式 /***************************************************************/ #include <reg52.h> #include <intrins.h> //引脚定义 sbit Trig1 = P1 ^ 0; // sbit Ecno1 = P1 ^ 1; // sbit Trig2 = P3 ^ 2; // sbit Ecno2 = P3 ^ 3; // sbit Trig3 = P1 ^ 2; // sbit Ecno3 = P1 ^ 3; // sbit Trig4 = P1 ^ 4; // sbit Ecno4 = P1 ^ 5; // sbit CS = P0 ^ 5; //片选 高电平有效 单片LCD使用时可固定高电平 sbit SID = P0 ^ 6; //数据 sbit SCLK = P0 ^ 7; //时钟 // 函数声明 void Write_char(bit start, unsigned char ddata); void Send_byte(unsigned char bbyte); void Delaynms(unsigned int di); void Lcd_init(void); void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s); void LCD_set_xy( unsigned char x, unsigned char y ); void StartModule() ; void Clr_Scr(); unsigned char code num[]={"0123456789 :."}; unsigned char code table1[]={" 前方距离:"}; unsigned char code table2[] ={"后方距离:"}; unsigned char code table3[] ={"左方距离:"}; unsigned char code table4[] ={"右方距离:"}; unsigned char code M[] = {"CM"}; unsigned int time1=0; unsigned int time2=0; unsigned int time3=0; unsigned int time4=0; long S1=0; long S2=0; long S3=0; long S4=0; bit flag =0; unsigned char disbuff[4] ={ 0,0,0,0,}; /******************************************************************************/ 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 char ddata) //写指令或数据 { unsigned char 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) //发送一个字节 { unsigned char i; for(i=0;i<8;i++) { SID=bbyte&0x80; //取出最高位 SCLK=1; SCLK=0; bbyte<<=1; //左移 } } /******************************************************************************/ void Delaynms(unsigned int di) //延时 { unsigned int da,db; for(da=0;da<di;da++) for(db=0;db<10;db++); } /******************************************************************************/ 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) { case 0: address = 0x80 + y; break; case 1: address = 0x80 + y; break; case 2: address = 0x90 + y; break; case 3: address = 0x88 + y; break; case 4: address = 0x98 + y; break; default:address = 0x80 + y; break; } Write_char(0, address); } /******************************************************************************/ void LCD_Write_string(unsigned char X,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,table1);// LCD_Write_string(1,7,M); LCD_Write_string(2,0,table2); LCD_Write_string(2,7,M);// LCD_Write_string(3,0,table3);// LCD_Write_string(3,7,M); LCD_Write_string(4,0,table4);// LCD_Write_string(4,7,M); } /********************************************************/ void Conut1(void) { time1=TH0*256+TL0; TH0=0x00; TL0=0x00; S1=time1*1.87/100; // 11.0592M晶振 if(flag==1) //超出测量 { flag=0; LCD_set_xy( 1, 5 ); LCD_Write_number(13); LCD_Write_number(12); LCD_set_xy( 1, 6 ); LCD_Write_number(13); LCD_Write_number(13); } else { disbuff[1]=S1%1000/100; disbuff[2]=S1%1000%100/10; disbuff[3]=S1%1000%100%10; LCD_set_xy( 1, 5 ); LCD_Write_number(disbuff[1]); LCD_Write_number(disbuff[2]); LCD_set_xy( 1, 6 ); LCD_Write_number(disbuff[3]); } } /****************************************************/ void Conut2(void) { time2=TH0*256+TL0; TH0=0x00; TL0=0x00; S2=time2*1.87/100; // 11.0592M晶振 if(flag==1) //超出测量 { flag=0; LCD_set_xy( 2, 5 ); LCD_Write_number(13); LCD_Write_number(12); LCD_set_xy( 2, 6 ); LCD_Write_number(13); LCD_Write_number(13); } else { disbuff[1]=S2%1000/100; disbuff[2]=S2%1000%100/10; disbuff[3]=S2%1000%100%10; LCD_set_xy( 2, 5 ); LCD_Write_number(disbuff[1]); LCD_Write_number(disbuff[2]); LCD_set_xy( 2, 6 ); LCD_Write_number(disbuff[3]); } } /****************************************************/ void Conut4(void) { time4=TH0*256+TL0; TH0=0x00; TL0=0x00; S4=time4*1.87/100; // 11.0592M晶振 if(flag==1) //超出测量 { flag=0; LCD_set_xy( 2, 5 ); LCD_Write_number(13); LCD_Write_number(12); LCD_set_xy( 2, 6 ); LCD_Write_number(13); LCD_Write_number(13); } else { disbuff[1]=S4%1000/100; disbuff[2]=S4%1000%100/10; disbuff[3]=S4%1000%100%10; LCD_set_xy( 4, 5 ); LCD_Write_number(disbuff[1]); LCD_Write_number(disbuff[2]); LCD_set_xy( 4, 6 ); LCD_Write_number(disbuff[3]); } } /****************************************************/ void Conut3(void) { time3=TH0*256+TL0; TH0=0x00; TL0=0x00; S3=time3*1.87/100; // 11.0592M晶振 if(flag==1) //超出测量 { flag=0; LCD_set_xy( 3, 5 ); LCD_Write_number(13); LCD_Write_number(12); LCD_set_xy( 3, 6 ); LCD_Write_number(13); LCD_Write_number(13); } else { disbuff[1]=S3%1000/100; disbuff[2]=S3%1000%100/10; disbuff[3]=S3%1000%100%10; LCD_set_xy( 3, 5 ); LCD_Write_number(disbuff[1]); LCD_Write_number(disbuff[2]); LCD_set_xy( 3, 6 ); LCD_Write_number(disbuff[3]); } } /********************************************************/ void delay20us(void) //误差 -0.016637731481us { unsigned char a,b; for(b=1;b>0;b--) for(a=52;a>0;a--); //if Keil,require use intrins.h } void Delay5ms() //@11.0592MHz { unsigned char i, j; i = 54; j = 199; do { while (--j); } while (--i); } void Delay50ms() //@11.0592MHz { unsigned char i, j, k; i = 3; j = 26; k = 223; do { do { while (--k); } while (--j); } while (--i); } void Delay300ms() //@11.0592MHz { unsigned char i, j, k; i = 13; j = 156; k = 83; do { do { while (--k); } while (--j); } while (--i); } /********************************************************/ void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围 { flag=1; //中断溢出标志 } /********************************************************/ void StartModule1() //超声波触发函数 { Trig1=0; delay20us(); Trig1=1; delay20us(); //发射一个大于10us的脉冲,触发超声波发射 Trig1=0; } /******************************************************/ void StartModule2() //超声波触发函数 { Trig2=0; delay20us(); Trig2=1; delay20us(); //发射一个大于10us的脉冲,触发超声波发射 Trig2=0; } /******************************************************/ void StartModule3() //超声波触发函数 { Trig3=0; delay20us(); Trig3=1; delay20us(); //发射一个大于10us的脉冲,触发超声波发射 Trig3=0; } /******************************************************/ void StartModule4() //超声波触发函数 { Trig4=0; delay20us(); Trig4=1; delay20us(); //发射一个大于10us的脉冲,触发超声波发射 Trig4=0; } /********************************************************/ void main(void) { TMOD=0x01; //设T0为方式1 TH0=0x00; TL0=0x00; TR0=1; ET0=1; //允许T0中断 EA=1; //开启总中断 Lcd_init(); //设置液晶显示器 Clr_Scr(); //清屏 …………………… …………限于本文篇幅 余下代码请从论坛下载附件………… |