找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 565|回复: 0
收起左侧

51单片机倒车雷达控制系统程序设计

[复制链接]
ID:1125696 发表于 2024-6-18 15:23 | 显示全部楼层 |阅读模式
基于51单片机来实现一个倒车雷达系统,可通过按键来调整雷达预警的阈值。也可以调节报警范围,代码也比较简单,可靠性强,可转换为实物,也可用于设计,仿真Proteus如图。

仿真效果图

仿真效果图

  1. #include<reg51.h>
  2. #include<intrins.h>

  3. sbit LED0=P2^0;
  4. sbit LED1=P2^1;

  5. sbit speak=P1^7;
  6. sbit key_up=P1^0;
  7. sbit key_dn=P1^1;

  8. sbit TRIG=P3^7;
  9. sbit ECHO=P3^2;

  10. sbit LCD_E=P2^5;
  11. sbit LCD_RW=P2^6;
  12. sbit LCD_RS=P2^7;

  13. unsigned int Set=40;//距离值,单位cm
  14. unsigned int Now;
  15. unsigned int count_T0=0,count_1ms,miao=0;
  16. unsigned int High_Time;
  17. unsigned char flag;

  18. unsigned char code word1[]="Set=          cm";//0--15
  19. unsigned char code word2[]="Now=          cm";//0--15
  20. unsigned char code word3[]="0123456789";
  21. void lcd_write_com(unsigned char com);
  22. void lcd_write_data(unsigned char dat);
  23. void lcdInit();
  24. void display_LCD(unsigned char hang,unsigned char lie,unsigned dat);

  25. void Timer0_Init();

  26. void delayms(unsigned char t);
  27. void scan_key();
  28. unsigned int WAVE();
  29. void display_string();
  30. void Timer_delay(unsigned int BS);
  31. void Speak();
  32. void main()
  33. {
  34.         unsigned char bai,shi,ge;
  35.         lcdInit();
  36.         display_string();//显示开始的字母
  37.         while(1)
  38.         {
  39.                 scan_key();
  40.                 if((Set/100%10)!=0)
  41.                 {
  42.                   display_LCD(0,6,word3[Set/100%10]);
  43.                   delayms(1);
  44.                 }
  45.                 display_LCD(0,7,word3[Set/10%10]);
  46.                 delayms(1);
  47.     display_LCD(0,8,word3[Set%10]);
  48.                 delayms(1);
  49.                
  50.     High_Time=WAVE();//超声波
  51.                 //Now=(int)(High_Time*1.72)/100;
  52.                 Now=(int)(High_Time*0.0175);
  53.                 Speak();
  54.                
  55.                 bai=Now/100%10;
  56.                 shi=Now/10%10;
  57.                 ge=Now%10;
  58.                
  59.                 if(bai!=0)
  60.                 {
  61.             display_LCD(1,6,word3[bai]);
  62.                   delayms(1);
  63.                 }
  64.                 display_LCD(1,7,word3[shi]);
  65.                 delayms(1);
  66.                 display_LCD(1,8,word3[ge]);
  67.                 delayms(1);
  68.         }
  69. }
  70. /*——————————蜂鸣器发声————————*/
  71. void Speak()
  72. {
  73.    if(Now<Set)
  74.                   {
  75.                           speak=0;
  76.                                 Timer_delay(1);
  77.                         }
  78.                   else if(Now<(Set+0))
  79.                         {
  80.                           speak=0;
  81.                                 Timer_delay(5);
  82.                         }
  83.                         else
  84.                         {
  85.                           speak=1;
  86.                         }

  87. }
  88. //*————————————定时器T1延时————————————*/
  89. void Timer_delay(unsigned int BS)//T1延时0.5ms
  90. {
  91.   unsigned int k;
  92.   for(k=0;k<BS;k++)
  93.         {
  94.           TH1=(65536-100)/256;
  95.           TL1=(65536-100)%256;
  96.     while(TF1==0);
  97.                 TF1=0;
  98.         }
  99. }
  100. //*——————显示开始的字母————————————*/
  101. void display_string()
  102. {
  103.         unsigned m,n;
  104.    for(m=0;m<16;m++)
  105.         {
  106.     display_LCD(0,m,word1[m]);
  107.                 delayms(1);
  108.         }               
  109.         for(n=0;n<16;n++)
  110.         {
  111.     display_LCD(1,n,word2[n]);
  112.                 delayms(1);
  113.         }               
  114. }
  115. /*——————————————超声波计算时间————————————*/
  116. unsigned int WAVE()
  117. {
  118.           unsigned int result;
  119.           unsigned char p;
  120.     TRIG=0;
  121.                 _nop_();//1微秒
  122.                 TRIG=1;
  123.           for(p=0;p<10;p++);//大于10us

  124.                 TRIG=0;
  125.                 while(ECHO==0);//等高电平来
  126.     Timer0_Init();//开始计时记高电平时间即超声波发射--返回时间
  127.                 while(ECHO)
  128.                 {
  129.                          if((TH0>0x8c)|| (TH0==0x8c&&TL0>0xa0))break;
  130.                 }
  131.                 TR0=0;
  132.                 //18us=18000ms=4650H  ;100us--18ms有效    超过36ms无效 36ms=8cA0
  133.                  if((TH0<0x46)|| (TH0==0x46&&TL0<=0x50))
  134.                  {
  135.                    result=(TH0<<8)+TL0;
  136.                          return result;
  137.                  }
  138.                 else return 0;
  139. }

  140. /*——————————————LCD初始化————————————*/
  141. void lcdInit()
  142. {
  143.   lcd_write_com(0x38);//字符为5*7点阵
  144.         lcd_write_com(0x0c); //显示开 光标关 闪烁关
  145.         lcd_write_com(0x06);//写入数据后光标右移一位 显示屏不动
  146.         lcd_write_com(0x01);//清屏
  147.         lcd_write_com(0x80);//设置数据指针起点
  148. }

  149. /**———————————LCD写命令——————————————*/
  150. void lcd_write_com(unsigned char com)
  151. {
  152.   LCD_E=0;
  153.         LCD_RS=0;//命令
  154.         LCD_RW=0;//写入
  155.         P0=com;
  156.         delayms(1);
  157.         LCD_E=1;//写入时序
  158.         delayms(1);
  159.         LCD_E=0;

  160. }

  161. /*————————LCD写数据————————————————————*/
  162. void lcd_write_data(unsigned char dat)
  163. {
  164.   LCD_E=0;
  165.         LCD_RW=0;//写入
  166.         LCD_RS=1;//数据
  167.         P0=dat;
  168.         delayms(1);
  169.         LCD_E=1;
  170.         delayms(1);
  171.         LCD_E=0;
  172. }
  173. //*———————————液晶屏显示—————————————————*/
  174. void display_LCD(unsigned char hang,unsigned char lie,unsigned value)
  175. {
  176.   if(hang==0)
  177.         {
  178.           lcd_write_com(0x80+lie);
  179.         }
  180.         if(hang==1)
  181.         {
  182.           lcd_write_com(0xc0+lie);
  183.         }
  184.         lcd_write_data(value);
  185. }


  186. /*————————定时器初始化————————*///T1延时,T0中断
  187. void Timer0_Init()
  188. {
  189.         //count_T0=0;
  190.         //miao=0;
  191.   TMOD=0x11;
  192.         TH0=0;
  193.         TL0=0;
  194.         //ET0=1;
  195.         TR0=1;TR1=1;
  196.         //EA=1;
  197. }
  198. void Timer0() interrupt 1
  199. {
  200.         TH0=0;
  201.         TL0=0;

  202. }

  203. //*———————————按键扫描—————————————————*/
  204. void scan_key()
  205. {

  206.         P1=0xff;
  207.         if(P1!=0xff)delayms(10);
  208.         //key_up=0;
  209.         if(P1!=0xff)
  210.         {
  211.           switch(P1&0xff)
  212.                 {
  213.                     case 0xfe :Set=Set+1;LED0=0;break;//key_up  p1.0
  214.                                 case 0xfd :Set=Set-1;break;//key_dn  p1.1
  215.                 }
  216.                 while(P1!=0xff);
  217.         }
  218. }
  219. //*——————————————————————————————————————————*/
  220. void delayms(unsigned char t)
  221. {
  222.   unsigned i,j;
  223.         for(i=0;i<t;i++)
  224.            for(j=0;j<120;j++);
  225. }




复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表