找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3269|回复: 4
打印 上一主题 下一主题
收起左侧

基于51单片机的超声波倒车报警系统Proteus仿真程序

  [复制链接]
跳转到指定楼层
楼主
stc89c52单片机+lcd1602+srf04超声波传感器+DS18B20温度传感器+无源蜂鸣器


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<math.h>
  4. #include"lcd.h"
  5. #include"temp.h"
  6. /*??????*/
  7. sbit Trig = P2^1;//??????????
  8. sbit Echo = P2^0;
  9. sbit DQ=P3^7;        //?????
  10. sbit beep=P1^5;        //???
  11. sbit key_up=P3^2;//????0?????
  12. sbit key_down=P3^3;//????1?????
  13. /*????????*/
  14. /*?????????*/
  15. unsigned char mes_temp[]="T:";//lcd???????
  16. unsigned char mes_dis[]="S:";
  17. unsigned char mes_alarmDis[]="aS:";
  18. unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
  19. /*??????*/
  20. float  time=0;//??
  21. float  temp;//??
  22. uint  S=0;//??
  23. uint alarm_distance = 10;//????
  24. bit    flag =0;//???????
  25. bit    flag_temp =0;//??????  0???,1???
  26. uchar disbuff[4]= { 0,0,0,0};//???????
  27. uchar temps[] = { 0, 0, 0, 0};//????
  28. uchar alarm_distances[] = { 0, 0};//??????
  29. /*****????****/
  30. void delay(uchar n){//10us
  31.     while(n--);
  32. }
  33. void delayms(unsigned int ms){//1ms
  34.     unsigned char i=100,j;
  35.     for(; ms; ms--){
  36.         while(--i){
  37.             j=10;
  38.             while(--j);
  39.         }
  40.     }
  41. }
  42. /****????*****/
  43.     void Conut(void)
  44.     {
  45.     uint i=0;//????,????????????
  46.     float v;//?????
  47.     /*****????*****/
  48.     time=TH0*256+TL0;//??,us
  49.     TL0=0;//??????,???????
  50.     TH0=0;
  51.     if(flag_temp == 1)//????(??0)
  52.         v=332+temp*0.6;//???????????? m/s
  53.     else//?????
  54.         v=332-temp*0.6;//???????????? m/s
  55.     /*  ????m/s???cm/us
  56.     v:m/s     ---->  ????0.5  0.5*v*100cm/1000 000us  ---->   v/20 000 cm/us
  57.     S=time*v  ---->  ???????
  58.     time/100  v/200  ???????????*/
  59.     time=time/100;
  60.     v=v/200;
  61.     S=time*v;//????
  62.     /*****??????*****/
  63.     /*****????,??????*****/
  64.     //?????????
  65.     LcdWriteCom(0x80+0x42);//???????2???  ????????0x80+0x40
  66.     if((S>=700)||flag==1) {//???????? ??????700cm ??????
  67.         flag=0;//?????????
  68.         while(i<1200){//????
  69.                 beep = ~beep;
  70.                 delay(100);
  71.                 i++;
  72.             }//???????????
  73.            i=0;//???????
  74.            beep = 0;
  75.         //LCD?????   -.--M
  76.         LcdWriteData(ASCII[11]);//-
  77.         LcdWriteData(ASCII[10]);//.
  78.         LcdWriteData(ASCII[11]);//-
  79.         LcdWriteData(ASCII[11]);//-
  80.         LcdWriteData( ASCII[12]);//M
  81.     }
  82.     else //?????? ? 68cm -->  0.68M
  83.     {
  84.         if(S<alarm_distance){
  85.             while(i<1200){//????
  86.                 beep = ~beep;
  87.                 delay(100);
  88.                 i++;
  89.             }//???????????
  90.            i=0;//???????
  91.            beep = 0;
  92.         }
  93.         beep = 0;//??????
  94.         disbuff[0]=S/100;         //??
  95.         disbuff[1]=S%100/10;      //??
  96.         disbuff[2]=S%10 %10;      //??
  97.         LcdWriteData(ASCII[disbuff[0]]);//0
  98.         LcdWriteData(ASCII[10]);            //.
  99.         LcdWriteData(ASCII[disbuff[1]]);//6
  100.         LcdWriteData(ASCII[disbuff[2]]);//8
  101.         LcdWriteData(ASCII[12]);            //M
  102.     }
  103.     LcdWriteCom(0x80+0x48);//??????
  104.     for(i = 0 ; i < 3; i++)
  105.         LcdWriteData(mes_alarmDis[i]);//aS:
  106.     alarm_distances[0]=alarm_distance%100/10;      //??
  107.     alarm_distances[1]=alarm_distance%10 %10;      //??
  108.     for(i = 0 ; i < 2; i++){
  109.         LcdWriteData(ASCII[alarm_distances[i]]);
  110.         if(i == 1){
  111.             LcdWriteData('c');
  112.             LcdWriteData('m');
  113.         }
  114.     }
  115. }
  116. /****??????***/
  117. void T0_OVERFLOW() interrupt 1 //T0?????????,??????
  118. {
  119.     flag=1;
  120. }
  121. void alarm_distance_up() interrupt 0  {//0?????0????
  122.     alarm_distance +=5;
  123. }
  124. void alarm_distance_down() interrupt 2        {//2?????1????
  125.     if(alarm_distance > 5)
  126.         alarm_distance -=5;
  127. }
  128. /****???????****/
  129. void  StartModule(){
  130.     uchar i;//????
  131.     Trig=1;//??????
  132.     for(i=10; i>0; i--)
  133.         _nop_(); //??10????,??
  134.     Trig=0;
  135. }
  136. /***??????*/
  137. void temp_deal(int t){
  138.     uchar i;//????
  139.     float tp;//??????????
  140.     uint  ttp;
  141.         if(t< 0){//?????
  142.         flag_temp = 0;
  143.         LcdWriteCom(0x82);//2???????
  144.         LcdWriteData('-');
  145.         //?????????????,????
  146.         //?????
  147.         t=t-1;
  148.         t=~t;
  149.         tp=t;
  150.         //? 27.123 ---> 2712.3+0.5 --->2712
  151.         ttp=tp*0.0625*100+0.5;
  152.         temp = ttp/100;
  153.     }
  154.     else{
  155.         flag_temp = 1;
  156.         if(t > 0){
  157.             LcdWriteCom(0x82);
  158.             LcdWriteData('+');
  159.         }
  160.         tp=t;//?????????
  161.         ttp=tp*0.0625*100+0.5;
  162.         temp = ttp/100;
  163.     }
  164.     //2712/1000 -> 2
  165.     temps[0] = ttp / 1000;
  166.     //2712%1000 -->712  712/100-->7
  167.     temps[1] = ttp % 1000 / 100;
  168.     //2712%100 --> 12  12/10 -->1
  169.     temps[2] = ttp % 100 / 10;
  170.     temps[3] = ttp % 10;//2712%10 --> 2
  171.     LcdWriteCom(0x83);
  172.     for(i =0; i < 4;i++){
  173.         if(i==2)
  174.             LcdWriteData(ASCII[10]);
  175.         LcdWriteData(ASCII[temps[i]]);
  176.     }
  177.     LcdWriteData(' ');
  178.     LcdWriteData('C');
  179. }
  180. /*???*/
  181. void main(void){
  182.     uchar i;      //for?????
  183.     TMOD=0x01;    //??????
  184.     TH0=0;  TL0=0;//???0??
  185.     IT0=1;  IT1=1;//????0,1?????
  186.     ET0=1;        //??T0??
  187.     EX0=1;  EX1=1;//??????0,1
  188.     EA=1;         //????
  189.     LcdInit();    //???1602
  190.     LcdWriteCom(0x80);//???????
  191.     for(i=0; i<2; i++)
  192.        LcdWriteData(mes_temp[i]);//T:
  193.     LcdWriteCom(0x80+0x40);//??????????
  194.     for(i=0; i<2; i++)
  195.         LcdWriteData(mes_dis[i]);//S:
  196.     while(1){
  197.         //?????????
  198.         temp_deal(Ds18b20ReadTemp());
  199.         StartModule();//???????
  200.         while(!Echo);                //echo=1???
  201.         TR0=1;                         //????
  202.         while(Echo);        //echo=0???
  203.         TR0=0;                                    //????
  204.         Conut();                          //???????
  205.         delayms(80);       //??80ms
  206.     }
  207. }

复制代码

所有资料51hei提供下载:
UltrasonicDistanceMeasurementSystem-master.zip (148.28 KB, 下载次数: 166)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:829126 发表于 2020-10-13 09:13 | 只看该作者
请问是51单片机还是stm32单片机
回复

使用道具 举报

板凳
ID:833603 发表于 2020-10-23 15:31 | 只看该作者
1feng1 发表于 2020-10-13 09:13
请问是51单片机还是stm32单片机

51的
回复

使用道具 举报

地板
ID:787976 发表于 2020-11-1 10:42 | 只看该作者
怎么显示成功的结果
回复

使用道具 举报

5#
ID:986539 发表于 2021-12-26 17:09 | 只看该作者
我想要注释
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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