多功能电子时钟

基于单片机的多功能电子时钟

功能要求:编程实现电子时钟功能,并将时间显示出来。具体功能如下:

  1. 能直接显示时、分、秒十进制数字;
  2. LED数码管时钟电路采用24h计时方式,时、分、秒分别用两位LED数码管显示,采用动态显示编程。
  3. 开机时间显示“11:59:50”
  4. 具备调时功能,设置三个独立按键,分别可调整时、分、秒,每按一次按键,数值加1。

任务:完成电路设计与仿真、编程实现电子时钟功能。

仪器耗材:计算机,proteus软件和KEIL软件。

 

实训设计:

仿真图:

65b29f900de14edf9537a5e91cb17379.png

使用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;
				}
			}
		}
	}
}

 

如果发现程序存在问题,欢迎留言指正。

 

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值