找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 550|回复: 5
收起左侧

温度值不能正确显示 求指导如何修改单片机程序

[复制链接]
ID:1005855 发表于 2022-5-22 19:46 | 显示全部楼层 |阅读模式
VQKOLFB]B~`}U163THHBIFN.png

单片机源程序如下:
  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. bit flag=0;
  22. bit flag1s=0;


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




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






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


  36. void Init_ds18b20(void)
  37. {
  38.         unsigned char x=0;
  39.         DQ = 1;          //DQ拉高
  40.         Delay1ms(8);
  41.         DQ = 0;          //DQ拉低,    将总线拉低,持续时间为480us到960us之间
  42.         Delay1ms(80);
  43.         DQ = 1;
  44.         Delay1ms(14);
  45.         x=DQ;
  46.         Delay1ms(20);
  47. }


  48. unsigned char read(void)
  49. {
  50.         unsigned char i=0;
  51.   unsigned char dat = 0;
  52.         for (i=8;i>0;i--)
  53.         {
  54.                 DQ = 0;
  55.                 dat>>=1;
  56.                 DQ = 1;
  57.                 if(DQ)
  58.                 {
  59.                         dat|=0x80;
  60.                         Delay1ms(4);
  61.                 }
  62.         }
  63.         return(dat);
  64. }


  65. void write(unsigned char dat)
  66. {
  67.         unsigned char i=0;
  68.   for (i=8; i>0; i--)
  69.         {
  70.                 DQ = 0;
  71.                 DQ = dat&0x01;
  72.                 if(DQ)
  73.                 {
  74.                         Delay1ms(1);
  75.                         DQ = 1;
  76.                 }
  77.                 else
  78.                 {
  79.                         Delay1ms(5);
  80.                         DQ = 1;
  81.                 }
  82.                 dat>>=1;
  83.         }
  84. }        


  85. unsigned char readtemp(void)
  86. {
  87.         unsigned char a=0,b=0;
  88.         unsigned int temp=0;
  89.         Init_ds18b20();
  90.         write(0xcc);// 跳过读序列号操作
  91.         write(0xcc);// 启动温度转换
  92.         Delay1ms(100);
  93.         write(0xcc);
  94.         write(0xbe);//读取温度寄存器
  95.         Delay1ms(100);
  96.         a=read();//读温度低位
  97.         b=read();//读温度高位
  98.         temp=((b*256+a)>>4); //当前采集温度除16得到实际温度
  99.         return(temp);
  100. }


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


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




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


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




  162.                


  163. void write_sfm(uchar add,uchar date)
  164. {
  165.                 lcd_writecom(0x80+add);
  166.                 lcd_writedate(date/10+0x30);
  167.                 lcd_writedate(date%10+0x30);
  168.                 lcd_writecom(0x80+add+1);
  169. }




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


  317. void fmq()
  318. {
  319.         beep=1;
  320.         Delay1ms(5);
  321.         beep=0;
  322.         Delay1ms(5);
  323. }






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








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


  392. void Timer1() interrupt 3
  393. {
  394.         flag=1;
  395. }



  396. void startmodule()
  397. {
  398.                 trig=1;
  399.         
  400.                 _nop_(); _nop_(); _nop_(); _nop_();
  401.           _nop_(); _nop_(); _nop_(); _nop_();
  402.           _nop_(); _nop_(); _nop_(); _nop_();
  403.           _nop_(); _nop_(); _nop_(); _nop_();
  404.           _nop_(); _nop_(); _nop_(); _nop_();
  405.           _nop_(); _nop_(); _nop_(); _nop_();
  406.         
  407.                 trig=0;
  408.         
  409. }


  410. void start()
  411. {
  412.                    while(!echo);                //当Echo为零时等待
  413.              TR1=1;                            //开启
  414.              while(echo);                //当Echo为1计数并等待
  415.              TR1=0;                                //关闭




  416. }


  417. void count()
  418. {
  419.         t=TH1*256+TL1;
  420.         TH1=0;
  421.         TL1=0;
  422.         distance=t*0.17;
  423.         
  424.         if(distance >=600)
  425.         {
  426.                 lcd_writechar(0, 1, table3[11]);
  427.                 lcd_writechar(1, 1, table3[11]);
  428.                 lcd_writechar(2, 1, table3[10]);
  429.                 lcd_writechar(3, 1, table3[11]);
  430.                 lcd_writechar(4, 1, table3[13]);
  431.                 lcd_writechar(5, 1, table3[12]);
  432.         }
  433.         else if(distance <= 0)
  434.         {
  435.                 lcd_writechar(0, 1, table3[11]);
  436.                 lcd_writechar(1, 1, table3[11]);
  437.                 lcd_writechar(2, 1, table3[10]);
  438.                 lcd_writechar(3, 1, table3[11]);
  439.                 lcd_writechar(4, 1, table3[13]);
  440.                 lcd_writechar(5, 1, table3[12]);
  441.         }
  442.         else
  443.         {
  444.         cc[1]=distance/100;
  445.         cc[2]=distance/10%10;
  446.         cc[3]=distance%10;
  447.         lcd_writechar(0, 1, table3[cc[1]]);
  448.         lcd_writechar(1, 1, table3[cc[2]]);
  449.         lcd_writechar(2, 1, table3[10]);//显示点
  450.         lcd_writechar(3, 1, table3[cc[3]]);
  451.         lcd_writechar(4, 1, table3[13]);//显示点
  452.         lcd_writechar(5, 1, table3[12]);
  453.                 if(distance<=245)
  454.                                 {
  455.                                         beep=0;
  456.                                         led=~led;
  457.                                 }
  458.                                 else if(distance>=255)
  459.                                 {
  460.                                         beep=0;
  461.                                         led=~led;
  462.                                 }
  463.                                 else
  464.                                 {
  465.                                         beep=1;
  466.                                         led=1;
  467.                                 }
  468.         }
  469. }
复制代码
回复

使用道具 举报

ID:1005855 发表于 2022-5-22 19:46 | 显示全部楼层
请问该怎么改动才能正确显示温度值呢
回复

使用道具 举报

ID:213173 发表于 2022-5-23 07:27 | 显示全部楼层
lj2443454061 发表于 2022-5-22 19:46
请问该怎么改动才能正确显示温度值呢

void display()
{
        unsigned int temp0=0,temp1=0,temp2=0;
        temp0=wdz/100;
        temp1=(wdz%100)/10;
        temp2=wdz%10;
        Delay1ms(5);
        lcd_writechar(11, 1, table3[temp0]);
        Delay1ms(5);
        lcd_writechar(12, 1, table3[temp1]);
        Delay1ms(5);
        lcd_writechar(13, 1, table3[temp2]);
        Delay1ms(5);
        lcd_writechar(14, 1, 0xdf);
        Delay1ms(5);;
        lcd_writechar(15, 1, table3[13]);
        Delay1ms(5);
}
回复

使用道具 举报

ID:390416 发表于 2022-5-23 08:14 | 显示全部楼层
基于STC89C52单片机LCD1602显示的DS1302时钟带温度采集显示
回复

使用道具 举报

ID:1005855 发表于 2022-5-23 10:09 | 显示全部楼层
谢谢,我用仿真调试一下可以正确显示,但是按键调整时间好像有冲突,按设置键光标会在温度哪里来回闪,请问怎么解决呢
回复

使用道具 举报

ID:161164 发表于 2022-5-23 11:11 | 显示全部楼层
调时间的时候停止温度显示更新

405行   if(num==0)display();
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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