目录
前言
今天我们来学习单片机AT89C52控制电子时钟,此时钟可以分别显示“时-分-秒”,并且可以通过按键调节时间。期间我们用到的软件有proteus和keil两个软件,欢迎大家提问已经寻找错误,请大家点个关注和收藏,后续还会更新。
一、电子时钟原理
1、输入电路原理
主要是通过按键完成信息的采集,咱们是通过七个I/O口分别对七个按键进行检测。
2、输出电路原理
本实验采用8位LED数码管动态扫描显示电路,其A~DP分别与单片机的P2口相连,受P2口控制,位控制端由P3口连接。
3、控制电路
通过单片机内置定时器定时1秒不断刷新在显示屏中显示数值,对输入信息进行分析显示,实验中采用C52单片机进行控制
二、单片机原理图绘制
1、所需元件名称
proteus原理图中名称对应:
AT89C52——52单片机芯片;
BUTTON——按钮(复位按键);
CAP——无极性电容;
CAP-ELEC——电解电容;
CAP-POL——极性电容;
CRYSTAL——晶振;
RES——电阻;
7SEG-MPX8-CA-BLUE——共阳极数码管显示器;
以上就是我们这次设计需要用到的所有元器件,接下来我们就需要创建新工程,然后在右面添加元器件进行绘制。
2、绘制原理图
首先是绘制最小系统,将AT89C52、复位电路、时钟电路绘制出来。
然后就是咱们的输出电路,将数码管显示器加入原理图,将对应引脚与I/O口相连。
然后咱们对输出电路进行绘制。
这里我采用了网络标号的连接方法进行连接,可以增加原理图的整洁度,可以一眼看到是如何连接的。
至此,咱们的原理图就绘制完成,接下来咱们可以开始编写程序。
三、编写程序
这里咱们分出三部分分别展示程序,分别为输出电路、输入电路、控制电路。
1、输出电路
u8 gsmg_code[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳
u8 place_code[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
void smg_display(void)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:PLACE=0x01;SMG_A_DP_PORT=gsmg_code[hour/10];break;
case 1:PLACE=0x02;SMG_A_DP_PORT=gsmg_code[hour%10];break;
case 2:PLACE=0x04;SMG_A_DP_PORT=0xbf;break;
case 3:PLACE=0x08;SMG_A_DP_PORT=gsmg_code[min/10];break;
case 4:PLACE=0x10;SMG_A_DP_PORT=gsmg_code[min%10];break;
case 5:PLACE=0x20;SMG_A_DP_PORT=0xbf;break;
case 6:PLACE=0x40;SMG_A_DP_PORT=gsmg_code[sec/10];break;
case 7:PLACE=0x80;SMG_A_DP_PORT=gsmg_code[sec%10];break;
}
delay(1);
}
}//PLACE对应的是1~8位控制端的I/O口;SMG_A_DP_PORT对应的是8位共阳极数码管A~DP的I/O口;hour、min、sec分别代表小时、分钟、秒。
2、输入电路
void Button_c()
{
BUTTON=0xFF;//P1口控制七个按键进行控制
if(BUTTON!=0xFF)
{
delay(1);
if(BUTTON!=0xFF)//消抖处理
{
switch(BUTTON)
{
case 0xBF:sec--;break;
case 0xDF:sec++;break;
case 0xEF:min--;break;
case 0xF7:min++;break;
case 0xFB:hour--;break;
case 0xFD:hour++;break;
case 0xFE:sec=0;min=0;hour=0;break;
}
while(BUTTON!=0xFF);//按钮按一下做出一次反应
}
}
}
3、控制电路
void time0_int(void)//定时
{
TMOD|=0x01;
TH0=0xfc;
TL0=0x66;
ET0=1;
EA=1;
TR0=1;
}
void main()
{
time0_int();
while(1)
{
smg_display();//输出
Time_Line_Negative();//此函数是对00:00:00时继续进行减操作的限制行为,继续减会到23:59:59
Time_Line_Add();//此函数是对24:60:60时继续进行加操作的限制行为,继续加会到00:00:00
Button_c();//输入
}
}
void time0() interrupt 1//定时
{
static u16 i=0;
TH0=0xfc;
TL0=0x66;
i++;
if(i==1000)
{
i=0;
sec++;
LED1=!LED1;
}
}
至此,程序编写完成。
代码效果:
根据以上步骤,咱们就可以得到想要的实验效果啦!
总结
以上就是咱们的实验步骤,在实验中咱们需要注意定时器初始化,以及8位共阳极数码管的显示。通过porteus和keil对电子时钟进行了简单的设计。希望对你有帮助,后续我还会持续更新,帮忙点赞收藏,欢迎大家来看。