找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

这是个关于DS18B20的单片机测温程序 但是显示的温度为什么一直在15度啊 求大神

查看数: 3749 | 评论数: 2 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-4-28 20:06

正文摘要:

单片机源程序如下: #include<reg51.h>                               #include<intrins.h ...

回复

ID:539433 发表于 2019-6-4 10:28
wulin 发表于 2019-4-29 09:14
你的程序主要有两处错误:
1.DS18B20读取时序错误,Delay_us(480);uchar最大只能255,其它小延时也做了调 ...

这个帖子对我太有用了,最近也在研究lcd显示
ID:213173 发表于 2019-4-29 09:14
你的程序主要有两处错误:
1.DS18B20读取时序错误,Delay_us(480);uchar最大只能255,其它小延时也做了调整。
2.需要显示的数据分解方法错误,temp是uchar型数据,怎么能str3[temp%1000/100])、str3[temp%100/10]);
修改后的程序如下:




  1. #include<reg51.h>                              
  2. #include<intrins.h>
  3. #include <absacc.h>
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define BUSY  0x80
  7. void Delay(uint);
  8. void init_LCD();
  9. void LCD_Com(uchar,uchar);
  10. void LCD_Data(uchar);
  11. void ReadyLCD();
  12. void Display_char(uchar X,uchar Y,uchar Data);
  13. void Display_str(uchar,uchar,uchar code *Data);
  14. void LCDDisplay();
  15. void init_18B20();
  16. uchar Read_18B20();
  17. void Write_18B20(uchar dat);
  18. void Read_temp1();
  19. void Delay_us(uchar i);
  20. void Key_scan( );
  21. void Key_set( );
  22. void Key_inc( );
  23. void Key_dec( );
  24. void Alarm( );
  25. sbit relay=P3^3;
  26. sbit triac1=P3^0;
  27. sbit triac2=P3^1;
  28. sbit triac3=P3^2;
  29. sbit LCD_RS=P2^0;
  30. sbit LCD_RW=P2^1;
  31. sbit LCD_EN=P2^2;
  32. sbit DQ=P1^7;
  33. sbit Normal=P2^4;
  34. sbit Alarm_B=P2^5;
  35. sbit Alarm_R=P2^6;
  36. sbit Alarm_BEEP=P2^7;

  37. uchar Set_flag=0;
  38. uchar Temp_set1,Temp_set2;        //用于存放读到的值
  39. uchar temp,temp1,temp2;
  40. extern uchar code str0[]={"C   :    D :    "};                        //显示设置1
  41. extern uchar code str1[]={"Mode:    DC:    "};                        //显示设置2
  42. extern uchar code str2[]={"    Hellow!!    "};
  43. extern uchar code str3[]={"0123456789"};
  44. extern uchar code mode[]={"NCD"};
  45. bit ON_OFF=0;   
  46. bit outflag;   
  47. bit write=0;  

  48. void main()                        //主程序
  49. {
  50.         P1=0xff;
  51.         P2|=0x70;
  52.         P2&=0x7f;
  53.         Temp_set1=40;          //设置温度40
  54.         Temp_set2=1;          //设置档位1
  55.         Delay(500);             //延时500ms
  56.         init_LCD();              //LCD初始化
  57.         init_18B20();            //DS18B20初始化
  58.         Display_str(0,0,str2);     //开机界面
  59.         Display_str(0,1,str2);     //开机界面
  60.         Delay(2000);                           //延迟
  61.         Display_str(0,0,str0);           //显示设置str0
  62.         Display_str(0,1,str1);           //显示设置str1
  63.         while(1)
  64.         {
  65.                 Key_scan();       //扫描键盘
  66.                 Read_temp1();     //读取温度               
  67.                 LCDDisplay();        //显示
  68.                 Alarm();         //指示灯与报警程序
  69.                 Delay(1000);                 //延迟
  70.         }
  71. }

  72. /********延时kms********/
  73. void Delay(uint k)
  74. {
  75.         uint i,j;
  76.         for(i=0;i<k;i++)
  77.                 for(j=0;j<60;j++);
  78. }
  79. /********精确延时********/
  80. void Delay_us(uchar i)
  81. {
  82.   while(--i);
  83. }

  84. /********显示模块********/
  85. /********LCD初始化********/
  86. void init_LCD()
  87. {
  88.         P0=0;
  89.         Delay(15);
  90.         LCD_Com(0x38,0);
  91.         Delay(5);
  92.         LCD_Com(0x38,0);
  93.         Delay(5);
  94.         LCD_Com(0x38,0);
  95.         Delay(5);
  96.         LCD_Com(0x38,1);  //8位数据传送,2行显示,5*7字形
  97.         LCD_Com(0x08,1);  //关闭显示
  98.         LCD_Com(0x01,1);  //清屏
  99.         LCD_Com(0x06,1);  //显示光标右移设置
  100.         LCD_Com(0x0c,1);  //显示屏打开,光标不显示不闪烁
  101. }

  102. /********写指令数据到LCD********/
  103. void LCD_Com(uchar LC,uchar BC)
  104. {
  105.         if(BC) ReadyLCD();
  106.         P0=LC;
  107.         LCD_RS=0;      //选中指令寄存器
  108.         LCD_RW=0;      //写模式
  109.         LCD_EN=1;
  110.         _nop_();
  111.         _nop_();
  112.         _nop_();
  113.         LCD_EN=0;
  114. }

  115. /********写显示数据到LCD********/
  116. void LCD_Data(uchar LD)
  117. {
  118.         ReadyLCD();
  119.         P0=LD;
  120.         LCD_RS=1;      //选中数据寄存器
  121.         LCD_RW=0;      //写模式
  122.         LCD_EN=1;
  123.         _nop_();
  124.         _nop_();
  125.         _nop_();
  126.         LCD_EN=0;
  127. }

  128. /********检测LCD忙状态********/
  129. void ReadyLCD()
  130. {
  131.         P0=0xff;
  132.         LCD_RS=0;
  133.         LCD_RW=1;
  134.         LCD_EN=1;
  135.         _nop_();
  136.         while(P0&BUSY)
  137.         {
  138.                 LCD_EN=0;
  139.                 _nop_();
  140.           _nop_();
  141.                 LCD_EN=1;
  142.                 _nop_();
  143.           _nop_();
  144.         }
  145.   LCD_EN=0;
  146. }

  147. /********显示一个字符********/
  148. void Display_char(uchar X,uchar Y,uchar Data)
  149. {
  150.         Y&=1;
  151.         X&=15;
  152.         if(Y) X|=0x40;
  153.         X|=0x80;
  154.         LCD_Com(X,0);
  155.         LCD_Data(Data);
  156. }

  157. /********显示一串字符********/
  158. void Display_str(uchar X,uchar Y,uchar code *Data)
  159. {
  160.         uchar List=0;
  161.         Y&=0x01;
  162.         X&=0x0f;
  163.         while(X<16)
  164.         {
  165.                 Display_char(X,Y,Data[List]);
  166.                 List++;
  167.                 X++;
  168.         }               
  169. }




  170. /********温度测量模块********/
  171. /********DS18B20初始化********/
  172. void init_18B20()
  173. {
  174.         uchar x=0;
  175.         DQ=1;            //DQ复位
  176.         Delay_us(5);       //延时
  177.         DQ=0;            //将DQ拉低
  178.         Delay_us(200);     //精确延时大于480us
  179.         Delay_us(200);
  180.         DQ=1;            //拉高总线
  181.         Delay_us(50);
  182.         x=DQ;
  183.         Delay_us(25);
  184. }

  185. /********从DS18B20读取一个字节数据********/
  186. uchar Read_18B20()
  187. {
  188.         uchar i=0;
  189.         uchar dat=0;
  190.         for(i=8;i>0;i--)
  191.         {
  192.                 DQ=0;
  193.                 dat>>=1;
  194.                 DQ=1;
  195. //                Delay_us(1);
  196.                 if(DQ)
  197.                 dat|=0x80;
  198.                 Delay_us(25);
  199.         }
  200.         return(dat);
  201. }


  202. /********向DS18B20写入一个字节数据********/
  203. void Write_18B20(uchar dat)
  204. {
  205.         uchar i=0;
  206.         for(i=8;i>0;i--)
  207.         {
  208.                 DQ=0;
  209.                 _nop_();
  210.                 DQ=dat&0x01;
  211.                 Delay_us(25);
  212.                 DQ=1;
  213.                 dat>>=1;
  214.                 Delay_us(25);
  215.         }
  216. }

  217. /********从DS18B20读取温度********/
  218. void Read_temp1()
  219. {
  220.         uchar a=0;
  221.         uint b=0;
  222.         uint t=0;
  223. //        float tt;
  224.         init_18B20();
  225.         Write_18B20(0xcc);                //写跳过读ROM指令
  226.         Write_18B20(0x44);                //写跳过读ROM指令
  227.         Delay(20);
  228.         init_18B20();
  229.         Write_18B20(0xcc);
  230.         Write_18B20(0xbe);
  231.         a=Read_18B20();
  232.         b=Read_18B20();
  233.         b<<=8;
  234.         t=a+b;
  235.         temp=t>>4;
  236. }

  237. /********显示子程序********/
  238. void LCDDisplay()
  239. {
  240.         LCD_Com(0x0c,1);                        
  241.         Display_str(0,0,str0);     
  242.         Display_str(0,1,str1);   
  243.         Display_char(5,0,str3[Temp_set1/10]);
  244.         Display_char(6,0,str3[Temp_set1%10]);
  245.         Display_char(13,0,str3[Temp_set2/10]);
  246.         Display_char(14,0,str3[Temp_set2%10]);
  247.         Display_char(5,1,mode[Set_flag]);
  248.         Display_char(13,1,str3[temp/10%10]);
  249.         Display_char(14,1,str3[temp%10]);
  250. }
  251. /********键盘扫描程序********/
  252. void Key_scan( )
  253. {

  254.         P1=0xff;
  255.         if(P1!=0xff)
  256.         {
  257.                 Delay(20);  //延时消抖
  258.                 if(P1!=0xff)
  259.                 {
  260.                        
  261.                         switch(P1)
  262.                         {
  263.                                 case 0xfe:Key_set();break; //P1.0按下,功能选择
  264.                                 case 0xfd:Key_inc();break; //P1.1按下,数字加一
  265.                                 case 0xfb:Key_dec();break; //P1.2按下,数字减一
  266.                                 default:break;
  267.                         }
  268.                 }
  269.         }
  270. }

  271. /********工作模式子程序********/
  272. void Key_set( )
  273. {
  274.         Set_flag++;
  275.         if(Set_flag>=3)  //设定温度值
  276.                 Set_flag=0;    //设定档位值
  277. }

  278. /********按键加一子程序********/
  279. void Key_inc( )
  280. {
  281.         switch(Set_flag)
  282.         {
  283.                 case 1:Temp_set1++;
  284.                        if(Temp_set1>=99) Temp_set1=99;break;
  285.                 case 2:Temp_set2++;
  286.                        if(Temp_set2>=Temp_set1) Temp_set2=Temp_set1;break;
  287.                 default:break;
  288.         }
  289. }

  290. /********按键减一子程序********/
  291. void Key_dec( )
  292. {
  293.       
  294.         switch(Set_flag)
  295.         {
  296.                 case 1:Temp_set1--;
  297.                        if(Temp_set1<=Temp_set2) Temp_set1=Temp_set2;break;
  298.                 case 2:Temp_set2--;
  299.                        if(Temp_set2<=1) Temp_set2=1;break;
  300.                 default:break;
  301.         }
  302. }

  303. /********报警和指示程序********/
  304. void Alarm( )
  305. {
  306.         uchar C;

  307.         C=Temp_set1+5;
  308.       
  309.         if(temp>C)
  310.         {
  311.                 Normal=1;
  312.                 Alarm_B=0;
  313.                 Alarm_R=1;
  314.                 Alarm_BEEP=1;
  315.   }
  316.          else
  317.          {
  318.             Normal=1;
  319.                 Alarm_B=1;
  320.                 Alarm_R=0;
  321.                 Alarm_BEEP=0;
  322.          }
  323. }

复制代码



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

Powered by 单片机教程网

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