久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1140|回復: 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. }
復制代碼
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频三区 | 久久精品99| 在线日韩欧美 | 成人免费视频网 | 成人片在线看 | 亚洲国产精品精华素 | 国产一区二区三区色淫影院 | 精彩视频一区二区三区 | 久久精品国产免费 | av黄色网 | 国产亚洲精品精品国产亚洲综合 | 91精品国产乱码久久久久久久久 | 九九综合九九 | 懂色av一区二区三区在线播放 | 97国产精品 | 99精品国产一区二区三区 | 羞羞免费网站 | 亚洲国产欧美在线人成 | 亚洲一区二区三区在线播放 | 综合成人在线 | 亚洲午夜精品一区二区三区 | 国产精品1区2区 | 国产日韩欧美在线观看 | 中文字幕精品视频 | www.国产日本 | 亚洲一区二区中文字幕 | 九九综合 | 国产在线资源 | 香蕉一区二区 | 99re在线视频 | 三级成人在线 | 视频在线一区二区 | 成人精品视频在线观看 | 国产一区二区观看 | 在线观看av中文字幕 | 欧美一区不卡 | 精品一区二区在线观看 | 正在播放国产精品 | 国产精品久久久久久久久久久新郎 | 成人免费淫片aa视频免费 | 精品二区 |