在致力于复习并强化先前所学单片机知识的目标导向下,
本文将会引入一个小型项目,同时提供与之对应的完整程序以及详尽讲解,
以此助力读者对单片机知识体系的深入理解与熟练掌握,进一步提升在该领域的实践能力与知识运用水平。
要求:
基本功能:利用数码管显示电子时钟的时、分、秒。要求计时准确,显示稳定,无虚影。
扩展功能:整点报时功能。计时遇整点蜂鸣器发声提示。
程序(根据下面的仿真图编写的程序,仿真图与普中A7的线路基本一致,只有74HC138的输出端是相反的):
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define duanma P0
sbit wxc=P2^4;
sbit wxb=P2^3;
sbit wxa=P2^2;
uint aa=0,shi=0,fen=0,miao=0,s1,s2,f1,f2,m1,m2;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79, 0x71,0x00 };
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uint a,uint b,uint c)
{
s1=a/10;
s2=a%10;
f1=b/10;
f2=b%10;
m1=c/10;
m2=c%10;
wxc=1;wxb=1;wxa=1;
duanma=table[s1];
delay(1);
wxc=1;wxb=1;wxa=0;
duanma=table[s2];
delay(1);
wxc=1;wxb=0;wxa=1;
duanma=0x40;
delay(1);
wxc=1;wxb=0;wxa=0;
duanma=table[f1];
delay(1);
wxc=0;wxb=1;wxa=1;
duanma=table[f2];
delay(1);
wxc=0;wxb=1;wxa=0;
duanma=0x40;
delay(1);
wxc=0;wxb=0;wxa=1;
duanma=table[m1];
delay(1);
wxc=0;wxb=0;wxa=0;
duanma=table[m2];
delay(1);
}
void main()
{
TMOD=0x10;//0001 0000
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
while(1)
{
if(aa==20)
{
aa=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
}
}
}
display(shi,fen,miao);
}
}
void ds50ms() interrupt 3
{
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
aa++ ;
}
程序讲解:
上面的注释10ms是错误的,这个中断服务程序是每0.05秒执行一次
程序验证:
1、proteus仿真验证
2、单片机运行验证
程序是根据仿真图编写的,而普中A7的原理图和仿真图只有74HC138输出的部分是相反的。
可以手动更改74HC138的输出线路或者自行更改代码