找回密码
 立即注册

QQ登录

只需一步,快速开始

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

新手求助!为什么这个程序显示不出温度?

[复制链接]
跳转到指定楼层
楼主
ID:978933 发表于 2021-11-15 10:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. sbit RS=P2^0;   
  4. sbit RW=P2^1;
  5. sbit E=P1^2;
  6. sbit DQ=P1^4;

  7. sbit led1=P0^0;
  8. sbit led2=P0^1;
  9. sbit led3=P0^2;
  10. sbit led4=P0^3;
  11. sbit led5=P0^4;
  12. sbit led6=P0^5;
  13. sbit led7=P0^6;
  14. sbit led8=P0^7;
  15. sbit buzz=P0^6;

  16. unsigned char a,b,c,d,e,f,g,h;
  17. static int readtemp=0;
  18. unsigned char s[]={"Temp:"};
  19. unsigned char str[]={"0123456789"};

  20. //************************************************************************
  21. void delay(unsigned int n)//Ñó3ùoˉêy
  22. {
  23.   unsigned i=0,j=0;
  24.     for(i=0;i<n;i++)
  25.     {
  26.       for(j=0;j<120;j++);
  27.     }
  28. }
  29. //*************************ds18b20****************************************
  30. void Write_DS18B20(unsigned char dat)
  31. {
  32.         unsigned char i;
  33.         for(i=0;i<8;i++)
  34.         {
  35.                 DQ = 0;
  36.                 DQ = dat&0x01;
  37.                 delay(5);
  38.                 DQ = 1;
  39.                 dat >>= 1;
  40.         }
  41.         delay(5);
  42. }
  43. unsigned char Read_DS18B20(void)
  44. {
  45.         unsigned char i;
  46.         unsigned char dat;

  47.         for(i=0;i<8;i++)
  48.         {
  49.                 DQ = 0;
  50.                 dat >>= 1;
  51.                 DQ = 1;
  52.                 if(DQ)  
  53.                 {
  54.                         dat |= 0x80;
  55.                 }            
  56.                 delay(5);
  57.         }
  58.         return dat;
  59. }
  60. bit init_ds18b20(void)
  61. {
  62.           bit initflag = 0;
  63.          
  64.           DQ = 1;
  65.           delay(12);
  66.           DQ = 0;
  67.           delay(80);
  68.           DQ = 1;
  69.           delay(10);
  70.           initflag = DQ;     
  71.           delay(5);

  72.           return initflag;
  73. }
  74. unsigned char Readtemp(void)
  75. {
  76.           char temp;  

  77.           init_ds18b20();
  78.           Write_DS18B20(0xCC);
  79.           Write_DS18B20(0x44);
  80.           delay(100);

  81.           init_ds18b20();
  82.           Write_DS18B20(0xCC);
  83.           Write_DS18B20(0xBE);
  84.     delay(100);
  85.           a = Read_DS18B20();
  86.           b = Read_DS18B20();

  87.           temp = ((b*256+a)>>4);   

  88.           return temp;
  89. }

  90. //*********************1602************************************
  91. void writedat(unsigned char dat)
  92. {
  93.   RS=1;
  94.     RW=0;  
  95.     E=0;   
  96.     P0=dat;
  97.     delay(5);
  98.     E=1;
  99.     E=0;
  100. }

  101. void writecom(unsigned char com)
  102. {
  103.   RS=0;
  104.     RW=0;  
  105.     E=0;  
  106.     P0=com;
  107.     delay(5);
  108.     E=1;
  109.     E=0;
  110. }
  111. void initlcd()
  112. {
  113.   writecom(0x38);  
  114.     writecom(0x0c);  
  115.     writecom(0x06);  
  116.     writecom(0x01);  
  117. }

  118. /*******************DòáDoÅ*************************************
  119. void disply18b20Rom(char Rom)
  120. {
  121.         char h,l;
  122.         l=Rom&0x0f;
  123.         h=Rom&0xf0;
  124.         h>>=4;
  125.         if((h>=0x00)&&(h<=0x30))
  126.         {
  127.                 writedat(h+0x30);
  128.         }
  129.                 else
  130.                         writedat(h+0x37);
  131.                 if((l>=0x00)&&(l<=0x09))
  132.                 {
  133.                         writedat(l+0x30);
  134.                 }
  135.                 else
  136.                         writedat(l+0x37);
  137.                
  138.         }*/

  139. //*************oˉêy********************************************
  140. void display()//ÏÔê¾oˉêy
  141. {
  142.         unsigned int temp0=0,temp1=0,temp2=0,i=0;
  143.         temp0=readtemp/100+'0';
  144.         temp1=(readtemp%100)/10+'0';
  145.         temp2=readtemp%10+'0';
  146.         writecom(0x80);  
  147.         delay(5);            
  148.         while(s[i]!='\0')
  149.         {
  150.           writedat(s[i]);
  151.                 delay(5);
  152.                 i++;
  153.         }
  154.         
  155.         writecom(0x80+6);  
  156.         delay(5);
  157.         writedat(' ');
  158.         delay(5);
  159.         writedat(str[temp0]);
  160.         delay(5);           
  161.         writedat(str[temp1]);
  162.         delay(5);            
  163.         writedat(str[temp2]);
  164.         delay(5);   
  165.   writedat('.');
  166.         delay(5);        
  167.         writedat('0');
  168.         delay(5);
  169.         writedat(0xDF);
  170.         delay(5);         
  171.         writedat('C');
  172.         delay(5);           
  173. }
  174. void displayfu()
  175. {
  176.         unsigned int temp0=0,temp1=0,temp2=0,i=0;
  177.         temp0=~readtemp/100+'0';
  178.         temp1=(~readtemp%100)/10+'0';
  179.         temp2=~readtemp%10+'0';
  180.         writecom(0x80);  
  181.         delay(5);            
  182.         while(s[i]!='\0')
  183.         {
  184.           writedat(s[i]);
  185.                 delay(5);
  186.                 i++;
  187.         }
  188.         
  189.         writecom(0x80+6);  
  190.         delay(5);
  191.         writedat('-');
  192.         delay(5);
  193.         writedat(str[temp0]);
  194.         delay(5);           
  195.         writedat(str[temp1]);
  196.         delay(5);            
  197.         writedat(str[temp2]);
  198.         delay(5);   
  199.   writedat('.');
  200.         delay(5);        
  201.         writedat('0');
  202.         delay(5);
  203.         writedat(0xDF);
  204.         delay(5);         
  205.         writedat('C');
  206.         delay(5);   
  207. }
  208. //************************Ö÷oˉêy******************************
  209. void main()
  210. {
  211.           int i;
  212.         initlcd();/*
  213.         void disply18b20Rom(char Rom);
  214. Write_DS18B20(0x33);
  215.         delay(1);
  216. a =Read_DS18B20();
  217.         b =Read_DS18B20();
  218.         c=Read_DS18B20();
  219.         d =Read_DS18B20();
  220.         e=Read_DS18B20();
  221.         f=Read_DS18B20();
  222.         g =Read_DS18B20();
  223.         h = Read_DS18B20();
  224.         writecom(0x80+0x40);
  225.         display18b20Rom(h);
  226. display18b20Rom(g);
  227. display18b20Rom(f);
  228. display18b20Rom(e);
  229. display18b20Rom(d);
  230. display18b20Rom(c);
  231. display18b20Rom(b);
  232. display18b20Rom(a);*/

  233.         while(1)
  234.         {
  235.                 if(Readtemp()==0)
  236.                 {
  237.                         writecom(0x01);
  238.                         readtemp=0;
  239.                         display();
  240.                 }
  241.                 else if(Readtemp()<150)
  242.                 {
  243.                         readtemp=Readtemp();
  244.                         display();
  245.                 }
  246.                 else
  247.                 {
  248.                         int a=0;
  249.                         a=Readtemp();
  250.                         readtemp=a-257;
  251.                         displayfu();
  252.                 }
  253.         if((readtemp>=20)||(readtemp<=10))
  254.                 {
  255.                         for(i=0;1>0;i++)
  256.                 {
  257.                         led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1;led8=1;
  258.                 buzz=1;
  259.                 delay(500);
  260.                         led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;led7=0;led8=0;
  261.                 buzz=0;
  262.                         delay(500);
  263.                 }
  264.         }
  265.         }
  266. }
