一、实验思路
动态数码管就是我们的单片机运行的太快,以至于我们的肉眼没有办法看到间隔,所以我们改一下数据,就可以了,有时候我们用的就是人的视觉暂留,我们在使用数码管时,得知道是共阴还是共阳,在这里,我使用的是共阴的数码管,使用的是12Mhz的晶振,如果我们使用的是11.0592MHz,
这是我们数码管的原理图,数码管其实就是发光二极管显示,共阴,然后我们可以根据段码计算出来的自己想要显示的数字,这里有一些
二、代码原理
我们用定时器显示,如果我们定时器定时2ms,那么2ms就中断一次,而我们在中断里面定义一个 数字,当达到500时,就是500×2ms=1S,然后使数据更新一边,变成下一个数字,我们有俩个数组,一个是存放段码的,另一个是存放实际值的,我们可以十位和各位分别显示,存放到另一个数组里面,然后在经过138译码器显示出来。
三 、实验源码
四、实验现象
还有一点就是那个消隐,P0=0x00;的那个就是消隐,如果没有消隐,显示的数字则会很不清晰;
可能代码还存在点问题,希望大家能够批评指正!
单片机源程序如下:- /*************************************
- 本人用的是普中的开发板,然后138和数码管的连接图会贴贴出来,
- 芯片是stc89c52 ,晶振是12MHz,仅供交流使用
- *************************************/
- #include <reg52.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- #define TIME 500
- sbit LSA=P2^2; //引脚的定义
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f};//数码管段码,共阴极段码
- u8 disbuff[2];//存放00~99的数组
- unsigned char t=0;//数值00~99
- /*****************************************************
- 函数名称:void In0Init()
- 函数功能:定时器0初始化
- 输入参数:无
- 输出参数:无
- *****************************************************/
- void In0Init()
- {
- TMOD = 0x01; //开启定时器0
- TH0 = 0xF8; //赋初值
- TL0 = 0x30;
- EA = 1; //开启总中断
- ET0 = 1; //开启定时器0的中断
- TR0 = 1;
- }
- /*****************************************************
- 函数名称:void DigDisplay()
- 函数功能:数码管显示
- 输入参数:无
- 输出参数:无
- *****************************************************/
- void DigDisplay()
- {
- u8 i,j;
- for (i=0;i<2;i++)
- {
- switch(i)//位选,选择哪一位亮
- {
- case(0): LSA=1;LSB=1;LSC=1;break;
- case(1): LSA=0;LSB=1;LSC=1;break;
-
- }
- P0=disbuff[i];
- j=10; //消隐,要不然会很模糊
- while(j--);
- P0=0x00;
- }
- }
- /*****************************************************
- 函数名称:void DealNumber()
- 函数功能:处理数字,拆分一位一位的显示
- 输入参数:无
- 输出参数:无
- *****************************************************/
- void DealNumber()
- {
- disbuff[0]=smgduan[t/10];//处理十位
- disbuff[1]=smgduan[t%10];//处理各位
- }
- /*****************************************************
- 函数名称:void main ()
- *****************************************************/
- void main ()
- {
- In0Init();
- while(1)
- {
- DealNumber();
- DigDisplay();
- }
- }
- /*****************************************************
- 函数名称:void Timer0Interrupt(void) interrupt 1
- 函数功能:中断服务函数
- 输入参数:无
- 输出参数:无
- *****************************************************/
- void Timer0Interrupt(void) interrupt 1
- {unsigned int n;
- TH0 = 0xF8; //重新赋初值
- TL0 = 0x30;
- n++; //当n==500时,则为1s
- if(n==TIME)//TIME定义为500,用户可以自己修改
- {
- t++; //实际的数值
- n=0;
- }
- if(t==100)//如果t==99;然后重新显示00
- {
- t=0;
- }
- }
复制代码
全部资料51hei下载地址:
显示00~99.7z
(1.5 MB, 下载次数: 16)
|