写在前面:以下涉及到的程序及电路图不保证为最优方案,会存在很多不足之处,望谅解。另外,C51的内容是在整理很久之前所学的知识,可能会存在错误,欢迎指正。
正文
学习目标:利用51单片机在数码管上模拟时钟的功能。 学习内容:
- 在8位数码管上同时使用其中的3位并显示不同的数字、字母或字符
- 在数码管上模拟时钟的功能
程序一:数码管简单应用
本次所使用的数码管为8位共阴数码管 源程序
#include "reg52.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define display_duan P0
#define display_wei P2
uchar code smg[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay1ms(void)
{
unsigned char a,b;
for(b=199;b>0;b--)
for(a=1;a>0;a--);
}
void main()
{
while(1)
{
display_wei = 0xfe;
display_duan = smg[1];
delay1ms();
display_wei = 0xfb;
display_duan = 0x40;
delay1ms();
display_wei = 0x7f;
display_duan = smg[7];
delay1ms();
}
}
仿真图 如图所示,当运行程序后,数码管将按照程序设定的位置以及内容进行显示。
程序二:数码管显示时钟
源程序
#include "reg52.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define display_duan P0
#define display_wei P2
uchar code smg[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar temp_hour = 12,temp_min = 34,temp_sec = 25;
uchar temp;
void delay1ms(void)
{
unsigned char a,b;
for(b=199;b>0;b--)
for(a=1;a>0;a--);
}
void Init(void)
{
TMOD |= 0X01;
TH0 = 0X3c;
TL0 = 0xb0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Display()
{
display_wei = 0xfe;
display_duan = smg[temp_sec%10];
delay1ms();
display_wei = 0xfd;
display_duan = smg[temp_sec/10];
delay1ms();
display_wei = 0xfb;
display_duan = 0x40;
delay1ms();
display_wei = 0xf7;
display_duan = smg[temp_min%10];
delay1ms();
display_wei = 0xef;
display_duan = smg[temp_min/10];
delay1ms();
display_wei = 0xdf;
display_duan = 0x40;
delay1ms();
display_wei = 0xbf;
display_duan = smg[temp_hour%10];
delay1ms();
display_wei = 0x7f;
display_duan = smg[temp_hour/10];
delay1ms();
}
void main()
{
Init();
while(1)
{
Display();
}
}
void timer0() interrupt 1
{
TH0 = 0X3c;
TL0 = 0xb0;
temp++;
{
if(temp > 19)
{
temp = 0;
temp_sec++;
if(temp_sec > 59)
{
temp_sec = 0;
temp_min++;
if(temp_min > 59)
{
temp_min = 0;
temp_hour++;
if(temp_hour > 23)
{
temp_hour = 0;
}
}
}
}
}
}
仿真图 如图所示,当程序运行时,初始显示为12时34分25秒,并且该时钟会随时间的推移自动计时,以实现时钟的功能。 当然,该时钟还可以在加上年月日的功能,具体的实现方式与时分秒的实现方式相同,当然如果想要将年月日时分秒显示在1个8位数码管上,还需要加上切换功能,可以加一个自动切换功能,具体可以像这样做:将年月日写在函数1里,比如命名为Time1(),将时分秒写在函数2里,比如命名为Time2(),此时同时将两个函数放入主函数的while(1)循环中,并且在两函数中间加上一个时间稍微长一点的延时,比如10s,这样就可以实现1个数码管既显示年月日,又显示时分秒。当然这只是建议,具体还要各位自己实验。
|