复制代码



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

使用道具 举报

沙发
ID:744809 发表于 2021-11-15 11:41 | 只看该作者
这是做仿真还是实物?原理图不放上来吗
回复

使用道具 举报

板凳
ID:879348 发表于 2021-11-15 11:46 | 只看该作者
就问谁会耐心看完代码,提问也要自己把范围缩小
回复

使用道具 举报

地板
ID:624769 发表于 2021-11-15 12:46 | 只看该作者
一,最大的可能, LED没接,不然就不是说显示不出温度,而是说温度显示: xxxxxx.
二,第二大可能,18B20没有连接,不然就不会说显示不出温度,而是说18B20回传是:xxxxxx
三,可能调试都没调试过, 不然就会说串口回传 xxxx 属于正常范围,但是传给LED显示时为:xxxxxx
回复

使用道具 举报

5#
ID:976493 发表于 2021-11-15 14:04 来自手机 | 只看该作者
原理图呢,说明白你遇到的问题
回复

使用道具 举报

6#
ID:71233 发表于 2021-11-15 14:15 | 只看该作者
如果LCD能显示的话,我怀疑是延时不符合18B20的时序。18B20的时序是很严格的。
回复

使用道具 举报

7#
ID:446156 发表于 2021-11-15 15:27 | 只看该作者
DS18B20连接的IO口必须处于开漏状态,我对51不熟不知道P1口能不能设置为开漏状态,但是P0口是可以作为开漏输出的。还有必须加上拉电阻一般10K就行。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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