基于51單片機來實現一個倒車雷達系統,可通過按鍵來調整雷達預警的閾值。也可以調節報警范圍,代碼也比較簡單,可靠性強,可轉換為實物,也可用于設計,仿真Proteus如圖。
仿真效果圖
- #include<reg51.h>
- #include<intrins.h>
- sbit LED0=P2^0;
- sbit LED1=P2^1;
- sbit speak=P1^7;
- sbit key_up=P1^0;
- sbit key_dn=P1^1;
- sbit TRIG=P3^7;
- sbit ECHO=P3^2;
- sbit LCD_E=P2^5;
- sbit LCD_RW=P2^6;
- sbit LCD_RS=P2^7;
- unsigned int Set=40;//距離值,單位cm
- unsigned int Now;
- unsigned int count_T0=0,count_1ms,miao=0;
- unsigned int High_Time;
- unsigned char flag;
- unsigned char code word1[]="Set= cm";//0--15
- unsigned char code word2[]="Now= cm";//0--15
- unsigned char code word3[]="0123456789";
- void lcd_write_com(unsigned char com);
- void lcd_write_data(unsigned char dat);
- void lcdInit();
- void display_LCD(unsigned char hang,unsigned char lie,unsigned dat);
- void Timer0_Init();
- void delayms(unsigned char t);
- void scan_key();
- unsigned int WAVE();
- void display_string();
- void Timer_delay(unsigned int BS);
- void Speak();
- void main()
- {
- unsigned char bai,shi,ge;
- lcdInit();
- display_string();//顯示開始的字母
- while(1)
- {
- scan_key();
- if((Set/100%10)!=0)
- {
- display_LCD(0,6,word3[Set/100%10]);
- delayms(1);
- }
- display_LCD(0,7,word3[Set/10%10]);
- delayms(1);
- display_LCD(0,8,word3[Set%10]);
- delayms(1);
-
- High_Time=WAVE();//超聲波
- //Now=(int)(High_Time*1.72)/100;
- Now=(int)(High_Time*0.0175);
- Speak();
-
- bai=Now/100%10;
- shi=Now/10%10;
- ge=Now%10;
-
- if(bai!=0)
- {
- display_LCD(1,6,word3[bai]);
- delayms(1);
- }
- display_LCD(1,7,word3[shi]);
- delayms(1);
- display_LCD(1,8,word3[ge]);
- delayms(1);
- }
- }
- /*——————————蜂鳴器發聲————————*/
- void Speak()
- {
- if(Now<Set)
- {
- speak=0;
- Timer_delay(1);
- }
- else if(Now<(Set+0))
- {
- speak=0;
- Timer_delay(5);
- }
- else
- {
- speak=1;
- }
- }
- //*————————————定時器T1延時————————————*/
- void Timer_delay(unsigned int BS)//T1延時0.5ms
- {
- unsigned int k;
- for(k=0;k<BS;k++)
- {
- TH1=(65536-100)/256;
- TL1=(65536-100)%256;
- while(TF1==0);
- TF1=0;
- }
- }
- //*——————顯示開始的字母————————————*/
- void display_string()
- {
- unsigned m,n;
- for(m=0;m<16;m++)
- {
- display_LCD(0,m,word1[m]);
- delayms(1);
- }
- for(n=0;n<16;n++)
- {
- display_LCD(1,n,word2[n]);
- delayms(1);
- }
- }
- /*——————————————超聲波計算時間————————————*/
- unsigned int WAVE()
- {
- unsigned int result;
- unsigned char p;
- TRIG=0;
- _nop_();//1微秒
- TRIG=1;
- for(p=0;p<10;p++);//大于10us
- TRIG=0;
- while(ECHO==0);//等高電平來
- Timer0_Init();//開始計時記高電平時間即超聲波發射--返回時間
- while(ECHO)
- {
- if((TH0>0x8c)|| (TH0==0x8c&&TL0>0xa0))break;
- }
- TR0=0;
- //18us=18000ms=4650H ;100us--18ms有效 超過36ms無效 36ms=8cA0
- if((TH0<0x46)|| (TH0==0x46&&TL0<=0x50))
- {
- result=(TH0<<8)+TL0;
- return result;
- }
- else return 0;
- }
- /*——————————————LCD初始化————————————*/
- void lcdInit()
- {
- lcd_write_com(0x38);//字符為5*7點陣
- lcd_write_com(0x0c); //顯示開 光標關 閃爍關
- lcd_write_com(0x06);//寫入數據后光標右移一位 顯示屏不動
- lcd_write_com(0x01);//清屏
- lcd_write_com(0x80);//設置數據指針起點
- }
- /**———————————LCD寫命令——————————————*/
- void lcd_write_com(unsigned char com)
- {
- LCD_E=0;
- LCD_RS=0;//命令
- LCD_RW=0;//寫入
- P0=com;
- delayms(1);
- LCD_E=1;//寫入時序
- delayms(1);
- LCD_E=0;
- }
- /*————————LCD寫數據————————————————————*/
- void lcd_write_data(unsigned char dat)
- {
- LCD_E=0;
- LCD_RW=0;//寫入
- LCD_RS=1;//數據
- P0=dat;
- delayms(1);
- LCD_E=1;
- delayms(1);
- LCD_E=0;
- }
- //*———————————液晶屏顯示—————————————————*/
- void display_LCD(unsigned char hang,unsigned char lie,unsigned value)
- {
- if(hang==0)
- {
- lcd_write_com(0x80+lie);
- }
- if(hang==1)
- {
- lcd_write_com(0xc0+lie);
- }
- lcd_write_data(value);
- }
- /*————————定時器初始化————————*///T1延時,T0中斷
- void Timer0_Init()
- {
- //count_T0=0;
- //miao=0;
- TMOD=0x11;
- TH0=0;
- TL0=0;
- //ET0=1;
- TR0=1;TR1=1;
- //EA=1;
- }
- void Timer0() interrupt 1
- {
- TH0=0;
- TL0=0;
- }
- //*———————————按鍵掃描—————————————————*/
- void scan_key()
- {
- P1=0xff;
- if(P1!=0xff)delayms(10);
- //key_up=0;
- if(P1!=0xff)
- {
- switch(P1&0xff)
- {
- case 0xfe :Set=Set+1;LED0=0;break;//key_up p1.0
- case 0xfd :Set=Set-1;break;//key_dn p1.1
- }
- while(P1!=0xff);
- }
- }
- //*——————————————————————————————————————————*/
- void delayms(unsigned char t)
- {
- unsigned i,j;
- for(i=0;i<t;i++)
- for(j=0;j<120;j++);
- }
復制代碼
|