找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6925|回复: 1
收起左侧

51单片机之三极管控数码管源程序+电路-初学者

[复制链接]
ID:439613 发表于 2019-7-27 08:59 | 显示全部楼层 |阅读模式
程序包含静态显示 和 计数  消隐问题都在程序中解决(本程序是用共阳数码管)一原理图
1.1数码管引脚图
20.png

2.2关于共阳与共阴的区别
21.png   //共阳数码管 段位全部接正极  段位数码管 置零亮
2.3电路图
23.png 程序使用的是共阳数码管

二程序
主程序解释:共阳数码管,三极管控制,通过先关闭数码管的位选,为什么要关闭位选呢?是因为要去消隐,因为数码管利用的是余晖效应 他们并不是同时显示的而是一个接着一个显示的,
例如 你打开一个数码管 延时1ms,人眼是看不到的,所以看的时候是同时显示的。
2.1延时函数
31.png 使用的是0us,防止数码管过快

2.2数码管程序 33.png 图上有解释
2.3主程序 30.png 利用的是定时器,在后面有程序源码。

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar code ddata[]={             //共阳数码管 段位全部接正极  段位数码管 置零亮  
  5.                                                 0xc0,//0                                
  6.                                                 0xf9,//1
  7.                                                 0xa4,//2
  8.                                                 0xb0,//3
  9.                                                 0x99,//4
  10.                                                 0x92,//5                  1001 0000
  11.                                                 0x82,//6
  12.                                                 0xf8,//7
  13.                                                 0x80,//8
  14.                                                 0x90,//9
  15.                                                 0x88,//A          10
  16.                                                 0x83,//b          11
  17.                                                 0xc6,//C          12
  18.                                                 0x86,//E        13
  19.                                                 0x9c,//F        14
  20.                                                 0x89,//H        15
  21.                                                 0xc7,//L        16
  22.                                                 0xab,//n        17
  23.                                                 0xe3,//u        18
  24.                                                 0x8c,//P        19
  25.                                                 0xbf,//-        20
  26.                                                 0xa3,//o        21
  27.                                                 0xff,
  28.                                                 0x00} ;
  29. uchar code wdata[]={          //位选 是让第几个数码管亮 从左到右  
  30.                                                 0xfe,//0
  31.                                                 0xfd,//1
  32.                                                 0xfb,//2
  33.                                                 0xf7,//3                                       
  34.                                         };
  35. int a = 5210,count0;

  36.                                        
  37. void delay1(uint z)  //延时函数
  38. {
  39.         uint x,y;
  40.         for(x = z;x > 0;x --)
  41.                 for(y = 12;y > 0;y --);

  42. }
  43. void time_ds()  //定时器配置函数
  44. {
  45.         TMOD = 0x01; //0x89 只能字节 定时器0 16模式定时器
  46.         TH0 = 0x4b;//50ms
  47.         TL0 = 0xfe;
  48.         TR0 = 1;  //打开定时器
  49. }

  50. void delay(void)   //误差 0us 数码管延时专用
  51. {
  52.         unsigned char a,b,c;
  53.         for(c=1;c>0;c--)
  54.                         for(b=222;b>0;b--)
  55.                                 for(a=5;a>0;a--);
  56. }

  57. void display(int a) //数码管显示函数
  58. {
  59.            int g,s,b,q;  
  60.                         g = a % 10;    //取走形参的个位十位百位,千位
  61.                         s = a / 10 % 10;
  62.                         b = a / 100 % 10;
  63.                         q = a / 1000 % 10;
  64.         
  65.                         P2 = 0xff;  //关闭数码管的位选 全部  防止产生重影
  66.                         P0 = ddata[g]; //为数码管的段位赋值
  67.                         P2 = wdata[0];  // 接通数码管的位选
  68.                         delay();  //延迟   延迟不要过大 防止重影
  69.         
  70.                         
  71.                         P2 = 0xff;
  72.                         P0 = ddata[s];
  73.                         P2 = wdata[1];
  74.                         delay();
  75.         

  76.                         P2 = 0xff;
  77.                         P0 = ddata[b];
  78.                         P2 = wdata[2];
  79.                         delay();

  80.                         P2 = 0xff;
  81.                         P0 = ddata[q];
  82.                         P2 = wdata[3];
  83.                         delay();



  84. }
  85. /*
  86.         共阳数码管 ,三极管空  通过先关闭数码管的位选
  87. 为什么要先关闭位选  ,是因为要去“消影”,因为数码管利用余晖效应 他们并不是同时显示的而是一个接着一个显示的  
  88. 例如 你打开一个数码管 延时1ms 人眼是看不到的 ,所以人看的时候是同时显示的 。
  89.         不懂可以看        锁存器控制 http://www.51hei.com/bbs/dpj-10971-1.html

  90. */
  91. void main()
  92. {
  93.         time_ds();
  94.         while(1)
  95.         {
  96.                 display(a);  //数码管显示函数
  97.         //        delay1(); //延迟 496+4 0.5秒
  98.                 if(TF0 ==1) // 溢出 则TF = 0
  99.                 {
  100.                         TF0 = 0;
  101.                         TH0 = (65535 - 46082)/256;        //50ms 两种书写方法 一种十六进制 一种这个
  102.                         TL0 = (65535 - 46082)%256;
  103.                         count0++;
  104.                 }
  105.                 if(count0 == 20) //溢出等于0  50*20一秒走一次
  106.                 {
  107.                         count0 = 0;
  108.                         a--;
  109.                 }
  110.                 if(a == 0)   //如果a减到0则 赋初值 5210
  111.                         a = 5210;
  112.         }
  113.         
  114. }
复制代码

所有资料51hei提供下载:
数码管.zip (45.08 KB, 下载次数: 19)

评分

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

查看全部评分

回复

使用道具 举报

ID:21104 发表于 2019-9-11 11:15 | 显示全部楼层
标记参考
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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