找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

单片机ds18b20仿真数值显示不正常?

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

正文摘要:

我设置的温度超过60度LED等就会亮,温度没超过60度时,数码管显示温度值正常,但是还是有一堆的看不懂的提醒定位是ds18b20好像有问题;然后温度超过60度后,LED灯亮,但是数码管不显示温度值,调节温度传感器也没有 ...

回复

ID:213173 发表于 2019-3-24 10:35
你的程序没有大毛病。可能是时序有点问题,另外把读温度程序放在时标 if(y==1)内为佳。修改后功能正常。

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit du26=P2^6;//数码管段选
  6. sbit we27=P2^7;//数码管位选
  7. sbit DS=P2^2;//温度传感器
  8. sbit led1=P3^7;//led
  9. uchar code smgdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9数码管段表
  10. uchar code smgwei[]={0xfe,0xfd,0xfb,0xf7};       //1~4数码管位表
  11. uchar TempData[4];//显示值缓存
  12. //uint sum,wendu;
  13. //uint tt;
  14. bit y;

  15. void delay_us(uchar us)//约2us延时函数
  16. {
  17.         while(--us);
  18. }
  19. void delay(uchar z)//约1ms延时函数
  20. {
  21.         while(z--)
  22.         {
  23.                 delay_us(245);
  24.                 delay_us(245);
  25.         }
  26. }
  27. void we(uchar z) //位选
  28. {
  29. //        we27=0;
  30.         P0=z;
  31.         we27=1;
  32.         we27=0;        
  33. }
  34. void du(uchar z)   //段选
  35. {
  36. //        du26=0;
  37.         P0=z;
  38.         du26=1;
  39.         du26=0;
  40. }
  41. void display() //4个数码管显示
  42. {
  43.         static uchar wei;
  44.         du(0x00);                        //消隐
  45.         we(smgwei[wei]);        //送位码
  46.         du(TempData[wei]);//送段码
  47.         wei++;
  48.         wei%=4;
  49. }
  50. //读一个字节
  51. uchar read_byte()
  52. {
  53.         uchar i,dat;
  54.         for(i=0;i<8;i++)
  55.         {
  56.                 DS=0;
  57.                 dat>>=1;
  58.                 DS=1;
  59.                 if(DS)
  60.                         dat|=0x80;
  61.                 delay_us(25);
  62.         }
  63.         return (dat);
  64. }  
  65. //写一个字节
  66. void write_byte(uchar dat)
  67. {
  68.         uchar i;
  69.         for(i=0;i<8;i++)
  70.         {
  71.                 DS=0;
  72.                 DS=dat&0x01;
  73.                 delay_us(25);//延时
  74.                 DS=1;//释放总线准备下一次数据的写入
  75.                 dat>>=1;
  76.         }
  77. }
  78. //单总线初始化时序         
  79. bit ds_init()
  80. {
  81.         bit i;
  82.         DS=1;
  83.         delay_us(5);
  84.         DS=0;
  85.         delay_us(200);//拉低总线499.45us,总线上的温度传感器将会被全部复位
  86.         delay_us(200);
  87.         DS=1;//释放总线
  88.         delay_us(50);//延时37.95us,等待温度传感器发回存在信号       
  89.         i=DS;
  90.         delay_us(25);//延时141.95us,读取温度传感器存在的时间
  91.         return (i);
  92. }
  93. uint ReadTemperature()
  94. {
  95.         uint H,i;
  96.         uchar L;
  97.         ds_init();//初始化温度传感器
  98.         write_byte(0xcc);//发送跳跃ROM指令
  99.         write_byte(0x44);//发送温度转换指令
  100.         delay(10);
  101.         ds_init();//初始化温度传感器
  102.         write_byte(0xcc);//发送跳跃ROM指令
  103.         write_byte(0xbe);//读取温度传感器暂存器的值
  104.         L=read_byte();
  105.         H=read_byte();
  106.         H<<=8;
  107.         i=L+H;
  108.         return(i);
  109. }
  110. void Timer0Init()                //2毫秒@12.000MHz
  111. {
  112.         TMOD= 0x01;                //设置定时器模式
  113.         TL0 = 0x30;                //设置定时初值
  114.         TH0 = 0xF8;                //设置定时初值
  115.         TR0 = 1;                //定时器0开始计时
  116.         EA=1;
  117.         ET0=1;
  118. }
  119. void main()
  120. {        
  121.         uint  temp;
  122.         uchar TempH,TempL;
  123.         bit   negative;//负数标志

  124.         Timer0Init();      
  125.         while(1)           
  126.         {
  127.                 if(y==1)         
  128.                 {
  129.                         y=0;
  130.                         temp=ReadTemperature();//读取温度
  131.                         if(temp&0x8000)
  132.                         {
  133.                                 negative=1;                //负号标志
  134.                                 temp=~temp;                //取反加1
  135.                                 temp +=1;
  136.                         }
  137.                         else negative=0;        //正数

  138.                         TempH=temp>>4;                //分解为整数
  139.                         TempL=temp&0x0F;        //分解为小数
  140.                         TempL=TempL*6/10;        //保留一位小数

  141.                         if(negative==1)
  142.                                 TempData[0]=0x40;//显示负号
  143.                         else if(TempH/100==0)//小于100
  144.                                 TempData[0]=0;                                                //百位消隐
  145.                         else
  146.                                 TempData[0]=smgdu[TempH/100]; //显示百位温度
  147.        
  148.                         if((TempH/100==0)&&((TempH%100)/10==0))
  149.                                 TempData[1]=0;                                                //十位消隐
  150.                         else
  151.                                 TempData[1]=smgdu[(TempH%100)/10];        //显示十位温度
  152.                         TempData[2]=smgdu[(TempH%100)%10]|0x80;//显示个位温度,带小数点
  153.                         TempData[3]=smgdu[TempL];                                        //显示小数温度1位       
  154.                 }
  155.                 if(TempH>=60)          //温度超过60度,LED灯亮
  156.                         led1=0;
  157.                 else        led1=1;       
  158.         }
  159. }
  160. void timer0int() interrupt 1 //定时器,定时2ms
  161. {
  162.         static uchar num;
  163.         TL0 = 0x30;                //设置定时初值
  164.         TH0 = 0xF8;                //设置定时初值
  165.         display();
  166.         num++;
  167.         if(num>=250)   //延时500ms显示温度数值
  168.         {
  169.                 num=0;
  170.                 y=1;
  171.         }        
  172. }
复制代码



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

Powered by 单片机教程网

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