找回密码
 立即注册

QQ登录

只需一步,快速开始

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

加上温度补偿后,超声波测不了,该怎么修改单片机程序,才可以正确显示温度补偿...

[复制链接]
跳转到指定楼层
楼主
ID:1005855 发表于 2022-5-24 09:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请大家帮忙看看 谢谢了

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <lcd.h>


  4. #define uchar unsigned char
  5. #define uint unsigned int
  6.         
  7. sbit key1=P1^1;  //设置键
  8. sbit key2=P1^2;  //加键
  9. sbit key3=P1^3;  //减键
  10. sbit key4=P1^4;  //退出键


  11. sbit DQ=P1^7;
  12. sbit beep=P1^0;
  13. sbit led=P1^6;


  14. sbit trig=P3^1;
  15. sbit echo=P3^0;




  16. uchar djshi,djfen=45,djmiao;
  17. uchar r,num;
  18. uint distance,t;
  19. uchar l=25;
  20. int wdz=0;
  21. float n;


  22. bit flag=0;
  23. bit flag1s=0;


  24. uchar code table1[]={"time: 00:00:00  "};
  25. uchar code table3[14]={'0','1','2','3','4','5','6','7','8','9','.','-','M','C'};
  26. uchar code table4[]={"wdz:"};
  27. uchar cc[4]={0,0,0,0};




  28. void startmodule();
  29. void start();
  30. void count();






  31. void Delay1ms(uint n)
  32. {
  33.    uint x,y;
  34.     for(x=n;x>0;x--)
  35.          for(y=110;y>0;y--);
  36. }


  37. void delay_18B20(unsigned int i)//延时函数
  38. {
  39.         for(;i>0;i--);
  40. }


  41. void Init_ds18b20(void)
  42. {
  43.         unsigned char x=0;
  44.         DQ = 1;          //DQ拉高
  45.         delay_18B20(8);
  46.         DQ = 0;          //DQ拉低,    将总线拉低,持续时间为480us到960us之间
  47.         delay_18B20(80);
  48.         DQ = 1;
  49.         delay_18B20(14);
  50.         x=DQ;
  51.         delay_18B20(20);
  52. }


  53. unsigned char read(void)
  54. {
  55.         unsigned char i=0;
  56.   unsigned char dat = 0;
  57.         for (i=0;i<8;i++)
  58.         {
  59.                 DQ = 0;
  60.                 dat>>=1;
  61.                 DQ = 1;
  62.                 if(DQ)
  63.                         dat|=0x80;
  64.                         delay_18B20(4);
  65.         }
  66.         return(dat);
  67. }


  68. void write(unsigned char dat)
  69. {
  70.   unsigned char i=0;
  71.   for (i=8; i>0; i--)
  72.   {
  73.    DQ = 0;           
  74.    DQ = dat&0x01;
  75.    if(DQ){delay_18B20(1);DQ=1;}//当要写“0”时,单总线要被拉低至少60?s,以保证DS18B20能够在15?s到45?s之间,正确地采样I/O总线上的“0”电平
  76.          else{delay_18B20(5);DQ = 1;}//当要写“1”时,单总线被拉低之后,在15?s之内就得释放单总线。
  77.    dat>>=1;
  78.    }
  79. }


  80. unsigned char readtemp(void)
  81. {
  82.         unsigned char a=0,b=0;
  83.         unsigned int temp=0;
  84.         Init_ds18b20();
  85.         write(0xcc);// 跳过读序列号操作
  86.         write(0x44);// 启动温度转换
  87.         delay_18B20(100);
  88.         Init_ds18b20();
  89.         write(0xcc);
  90.         write(0xbe);//读取温度寄存器
  91.         delay_18B20(100);
  92.         a=read();//读温度低位
  93.         b=read();//读温度高位
  94.         temp=((b*256+a)>>4);
  95.         return(temp);
  96. }


  97. void display()
  98. {
  99.         unsigned int temp0=0,temp1=0,temp2=0;
  100.         temp0=wdz/100;
  101.         temp1=(wdz%100)/10;
  102.         temp2=wdz%10;
  103.         Delay1ms(5);
  104.         lcd_writechar(11, 1, table3[temp0]);
  105.         Delay1ms(5);
  106.         lcd_writechar(12, 1, table3[temp1]);
  107.         Delay1ms(5);
  108.         lcd_writechar(13, 1, table3[temp2]);
  109.         Delay1ms(5);
  110.         lcd_writechar(14, 1, 0xdf);
  111.         Delay1ms(5);
  112.         lcd_writechar(15, 1, table3[13]);
  113.         Delay1ms(5);
  114. }


  115. void LcdInit()                                                  //LCD初始化子程序
  116. {
  117.                 uchar i;
  118.                 lcd_writecom(0x38);  //开显示
  119.         Delay1ms(5);
  120.                 lcd_writecom(0x38);  //开显示
  121.         Delay1ms(5);
  122.                 lcd_writecom(0x38);  //开显示
  123.         Delay1ms(5);
  124.                 lcd_writecom(0x38);  //开显示
  125.         Delay1ms(5);
  126.         
  127.                 lcd_writecom(0x0c);  //开显示不显示光标
  128.                 lcd_writecom(0x06);  //写一个指针加1
  129.                 lcd_writecom(0x01);  //清屏
  130.         
  131.                 lcd_writecom(0x80);  //设置数据指针起点
  132.                 for(i=0;i<16;i++)
  133.                 {
  134.                                 lcd_writedate(table1[i]);[/i][i]
  135.                 }
  136.         
  137. }        




  138. void Timer0Init(void)                //
  139. {
  140.         
  141.                 TMOD |= 0x01;                //使用定时器T0的模式1  
  142.                 TL0 = 15536%256;                //设置定时0初值
  143.                 TH0 = 15536/256;                //设置定时0初值
  144.                 TR0 = 1;                //定时器0开始计时
  145.                 ET0=1;
  146.                 EA=1;
  147. }


  148. void Timer1Init(void)                //
  149. {
  150.         
  151.                 TMOD |= 0x10;                //使用定时器T1的模式1  
  152.                 TL1 = 0;                //设置定时1初值
  153.                 TH1 = 0;                //设置定时1初值
  154.                 TR1 = 1;                //定时器1开始计时
  155.                 ET1=1;
  156.                 EA=1;
  157. }




  158.                


  159. void write_sfm(uchar add,uchar date)
  160. {
  161.                 lcd_writecom(0x80+add);
  162.                 lcd_writedate(date/10+0x30);
  163.                 lcd_writedate(date%10+0x30);
  164.                 lcd_writecom(0x80+add+1);
  165. }




  166. void keyscan()
  167. {
  168.                 if(key1==0)
  169.                 {
  170.                                 Delay1ms(5);
  171.                                 if(key1==0)
  172.                                 {        
  173.                                                 num++;        
  174.                                                 TR0=0;
  175.                                                 while(!key1);
  176.                                                 if(num==1)
  177.                                                 {
  178.                                                                 lcd_writecom(0x0f);
  179.                                                                 lcd_writecom(0x8D);
  180.                                                 }
  181.                                                 if(num==2)
  182.                                                 {
  183.                                                                 lcd_writecom(0x8A);
  184.                                                 }
  185.                                                 if(num==3)
  186.                                                 {
  187.                                                                
  188.                                                                 lcd_writecom(0x87);
  189.                                                 }
  190.                                                 if(num==4)
  191.                                                 {
  192.                                                         num=0;
  193.                                                 }
  194.                         }
  195.                 }
  196.                 if(num==1)
  197.                 {
  198.                                 if(key2==0)
  199.                                 {
  200.                                                 Delay1ms(5);
  201.                                                 if(key2==0)
  202.                                                 {
  203.                                                                 djmiao++;
  204.                                                                 while(!key2);        //等待按键释放
  205.                                                                 if(djmiao==60)
  206.                                                                         djmiao=0;
  207.                                                                 lcd_writecom(0x8c);
  208.                                                                 lcd_writedate(djmiao/10+0x30);
  209.                                                                 lcd_writedate(djmiao%10+0x30);
  210.                                                                 lcd_writecom(0x8D);
  211.                                                 }
  212.                                                 
  213.                                 }
  214.                                 if(key3==0)
  215.                                 {
  216.                                                 Delay1ms(5);
  217.                                                 if(key3==0)
  218.                                                 {
  219.                                                                 djmiao--;
  220.                                                                 while(!key3);
  221.                                                                 if(djmiao==255)
  222.                                                                         djmiao=59;
  223.                                                                 lcd_writecom(0x8c);
  224.                                                                 lcd_writedate(djmiao/10+0x30);
  225.                                                                 lcd_writedate(djmiao%10+0x30);        
  226.                                                                 lcd_writecom(0x8D);
  227.                                                 }
  228.                                        
  229.                                 }
  230.                 }
  231.                 if(num==2)
  232.                 {
  233.                                 if(key2==0)
  234.                                 {
  235.                                                 Delay1ms(5);
  236.                                                 if(key2==0)
  237.                                                 {
  238.                                                                 djfen++;
  239.                                                                 while(!key2);
  240.                                                                 if(djfen==60)
  241.                                                                         djfen=0;
  242.                                                                 lcd_writecom(0x89);
  243.                                                                 lcd_writedate(djfen/10+0x30);
  244.                                                                 lcd_writedate(djfen%10+0x30);        
  245.                                                                 lcd_writecom(0x8A);
  246.                                                 }
  247.                                        
  248.                                 }
  249.                                 if(key3==0)
  250.                                 {
  251.                                                 Delay1ms(5);
  252.                                                 if(key3==0)
  253.                                                 {
  254.                                                                 djfen--;
  255.                                                         while(!key3);
  256.                                                                 if(djfen==255)
  257.                                                                         djfen=59;
  258.                                                                 lcd_writecom(0x89);
  259.                                                                
  260.                                                                 lcd_writedate(djfen/10+0x30);
  261.                                                                 lcd_writedate(djfen%10+0x30);        
  262.                                                                 lcd_writecom(0x8A);
  263.                                                 }
  264.                                 }
  265.                 }
  266.                 if(num==3)
  267.                 {
  268.                                 if(key2==0)
  269.                                 {
  270.                                                 Delay1ms(5);
  271.                                                 if(key2==0)
  272.                                                 {
  273.                                                                 djshi++;
  274.                                                                 while(!key2);
  275.                                                                 if(djshi==24)
  276.                                                                         djshi=0;
  277.                                                                 lcd_writecom(0x86);
  278.                                                                 lcd_writedate(djshi/10+0x30);
  279.                                                                 lcd_writedate(djshi%10+0x30);        
  280.                                                                 lcd_writecom(0x87);
  281.                                                 }
  282.                                                 
  283.                                 }
  284.                                 if(key3==0)
  285.                                 {
  286.                                                 Delay1ms(5);
  287.                                                 if(key3==0)
  288.                                                 {
  289.                                                                 djshi--;
  290.                                                                 while(!key3);
  291.                                                                 if(djshi==255)
  292.                                                                         djshi=23;
  293.                                                                 lcd_writecom(0x86);
  294.                                                                 lcd_writedate(djshi/10+0x30);
  295.                                                                 lcd_writedate(djshi%10+0x30);        
  296.                                                                 lcd_writecom(0x87);
  297.                                                 }
  298.                                 }
  299.                 }
  300.         
  301.                 if(key4==0)
  302.                 {
  303.                                 Delay1ms(5);
  304.                                 if(key4==0)
  305.                                 {
  306.                                                                 TR0=1;
  307.                                         lcd_writecom(0x0c);
  308.                                                 
  309.                                 }
  310.                                 
  311.                 }
  312. }


  313. void fmq()
  314. {
  315.         beep=1;
  316.         Delay1ms(5);
  317.         beep=0;
  318.         Delay1ms(5);
  319. }






  320. void main()
  321. {
  322.         led=1;
  323.                 LcdInit();
  324.                 Timer0Init();
  325.           Timer1Init();
  326.                 lcd_writestring(7,1,table4);
  327.         
  328.                 trig=0;
  329.                 while(1)
  330.                 {
  331.                         
  332.                         if(flag1s)
  333.                         {
  334.                                 flag1s=0;
  335.                                 startmodule();
  336.                                 start();
  337.                                 count();        
  338.                         }
  339.                         wdz=readtemp();
  340.                         if(num==0)display();
  341.                         keyscan();
  342.                                 if(djshi==0 && djfen==0 &&djmiao==0)  //倒计时时间到
  343.                                 {
  344.                                                 TR0=0;          //停止计时
  345.                                           fmq();
  346.                                         led=~led;
  347.                                 }        
  348.                                 
  349.                                 
  350.                 }
  351.                
  352. }








  353. void Timer0() interrupt 1
  354. {
  355.         
  356.                 TL0 = 15536%256;                //设置定时初值
  357.                 TH0 = 15536/256;                //设置定时初值
  358.                 r++;
  359.                 if(r==20)
  360.                 {
  361.                                 r=0;
  362.                                 djmiao--;
  363.                                 if(djmiao==255)
  364.                                 {
  365.                                                 djmiao=59;
  366.                                                 djfen--;
  367.                                                 if(djfen==255)
  368.                                                 {
  369.                                                                 djfen=59;
  370.                                                                 djshi--;
  371.                                                                 if(djshi==255)
  372.                                                                 {
  373.                                                                                 djshi=0;
  374.                                                                 }
  375.                                                                 if(djshi==0)
  376.                                                                 djfen=59;
  377.                                                                 if(djfen==0&djshi==0)
  378.                                                                         djfen=0;
  379.                                                                 write_sfm(6,djshi);
  380.                                                 }
  381.                                                 write_sfm(9,djfen);        
  382.                                         }
  383.                                         write_sfm(12,djmiao);
  384.                                         flag1s=1;
  385.                         }        
  386. }               


  387. void Timer1() interrupt 3
  388. {
  389.         flag=1;
  390. }








  391. void startmodule()
  392. {
  393.                 trig=1;
  394.         
  395.                 _nop_(); _nop_(); _nop_(); _nop_();
  396.           _nop_(); _nop_(); _nop_(); _nop_();
  397.           _nop_(); _nop_(); _nop_(); _nop_();
  398.           _nop_(); _nop_(); _nop_(); _nop_();
  399.           _nop_(); _nop_(); _nop_(); _nop_();
  400.           _nop_(); _nop_(); _nop_(); _nop_();
  401.         
  402.                 trig=0;
  403.         
  404. }


  405. void start()
  406. {
  407.                    while(!echo);                //当Echo为零时等待
  408.              TR1=1;                            //开启
  409.              while(echo);                //当Echo为1计数并等待
  410.              TR1=0;                                //关闭




  411. }


  412. void count()
  413. {
  414.         t=TH1*256+TL1;
  415.         TH1=0;
  416.         TL1=0;
  417.         wdz=readtemp();
  418.         distance=t*(0.607*wdz+331.5);
  419.         
  420.         if(distance >=600)
  421.         {
  422.                 lcd_writechar(0, 1, table3[11]);
  423.                 lcd_writechar(1, 1, table3[11]);
  424.                 lcd_writechar(2, 1, table3[10]);
  425.                 lcd_writechar(3, 1, table3[11]);
  426.                 lcd_writechar(4, 1, table3[13]);
  427.                 lcd_writechar(5, 1, table3[12]);
  428.         }
  429.         else if(distance <= 0)
  430.         {
  431.                 lcd_writechar(0, 1, table3[11]);
  432.                 lcd_writechar(1, 1, table3[11]);
  433.                 lcd_writechar(2, 1, table3[10]);
  434.                 lcd_writechar(3, 1, table3[11]);
  435.                 lcd_writechar(4, 1, table3[13]);
  436.                 lcd_writechar(5, 1, table3[12]);
  437.         }
  438.         else
  439.         {
  440.         cc[1]=distance/100;
  441.         cc[2]=distance/10%10;
  442.         cc[3]=distance%10;
  443.         lcd_writechar(0, 1, table3[cc[1]]);
  444.         lcd_writechar(1, 1, table3[cc[2]]);
  445.         lcd_writechar(2, 1, table3[10]);//显示点
  446.         lcd_writechar(3, 1, table3[cc[3]]);
  447.         lcd_writechar(4, 1, table3[13]);//显示点
  448.         lcd_writechar(5, 1, table3[12]);
  449.                 if(distance<=245)
  450.                                 {
  451.                                         beep=0;
  452.                                         led=~led;
  453.                                 }
  454.                                 else if(distance>=255)
  455.                                 {
  456.                                         beep=0;
  457.                                         led=~led;
  458.                                 }
  459.                                 else
  460.                                 {
  461.                                         beep=1;
  462.                                         led=1;
  463.                                 }
  464.         }
  465. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2022-5-24 16:03 | 只看该作者
distance=t*(0.607*wdz+331.5)/2000;

wdz已经在主循环中更新了
不用再在计算距离之前更新

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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