语音芯片时钟电路(整点报时名闹铃设置)程序
整点报时电路

整点报时电路
有不少场合,如车站候车室、浴室、写字楼、医院等公共场合,一般设置的数字钟都无声光报时功能,这给旅客、顾客或病员等会带来不便。
本整点报时电路在整点时能准确地进行声、光报时,能奏出一首世界名曲,且每次整点按序换一首乐曲。
整点报时电路包括数字钟定时控制电路、单稳态定时电路和名曲演奏电路等,电路如图所示。
定时控制电路是以LCD数字钟芯片KS5195(或KS5194)为核心组成的,它外接专用石英晶体32768Hz,可变电容器C0用以微调其准确的时间基准。
从AL钟控端引出整点的定时信号,每到整点时刻便输出一高电平信号(Vp-p=1.3v,t=50ms)。
IC2采用时基电路555,它与R3、C3等组成一个单稳态定时电路。
在整点时刻,钟控定时脉冲使VT1饱和导通,555的2脚呈低电位,将555翻转置位,3脚转呈高电位。
高电位保持的时间,即单稳态的暂稳时间为td=1.1R3C3,根据后级KD-4821演奏一首乐曲的时间,暂稳时间设计为52秒。
调节充电时间常数RC,可改变其演奏时间。
在IC2的输出转呈高电位后,发光二极管LED发光,同时,IC3得电并触发,迅即奏放乐曲一首。
IC3采用16首乐曲集成电路KD-482I,它内存有16首世界名曲。
单片机电子闹钟程序亲自编写-可用

