单片机原理与应用
实训报告
题目:具有整点报时带闹钟时间可调的数字钟 学院:盐 城 工 业 职 业 技 术 学 院 班级:计 控 1201 姓名:孙 慧 芳 学号:
完成日期: 2014/12/12
目录
1. 系统整体设计........................................................................................................... 3
1.1 系统设计要求.................................................................................................. 3
1.2 系统整体设计方案........................................................ 错误!未定义书签。
2. 系统硬件设计........................................................................................................... 3
2.1 单片机的电子闹钟系统框图 .......................................................................... 4
2.2 显示及控制模块.............................................................................................. 4
3. 系统软件设计........................................................................................................... 5
3.1 软件计时的分析与计算 ................................................................................ 5
3.2系统软件设计 ................................................................................................. 5
4. 结语........................................................................................................................... 6
5. 参考文献................................................................................................................... 7
附录1:......................................................................................................................... 8
附录二............................................................................................................................ 9
1. 系统整体设计
1.1 系统设计要求
1. 数字时钟显示:小时(两位)分钟(两位)秒钟(两位) 2. 时间可调,要求时、分、秒都可调
3. 可以设定闹铃,当闹铃时间到,蜂鸣器发出闹铃声音。 4. 具有整点报时功能。
1.2 系统整体设计方案
用内部定时器中断计时,三个两位数码管分别显示秒、分、时,STC89C52芯片P2口控制数码管选通,P0口输出数值显示。P3.5口输出高低电平驱动蜂鸣器做闹钟用。 设计功能如下:
(1)用6位LED数码管显示时、分、秒。 (2)可以设定时时间、修改定时时间。 (3)通过按键控制闹铃启动和停止。
(4)定时时间到通过蜂鸣器发出报警器,同时伴有灯光闪烁,由复位键停止报警。
(5)显示时间可调节
2. 系统硬件设计
2.1 系统框图如下:
基于80C51单片机的电子闹钟系统框图
2.2 显示及控制模块
3. 系统软件设计
3.1 软件计时的分析与计算
单片机内部定时器有4种工作模式,方式0是13位计数器,由于计时时间过短,中断频率高,所以不选用此模式;方式2是自动重装式计数器,是8位计数器,同样中断频率过高;方式3也是8位计数器;方式1是16位计数器,综合考虑,选用方式1做精确计时。由于51单片机是12分频,因此机器周期=晶振频率/12。在该设计中,选用频率为12MHz的晶振,因此机器周期=1μs。定时1s需要1000000个机器周期,因此通过20次定时器中断完成1s的定时,每次完成50000个周期的定时,因此每次给定时器的初值应该是TH0=B0H,TL0=3CH。
3.2 系统软件设计
设计两套存储方案,一套存储时钟,一套存储闹钟,两者互不干涉,只有当两者相等时才会调用闹钟播放子程序,而当每次整点时则会调用整点报时子程序。
本设计有调用T0中断,并有以下子程序: void delay(void) //延时子程序
void delay2(void) //1420专用延时子程序 void play(unsigned char temp) //1420播放子程序 void display(void) //显示子程序 void rdisplay(void) //闹钟显示子程序 void ring(void) //闹钟控制子程序 void examring(void) //闹钟播放子程序 void zhengdian(void) //整点报时子程序
4. 结语
通过对该作品的制作,了解了各个模块之间相互协同工作的重要性,初步掌握如何控制好各个模块之间的关系。通过对80C51的使用,了解了语音芯片在设计中的重要作用,有益于对单片机的进一步学习。
通过本次实验,简单模拟了一个时钟的基本功能。可以方便地设定时间,设定闹铃。预设定时间到整点有提示声,能够修改时间的时、分、秒。此系统设计简单、操作方便、程序可靠,具有一定的实用性。另外,在此基础上还可以继续完善和改进,如七彩灯显示等功能,使电子闹钟系统更加美观和智能化。 本次电子综合实践也锻炼了我们的动手能力,但最重要的是锻炼了如何解决问题的能力
5. 参考文献:
1、胡汉才.单片机原理及其接口技术.北京:清华大学出版社,2005 2、阎石.数字电子技术基础.北京:高等教育出版社,2001
3、童诗白 华成英.模拟电子技术基础.北京:高等教育出版社,2001 4、郁有文等.传感器原理及工程应用.西安:西安电子科技大学出版社,2008 5、彭伟.单片机C语言程序设计实训100例. 北京:电子工业出版社,2009 6、潘晓宁.单片机程序设计实践教程.北京:清华大学出版社,2009 7、楼然苗.单片机课程设计指导.北京:机械工业出版社,2007
8、彭芬。单片机C语言应用技术。北京 西安电子科技大学出版社,2009
附录1:
附录二
程序代码如下: #include #define tl 0xba; #define th 0x3c; sbit time=P1^0; //时间设置 sbit timer=P1^1; //闹钟设置 sbit add=P1^2; //加 sbit dec=P1^3; //减 sbit speaker=P3^5; //闹钟输出 bit disp_sd; //数码管闪动显示标志位 bit disp_ms; //数码管显示时间/闹钟标志位 bit disp_sdt; //数码管闪动间隔反转标志位 bit zhengdian=0; //整点报时标志位
unsigned char code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字0-9的编码
//unsigned char code led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98}; //数字0-9的编码
unsigned char time_cc,timer_cc; //调时计数器 unsigned char count0,count1,second,minit,hour; //时间时分秒 unsigned char second1,minit1,hour1; //闹钟时分秒 unsigned char hour_zd; //整点小时记录 void delay(void) { unsigned int i; for(i=0;i
void display(void) { if(disp_ms==0) { if(disp_sd==0) { P0=led[hour/10]; P2=0xFE; delay(); P2=0xFF; P0=0x00; P0=led[hour%10]; P2=0xFD;
delay(); P2=0xFF; P0=0x00;
P0=0x80; P2=0xFB; delay(); P2=0xFF; P0=0x00;
P0=led[minit/10]; P2=0xF7; delay(); P2=0xFF; P0=0x00; P0=led[minit%10]; P2=0xEF; delay(); P2=0xFF; P0=0x00;
P0=0x80; P2=0xDF; delay(); P2=0xFF; P0=0x00; P0=led[second/10]; P2=0xBF; delay(); P2=0xFF;
P0=0x00;
P0=led[second%10]; P2=0x7F; delay(); P2=0xFF; P0=0x00; } else {
if(time_cc==0x01)
{
if(disp_sdt==1)
P0=led[hour/10];
else
P0=0x00;
P2=0xFE;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[hour%10];
else
P0=0x00;
P2=0xFD;
delay();
P2=0xFF;
}
else
{
P0=led[hour/10];
P2=0xFE;
delay();
P2=0xFF;
P0=led[hour%10];
P2=0xFD;
delay();
P2=0xFF;
}
P0=0x80;
P2=0xFB;
delay();
P2=0xFF;
if(time_cc==0x02)
{
if(disp_sdt==1)
P0=led[minit/10];
else
P0=0x00;
P2=0xF7;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[minit%10];
else
P0=0x00;
P2=0xEF;
delay();
P2=0xFF;
}
else
{
P0=led[minit/10];
P2=0xF7;
delay();
P2=0xFF;
P0=led[minit%10];
P2=0xEF;
delay();
P2=0xFF;
}
P0=0x80;
P2=0xDF;
delay();
P2=0xFF;
if(time_cc==0x03)
{
if(disp_sdt==1)
P0=led[second/10];
else
P0=0x00;
P2=0xBF;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[second%10];
else
P0=0x00;
P2=0x7F;
delay();
P2=0xFF;
}
else
{
P0=led[second/10];
P2=0xBF;
delay();
P2=0xFF;
P0=led[second%10];
P2=0x7F;
delay();
P2=0xFF;
}
}
}
else
{
if(disp_sd==0)
{
P0=led[hour1/10];
P2=0xFE;
delay();
P2=0xFF;
P0=led[hour1%10];
P2=0xFD;
delay();
P2=0xFF;
P0=0x80;
P2=0xFB;
delay();
P2=0xFF;
P0=led[minit1/10];
P2=0xF7;
delay();
P2=0xFF;
P0=led[minit1%10];
P2=0xEF;
delay();
P2=0xFF;
P0=0x80;
P2=0xDF;
delay();
P2=0xFF;
P0=led[second1/10];
P2=0xBF;
delay();
P2=0xFF;
P0=led[second1%10];
P2=0x7F;
delay();
P2=0xFF;
}
else
{
if(timer_cc==0x01)
{
if(disp_sdt==1)
P0=led[hour1/10];
else
P0=0x00;
P2=0xFE;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[hour1%10];
else
P0=0x00;
P2=0xFD;
delay();
P2=0xFF;
}
else
{
P0=led[hour1/10];
P2=0xFE;
delay();
P2=0xFF;
P0=led[hour1%10];
P2=0xFD;
delay();
P2=0xFF;
}
P0=0x80;
P2=0xFB;
delay();
P2=0xFF;
if(timer_cc==0x02)
{
if(disp_sdt==1)
P0=led[minit1/10];
else
P0=0x00;
P2=0xF7;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[minit1%10];
else
P0=0x00;
P2=0xEF;
delay();
P2=0xFF;
}
else
{
P0=led[minit1/10];
P2=0xF7;
delay();
P2=0xFF;
P0=led[minit1%10];
P2=0xEF;
delay();
P2=0xFF;
}
P0=0x80;
P2=0xDF;
delay();
P2=0xFF;
if(timer_cc==0x03)
{
if(disp_sdt==1)
P0=led[second1/10];
else
P0=0x00;
P2=0xBF;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[second1%10];
else
P0=0x00;
P2=0x7F;
delay();
P2=0xFF;
}
else
{
P0=led[second1/10];
P2=0xBF;
delay();
P2=0xFF;
P0=led[second1%10];
P2=0x7F;
delay();
P2=0xFF;
}
}
}
}
void key_scan(void)
{
unsigned int i;
if(time==0)
{
speaker=1;
for(i=0;i
display();
if(time==0)
{
TR0=0;
do
display();
while(time==0);
disp_sd=1;
disp_ms=0;
time_cc++;
if(time_cc==4)
{
TR0=1;
time_cc=0;
disp_sd=0;
}
}
}
if(timer==0)
{
speaker=1;
for(i=0;i
{
display();
}
if(timer==0)
{
do
display();
while(timer==0);
disp_sd=1;
disp_ms=1;
timer_cc++;
if(timer_cc==4)
{
timer_cc=0;
disp_sd=0;
disp_ms=0;
}
}
} //数码管闪动显示 //显示模式为闹钟时间//闪动关闭 //切换到时间模式
if(add==0) { for(i=0;i23) hour=23; break;} case (0x02): { minit++; if(minit>59) minit=59; break;} case (0x03): { second++;if(second>59) second=59; break;} default: break; } } else { switch(timer_cc) { case (0x01): {if(hour1==23) hour1=23; else hour1++; break;} case (0x02): {if(minit1==59) minit1=59; else minit1++; break;} case (0x03): {if(second1==59) second1=59; else second1++; break;} default:break; } } } } if(dec==0) { for(i=0;i
while(dec==0);
if(disp_ms==0)
{
switch(time_cc)
{
case (0x01): {if(hour==0) hour=0; else hour--; break;} case (0x02): {if(minit==0) minit=0; else minit--; break;} case (0x03): {if(second==0) second=0; else second--; break;} default: break;
}
}
else
{
switch(timer_cc)
{
case (0x01): {if(hour1==0) hour1=0; else hour1--; break;} case (0x02): {if(minit1==0) minit1=0; else minit1--; break;} case (0x03): {if(second1==0) second1=0; else second1--; break;} default: break;
}
}
}
}
}
void timer_alam(void)
{
if((disp_ms==0)&&(disp_sd==0)) //正常运行时间的状态下 {
if((hour1==hour)&&(minit1==minit))
{
speaker=disp_sdt;
}
else
{
if(zhengdian==1)
{
speaker=disp_sdt;
}
else
speaker=1;
}
}
}
//3、主函数*************************************************
void main(void)
{
second=0; //时间初始化为00:00:00
minit=0;
hour=0;
second1=0; //闹钟默认为12:00:00
minit1=0;
hour1=12;
count0=0x00;
count1=0x00;
P1=0xFF;
TMOD=0x11;
TL0=tl;
TH0=th;
TL1=tl;
TH1=th;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
while(1)
{
key_scan();
display();
timer_alam();
}
}
//**********4、整点报时中断服务函数************************************** void time0_int(void) interrupt 1
{
TL0=tl;
TH0=th;
TR0=1;
count0++;
if(count0==20)
{
count0=0;
second++;
if(hour_zd==second) //报时到小时数后关闭报时标志。 zhengdian=0;
if(second==60)
{
second=0;
minit++;
if(minit==60)
{
zhengdian=1; //开启整点报时
minit=0;
hour++;
hour_zd=hour;
if(hour_zd>12)
hour_zd=hour_zd-12; //12小时制报时方式
if(hour==24)
{
hour=0;
}
}
}
}
}
//***5、调时中断服务函数**************************************
void time1_int(void) interrupt 3
{
TL1=tl;
TH1=th;
TR1=1;
count1++;
if(count1==10)
{
count1=0;
disp_sdt=~disp_sdt;
}
}
21
单片机原理与应用
实训报告
题目:具有整点报时带闹钟时间可调的数字钟 学院:盐 城 工 业 职 业 技 术 学 院 班级:计 控 1201 姓名:孙 慧 芳 学号:
完成日期: 2014/12/12
目录
1. 系统整体设计........................................................................................................... 3
1.1 系统设计要求.................................................................................................. 3
1.2 系统整体设计方案........................................................ 错误!未定义书签。
2. 系统硬件设计........................................................................................................... 3
2.1 单片机的电子闹钟系统框图 .......................................................................... 4
2.2 显示及控制模块.............................................................................................. 4
3. 系统软件设计........................................................................................................... 5
3.1 软件计时的分析与计算 ................................................................................ 5
3.2系统软件设计 ................................................................................................. 5
4. 结语........................................................................................................................... 6
5. 参考文献................................................................................................................... 7
附录1:......................................................................................................................... 8
附录二............................................................................................................................ 9
1. 系统整体设计
1.1 系统设计要求
1. 数字时钟显示:小时(两位)分钟(两位)秒钟(两位) 2. 时间可调,要求时、分、秒都可调
3. 可以设定闹铃,当闹铃时间到,蜂鸣器发出闹铃声音。 4. 具有整点报时功能。
1.2 系统整体设计方案
用内部定时器中断计时,三个两位数码管分别显示秒、分、时,STC89C52芯片P2口控制数码管选通,P0口输出数值显示。P3.5口输出高低电平驱动蜂鸣器做闹钟用。 设计功能如下:
(1)用6位LED数码管显示时、分、秒。 (2)可以设定时时间、修改定时时间。 (3)通过按键控制闹铃启动和停止。
(4)定时时间到通过蜂鸣器发出报警器,同时伴有灯光闪烁,由复位键停止报警。
(5)显示时间可调节
2. 系统硬件设计
2.1 系统框图如下:
基于80C51单片机的电子闹钟系统框图
2.2 显示及控制模块
3. 系统软件设计
3.1 软件计时的分析与计算
单片机内部定时器有4种工作模式,方式0是13位计数器,由于计时时间过短,中断频率高,所以不选用此模式;方式2是自动重装式计数器,是8位计数器,同样中断频率过高;方式3也是8位计数器;方式1是16位计数器,综合考虑,选用方式1做精确计时。由于51单片机是12分频,因此机器周期=晶振频率/12。在该设计中,选用频率为12MHz的晶振,因此机器周期=1μs。定时1s需要1000000个机器周期,因此通过20次定时器中断完成1s的定时,每次完成50000个周期的定时,因此每次给定时器的初值应该是TH0=B0H,TL0=3CH。
3.2 系统软件设计
设计两套存储方案,一套存储时钟,一套存储闹钟,两者互不干涉,只有当两者相等时才会调用闹钟播放子程序,而当每次整点时则会调用整点报时子程序。
本设计有调用T0中断,并有以下子程序: void delay(void) //延时子程序
void delay2(void) //1420专用延时子程序 void play(unsigned char temp) //1420播放子程序 void display(void) //显示子程序 void rdisplay(void) //闹钟显示子程序 void ring(void) //闹钟控制子程序 void examring(void) //闹钟播放子程序 void zhengdian(void) //整点报时子程序
4. 结语
通过对该作品的制作,了解了各个模块之间相互协同工作的重要性,初步掌握如何控制好各个模块之间的关系。通过对80C51的使用,了解了语音芯片在设计中的重要作用,有益于对单片机的进一步学习。
通过本次实验,简单模拟了一个时钟的基本功能。可以方便地设定时间,设定闹铃。预设定时间到整点有提示声,能够修改时间的时、分、秒。此系统设计简单、操作方便、程序可靠,具有一定的实用性。另外,在此基础上还可以继续完善和改进,如七彩灯显示等功能,使电子闹钟系统更加美观和智能化。 本次电子综合实践也锻炼了我们的动手能力,但最重要的是锻炼了如何解决问题的能力
5. 参考文献:
1、胡汉才.单片机原理及其接口技术.北京:清华大学出版社,2005 2、阎石.数字电子技术基础.北京:高等教育出版社,2001
3、童诗白 华成英.模拟电子技术基础.北京:高等教育出版社,2001 4、郁有文等.传感器原理及工程应用.西安:西安电子科技大学出版社,2008 5、彭伟.单片机C语言程序设计实训100例. 北京:电子工业出版社,2009 6、潘晓宁.单片机程序设计实践教程.北京:清华大学出版社,2009 7、楼然苗.单片机课程设计指导.北京:机械工业出版社,2007
8、彭芬。单片机C语言应用技术。北京 西安电子科技大学出版社,2009
附录1:
附录二
程序代码如下: #include #define tl 0xba; #define th 0x3c; sbit time=P1^0; //时间设置 sbit timer=P1^1; //闹钟设置 sbit add=P1^2; //加 sbit dec=P1^3; //减 sbit speaker=P3^5; //闹钟输出 bit disp_sd; //数码管闪动显示标志位 bit disp_ms; //数码管显示时间/闹钟标志位 bit disp_sdt; //数码管闪动间隔反转标志位 bit zhengdian=0; //整点报时标志位
unsigned char code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字0-9的编码
//unsigned char code led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98}; //数字0-9的编码
unsigned char time_cc,timer_cc; //调时计数器 unsigned char count0,count1,second,minit,hour; //时间时分秒 unsigned char second1,minit1,hour1; //闹钟时分秒 unsigned char hour_zd; //整点小时记录 void delay(void) { unsigned int i; for(i=0;i
void display(void) { if(disp_ms==0) { if(disp_sd==0) { P0=led[hour/10]; P2=0xFE; delay(); P2=0xFF; P0=0x00; P0=led[hour%10]; P2=0xFD;
delay(); P2=0xFF; P0=0x00;
P0=0x80; P2=0xFB; delay(); P2=0xFF; P0=0x00;
P0=led[minit/10]; P2=0xF7; delay(); P2=0xFF; P0=0x00; P0=led[minit%10]; P2=0xEF; delay(); P2=0xFF; P0=0x00;
P0=0x80; P2=0xDF; delay(); P2=0xFF; P0=0x00; P0=led[second/10]; P2=0xBF; delay(); P2=0xFF;
P0=0x00;
P0=led[second%10]; P2=0x7F; delay(); P2=0xFF; P0=0x00; } else {
if(time_cc==0x01)
{
if(disp_sdt==1)
P0=led[hour/10];
else
P0=0x00;
P2=0xFE;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[hour%10];
else
P0=0x00;
P2=0xFD;
delay();
P2=0xFF;
}
else
{
P0=led[hour/10];
P2=0xFE;
delay();
P2=0xFF;
P0=led[hour%10];
P2=0xFD;
delay();
P2=0xFF;
}
P0=0x80;
P2=0xFB;
delay();
P2=0xFF;
if(time_cc==0x02)
{
if(disp_sdt==1)
P0=led[minit/10];
else
P0=0x00;
P2=0xF7;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[minit%10];
else
P0=0x00;
P2=0xEF;
delay();
P2=0xFF;
}
else
{
P0=led[minit/10];
P2=0xF7;
delay();
P2=0xFF;
P0=led[minit%10];
P2=0xEF;
delay();
P2=0xFF;
}
P0=0x80;
P2=0xDF;
delay();
P2=0xFF;
if(time_cc==0x03)
{
if(disp_sdt==1)
P0=led[second/10];
else
P0=0x00;
P2=0xBF;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[second%10];
else
P0=0x00;
P2=0x7F;
delay();
P2=0xFF;
}
else
{
P0=led[second/10];
P2=0xBF;
delay();
P2=0xFF;
P0=led[second%10];
P2=0x7F;
delay();
P2=0xFF;
}
}
}
else
{
if(disp_sd==0)
{
P0=led[hour1/10];
P2=0xFE;
delay();
P2=0xFF;
P0=led[hour1%10];
P2=0xFD;
delay();
P2=0xFF;
P0=0x80;
P2=0xFB;
delay();
P2=0xFF;
P0=led[minit1/10];
P2=0xF7;
delay();
P2=0xFF;
P0=led[minit1%10];
P2=0xEF;
delay();
P2=0xFF;
P0=0x80;
P2=0xDF;
delay();
P2=0xFF;
P0=led[second1/10];
P2=0xBF;
delay();
P2=0xFF;
P0=led[second1%10];
P2=0x7F;
delay();
P2=0xFF;
}
else
{
if(timer_cc==0x01)
{
if(disp_sdt==1)
P0=led[hour1/10];
else
P0=0x00;
P2=0xFE;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[hour1%10];
else
P0=0x00;
P2=0xFD;
delay();
P2=0xFF;
}
else
{
P0=led[hour1/10];
P2=0xFE;
delay();
P2=0xFF;
P0=led[hour1%10];
P2=0xFD;
delay();
P2=0xFF;
}
P0=0x80;
P2=0xFB;
delay();
P2=0xFF;
if(timer_cc==0x02)
{
if(disp_sdt==1)
P0=led[minit1/10];
else
P0=0x00;
P2=0xF7;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[minit1%10];
else
P0=0x00;
P2=0xEF;
delay();
P2=0xFF;
}
else
{
P0=led[minit1/10];
P2=0xF7;
delay();
P2=0xFF;
P0=led[minit1%10];
P2=0xEF;
delay();
P2=0xFF;
}
P0=0x80;
P2=0xDF;
delay();
P2=0xFF;
if(timer_cc==0x03)
{
if(disp_sdt==1)
P0=led[second1/10];
else
P0=0x00;
P2=0xBF;
delay();
P2=0xFF;
if(disp_sdt==1)
P0=led[second1%10];
else
P0=0x00;
P2=0x7F;
delay();
P2=0xFF;
}
else
{
P0=led[second1/10];
P2=0xBF;
delay();
P2=0xFF;
P0=led[second1%10];
P2=0x7F;
delay();
P2=0xFF;
}
}
}
}
void key_scan(void)
{
unsigned int i;
if(time==0)
{
speaker=1;
for(i=0;i
display();
if(time==0)
{
TR0=0;
do
display();
while(time==0);
disp_sd=1;
disp_ms=0;
time_cc++;
if(time_cc==4)
{
TR0=1;
time_cc=0;
disp_sd=0;
}
}
}
if(timer==0)
{
speaker=1;
for(i=0;i
{
display();
}
if(timer==0)
{
do
display();
while(timer==0);
disp_sd=1;
disp_ms=1;
timer_cc++;
if(timer_cc==4)
{
timer_cc=0;
disp_sd=0;
disp_ms=0;
}
}
} //数码管闪动显示 //显示模式为闹钟时间//闪动关闭 //切换到时间模式
if(add==0) { for(i=0;i23) hour=23; break;} case (0x02): { minit++; if(minit>59) minit=59; break;} case (0x03): { second++;if(second>59) second=59; break;} default: break; } } else { switch(timer_cc) { case (0x01): {if(hour1==23) hour1=23; else hour1++; break;} case (0x02): {if(minit1==59) minit1=59; else minit1++; break;} case (0x03): {if(second1==59) second1=59; else second1++; break;} default:break; } } } } if(dec==0) { for(i=0;i
while(dec==0);
if(disp_ms==0)
{
switch(time_cc)
{
case (0x01): {if(hour==0) hour=0; else hour--; break;} case (0x02): {if(minit==0) minit=0; else minit--; break;} case (0x03): {if(second==0) second=0; else second--; break;} default: break;
}
}
else
{
switch(timer_cc)
{
case (0x01): {if(hour1==0) hour1=0; else hour1--; break;} case (0x02): {if(minit1==0) minit1=0; else minit1--; break;} case (0x03): {if(second1==0) second1=0; else second1--; break;} default: break;
}
}
}
}
}
void timer_alam(void)
{
if((disp_ms==0)&&(disp_sd==0)) //正常运行时间的状态下 {
if((hour1==hour)&&(minit1==minit))
{
speaker=disp_sdt;
}
else
{
if(zhengdian==1)
{
speaker=disp_sdt;
}
else
speaker=1;
}
}
}
//3、主函数*************************************************
void main(void)
{
second=0; //时间初始化为00:00:00
minit=0;
hour=0;
second1=0; //闹钟默认为12:00:00
minit1=0;
hour1=12;
count0=0x00;
count1=0x00;
P1=0xFF;
TMOD=0x11;
TL0=tl;
TH0=th;
TL1=tl;
TH1=th;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
while(1)
{
key_scan();
display();
timer_alam();
}
}
//**********4、整点报时中断服务函数************************************** void time0_int(void) interrupt 1
{
TL0=tl;
TH0=th;
TR0=1;
count0++;
if(count0==20)
{
count0=0;
second++;
if(hour_zd==second) //报时到小时数后关闭报时标志。 zhengdian=0;
if(second==60)
{
second=0;
minit++;
if(minit==60)
{
zhengdian=1; //开启整点报时
minit=0;
hour++;
hour_zd=hour;
if(hour_zd>12)
hour_zd=hour_zd-12; //12小时制报时方式
if(hour==24)
{
hour=0;
}
}
}
}
}
//***5、调时中断服务函数**************************************
void time1_int(void) interrupt 3
{
TL1=tl;
TH1=th;
TR1=1;
count1++;
if(count1==10)
{
count1=0;
disp_sdt=~disp_sdt;
}
}
21