标题: STC89C52+DS18B20+共阴四位数码管 温度显示 [打印本页]

作者: 昭通音响-小倪    时间: 2016-8-2 09:50
标题: STC89C52+DS18B20+共阴四位数码管 温度显示
用的是STC89C52单片机,图中四个非门是相当于四个三极管,在仿真中闲麻烦就用非门代替。




实际效果










  1. #include<reg52.h>
  2. #include<intrins.h>
  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5. uchar code table[]             =   {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

  6. uchar code Temperature_Char[8] =   {0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};
  7.                                                                   
  8. uchar code df_Table[]          =   {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};

  9. uchar code wei[]               =   {0x01,0x02,0x04,0x08};

  10. sbit DQ = P3^7;
  11. sbit digt1=P2^0;
  12. sbit digt2=P2^1;
  13. sbit digt3=P2^2;
  14. sbit digt4=P2^3;
  15. uchar DS18B20_IS_OK;
  16. uchar CurrentT = 0;
  17. uchar Temp_Value[]={0x00,0x00};
  18. uchar Display_Digit[]={0,0,0,0};
  19. void delayus(uint us)
  20. {
  21.          while(--us);
  22. }
  23. void delay(uint ms)
  24. {
  25.          uchar i;
  26.         while(ms--)
  27.         {
  28.                  for(i=0;i<120;i++);
  29.         }
  30. }
  31. uchar Init_DS18B20()                        //18B20初始化
  32. {
  33.          uchar status;
  34.         DQ = 1;                                         //总线拉高
  35.         delayus(8);                         // 12MHz晶振,20us左右
  36.         DQ = 0;                                         
  37.         delayus(90);                        //720us左右
  38.         DQ = 1;                                        //释放总线
  39.         delayus(8);
  40.         status=DQ;
  41.         delayus(20);                         //160us左右
  42.         DQ=1;
  43.         return status;
  44. }

  45. uchar ReadOneByte()
  46. {
  47.          uchar i,dat=0;
  48.         DQ = 1;
  49.         _nop_();
  50.         for(i=0;i<8;i++)
  51.         {
  52.                  DQ = 0;
  53.                 _nop_();_nop_();
  54.                 dat >>= 1;
  55.                 DQ = 1;
  56.                 _nop_();
  57.                 _nop_();
  58.                 if(DQ)
  59.                         dat |= 0X80;
  60.                 delayus(30);
  61.                 DQ = 1;
  62.         }
  63.         return dat;
  64. }

  65. void WriteOneByte(uchar dat)                  //18B20写数据
  66. {
  67.          uchar i;
  68.         for(i=0;i<8;i++)
  69.         {
  70.                  DQ = 0;
  71.                 DQ = dat& 0x01;
  72.                 delayus(3);
  73.                 DQ = 1;
  74.                 dat >>= 1;                //右移一位
  75.         }
  76. }

  77. void Read_Temperature()                          //读取温度
  78. {
  79.          if(Init_DS18B20()==1)
  80.                 DS18B20_IS_OK=0;
  81.         else
  82.         {
  83.                 WriteOneByte(0xcc);                          //跳过序列号
  84.                 WriteOneByte(0x44);                           //启动温度转换
  85.                 Init_DS18B20();
  86.                 WriteOneByte(0xcc);
  87.                 WriteOneByte(0xbe);                                //读取温度
  88.                 Temp_Value[0] = ReadOneByte();           //低八位
  89.                 Temp_Value[1] = ReadOneByte();           //高八位
  90.                 DS18B20_IS_OK=1;        
  91.         }        
  92. }

  93. void Display_Temperature()
  94. {

  95.         uchar t = 150, ng =0xff,  a ,  b;
  96.         if((Temp_Value[1]&0xf8)==0xf8)                        //判断高5位,如果都为1则是负数
  97.         {
  98.                  Temp_Value[1] = ~Temp_Value[1];                  //如果为负数。高八位需要取反,第八位需要取反后加1.
  99.                 Temp_Value[0] = ~Temp_Value[0]+1;
  100.                 if(Temp_Value[0]==0x00)
  101.                         Temp_Value[1]++;
  102.                 ng = 10;
  103.                         
  104.         }

  105.          a=Temp_Value[0]&0x0f;           //小数点后一位算法
  106.          b=a*0.0625*10;

  107.         /*----0度以上的数值显示-----*/
  108.          Display_Digit[0]=ng;
  109.         CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);         //整数值
  110.         Display_Digit[1] = CurrentT/10; //百位          CurrentT%1000/100;
  111.         Display_Digit[2] = CurrentT%10;          //十位          CurrentT%100/10;
  112.         Display_Digit[3] =  b%10;                  //个位          CurrentT%10;

  113.         
  114.         }
  115. void display(uchar ge,uchar shi,uchar bai,uchar fu)    //数码管扫描
  116. {
  117.         P2=0X00;
  118.         delayus(30);

  119.         if(table[fu]==0x40)            ////////
  120.         {
  121.                 digt1=1;                //不加NPN三级管位驱动需要取反
  122.         }
  123.         else
  124.         {
  125.            digt1=0;                            //加NPN三级管位驱动需要取反
  126.         }

  127.         P0=table[fu];
  128.         delay(3);
  129.         digt1=0;                    //不加NPN三级管位驱动需要取反
  130.                                                          
  131.                 if(table[bai]==0x3f)
  132.         {        
  133.                 digt2=0;                //不加NPN三级管位驱动需要取反
  134.         }                          
  135.         else
  136.         {
  137.                 digt2=1;                //不加NPN三级管位驱动需要取反
  138.         }

  139.         P0=table[bai];         
  140.         delay(3);               
  141.         digt2=0;         //不加NPN三级管位驱动需要取反

  142.         digt3=1;         //不加NPN三级管位驱动需要取反

  143.         P0=table[shi]+0X80;
  144.         delay(3);           
  145.         digt3=0;   //不加NPN三级管位驱动需要取反

  146.         digt4=1;    //不加NPN三级管位驱动需要取反
  147.         P0=table[ge];
  148.         delay(3);
  149.         digt4=0;    //不加NPN三级管位驱动需要取反
  150.    

  151. }
  152. void main()
  153. {
  154.     P0=0XFF;
  155.     P2=0X00;
  156. //        delayus(10);
  157.         Read_Temperature();
  158.         delay(500);

  159.         delay(500);

  160.         while(1)
  161.         {        
  162.                 display(Display_Digit[3],Display_Digit[2],Display_Digit[1],Display_Digit[0]);
  163.                  Read_Temperature();
  164.                 if(DS18B20_IS_OK)
  165.                         Display_Temperature();
  166.                 delayus(3);        
  167.         
  168.         }

  169. }