单片机电子闹钟程序(亲自编写-可用)————————————————————————————————作者:————————————————————————————————日期:学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。
其中正常时间显示和闹钟时间显示可用一个开关来调整。
芯片选择STC89C52程序:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//定义显示段码uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar codebbtime[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar clock[]={0,0,0,0};uchar clock1[]={12,30,0};uchar weikong[6];uchar bbduration=4;uchar lingtime=9;//学校打铃时间组uchar shangwu1[]={8,30};uchar shangwu2[]={10,0};uchar shangwu3[]={10,20};uchar shangwu4[]={11,50};uchar xiawu1[]={13,30};uchar xiawu2[]={15,00};uchar xiawu3[]={15,15};uchar xiawu4[]={16,45};//按键定义sbit mode=P1^7;sbit sec_clr=P1^0;sbit min_set_add=P1^3;sbit min_set_sub=P1^4;sbit hour_set_add=P1^1;sbit hour_set_sub=P1^2;sbit bb_set_add=P1^5;sbit bb_set_sub=P1^6;sbit speaker=P2^6;//延时函数void delay(unsigned int t){while(t--);//时钟进位函数void clockjinwei(){clock[0]++;if(clock[0]==20){clock[1]++;clock[0]=0;if(clock[1]==60){clock[2]++;clock[1]=0;if(clock[2]==60){clock[3]++;clock[2]=0;if(clock[3]==24)clock[3]=0;}}}}//定时器0中断服务函数void timer0(void) interrupt 1 using 1 {TMOD=0x01;TH0=0x3c;TL0=0xb0;clockjinwei();}//时钟分位显示函数void fenwei(){weikong[0]=clock[3]/10;weikong[1]=clock[3]%10;weikong[2]=clock[2]/10;weikong[3]=clock[2]%10;weikong[4]=clock[1]/10;weikong[5]=clock[1]%10;}//闹钟分位显示函数void naofen(){weikong[0]=clock1[0]/10;weikong[1]=clock1[0]%10;weikong[2]=clock1[1]/10;weikong[3]=clock1[1]%10;weikong[4]=clock1[2]/10;weikong[5]=clock1[2]%10; }//闹钟定时显示函数void naozhongdisplay(){uchar z,s;uchar x=0x01;naofen();for(z=0;z<6;z++){P2=0;P0=table[weikong[z]];P2=x;x=_crol_(x,1);for(s=0;s<255;s++);}}//时钟显示函数void display(){uchar i,j;uchar x=0x01;fenwei();for(i=0;i<6;i++){P2=0;P0=table[weikong[i]];P2=x;x=_crol_(x,1);for(j=0;j<255;j++);}}//总显示函数void zhongxian(){if(mode==1)delay(100);if(mode==1)display();if(mode==0)delay(100);if(mode==0)naozhongdisplay();}//按键处理程序void key_set(){zhongxian();P1=0xff;if(min_set_add==0){delay(100);if(min_set_add==0){if(mode==1){clock[2]++;if(clock[2]==60){clock[2]=0;}while(min_set_add==0)zhongxian();}}if(mode==0){clock1[1]++;if(clock1[1]==60){clock1[1]=0;}while(min_set_add==0)zhongxian();}}//if(min_set_sub==0){delay(100);if(min_set_sub==0){if(mode==1){clock[2]--;if(clock[2]==0)clock[2]=59;}while(min_set_sub==0)zhongxian();if(mode==0){clock1[1]--;if(clock1[1]==0)clock1[1]=59;}while(min_set_sub==0)zhongxian();}}//if(hour_set_add==0){delay(100);if(hour_set_add==0){if(mode==1){clock[3]++;if(clock[3]==24){clock[3]=0;}while(hour_set_add==0)zhongxian();}if(mode==0){clock1[0]++;if(clock1[0]==24){clock1[0]=0;}while(hour_set_add==0)zhongxian();}}}//if(hour_set_sub==0){delay(100);if(hour_set_sub==0){if(mode==1){clock[3]--;if(clock[3]==0)clock[3]=23;}while(hour_set_sub==0)zhongxian();if(mode==0){clock1[0]--;if(clock1[0]==0)clock1[0]=23;}while(hour_set_sub==0)zhongxian();}}//if(sec_clr==0){delay(100);if(sec_clr==0){clock[1]=0;}while(sec_clr==0)zhongxian();}}//闹钟响铃函数void bb(){if(clock[1]<=bbduration){speaker=1;delay(100);speaker=0;}else speaker=0;}//打铃函数void daling(){if(clock[1]<=lingtime){speaker=1;delay(100);speaker=0;}else speaker=0;}//时间比较函数void bijiao(){if(clock[3]==shangwu1[0]){if(clock[2]==shangwu1[1])daling();}if(clock[3]==shangwu2[0]){if(clock[2]==shangwu2[1])daling();}if(clock[3]==shangwu3[0]){if(clock[2]==shangwu3[1])daling();}if(clock[3]==shangwu4[0]){if(clock[2]==shangwu4[1])daling();}if(clock[3]==xiawu1[0]){if(clock[2]==xiawu1[1])daling();}if(clock[3]==xiawu2[0]){if(clock[2]==xiawu2[1])daling();}if(clock[3]==xiawu3[0]){if(clock[2]==xiawu3[1])daling();}if(clock[3]==xiawu4[0]){if(clock[2]==xiawu4[1])daling();}}//闹钟比较void naobijiao(){if(clock[3]==clock1[0]){if(clock[2]==clock1[1]||clock[2]==clock1[1]+1||clock[2]==clock1[1]+2) bb();}}//响铃时长显示函数void bbtimeshow(){P3=bbtime[bbduration];if(bbduration>15)bbduration=0;}//响铃按键处理函数void bbtime_set(){bbtimeshow();if(bb_set_add==0){delay(100);if(bb_set_add==0)bbduration++;while(bb_set_add==0)bbtimeshow();}if(bb_set_sub==0){delay(100);if(bb_set_sub==0)bbduration--;while(bb_set_sub==0)bbtimeshow();}}//主程序void main(){EA=1;ET0=1;TR0=1;while(1){key_set();bijiao();bbtime_set();naobijiao();}}电路图:分四部分显示:如果在学习这个程序过程中有什么问题,可以发邮件到询问。
多功能语音报时数字钟的设计 (2)

