基于单片机的多功能电子时钟
功能要求:编程实现电子时钟功能,并将时间显示出来。具体功能如下:
- 能直接显示时、分、秒十进制数字;
- LED数码管时钟电路采用24h计时方式,时、分、秒分别用两位LED数码管显示,采用动态显示编程。
- 开机时间显示“11:59:50”
- 具备调时功能,设置三个独立按键,分别可调整时、分、秒,每按一次按键,数值加1。
任务:完成电路设计与仿真、编程实现电子时钟功能。
仪器耗材:计算机,proteus软件和KEIL软件。
实训设计:
仿真图:
使用8位共阳数码管
c语言代码部分:
#include <stc15.h>
// 定义时、分、秒变量
unsigned char hour = 11;
unsigned char minute = 59;
unsigned char second = 50;
unsigned char cnt = 0;
// 定义按键
sbit addHour = P3^0;
sbit addMinute = P3^1;
sbit addSecond = P3^2;
//延时
void delay(unsigned int xms) {
unsigned int i, j;
for(i = xms; i > 0; i--)
for(j = 112; j > 0; j--);
}
//显示
void display() {
// 定义一个数组来存储0-9的数码管编码
unsigned char code digit[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
// 分别显示时、分、秒的十位和个位
P1 = 0x01; // 选择第一个数码管
P2 = digit[hour / 10]; // 显示小时的十位
delay(1);
P1 = 0x02; // 选择第二个数码管
P2 = digit[hour % 10]; // 显示小时的个位
delay(1);
P1 = 0x04;
P2 = 0xBF;
delay(1);
P1 = 0x08; // 选择第四个数码管
P2 = digit[minute / 10]; // 显示分钟的十位
delay(1);
P1 = 0x10; // 选择第五个数码管
P2 = digit[minute % 10]; // 显示分钟的个位
delay(1);
P1 = 0x20;
P2 = 0xBF;
delay(1);
P1 = 0x40; // 选择第七个数码管
P2 = digit[second / 10]; // 显示秒钟的十位
delay(1);
P1 = 0x80; // 选择第八个数码管
P2 = digit[second % 10]; // 显示秒钟的个位
delay(1);
}
//主函数
void main() {
// 初始化定时器0
TMOD=0x00; // 设置定时器0为模式1
TH1=0x3c;// 设置定时初值
TL1=0xb0;//50ms
ET1=1;// 开启定时器
EA=1;// 开启总中断
TR1=1;// 启动定时器
while(1) {
if(!addHour) {//小时按键
delay(10);
if(!addHour) {
hour++;
if(hour >= 24) hour = 0;
}
while(!addHour);
}
if(!addMinute) {//分钟按键
delay(10);
if(!addMinute) {
minute++;
if(minute >= 60) minute = 0;
}
while(!addMinute);
}
if(!addSecond) {//秒按键
delay(10);
if(!addSecond) {
second++;
if(second >= 60) second = 0;
}
while(!addSecond);
}
display();
}
}
//定时器
void int0() interrupt 3 //20*50ms=1s
{
cnt++;
if(cnt == 20)
{
cnt = 0;
second++;
if(second == 60)
{
second = 0;
minute++;
if(minute == 60)
{
minute = 0;
hour++;
if(hour == 24)
{
hour = 0;
}
}
}
}
}
如果发现程序存在问题,欢迎留言指正。