复制代码



全部资料51hei下载地址:
数码管温度显示.zip (54.94 KB, 下载次数: 180)

作者: mnbvcxzlkjhgfds    时间: 2016-10-12 19:22
能显示低温吗
作者: 昭通音响-小倪    时间: 2016-11-29 16:46
mnbvcxzlkjhgfds 发表于 2016-10-12 19:22
能显示低温吗

实时显示温度
作者: ttwwtt    时间: 2017-6-5 22:30
这里面有protues仿真吗?

作者: ttwwtt    时间: 2017-6-9 17:40
这个是实时显示温度吗,为什么我用你的hex还是和你一样的温度呢
作者: join22life    时间: 2018-9-13 10:11
谢谢分享
作者: ubuntu321    时间: 2018-11-17 20:38
感谢分享
作者: 小石头呐    时间: 2019-2-22 23:29
你好 我想咨询下你是使用的PNP三极管 还是NPN三极管
作者: 小石头呐    时间: 2019-2-23 08:46
我想问一下 你的NPN三极管如何在电路中接线的 求回复 谢谢了
作者: 风158    时间: 2019-2-23 10:28
谢谢分享!
作者: 小石头呐    时间: 2019-4-27 15:48
感谢分享
作者: 17341637586    时间: 2019-4-27 17:43
感谢分享
作者: 316004322    时间: 2019-6-15 01:14
感谢分享
作者: 霸道竹子    时间: 2019-6-17 15:58
感谢分享
作者: 小石头呐    时间: 2020-10-16 16:36
共阴数码管 CA
作者: zzhzzhzzh123    时间: 2020-10-17 23:31
ttwwtt 发表于 2017-6-5 22:30
这里面有protues仿真吗?

有的,proteus画好了
作者: hurbocn    时间: 2020-10-20 13:29
你好。如果把数码管换成共阳的,只修改段码行不行,单片机驱动共阴管亮度好像不理想
作者: 长风007    时间: 2020-10-20 17:40
温度显示的范围可以更宽一点的。
作者: zxule    时间: 2021-1-1 19:44
您好,为什么仿真通过,但我实物搭建出来不行呢,没搭错。谢谢!
作者: QY11    时间: 2021-5-28 14:05
周栩乐 发表于 2021-1-1 19:44
您好,为什么仿真通过,但我实物搭建出来不行呢,没搭错。谢谢!

串口要改的,而且他是共阴的
作者: dj3365191    时间: 2021-5-28 15:52
你好楼主,能显示负温度吗?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1