目录多功能语音报时数字钟的设计 (1)一、绪论 (4)(一)课题研究背景 (5)二、研究或设计的国内外现状和发展趋势 (5)(一)课题研究意义 (6)(二)本设计的主要内容 (6)(三)时钟芯片的选择 (7)(四)显示模块的选择 (8)(五)语音芯片的选择 (8)三、系统的硬件电路设计 (8)(一)总体设计 (8)1.时钟电路 (9)2.复位电路 (9)3.DS1302时钟模块设计 (11)4.LCD显示电路 (11)5.LCD显示电路 (12)四、系统软件的设计 (14)(一)主程序流程图 (14)(二)时钟电路流程图 (14)(三)语音电路子程序 (15)多功能语音报时数字钟的设计摘要:自进入21世纪以来,电子产业飞速发展,各种新兴的电子产品布满了电子专柜,电子产品几乎走进了家家户户,走进了社会的各个行业,有力的推动了社会生产力的发展和电子信息化、电子智能化的提高。
数字钟也在发生着各种各样的变化,由体积较大、功能少、运行不精确的机械钟变为在液晶显示屏上显示数字的数字钟,再到多种功能于一钟的语音报时数字钟等等。
本设计是实现一款可正常显示当前时间,测量当前温度,带有语音报时的多功能数字钟。
本设计是采用AT89C51单片机控制的多功能语音报时数钟,可以显示年、月、日、时、分、秒、星期、温度。
具有年、月、日、时、分校准功能,自动提取温度并显示功能,语音报时功能,调整时间按下相应键会发出嘟嘟提示声功能。
采用DS1302时钟芯片进行时钟控制,DS18B20传感器实现温度采集功能,LCD12864作为液晶显示模块,ISD1420语音芯片实现语音播报时间功能。
钟表的多功能化给我们生活带来了很大的改善,比如定时报警、备忘提醒、电气设备的自动断电、自动开启关闭等功能。
数字时钟对世界有着重要的影响,对工业、电子业、商业有着重要的推进作用,使用简单方便,成本低,显示直观,在广阔的市场具有非常很好的前景市场。
数字时钟之所以这么受广大的欢迎,它使用简单直观,数字时钟在显示方面能清楚的在LED显示屏上显示出年、月、日、周日、时、分、秒,还有调准时间的准确度的功能,并且能够显示当日的温度情况。
51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)

51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)效果图:程序如下://51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int/*七段共阴管显示定义*///此表为LED 的字模,共阴数码管0-9 -uchar code dispcode[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制/*定义并初始化变量*/uchar seconde=0;//秒uchar minite=0;//分uchar hour=12; //时uchar shi=0;//闹铃功能uchar fen=0;uchar bjcs;//报警次数sbit P1_0=P1^0; //second 调整定义sbit P1_1=P1^1; //minite调整定义sbit P1_2=P1^2; //hour调整定义sbit P1_5=P1^5; //整点报时sbit P1_3=P1^3; //闹铃功能,调整时间sbit P1_6=P1^6; //调整时sbit P1_7=P1^7; //调整分sbit P1_4=P1^4; //关闭闹铃/*函数声明*/void delay(uint k ); //延时子程序void time_pro( ); //时间处理子程序void display( ); //显示子程序void keyscan( ); //键盘扫描子程序/*xx子程序*/void delay (uint k){uchar j;while((k--)!=0){for(j=0;j<125;j++){;}}}/*时间处理子程序*/void time_pro(void){if(seconde==60){seconde=0;minite++;if(minite==60){minite=0;hour++;if(hour==24){hour=0;}}}}/*显示子程序*/void display(void){if(P1_3==1){P2=0XFE; P0=dispcode[seconde%10];//秒个位delay(1);P2=0XFD;P0=dispcode[seconde/10];//秒十位delay(1);P2=0XFB;P0=dispcode[10];//间隔符-delay(1);P2=0XF7;P0=dispcode[minite%10];//分个位delay(1);P2=0XEF;P0=dispcode[minite/10];//分十位delay(1);P2=0XDF;P0=dispcode[10];//间隔符-delay(1);P2=0XBF;P0=dispcode[hour%10];//时个位delay(1);P2=0X7F;P0=dispcode[hour/10];//时十位delay(1);}}/*键盘扫描子程序*/void keyscan(void){if(P1_0==0)//秒位的调整{delay (30);if(P1_0==0){seconde++;if(seconde==60){seconde=0;}}delay(250);}if(P1_1==0)//分位的调整{delay(30);if(P1_1==0){minite++;if(minite==60){minite=0;}}delay(250);}if(P1_2==0)//时位的调整{delay(30);if(P1_2==0){hour++;if(hour==24){hour=0;}}delay(250);}}/*整点报警*/void zhengdian (void){if((seconde==0)&(minite==0))//整点报时{P1_5=0;delay(1000);P1_5=1;}}/*定时闹钟*/void dingshi(void){if(P1_3==0)//按住P1_3BU不松,显示闹铃设置界面,分别按P1_6、P1_7设置闹铃时间。
rtc alarm原理

