标题:
51单片机多功能数字时钟程序,可显示时分秒,可定闹钟
[打印本页]
作者:
余城
时间:
2021-4-21 16:28
标题:
51单片机多功能数字时钟程序,可显示时分秒,可定闹钟
附带c代码和仿真图
51hei图片_20210421162309.png
(132.43 KB, 下载次数: 123)
下载附件
2021-4-21 16:27 上传
#include "main.h"
//延时函数
void delay(unsigned int time)
{
unsigned int j = 0;
for(;time>0;time--) //执行空语句,消耗CPU时间。
for(j=0;j<125;j++);
}
void main(void)
{
//时分秒初始化
m_shi=num/10;
m_ge=num%10;
f_shi=f/10;
f_ge=f%10;
h_shi=h/10;
h_ge=h%10;
//初始化定时器1和定时器0
TMOD=0x10;
//设置定时器溢出值
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
//开总中断
EA=1;
//开启定时器中断
ET1=1;
//开启定时器
TR1=1;
//开外部中断0
EX0 = 1;
//设置外部中断0的触发方式为下降沿
IT0 = 1;
while(1)
{
if (key1 == 0)
{
//按键松手检测
while (key1 == 0);
mode++;
Beep = 1;
flag = 0;
if (mode == 3)
{
//刷新数值并显示
m_shi=alarm_num/10;
m_ge=alarm_num%10;
f_shi=alarm_f/10;
f_ge=alarm_f%10;
h_shi=alarm_h/10;
h_ge=alarm_h%10;
}
else
{
//刷新数值并显示
m_shi=num/10;
m_ge=num%10;
f_shi=f/10;
f_ge=f%10;
h_shi=h/10;
h_ge=h%10;
}
if (mode == 4)
{
mode = 1;
}
}
if (mode == 1)//时钟模式
{
display();
}
//调试模式
if (mode == 2)
{
adjust_time();
}
//设置闹钟
if(mode == 3)
{
adjust_alarm();
}
//打开闹钟
if ((alarm_num == num) && (alarm_f == f) && (alarm_h == h))
{
//num2 = 0;
alarm_clock = 1;
}
//关闭闹钟
if (alarm_clock == 0)
{
Beep = 1;
}
}
}
void display(void)
{
//把时的十位送到P0端口
duang_clk = 1; //开启573锁存引脚
P0=LED[h_shi];
delay(1);
duang_clk = 0; //关闭573锁存引脚
//调时闪烁
if (flag == 1)
{
if (ok == 0)
{
wei_clk = 1;
P0=0xfe;
delay(1);
P0=0xff;
wei_clk = 0;
}
else
{
wei_clk = 1;
P0=0xff;
wei_clk = 0;
}
}
else
{
wei_clk = 1;
P0=0xfe;
delay(1);
P0=0xff;
wei_clk = 0;
}
//把时的个位送到P0端口
duang_clk = 1;
P0=LED[h_ge];
delay(1);
duang_clk = 0;
//调时闪烁
if (flag == 1)
{
if (ok == 0)
{
wei_clk = 1;
P0=0xfd;
delay(1);
P0=0xff;
wei_clk = 0;
}
else
{
wei_clk = 1;
P0=0xff;
wei_clk = 0;
}
}
else
{
wei_clk = 1;
P0=0xfd;
delay(1);
P0=0xff;
wei_clk = 0;
}
//-
duang_clk = 1;
P0=LED[10];
delay(1);
duang_clk = 0;
wei_clk = 1;
P0=0xfb;
delay(1);
P0=0xff;
wei_clk = 0;
//把分的十位到P0端口
duang_clk = 1;
P0=LED[f_shi];
delay(1);
duang_clk = 0;
//调分闪烁
if (flag == 2)
{
if (ok == 0)
{
wei_clk = 1;
P0=0xf7;
delay(1);
P0=0xff;
wei_clk = 0;
}
else
{
wei_clk = 1;
P0=0xff;
wei_clk = 0;
}
}
else
{
wei_clk = 1;
P0=0xf7;
delay(1);
P0=0xff;
wei_clk = 0;
}
//把分的个位送到P0端口
duang_clk = 1;
P0=LED[f_ge];
delay(1);
duang_clk = 0;
//调分闪烁
if (flag == 2)
{
if (ok == 0)
{
wei_clk = 1;
P0=0xef;
delay(1);
P0=0xff;
wei_clk = 0;
}
else
{
wei_clk = 1;
P0=0xff;
wei_clk = 0;
}
}
else
{
wei_clk = 1;
P0=0xef;
delay(1);
P0=0xff;
wei_clk = 0;
}
//-
duang_clk = 1;
P0=LED[10];
delay(1);
duang_clk = 0;
wei_clk = 1;
P0=0xdf;
delay(1);
P0=0xff;
wei_clk = 0;
//把秒的十位到P0端口
duang_clk = 1;
P0=LED[m_shi];
delay(1);
duang_clk = 0;
if (flag == 3)
{
if (ok == 0)
{
wei_clk = 1;
P0=0xbf;
delay(1);
P0=0xff;
wei_clk = 0;
}
else
{
wei_clk = 1;
P0=0xff;
wei_clk = 0;
}
}
else//调秒闪烁
{
wei_clk = 1;
P0=0xbf;
delay(1);
P0=0xff;
wei_clk = 0;
}
//把秒的个位送到P0端口
duang_clk = 1;
P0=LED[m_ge];
delay(1);
duang_clk = 0;
//调秒闪烁
if (flag == 3)
{
if (ok == 0)
{
wei_clk = 1;
P0=0x7f;
delay(1);
P0=0xff;
wei_clk = 0;
}
else
{
wei_clk = 1;
P0=0xff;
wei_clk = 0;
}
}
else
{
wei_clk = 1;
P0=0x7f;
delay(1);
P0=0xff;
wei_clk = 0;
}
}
//定时器1中断服务函数,50ms进入一次中断
void T1_time() interrupt 3
{
//重装载定时器1的初始值
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
//没20ms加一次
num2++;
//闹钟响
if (alarm_clock == 1)
{
if (num2 % 20 == 0)
{
alarm_clock_counte++;
Beep = !Beep;
if (alarm_clock_counte == 7)
{
Beep = 1;
alarm_clock_counte=0;
alarm_clock = 0;
}
}
}
if (num2 % 10 == 0)
{
ok = !ok;
}
//50ms * 20 = 1s
if(num2==20)
{
//清零
num2=0;
//只有在走时模式秒钟才动作
if (mode == 1)
{
//秒计数加1
num++;
//更新数值
m_shi=num/10;
m_ge=num%10;
}
//1s * 60 = 60s = 1分钟
if(num==60)
{
//清零
num=0;
//分计数加1
f++;
//更新数值
m_shi=num/10;
m_ge=num%10;
f_shi=f/10;
f_ge=f%10;
//1分钟 * 60 = 1小时
if (f == 60)
{
//清零
f = 0;
//时计数加1
h++;
//更新数值
f_shi=f/10;
f_ge=f%10;
h_shi=h/10;
h_ge=h%10;
//1小时 * 24 = 1天
if (h == 24)
{
//清零
h = 0;
//更新数值
h_shi=h/10;
h_ge=h%10;
}
}
}
}
}
//外部中断0中断服务函数
void int0() interrupt 0
{
alarm_clock = 0;
Beep = 1;
}
//调时间
void adjust_time(void)
{
if (key2 == 0)
{
//按键松手检测
while (key2 == 0);
flag++;
if(flag == 4)
{
flag = 1;
}
}
if (flag == 1)
{
if (key3 == 0)
{
while (key3 == 0);
h++;
if (h == 24)
{
h=0;
}
}
if (key5 == 0)
{
while (key5 == 0);
h--;
if (h == -1)
{
h=23;
}
}
}
if (flag == 2)
{
if (key3 == 0)
{
while (key3 == 0);
f++;
if (f == 60)
{
f=0;
}
}
if (key5 == 0)
{
while (key5 == 0);
f--;
if (f == -1)
{
f=59;
}
}
}
if (flag == 3)
{
if (key3 == 0)
{
while (key3 == 0);
num++;
if (num == 60)
{
num=0;
}
}
if (key5 == 0)
{
while (key5 == 0);
num--;
if (num == -1)
{
num=59;
}
}
}
//刷新数值并显示
m_shi=num/10;
m_ge=num%10;
f_shi=f/10;
f_ge=f%10;
h_shi=h/10;
h_ge=h%10;
display();
}
void adjust_alarm(void)
{
if (key2 == 0)
{
//按键松手检测
while (key2 == 0);
flag++;
if(flag == 4)
{
flag = 1;
}
}
if (flag == 1)
{
if (key3 == 0)
{
while (key3 == 0);
alarm_h++;
if (alarm_h == 24)
{
alarm_h=0;
}
}
if (key5 == 0)
{
while (key5 == 0);
alarm_h--;
if (alarm_h == -1)
{
alarm_h=23;
}
}
}
if (flag == 2)
{
if (key3 == 0)
{
while (key3 == 0);
alarm_f++;
if (alarm_f == 60)
{
alarm_f=0;
}
}
if (key5 == 0)
{
while (key5 == 0);
alarm_f--;
if (alarm_f == -1)
{
alarm_f=59;
}
}
}
if (flag == 3)
{
if (key3 == 0)
{
while (key3 == 0);
alarm_num++;
if (alarm_num == 60)
{
alarm_num=0;
}
}
if (key5 == 0)
{
while (key5 == 0);
alarm_num--;
if (alarm_num == -1)
{
alarm_num=59;
}
}
}
//刷新数值并显示
m_shi=alarm_num/10;
m_ge=alarm_num%10;
f_shi=alarm_f/10;
f_ge=alarm_f%10;
h_shi=alarm_h/10;
h_ge=alarm_h%10;
display();
}
复制代码
作者:
天下第一诗人
时间:
2021-7-1 17:12
有没有比较清楚的仿真图
作者:
ZQ01
时间:
2021-10-22 22:43
可以发一下仿真文件吗?谢谢
作者:
1020410405
时间:
2021-11-28 12:15
可以看一下前面的几行程序吗
作者:
1296809905
时间:
2021-11-29 11:08
楼主,有没有仿真文件呀
作者:
yangbulasi
时间:
2022-5-10 20:06
还缺少变量定义
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1