程序包含静态显示 和 计数 消隐问题都在程序中解决(本程序是用共阳数码管)一原理图
1.1数码管引脚图
2.2关于共阳与共阴的区别
//共阳数码管 段位全部接正极 段位数码管 置零亮
2.3电路图
程序使用的是共阳数码管
二程序
主程序解释:共阳数码管,三极管控制,通过先关闭数码管的位选,为什么要关闭位选呢?是因为要去消隐,因为数码管利用的是余晖效应 他们并不是同时显示的而是一个接着一个显示的,
例如 你打开一个数码管 延时1ms,人眼是看不到的,所以看的时候是同时显示的。
2.1延时函数
使用的是0us,防止数码管过快
2.2数码管程序
图上有解释
2.3主程序
利用的是定时器,在后面有程序源码。
单片机源程序如下:
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar code ddata[]={ //共阳数码管 段位全部接正极 段位数码管 置零亮
- 0xc0,//0
- 0xf9,//1
- 0xa4,//2
- 0xb0,//3
- 0x99,//4
- 0x92,//5 1001 0000
- 0x82,//6
- 0xf8,//7
- 0x80,//8
- 0x90,//9
- 0x88,//A 10
- 0x83,//b 11
- 0xc6,//C 12
- 0x86,//E 13
- 0x9c,//F 14
- 0x89,//H 15
- 0xc7,//L 16
- 0xab,//n 17
- 0xe3,//u 18
- 0x8c,//P 19
- 0xbf,//- 20
- 0xa3,//o 21
- 0xff,
- 0x00} ;
- uchar code wdata[]={ //位选 是让第几个数码管亮 从左到右
- 0xfe,//0
- 0xfd,//1
- 0xfb,//2
- 0xf7,//3
- };
- int a = 5210,count0;
-
- void delay1(uint z) //延时函数
- {
- uint x,y;
- for(x = z;x > 0;x --)
- for(y = 12;y > 0;y --);
- }
- void time_ds() //定时器配置函数
- {
- TMOD = 0x01; //0x89 只能字节 定时器0 16模式定时器
- TH0 = 0x4b;//50ms
- TL0 = 0xfe;
- TR0 = 1; //打开定时器
- }
- void delay(void) //误差 0us 数码管延时专用
- {
- unsigned char a,b,c;
- for(c=1;c>0;c--)
- for(b=222;b>0;b--)
- for(a=5;a>0;a--);
- }
- void display(int a) //数码管显示函数
- {
- int g,s,b,q;
- g = a % 10; //取走形参的个位十位百位,千位
- s = a / 10 % 10;
- b = a / 100 % 10;
- q = a / 1000 % 10;
-
- P2 = 0xff; //关闭数码管的位选 全部 防止产生重影
- P0 = ddata[g]; //为数码管的段位赋值
- P2 = wdata[0]; // 接通数码管的位选
- delay(); //延迟 延迟不要过大 防止重影
-
-
- P2 = 0xff;
- P0 = ddata[s];
- P2 = wdata[1];
- delay();
-
- P2 = 0xff;
- P0 = ddata[b];
- P2 = wdata[2];
- delay();
- P2 = 0xff;
- P0 = ddata[q];
- P2 = wdata[3];
- delay();
- }
- /*
- 共阳数码管 ,三极管空 通过先关闭数码管的位选
- 为什么要先关闭位选 ,是因为要去“消影”,因为数码管利用余晖效应 他们并不是同时显示的而是一个接着一个显示的
- 例如 你打开一个数码管 延时1ms 人眼是看不到的 ,所以人看的时候是同时显示的 。
- 不懂可以看 锁存器控制 http://www.51hei.com/bbs/dpj-10971-1.html
- */
- void main()
- {
- time_ds();
- while(1)
- {
- display(a); //数码管显示函数
- // delay1(); //延迟 496+4 0.5秒
- if(TF0 ==1) // 溢出 则TF = 0
- {
- TF0 = 0;
- TH0 = (65535 - 46082)/256; //50ms 两种书写方法 一种十六进制 一种这个
- TL0 = (65535 - 46082)%256;
- count0++;
- }
- if(count0 == 20) //溢出等于0 50*20一秒走一次
- {
- count0 = 0;
- a--;
- }
- if(a == 0) //如果a减到0则 赋初值 5210
- a = 5210;
- }
-
- }
复制代码
所有资料51hei提供下载:
数码管.zip
(45.08 KB, 下载次数: 19)
|