找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

ds18b20数码管显示开机温度一直是-0.06,数码管不能实时显示温度,请大家帮忙看看是...

查看数: 2259 | 评论数: 3 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-6-23 09:15

正文摘要:

程序在这里 #include<reg51.h> extern unsigned char code NumberData[12]; typedef  unsigned char uchar; typedef  unsigned int uint; sbit BUS=P2^6;//温度传感器接口 sbit LED_O ...

回复

ID:213173 发表于 2021-6-23 22:56
主要是时序问题


  1. #include<reg51.h>
  2. extern unsigned char code NumberData[12];
  3. typedef  unsigned char uchar;
  4. typedef  unsigned int uint;
  5. sbit BUS=P2^6;//温度传感器接口
  6. sbit LED_ONE = P2^0;//第一位数码管位选端口
  7. sbit LED_TWO = P2^1;//第一位数码管位选端口
  8. sbit LED_THREE = P2^2;//第一位数码管位选端口
  9. sbit LED_FOUR = P2^3;//第一位数码管位选端口
  10. volatile uchar GeWei,ShiWei,BaiWei,_Geiwei,_ShiWei;
  11. volatile bit Convert_yes_not=0;
  12. volatile char Negative=0;
  13. /**********************************
  14. 数码管编码
  15. **********************************/
  16. code unsigned char NumberData[12] ={
  17.       0x3f,//0
  18.           0x06,//1
  19.           0x5b,//2
  20.           0x4f,//3
  21.           0x66,//4
  22.           0x6d,//5
  23.           0x7d,//6
  24.           0x07,//7
  25.           0x7f,//8
  26.           0x6f,//9         
  27.           0x80,//DP
  28.           0x40 //negative
  29. };
  30. //延时子函数
  31. void Delay_4xN_US(uchar us)
  32. {
  33.     while(--us);
  34. }
  35. //初始化子函数
  36. void Timer0_Init()
  37. {
  38.         TMOD = 0x01;//定时器0模式1-16位定时器-
  39.         TCON = 0x00;//清零TCON
  40.         ET0  = 1;   //允许定时器0中断
  41.         TH0  = 0x3c;//定时100ms
  42.         TL0  = 0xb0;
  43.         TR0  = 1;   //启动定时器0
  44. }
  45. void DS18B20_Recover()
  46. {
  47.         BUS = 1;
  48.         Delay_4xN_US(5);//4us
  49.         BUS = 0;
  50.         Delay_4xN_US(200);//800us
  51.         Delay_4xN_US(200);
  52.         BUS = 1;
  53.         Delay_4xN_US(50);
  54.         BUS = 1;
  55.         Delay_4xN_US(25);
  56. }
  57. void SendProc(uchar proc)
  58. {
  59.         uchar i=0;
  60.         for(i=8; i>0; i--)
  61.         {
  62.                 BUS = 0;
  63.                 BUS = proc&0x01;
  64.                 Delay_4xN_US(25);
  65.                 BUS = 1;
  66.                 proc>>=1;
  67.         }
  68.         Delay_4xN_US(25);
  69. }
  70. uchar ReadOneByte()
  71. {
  72.         uchar i;
  73.         uchar dat=0;
  74.         for (i=8;i>0;i--)
  75.         {
  76.                 BUS = 0;
  77.                 dat>>=1;
  78.                 BUS = 1;
  79.                 if(BUS)
  80.                         dat|=0x80;
  81.                 Delay_4xN_US(25);
  82.         }
  83.         return dat;
  84. }
  85. void LED_DATE_Convert(uchar T_L,uchar T_H)
  86. {
  87.         uchar ZhengShu,MiddleShu;
  88.         uint XiaoShu;
  89.         if((T_H>>4)>0)//负数
  90.         {
  91.         Negative = 0xff;
  92.         MiddleShu =((~(T_L&0x0f))&0x0f)+1;
  93.         if(MiddleShu>>4>0)//有进位
  94.         {
  95.         ZhengShu = (~T_H)*16+((~T_L)>>4)+1;
  96.         XiaoShu =(MiddleShu&0x0f)*625;
  97.         }
  98.         else
  99.         {
  100.         ZhengShu = (~T_H)*16+((~T_L)>>4);
  101.         XiaoShu =(MiddleShu&0x0f)*625;
  102.         }
  103.         GeWei  = ZhengShu%10;
  104.         ShiWei = (ZhengShu/10)%10;
  105.         _Geiwei= XiaoShu/1000;
  106.         _ShiWei= (XiaoShu/100)%10;
  107.        
  108.         }
  109.         else//正数
  110.         {
  111.         Negative = 0x00;
  112.         ZhengShu = T_H*16+(T_L>>4);
  113.         XiaoShu =(T_L&0x0f)*625;
  114.         GeWei  = ZhengShu%10;
  115.         ShiWei = (ZhengShu/10)%10;
  116.         BaiWei = ZhengShu/100;
  117.         _Geiwei= XiaoShu/1000;
  118.         _ShiWei= (XiaoShu/100)%10;
  119.         }        
  120. }
  121. void LED_Show()
  122. {
  123.         switch(Negative)
  124.         {
  125.         case 0x00:        //正数
  126.         if(BaiWei!=0)
  127.         {
  128.         P0 = NumberData[BaiWei];
  129.         LED_ONE = 0;
  130.         Delay_4xN_US(100);//400us
  131.         LED_ONE = 1;
  132.         P0 = NumberData[ShiWei];
  133.         LED_TWO = 0;
  134.         Delay_4xN_US(100);//400us
  135.         LED_TWO = 1;
  136.         P0 = NumberData[GeWei]|NumberData[10];
  137.         LED_THREE = 0;
  138.         Delay_4xN_US(100);//400us
  139.         LED_THREE = 1;
  140.         P0 = NumberData[_Geiwei];
  141.         LED_FOUR = 0;
  142.         Delay_4xN_US(100);//400us
  143.         LED_FOUR = 1;
  144.         }
  145.         else
  146.         {
  147.         P0 = NumberData[ShiWei];
  148.         LED_ONE = 0;
  149.         Delay_4xN_US(100);//400us
  150.         LED_ONE = 1;
  151.         P0 = NumberData[GeWei]|NumberData[10];
  152.         LED_TWO = 0;
  153.         Delay_4xN_US(100);//400us
  154.         LED_TWO = 1;
  155.         P0 = NumberData[_Geiwei];
  156.         LED_THREE = 0;
  157.         Delay_4xN_US(100);//400us
  158.         LED_THREE = 1;
  159.         P0 = NumberData[_ShiWei];
  160.         LED_FOUR = 0;
  161.         Delay_4xN_US(100);//400us
  162.         LED_FOUR = 1;
  163.         }
  164.         break;
  165.         case 0xff:        //负数
  166.         if(ShiWei!=0)
  167.         {
  168.         P0 = NumberData[11];
  169.         LED_ONE = 0;
  170.         Delay_4xN_US(100);//400us
  171.         LED_ONE = 1;
  172.         P0 = NumberData[ShiWei];
  173.         LED_TWO = 0;
  174.         Delay_4xN_US(100);//400us
  175.         LED_TWO = 1;
  176.         P0 = NumberData[GeWei]|NumberData[10];
  177.         LED_THREE = 0;
  178.         Delay_4xN_US(100);//400us
  179.         LED_THREE = 1;
  180.         P0 = NumberData[_Geiwei];
  181.         LED_FOUR = 0;
  182.         Delay_4xN_US(100);//400us
  183.         LED_FOUR = 1;
  184.         }
  185.         else
  186.         {
  187.         P0 = NumberData[11];
  188.         LED_ONE = 0;
  189.         Delay_4xN_US(100);//400us
  190.         LED_ONE = 1;
  191.         P0 = NumberData[GeWei]|NumberData[10];
  192.         LED_TWO = 0;
  193.         Delay_4xN_US(100);//400us
  194.         LED_TWO = 1;
  195.         P0 = NumberData[_Geiwei];
  196.         LED_THREE = 0;
  197.         Delay_4xN_US(100);//400us
  198.         LED_THREE = 1;
  199.         P0 = NumberData[_ShiWei];
  200.         LED_FOUR = 0;
  201.         Delay_4xN_US(100);//400us
  202.         LED_FOUR = 1;
  203.         }
  204.         break;
  205.         }
  206. }
  207. void Timer_Interrupt() interrupt 1
  208. {
  209.         uchar T_dat_L,T_dat_H;
  210.         P0=0x00;
  211.         TH0  = 0x3c;//定时100ms
  212.         TL0  = 0xb0;
  213.         if(Convert_yes_not==0)
  214.         {
  215.         DS18B20_Recover();//复位
  216.         SendProc(0xcc);//ROM跳过指令
  217.         SendProc(0x44);//数据转换指令
  218.         Convert_yes_not=1;
  219.         }
  220.         else
  221.         {
  222.         DS18B20_Recover();//复位
  223.         SendProc(0xcc);//ROM跳过指令
  224.         SendProc(0xbe);//数据读取指令
  225.         T_dat_L = ReadOneByte();//读取数据
  226.         T_dat_H = ReadOneByte();//读取数据
  227.         LED_DATE_Convert(T_dat_L,T_dat_H);
  228.         Convert_yes_not=0;
  229.         }
  230. }
  231. //主函数
  232. void main()
  233. {
  234.         P0=0x00;
  235.         P2=0xff;
  236.         DS18B20_Recover();//复位
  237.         Timer0_Init();
  238.         EA =1;//开放中断
  239.         while(1)
  240.         {
  241.                 LED_Show();
  242.         }
  243. }
复制代码



ID:123289 发表于 2021-6-23 16:29
先把R3改为100欧。
ID:739545 发表于 2021-6-23 10:35
18b20为啥接那么多电阻

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

Powered by 单片机教程网

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