rtc alarm原理RTC闹钟是一种基于实时时钟芯片的闹钟,它通过准确的时间计时功能,能够在指定时间点触发闹钟功能,提醒人们进行相应的活动或任务。
本文将介绍RTC闹钟的原理及其应用。
一、RTC闹钟的工作原理RTC(Real-Time Clock)闹钟由实时时钟芯片和控制电路组成。
实时时钟芯片通过内置的晶体振荡器产生稳定的时钟信号,实现时间的计时功能。
控制电路通过设置和控制实时时钟芯片的寄存器,实现对闹钟时间的设定和闹钟功能的触发。
RTC闹钟的原理可以概括为以下几个步骤:1. 时钟信号的生成:实时时钟芯片通过晶体振荡器产生稳定的时钟信号,通常采用32.768kHz的振荡频率。
这个频率的选择是为了方便计算,因为它可以被2的幂整除,从而节省电路设计的复杂度。
2. 时间计数器的运行:实时时钟芯片内部有一个时间计数器,它通过时钟信号的输入进行计数。
时间计数器通常是一个32位的二进制计数器,它可以记录从设定时间点开始的经过时间。
3. 闹钟时间的设定:通过控制电路向实时时钟芯片的寄存器中写入闹钟时间,可以设置闹钟触发的时间点。
闹钟时间可以设定为具体的年月日时分秒,也可以设定为相对时间,如从当前时间开始的若干分钟后。
4. 闹钟功能的触发:当时间计数器的值与设定的闹钟时间相等时,实时时钟芯片会触发闹钟功能。
触发闹钟功能后,可以通过控制电路控制蜂鸣器、LED等外部设备,发出闹钟信号。
二、RTC闹钟的应用RTC闹钟广泛应用于各种计时和提醒场景,具有以下几个主要应用领域:1. 个人闹钟:RTC闹钟作为个人闹钟的核心部件,可以用于叫醒人们的日常生活。
通过设定闹钟时间,个人闹钟可以在指定时间点发出声音或震动,提醒人们起床或进行其他活动。
2. 会议提醒:在会议或重要活动中,RTC闹钟可以用作提醒工具。
通过设定闹钟时间,可以在会议开始前一段时间触发闹钟功能,提醒参会人员做好准备。
3. 医疗设备:在医疗设备中,RTC闹钟可以用于提醒患者按时服药或进行其他治疗活动。
基于51单片机,电子显示时钟带闹钟、整点报时、日期、星期

