找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC单片机直驱LED数码管显示DS18B20温度 电子温度计

[复制链接]
跳转到指定楼层
楼主
ID:1029542 发表于 2022-12-9 21:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放一下之前写的程序,单片机IO直接驱动4位数码管,同时具备显示ds18b20温度功能,可作为温度电子温度计。

单片机源程序如下:
  1. #include "sys.h"
  2. #include "temp.h"


  3. #define FOSC 24000000L      //时钟频率
  4. #define tm0_delay 1                                        //tm0_delay*ms
  5. //STC老单片机使用  
  6. //#define T1MS         (int)(65536-(int)((float)1000*(float)tm0_delay/((float)1/((float)FOSC/(float)1000000/(float)12))))     //12T模式 定时器定时时间自动计算
  7. //STC1T单片机使用  
  8. #define T1MS         (int)(65536-(int)((float)1000*(float)tm0_delay/((float)1/((float)FOSC/(float)1000000/(float)1))))     //1T模式 定时器定时时间自动计算

  9. //根据自己硬件的实际硬件连接来设定
  10. sbit led_a         =        P1^3; //数码管段引脚 11
  11. sbit led_b         =        P1^7; //数码管段引脚 7
  12. sbit led_c         =        P3^6; //数码管段引脚 4
  13. sbit led_d         =        P1^0; //数码管段引脚 2
  14. sbit led_e         =        P1^1; //数码管段引脚 1
  15. sbit led_f         =        P1^4; //数码管段引脚 10
  16. sbit led_g         =        P3^5; //数码管段引脚 5
  17. sbit led_dp        =        P3^7; //数码管段引脚 3

  18. sbit led_w1        =        P1^2; //数码管位引脚 12
  19. sbit led_w2        =        P1^5; //数码管位引脚 9
  20. sbit led_w3        =        P1^6; //数码管位引脚 8
  21. sbit led_w4        =        P3^2; //数码管位引脚 6

  22.   
  23. u8 code led_duan[16]={
  24. 0X3F,0X06,0x5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71 //共阴段码
  25. //0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e  //共阳段码
  26. };
  27. u8 code led_wei[8]={
  28. 0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F//共阴位码
  29. //0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80//共阳位码
  30. };//位码

  31. u8 bdata daun_gpio; //段码 位寻址
  32. sbit duan_bit7=daun_gpio^7;
  33. sbit duan_bit6=daun_gpio^6;
  34. sbit duan_bit5=daun_gpio^5;
  35. sbit duan_bit4=daun_gpio^4;
  36. sbit duan_bit3=daun_gpio^3;
  37. sbit duan_bit2=daun_gpio^2;
  38. sbit duan_bit1=daun_gpio^1;
  39. sbit duan_bit0=daun_gpio^0;

  40. u8 bdata wei_gpio; //位码 位寻址
  41. sbit wei_bit3=wei_gpio^3;
  42. sbit wei_bit2=wei_gpio^2;
  43. sbit wei_bit1=wei_gpio^1;
  44. sbit wei_bit0=wei_gpio^0;


  45. u16 time_clk=0;

  46. void duan_gpio_out(u8 dat,u8 dat1);  //解码段位
  47. void disp_num_dat(int dat);                //显示最大数字0-9999
  48. void InitTimer0();//定时器0初始化

  49. u8 disp_num[4]; //数码管显示缓存
  50. void duan_gpio_out(u8 dat,u8 dat1)  //解码段位,位码
  51. {       
  52.         daun_gpio=dat;
  53.         wei_gpio=dat1;
  54.         led_a =duan_bit0;
  55.         led_b =duan_bit1;
  56.         led_c =duan_bit2;
  57.         led_d =duan_bit3;
  58.         led_e =duan_bit4;
  59.         led_f =duan_bit5;
  60.         led_g =duan_bit6;
  61.         led_dp=duan_bit7;

  62.         led_w1=wei_bit0;
  63.         led_w2=wei_bit1;
  64.         led_w3=wei_bit2;
  65.         led_w4=wei_bit3;
  66. }
  67. void int_start(void)  //外部中断,定时器中断初始化
  68. {
  69.         //TMOD = 0x01;
  70.   TMOD=0X00;
  71.         TL0 = T1MS;
  72.         TH0 = T1MS>>8;
  73.         EA = 1;
  74.         ET0 = 1;
  75.         TR0 = 1;
  76. }
  77. void disp_num_dat(int dat)//显示解码 0-9999
  78. {
  79.   //  disp_num[0]=0x00;
  80.                 disp_num[1]=led_duan[(dat%1000)/100];
  81.                 disp_num[2]=led_duan[(dat%100)/10];
  82.                 disp_num[3]=led_duan[(dat%10)/1];
  83. }

  84. void temp_disp(int temp)//温度显示
  85. {  
  86.         float tp;  
  87.         if(temp< 0)                                //当温度值为负数
  88.           {
  89.       disp_num[0]=0x40; //负温度符号  
  90.                 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
  91.                 temp=temp-1;
  92.                 temp=~temp;
  93.                 tp=temp;
  94.                 temp=tp*0.0625*100+0.5;       
  95.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  96.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  97.                 //算由?.5,还是在小数点后面。

  98.           }
  99.         else
  100.           {               
  101.        disp_num[0]=0x76;   
  102.                 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  103.                 //如果温度是正的那么,那么正数的原码就是补码它本身
  104.                 temp=tp*0.0625*100+0.5;       
  105.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  106.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  107.                 //算加上0.5,还是在小数点后面。
  108. }
  109.   temp=temp/100;
  110. if(temp<10)
  111.   {
  112.                 //disp_num[0]=0x00;
  113.                 disp_num[1]=0x00;
  114.                 disp_num[2]=0x00;
  115.                 disp_num[3]=led_duan[(temp%10)/1];
  116.   }
  117.   if(temp>9)
  118.   {
  119.     if(temp<100)
  120.     {
  121.     //disp_num[0]=0x00;
  122.                 disp_num[1]=0x00;
  123.                 disp_num[2]=led_duan[(temp%100)/10];
  124.                 disp_num[3]=led_duan[(temp%10)/1];
  125.     }
  126.      if(temp>99)
  127.     {
  128.    // disp_num[0]=0x00;
  129.                 disp_num[1]=led_duan[(temp%1000)/100];
  130.                 disp_num[2]=led_duan[(temp%100)/10];
  131.                 disp_num[3]=led_duan[(temp%10)/1];
  132.     }
  133.   }
  134. }

  135. void main()
  136. {
  137.   char mode_dat=0;
  138.   
  139.         AUXR = AUXR|0x80;  // T0, 1T Mode
  140.         int_start();//初始化中断和定时器
  141.         P1M1 = 0<<0|0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;//配置端口模式
  142.         P1M0 = 1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7;//配置端口模式
  143.         P3M1 = 0<<0|0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;//配置端口模式
  144.         P3M0 = 0<<0|0<<1|1<<2|1<<3|0<<4|1<<5|1<<6|1<<7;//配置端口模式
  145.         P5M0=0X00;
  146.         P5M1=0X00;
  147.   Ds18b20Init();
  148.   
  149.         while(1)
  150.         {
  151.     if(time_clk==1000)//温度调取周期
  152.     {
  153.    
  154.       temp_disp(Ds18b20ReadTemp());//读取解析时间
  155.       time_clk=0;
  156.     }
  157.    
  158.         }
  159. }
  160. void time0(void) interrupt 1//
  161. {
  162.         static u8 i;
  163.         TL0 = T1MS;
  164.         TH0 = T1MS>>8;
  165.   time_clk++;
  166.   i++;
  167.   i=i&0x03;
  168.   duan_gpio_out(0x00,0xff);//消影
  169.   duan_gpio_out(disp_num[i],led_wei[i]);        //刷新LED
  170. }
复制代码

Keil代码下载(附件内只有代码 无原理图等其他资料,如介意请勿下载):
代码.7z (30.37 KB, 下载次数: 28)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1063134 发表于 2023-3-12 10:12 | 只看该作者
问题不在代码在于是否能带动,电流是否够
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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