找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机动态数码管显示DS18B20测温显示程序

[复制链接]
跳转到指定楼层
楼主
动态数码管显示DS18B20测温显示,折腾好几天了,终于搞定了,开始要么不能正常显示温度,要么乱跳动。究其原因是DS18B20读写的时序太严格了,程序中动态数码管显示需要开定时中断扫描显示,折腾多天的问题就是这个定时中断打断了正常的读写时序。附上显示正常的程序,供初学者参考


单片机源程序如下:
  1. /*********
  2. 测试DS18B20测温数码管动态显示
  3. **********/
  4. #include<STC90C52.h>
  5. #include"ds18b20.h"

  6. #define uchar unsigned char
  7. #define uint  unsigned int

  8. #define LedDuan  P0      /*定义数码管段码的控制脚*/
  9. #define LedWei P2    /*定义数码管位码的控制脚*/

  10. sbit        Out0=P3^2;//增氧泵控制输出

  11. uchar code NumTab[]={//显示段码共阳码64231750
  12. 0x21,0xEB,0x85,0x83,0x4B,0x13,0x11,0xAB,0x01,0x03,  //"9"
  13. 0x09,0x51,0x35,0xC1,0x15,0x1D,0x49,0x75,0x29,0x61,0x0D,0xD1,0xDF,0xFF,0x3D,0xD9};
  14. //A   B     C    D    E   F    H    I    N    U    P    o     -  熄灭  T     n
  15. uchar code DisBit[]={/*0xfe,*/0xfd,0xfb,0xf7,0xef,0xdf,0xbf/*,0x7f*/};//LED位驱动
  16. uchar data DisBuf[6]={0xff,0xff,0xff,0xff,0xff,0xff}; /*显示段码缓冲值*/
  17. uchar data DisBitCnt=0;//显示第几位选择



  18. /*****************************************************************
  19. 函数名:毫秒级CPU延时函数
  20. 调  用:delay (?);
  21. 参  数:1~65535(参数不可为0)
  22. 返回值:无
  23. 结  果:占用CPU方式延时与参数数值相同的毫秒时间
  24. 备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
  25. /******************************************************************/
  26. void DelaymsN(uint t)
  27. {
  28.         uint i;               //定义变量
  29.         for(;t>0;t--)             //如果t大于0,t减1(外层循环)
  30.         for(i=120;i>0;i--);         //i等于124,如果i大于0,i减1
  31. }
  32. /******************************
  33. 初始化设置定时器0,2MS at 12Mhz
  34. ******************************/
  35. void timeinit() /*定义中断方式*/
  36. {
  37.     TMOD=0x01;  /*定时0,1工作在方式1*/
  38.     TH0=0xf8;//(65535-1000)/256;//定时1MS*2_6Mhz=2Ms
  39.     TL0=0x2f;//(65535-1000)%256;
  40.     ET0=1;     /*开定时器0中断*/

  41. //        ClearEPROM();

  42. //        ReadE2P();//读出设定的值
  43.           EA=1;     /*开总中断*/
  44.         TR0=1;
  45. }
  46. /********
  47. 显示数据处理
  48. ************/
  49. /*******************************************************************************
  50. * 函 数 名         : LcdDisplay()
  51. * 函数功能                   : LCD显示读取到的温度
  52. * 输    入         : v
  53. * 输    出         : 无
  54. *******************************************************************************/

  55. void DisplayTablex(int temp)          //lcd显示
  56. {
  57.            float tp;  
  58.         if(temp< 0)                                //当温度值为负数
  59.           {
  60.                 DisBuf[0] = 0xdf; //显示-号
  61.                 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
  62.                 temp=temp-1;
  63.                 temp=~temp;
  64.                 tp=temp;
  65.                 temp=tp*0.0625*100+0.5;       
  66.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  67.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  68.                 //算由?.5,还是在小数点后面。

  69.           }
  70.         else
  71.           {                       
  72.                 DisBuf[0] = 0xff;
  73.                 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  74.                 //如果温度是正的那么,那么正数的原码就是补码它本身
  75.                 temp=tp*0.0625*100+0.5;       
  76.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  77.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  78.                 //算加上0.5,还是在小数点后面。
  79.         }
  80.         DisBuf[1]= NumTab[temp / 10000];
  81.         DisBuf[2]= NumTab[temp % 10000 / 1000];
  82.         DisBuf[3]= NumTab[temp % 1000 / 100] &0xfe;
  83.         DisBuf[4]= NumTab[temp % 100 / 10];
  84.         DisBuf[5]= NumTab[temp % 10];
  85. }

  86. /*****************
  87. 主函数
  88. ****************************/
  89. void main()
  90. {

  91.         timeinit();//初始化
  92.         while(1)
  93.         {
  94.                 DisplayTablex(Ds18b20ReadTemp());
  95.                 DelaymsN(200);
  96.                 DelaymsN(200);
  97.         }
  98. }

  99. /*****第一种显示方式数据处理****
  100. void Dis0()
  101. {
  102.         DisBuf[0]=NumTab[0];//O
  103.         DisBuf[1]=NumTab[15];//F
  104.         DisBuf[2]=NumTab[15];//F
  105.         DisBuf[3]=0xff;
  106.         DisBuf[4]=0xff;
  107.         DisBuf[5]=0xff;
  108. }  */
  109. /*-----------------------------------------------
  110. 显示部分程序,采用定时器0产生中断,2MS更新一次
  111. 因为使用晶振为12Mhz
  112. ------------------------------------------------*/
  113. void Display() interrupt 1 //using 3
  114. {

  115.         TR0=0;//关定时器0
  116.     TH0=0xf8;//(65535-1000)/256;//定时1MS*2_6Mhz=2Ms
  117.     TL0=0x2f;//(65535-1000)%256;
  118.         LedWei=0xff; /*关闭显示*/
  119.         TR0=1;//打开定时器0

  120. //        Dis0();//第一种显示方式
  121.         /********开始显示******************/
  122.         LedDuan=DisBuf[DisBitCnt]; /*输出段码数据到数码管*/
  123.         LedWei=DisBit[DisBitCnt]; /*输出位码数据到数码管*/
  124.         DisBitCnt++;
  125.         if(DisBitCnt>=6)
  126.         DisBitCnt=0; /*6位数码管全动态输出*/
  127. }
复制代码

附上打包的程序
DS18B20.rar (35.67 KB, 下载次数: 59)

评分

参与人数 2黑币 +65 收起 理由
杨雪飞 + 15 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:316832 发表于 2021-1-26 22:01 | 只看该作者
谢谢分享,有空下载一份学习一下
回复

使用道具 举报

板凳
ID:881131 发表于 2021-1-28 13:38 | 只看该作者
谢谢分享,初学正好能拿来借鉴学习
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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