{ StrTab[1]=second/10; //秒十位
StrTab[0]=second%10; //秒个位
StrTab[2]=10; //间隔符-
StrTab[4]=minute/10; //分十位
StrTab[3]=minute%10; //分个位
StrTab[5]=10; //间隔符-
void display(uchar w[32])
{ unsigned int i,j,c=0;
if(a==0)//正常时间显示
{ for(i=0;i<8;i++) //依次将数组w中八个数取出,并显示
{ P2=weikong_code[i]; //位选
j=w[i]; //取出要显示的数码
P0=tab[j]; //取出段选编码
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}
week++;//星期走
if(week==8)
week=1;
data1();
week1();
while(second==err);
}
}
/**********************键盘扫描子程序*************************/
{if(dБайду номын сангаасy==30); //闰年29天
{day=1; month++;
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}}
51单片机c语言电子钟已加入调时闹铃整点报时功能

51 单片机 c 语言电子钟(已加入调时、闹铃、整点报时功能)效果图:程序如下://51 单片机c 语言电子钟(已加入调时、闹铃、整点报时功能)#include<reg51.h>#include<absacc.h>#define uchar unsigned char #define uint unsigned int /* 七段共阴管显示定义*/ // 此表为LED 的字模,共阴数码管0-9 - uchar code dispcode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; // 段码控制/* 定义并初始化变量*/ uchar seconde=0;// 秒uchar minite=0;// 分uchar hour=12; // 时uchar shi=0;// 闹铃功能uchar fen=0;uchar bjcs;// 报警次数sbit P1_0=P1A0; //second 调整定义sbit P1_仁P1A1;//minite 调整定义sbit P1_2二PM2; //hour 调整定义sbitP1_5=P1A5; //整点报时sbit P1_3=P1A3; //闹铃功能,调整时间sbit P1_6=P1A6; //调整时sbit P1_7=P1A7; //调整分sbit P1_4=P1A4; //关闭闹铃/* 函数声明*/void delay(uint k ); // 延时子程序void time_pro( ); // 时间处理子程序void display( ); // 显示子程序void keyscan( ); // 键盘扫描子程序/*xx 子程序*/void delay (uint k){uchar j;while((k--)!=0){for(j=0;j<125;j++){;}}}/* 时间处理子程序*/void time_pro(void){if(seconde==60){seconde=0; minite++;if(minite==60){minite=0;hour++;if(hour==24){hour=0;}}}}/* 显示子程序*/void display(void){if(P1_3==1){P2=0XFE;PO=dispcode[seco nde%10];/秒个位delay(1);P2=0XFD;P0=dispcode[seco nde/10];〃秒十位delay(1);P2=0XFB;P0=dispcode[10];// 间隔符-delay(1);P2=0XF7;P0=dispcode[mi nite%10];〃分个位delay(1);P2=0XEF;P0=dispcode[minite/10];// 分十位delay(1);P2=0XDF;P0二dispcode[10];〃间隔符-delay(1);P2=0XBF;P0=dispcode[hour%10];〃时个位delay(1);P2=0X7F;P0=dispcode[hour/10];// 时十位delay(1);}}/* 键盘扫描子程序*/void keyscan(void){if(P1_0==0)//秒位的调整{delay (30);if(P1_0==0){seconde++;if(seconde==60){seconde=0;}}delay(250);}if(P1_仁=0)//分位的调整{delay(30);if(P1_1==0){minite++;if(minite==60){minite=0;}}delay(250);}if(P1_2==0)// 时位的调整{delay(30);if(P1_2==0){hour++;if(hour==24){hour=0;}}delay(250);}}/* 整点报警*/void zhengdian (void){if((seconde==0)&(minite==0))〃整点报时{P1_5=0;delay(1000);P1_5=1;}}/* 定时闹钟*/void dingshi(void){if(P1_3==0)〃按住P1_3BU不松,显示闹铃设置界面,分别按P1_6、P1_7设置闹铃时间。
基于STC89C52单片机的二十四小时语音数字闹钟设计

电子设计综合实验“基于STC89C52单片机的二十四小时语音数字闹钟设计”项目设计报告11设计任务与要求语音数字闹钟功能包括:计时功能、显示时间功能、校准时间功能、整点报时功能、闹钟功能。
2 设计思路2.1芯片选取1.单片机的选择采用STC89C52主芯片。
STC89C52是STC公司生产的一种低功耗、高性能微控制器,可用软件编程实现各种逻辑功能。
本身自带定时器和计时器,工作电压3.3-5.5v和电路其他器件相适应,具有断电保护功能,和时钟保持时间不间断相匹配。
并且其功耗低,体积小,成本低,可直接用串口下载,较为便利。
2.显示方案的选择采用LCD1602液晶显示屏。
液晶显示屏的显示功能强大,可显示大量文字,显示多样,功能扩展能力强,可不局限于单一时间显示,例如可以扩展年月显示。
稳定抗干扰能力强,清晰可见,且价格适中,对于本设计一个LCD显示屏足够实现所需功能。
3.时钟模块的选择采用DS1302时钟芯片实现时钟。
DS1302芯片是一种高性能、低功耗的实时时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,功能满足本设计要求,而且精度高,工作电压2.5V~5.5V范围内,与实验整体电路相适应。
4.语音模块采用NV020C语音芯片。
性能稳定,抗干扰能力强,无需外围电路外接电阻,电路简单,控制方便,价格便宜。
工作电压与电路整体电压范围一致,满足整点语音报时的功能需求。
且可进一步功能扩展。
2.2系统设计方案概述该设计包括电源模块、显示模块、按键模块、复位电路模块、时钟模块、语音模块、主控模块、闹铃模块。
整个系统以STC89C52单片机为核心器件,配合电阻电容晶振等器件,构成单片机的最小系统,其它的模块围绕着单片机最小系统展开。
其中包括,显示设备使用LCD1602液晶,可以同时显示时、分、秒等基本时间信息;时钟模块采用DS1302芯片,初始化之后,就会开始运行计算时间,单片机只需进行时间信息的读取即可。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<at89x51.h>unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char code tab[]={0xfd,0xfb,0xf7,0xef,0xdf,0xbf};unsigned char code ts[]={0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50}; unsigned char wei[]={0,1,2,3,4,5};unsigned char sec,min,hou,rsec,rmin,rhou,tcont;unsigned char a0,a1,a2;unsigned char smh;void delay(void) //延时子程序{ unsigned char i,j;for (i=10;i>0;i--)for(j=248;j>0;j--);}void delay2(void) //1420专用延时子程序{ unsigned char i,j,k;for (i=200;i>0;i--)for(j=248;j>0;j--)for(k=20;k>0;k--);}void play(unsigned char temp) //1420播放子程序{ P1=0;P3_0=1;P3_1=1;P1=temp;P3_1=0;delay2();P1=0;P3_1=1;}void display(void) //显示子程序{ for(a2=0;a2<6;a2++){ wei[0]=hou/10;wei[1]=hou%10;wei[2]=min/10;wei[3]=min%10;wei[4]=sec/10;wei[5]=sec%10;P2=tab[a2];P0=table[wei[a2]];delay();}}void rdisplay(void) //闹钟显示子程序{ for(a2=0;a2<6;a2++){ wei[0]=rhou/10;wei[1]=rhou%10;wei[2]=rmin/10;wei[3]=rmin%10;wei[4]=rsec/10;wei[5]=rsec%10;P2=tab[a2];P0=table[wei[a2]];delay();}}void ring(void) //闹钟控制子程序{ while(P3_5==0)rdisplay();smh=0;a0=0;while(a0==0){ rdisplay();if(P3_3==0){ delay();if(P3_3==0){ switch(smh){ case 0:rsec++;break;case 1:rmin++;break;case 2:rhou++;break;}if(rsec==60){ rsec=0;rmin++;}if(rmin==60){ rmin=0;rhou++;}if(rhou==24)rhou=0;}while(P3_3==0)rdisplay();}if(P3_2==0){ delay();if(P3_2==0){ switch(smh){ case 0:rsec--;break;case 1:rmin--;break;case 2:rhou--;break;}if(rsec==-1){ rsec=59;rmin--;}if(rmin==-1){ rmin=59;rhou--;}if(rhou==-1)rhou=23;}while(P3_2==0)rdisplay();}if(P3_4==0){ delay();if(P3_4==0)smh++;if(smh==3)smh=0;while(P3_4==0)rdisplay();}if(P3_5==0){ delay();if(P3_5==0)a0=1;while(P3_5==0)rdisplay();break;}}smh=0;}void examring(void) //闹钟播放子程序{ unsigned char i,j,k;if(sec==rsec){ if(min==rmin){ if(hou==rhou){ P1=0;P3_0=1;P3_1=1;P1=0x70;P3_1=0;for (i=150;i>0;i--)display();P1=0;P3_1=1;P1=0;P3_0=1;P3_1=1;P1=0x70;P3_1=0;for (i=150;i>0;i--)display();P1=0;P3_1=1;P1=0;P3_0=1;P3_1=1;P1=0x70;P3_1=0;for (i=150;i>0;i--)display();P1=0;P3_1=1;P1=0;P3_0=1;P3_1=1;P1=0x70;P3_1=0;for (i=150;i>0;i--)display();P1=0;P3_1=1;}}}}void zhengdian(void) //整点报时子程序{ unsigned char dian;if(sec==0){ if(min==0){ dian=hou/10;if(dian==0){play(0x60);play(0x68);dian=hou%10;dian=ts[dian];play(dian);play(0x58);}if(dian==1){dian=hou%10;if(dian==0){play(0x60);play(0x68);play(0x50);play(0x58);}if(dian!=0){play(0x60);play(0x68);play(0x50);dian=hou%10;dian=ts[dian];play(dian);play(0x58);}}if(dian==2){dian=hou%10;if(dian==0){play(0x60);play(0x68);play(0x10);play(0x50);play(0x58);}if(dian!=0){play(0x60);play(0x68);play(0x10);play(0x50);dian=hou%10;dian=ts[dian];play(dian);play(0x58);} }}}}void main(void) //主程序{ unsigned char i;TMOD=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;ET0=1;EA=1;tcont=0;sec=0;min=0;hou=0;rsec=0;rmin=0;rhou=0;smh=0;for (i=50;i>0;i--)display();while(1){ display();examring();zhengdian();if(P3_3==0){ delay();if(P3_3==0){ switch(smh){ case 0:sec++;break;case 1:min++;break;case 2:hou++;break;}if(sec==60){ sec=0;min++;}if(min==60){ min=0;hou++;}if(hou==24)hou=0;}while(P3_3==0)display();}if(P3_2==0){ delay();if(P3_2==0){ switch(smh){ case 0:sec--;break;case 1:min--;break;case 2:hou--;break;}if(sec==-1){ sec=59;min--;}if(min==-1){ min=59;hou--;}if(hou==-1)hou=23;}while(P3_2==0)display();}if(P3_4==0){ delay();if(P3_4==0)smh++;if(smh==3)smh=0;while(P3_4==0)display();}if(P3_5==0){ delay();if(P3_5==0)ring();}}}void t0(void) interrupt 1 using 0 //调用中断{ TH0=(65536-10000)/256;TL0=(65536-10000)%256;tcont++;if(tcont==100){ tcont=0;sec++;if(sec==60){ sec=0;min++;if(min==60){ min=0;hou++;if(hou==24)hou=0;}}}}。