找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9286|回复: 20
收起左侧

STC89C52+DS18B20+共阴四位数码管 温度显示

  [复制链接]
ID:56331 发表于 2016-8-2 09:50 | 显示全部楼层 |阅读模式
用的是STC89C52单片机,图中四个非门是相当于四个三极管,在仿真中闲麻烦就用非门代替。


1.jpg

实际效果
1.jpg

2.jpg

3.jpg

4.jpg

5.jpg

  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. }
复制代码

0.png

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

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:108622 发表于 2016-10-12 19:22 来自手机 | 显示全部楼层
能显示低温吗
回复

使用道具 举报

ID:56331 发表于 2016-11-29 16:46 | 显示全部楼层

实时显示温度
回复

使用道具 举报

ID:207497 发表于 2017-6-5 22:30 | 显示全部楼层
这里面有protues仿真吗?
回复

使用道具 举报

ID:207497 发表于 2017-6-9 17:40 | 显示全部楼层
这个是实时显示温度吗,为什么我用你的hex还是和你一样的温度呢
回复

使用道具 举报

ID:84492 发表于 2018-9-13 10:11 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:256289 发表于 2018-11-17 20:38 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:424506 发表于 2019-2-22 23:29 | 显示全部楼层
你好 我想咨询下你是使用的PNP三极管 还是NPN三极管
回复

使用道具 举报

ID:424506 发表于 2019-2-23 08:46 | 显示全部楼层
我想问一下 你的NPN三极管如何在电路中接线的 求回复 谢谢了
回复

使用道具 举报

ID:343102 发表于 2019-2-23 10:28 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:424506 发表于 2019-4-27 15:48 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:522050 发表于 2019-4-27 17:43 来自手机 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:554057 发表于 2019-6-15 01:14 来自手机 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:564693 发表于 2019-6-17 15:58 来自手机 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:424506 发表于 2020-10-16 16:36 | 显示全部楼层
共阴数码管 CA
回复

使用道具 举报

ID:831210 发表于 2020-10-17 23:31 | 显示全部楼层
ttwwtt 发表于 2017-6-5 22:30
这里面有protues仿真吗?

有的,proteus画好了
回复

使用道具 举报

ID:255559 发表于 2020-10-20 13:29 | 显示全部楼层
你好。如果把数码管换成共阳的,只修改段码行不行,单片机驱动共阴管亮度好像不理想
回复

使用道具 举报

ID:337139 发表于 2020-10-20 17:40 | 显示全部楼层
温度显示的范围可以更宽一点的。
回复

使用道具 举报

ID:283883 发表于 2021-1-1 19:44 | 显示全部楼层
您好,为什么仿真通过,但我实物搭建出来不行呢,没搭错。谢谢!
回复

使用道具 举报

ID:926496 发表于 2021-5-28 14:05 | 显示全部楼层
周栩乐 发表于 2021-1-1 19:44
您好,为什么仿真通过,但我实物搭建出来不行呢,没搭错。谢谢!

串口要改的,而且他是共阴的
回复

使用道具 举报

ID:143767 发表于 2021-5-28 15:52 | 显示全部楼层
你好楼主,能显示负温度吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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