找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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



数码管温度显示.zip

54.94 KB, 下载次数: 107, 下载积分: 黑币 -5

5

评分

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

查看全部评分

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

使用道具 举报

沙发
mnbvcxzlkjhgfds 发表于 2016-10-12 19:22 来自手机 | 只看该作者
能显示低温吗
回复

使用道具 举报

板凳
 楼主| 昭通音响-小倪 发表于 2016-11-29 16:46 | 只看该作者

实时显示温度
回复

使用道具 举报

地板
ttwwtt 发表于 2017-6-5 22:30 | 只看该作者
这里面有protues仿真吗?
回复

使用道具 举报

5#
ttwwtt 发表于 2017-6-9 17:40 | 只看该作者
这个是实时显示温度吗,为什么我用你的hex还是和你一样的温度呢
回复

使用道具 举报

6#
join22life 发表于 2018-9-13 10:11 | 只看该作者
谢谢分享
回复

使用道具 举报

7#
ubuntu321 发表于 2018-11-17 20:38 | 只看该作者
感谢分享
回复

使用道具 举报

8#
小石头呐 发表于 2019-2-22 23:29 | 只看该作者
你好 我想咨询下你是使用的PNP三极管 还是NPN三极管
回复

使用道具 举报

9#
小石头呐 发表于 2019-2-23 08:46 | 只看该作者
我想问一下 你的NPN三极管如何在电路中接线的 求回复 谢谢了
回复

使用道具 举报

10#
风158 发表于 2019-2-23 10:28 | 只看该作者
谢谢分享!
回复

使用道具 举报

11#
小石头呐 发表于 2019-4-27 15:48 | 只看该作者
感谢分享
回复

使用道具 举报

12#
17341637586 发表于 2019-4-27 17:43 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

13#
316004322 发表于 2019-6-15 01:14 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

14#
霸道竹子 发表于 2019-6-17 15:58 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

15#
小石头呐 发表于 2020-10-16 16:36 | 只看该作者
共阴数码管 CA
回复

使用道具 举报

16#
zzhzzhzzh123 发表于 2020-10-17 23:31 | 只看该作者
ttwwtt 发表于 2017-6-5 22:30
这里面有protues仿真吗?

有的,proteus画好了
回复

使用道具 举报

17#
hurbocn 发表于 2020-10-20 13:29 | 只看该作者
你好。如果把数码管换成共阳的,只修改段码行不行,单片机驱动共阴管亮度好像不理想
回复

使用道具 举报

18#
长风007 发表于 2020-10-20 17:40 | 只看该作者
温度显示的范围可以更宽一点的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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