电子闹钟程序
慧净电子闹钟程序(1302+lcd1602)
#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define lcddata P0#define readalarmsecond 0xc7 //定义从DS1302中读闹钟秒值的命令字节.#define writealarmsecond 0xc6 //定义往DS1302中写闹钟秒值的命令字节.#define readalarmminute 0xc5 //定义从DS1302中读闹钟分值的命令字节.#define writealarmminute 0xc4 //定义往DS1302中写闹钟分值的命令字节.#define readalarmhour 0xc3 //定义从DS1302中读闹钟小时值的命令字节. #define writealarmhour 0xc2 //定义往DS1302中写闹钟小时值的命令字节.sbit lcdrs=P1^0; //LCD数据/命令选择端(H/L)sbit lcdrw=P1^1; //LCD读/写选择端(H/L)sbit lcden=P2^5; //LCD使能控制sbit dula=P2^6; //数码管段声明sbit wela=P2^7; //数码管位声明sbit beep=P2^3; //蜂鸣器控制端sbit kmenu=P3^0; //功能键sbit kup=P3^1; //增大键sbit kdown=P3^2; //减小键sbit kalarm=P3^3; //闹钟查看键Ring:显示闹钟需要调到的时间sbit key=P3^7;sbit dsclk=P2^1; //ds1302的时钟信号端sbit dsdata=P2^0; //ds1302的数据I/O端sbit dsrst=P2^4; //ds1302的复位端sbit ACC7=ACC^7; //定义累加器的最高和最低位。
DIY单片机电子时钟
TL0=0x00;
ET0=1;
TR0=1;
IT0=1;
EX0=1; // 外部中断0
P2_4=0; //按键=0检测用,2008-7-8 *****
while(1)
{
b=1; //模式键是否动作标志。为1时不动作,为0时动作。
irok=1;
iri=0;
}
}
else
{
irtime=0;
flag=1;//是否是第一次接收
}
}
void ircordpro()//红外码值处理函数
{
irk=1;
for(iri=0;iri<4;iri++)
{
for(irj=1;irj<=8;irj++)
void RTInputByte(uchar); //输入 1Byte */
uchar RTOutputByte(void); //输出 1Byte */
void W1302(uchar, uchar); //向DS1302写入一个字节
uchar R1302(uchar); //从DS1302读出一个字节
else WriteCommandLCD(0x08,1); //关闭显示
if(discode[2]==0x01)system=0;
if(discode[2]==0x02)TimerUp=0;
if(discode[2]==0x03)TimerDown=0;
irok=0;
}
}
void main(void)
{
Speaker=1; //关闭蜂鸣器
基于51单片机电子时钟程序
// 本程序实现功能:显示小时和分钟,并以最后一位的小数点闪烁一次表示一秒。
按下INT0键后显示日期。
并在所设定的时间蜂铃器响5次以此为闹钟;// 第二:按下INT1键后,可对时间,日期,闹钟进行设置,再次按下INT1推出设置//// 显示说明:前两位显示小时和月份,后两位显示分钟和日期//#include <reg52.h>/*==========================================宏定义uchar和uint===========================================*/#define uchar unsigned char#define uint unsigned intsbit alarm=P1^4;/*==============================================变量的定义==============================================*/int year=2010;/*初始年份为2010年*/uchar alarm_hour=0,alarm_min=0; /*初始闹钟时间为00:00*/uchar qian=0,bai=0,shi=0,ge=0,key_flag=0,Key=0,num=0,Flag=0; /*定义输出函数变量和按键号*/uchar x,dis_flag=0; /*显示变换标志位*/uchar Key_control=0; /*按键被按下的标志位*/uchar mounth=7,day=25; /*初始日期设为7月25号*/uchar hour=0,t=0,min=0,sec=0,ring=0;/*初始时间为00:00:00*//*=============================================子函数的定义=============================================*/void Init(); /*此函数用于初始化所有需要使用的中断*/void delay(uint z); /*用于数码管显示*/uchar Key_num(void); /*此函数为确定按下的按键输出编号*/void Led_display();void display(uchar cc, uchar dd); /*显示时间的函数,中间的点表示:*/void display_nian(uchar cc, uchar dd); /*显示年份的显示函数,即没有中间的点*/void display_date(uchar cc, uchar dd); /*显示日期的函数,即四个小数点全亮*/void display_alarm(uchar cc, uchar dd); /*显示闹钟的函数,第二个和第四个点*/void Leap_Nonleap(int aa); /*判断是闰年还是平年,并将二月的最大天数赋给Mounth_array[1]*/void Judge_Setting(uchar Key_set); /*所得出的按键号进行对应的设置*//*==========================================所使用数组的定义============================================*/uchar Mounth_array[12]={31,29,31,30,31,30,31,31,30,31,30,31}; /*每个月的最大天数数组*/uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,/*数码管显示编码*/};uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};/*百位及其小数点的段码*//*==============================================主函数部分==============================================*/void main(){Init();while(1){Leap_Nonleap(year); /*进入大循环后首先对年份进行判断*/while(Key_control)/*当P3.3被按下后Key_control=1进入函数进行设置,直到第二次Key_control=0推出循环*/{Flag=Key_num(); /*将按键函数里面是否有按键被按下的标志位赋给Flag*/if(Flag) /*当有按键被按下时,进入设置函数*/{Judge_Setting(num); /*将num值传入函数,并进行设置*/}Led_display(); /*保证在设置的循环时有显示*/}Led_display();/*循环式动态显示*/}}/*===========================================系统初始化函数=============================================*/void Init() /*初始化系统,启动计时器0,1,外部中断0,1*/{TMOD=0x01; /*将计时器0定位工作方式1,将计时器1定为工作方式2*/TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;TR0=1;// ET1=1;// TR1=1;IE0=1;EX0=1; /*使用外部中断0和1,分别作为显示变换,设置的前戏*/IT0=1;/*为下降沿突发*/IE1=1;EX1=1;IT1=1;/*为下降沿突发*/EA=1;}void Display_flag() interrupt 0 /*使用外部中断0,进行显示时间和日期的转换P3.2口切换显示*/{dis_flag++;if(dis_flag==4) /*当dis_flag=0时,输出时间,当dis_flag=1时,输出日期,当dis_flag=2时,输出闹钟*/dis_flag=0; /*当dis_flag=3时,输出年份。
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设置闹铃时间。
题目:电子日历时钟系统程序设计
题目:电子日历时钟系统程序设计一、功能:1.可通过M键切换显示模式:日期(年、月、日)、时间(小时、分、秒)、秒表(小时、分、秒、1/100秒)、闹钟(小时、分、秒)。
2.在日期显示模式,可通过A键依次使年、月、日闪烁或变色,这时可通过I键加1调整。
3.在时间显示模式,可通过A键依次使小时、分、秒闪烁或变色,这时可通过I键加1调整。
4.在秒表显示模式,可通过I键切换(启动/暂停)计时,当暂停计时时可通过A键复位。
5.在闹钟显示模式,可通过A键依次使On/Off标志、小时、分、秒闪烁或变色,这时可通过I键切换On/Off标志或加1调整。
6.调整和秒表操作不影响日期和时间的准确性。
7.可通过Q键结束程序。
二、任务与要求:1.实现方案,流程图(20分)2.实现日期的显示和调整(15分)3.实现时间的显示和调整(15分)4.实现日期和时间的准确性(5分)5.实现程序正常结束(5分)6.实现秒表功能(20分)7.实现闹钟功能,发声10秒(20分)8.基本实现前5项要求,再实现其它扩展要求,视难度加分。
答辩中误导答辩教师(由答辩教师认定,如某些同学参考其它资料但坚持声称全是自己编写的情况),视情节扣分。
n组设计雷同(由答辩教师认定),第一组正常计分,其余n-1组不计分。
设计报告总体要求:①写出主要设计思路,工作原理;②画出硬件接线图;③调试出现的问题及解决方法;④提交程序清单。
三、编程提示:PC机系统中的8253定时器0工作于方式3,外部提供一个时钟作为CLK信号,频率f=1.1931816MHz。
定时器0输出方波的频率: f out=1.1931816/65536=18.2Hz输出方波的周期T out=1/18.2=54.945ms。
8253A每隔55ms引起一次中断,作为定时信号。
可用55945ms作基本计时单位。
用BIOS调用INT 1AH可以取得该定时单位。
例:1秒=18.2 (计时单位)。
主要利用PC机系统功能调用实现电子日历时钟。
单片机电子时钟设计程序
单片机电子时钟设计程序
1.引用头文件和定义全局变量
首先需要引用相应的头文件,例如`reg52.h`,并定义全局变量用于
存储时间、闹钟时间以及其他相关参数。
2.初始化时钟
在主函数中,首先进行时钟的初始化。
这包括设置定时器和中断相关
的寄存器,以及初始化显示屏和按钮等外设。
3.时间更新
编写一个中断服务函数,用于根据定时器的中断来更新时间。
在该中
断服务函数中,需要将全局变量中的时间进行递增,并考虑到分钟、小时、日期和星期等的进位和换算。
4.按钮输入
设置一个子函数用于读取按钮输入,并根据按钮的状态来进行相应的
操作,比如切换时钟显示模式、设置闹钟等。
5.显示时间
编写一个子函数用于将时间信息显示在数码管上。
这需要先将时间信
息转换为数码管的显示格式,然后通过IO口输出控制数码管的显示。
6.闹钟设置
使用按钮输入的功能,可以设置闹钟时间和开关闹钟功能。
当闹钟时
间到达时,可以通过控制蜂鸣器发声或点亮LED等方式来进行提醒。
7.主函数
在主函数中,循环执行按钮输入的检测和相应操作,以及时间的更新和显示等功能。
可以通过一个状态机来控制整个程序的流程。
以上是一个简要的单片机电子时钟设计程序的概述。
实际的程序设计过程中,还需要考虑到各个模块之间的交互、错误处理、电源管理以及代码的优化等细节问题。
具体的程序实现可以根据具体需求和硬件平台的差异进行适当的修改和扩展。
数字闹钟说明书
说明书一、主程序、子模块流程图电子闹钟主流程图:调时、调日期、调星期流程图:倒计时结束流程图:音乐播放流程图:闹铃功能流程图:二、功能介绍:有计时,计日期,计星期,调时、调日期、调星期、闹钟、调闹钟、音乐闹铃、秒表、99秒倒计时、60秒倒计时、5秒倒计时、倒计时结束播放提醒音乐、直接按键播放音乐共计15个小的功能,分为四个功能模块,用四个按键来实现1.调时,查看日期以及调日期,查看星期以及调星期按键1进入该模块后,显示该模块的界面“1234”,分别代表在该界面中要用到的按键编号。
此时按1即进入调时界面,显示当前时间,按1秒加1,按2分加1,按3时加1,按4退出该界面而回到模块界面。
此时按2即进入查看日期以及调日期的界面,显示当前日期,按1天加1,按2月加1,按3年加1,按4退出该界面而回到模块界面。
此时按3即进入查看星期以及调星期的界面,显示当前星期,按1星期加1,按4退出该界面而回到模块界面。
此时按4则退出功能模块1而回到主界面。
2.调闹钟进入该模块时,显示闹钟时间,按1秒加1,按2分加1,按3时加1,按4退出调闹钟模块而回到主界面3.秒表,倒计时进入该模块后,显示界面“12 4”,分别代表在该界面中要用到的按键编号。
此时按1进入秒表计时状态,按4退出,回到模块界面。
此时按2进入99秒倒计时状态,按1切换到60秒倒计时,按1切换到5秒倒计时,在倒计时进行中,按4可以回到模块界面。
此时按4,可以回到主界面4.音乐进入该界面后,显示界面“00-00-00”,按1播放歌曲1,按2播放歌曲2,按3播放歌曲3,按4播放歌曲4,在播放歌曲时,按4可以结束播放音乐并且回到主界面。
电子闹钟说明书
三
软件设计的重点在于秒脉冲信号的产生、显示的实现、以及按键的处理等方面。基于软件的秒脉冲信号通常有延时法和定时中断法。延时法一般采用查询方式,在延时子程序前后必然需要查询和处理的程序,导致误差的产生,因此其秒脉冲的精度不高;中断法的原理是,利用单片机内部的定时器溢出中断来实现。
MOV 22H,#00H
MOV 34H,#00H
MOV 35H,#00H
LJMP L0
L1:JB K3,L2
LCALL XIAOZHEN5
MOV C,25H.0
JC A6
A6:CLR 25H.0
INC 21H
MOV A,21H
CJNE A,#3CH,GO11
MOV 21H,#00H
MOV 32H,#00H
GO2:MOV 21H,A
MOV B,#0AH
DIV AB
MOV 33H,A
MOV 32H,B
AJMP RET0
MOV B,#0AH
DIV AB
MOV 35H,A
MOV R3,#0FEH
MOV A,R3
MOV A,@R0
MOV DPTR,#DSEG1
MOVC A,@A+DPTR
MOV P0,A
LCALL DL1
TIME:PUSH ACC
PUSH PSW
MOV TH0,#03CH
MOV TL0,#0B0H
DJNZ R2,RET0
MOV R2,#14H
MOV A,20H
CLR C
INC A
51单片机电子日历(电子时钟)程序
51单片机电子日历(电子时钟)程序经过两天的调试,完成了51单片机电子日历课程设计,现在把C程序源代码帖出来纪念一下:~硬件实验箱是伟福LAB2000实验箱。
程序代码:/****************************************************************************//* 电子日历,有时间显示、闹铃、日期、秒表及键盘设置功能*//* 功能键A: 设置位数字+1 闹钟模式下为闹钟开关秒表模式下为记时开关*//* 功能键B: 设置位数字-1 闹钟模式下为闹钟开关*//* 功能键C:设置模式及设置位选择秒表模式下为清零键*//* 功能键D:在四种工作模式下切换设置闹钟开关*//* 曹宇03电子0201029 *//* 2006.6.3 更新*//****************************************************************************/#include#include/***************这里设置程序初始化时显示的时间****************/#define SET_HOUR 12 /*设置初始化小时*/#define SET_MINUTE 00 /*设置初始化分钟*/#define SET_SECOND 00 /*设置初始化秒数*//*************************系统地址****************************/#define BASE_PORT 0x8000 /*选通基地址*/#define KEY_LINE BASE_PORT+1 /*键盘行线地址*/#define KEY_COLUMN BASE_PORT+2 /*键盘列线地址*/#define LED_SEG BASE_PORT+4 /*数码管段选地址*/#define LED_BIT BASE_PORT+2 /*数码管位选地址*/#define LED_ON(x) XBYTE[LED_BIT]=(0x01<<X)&NBSP; *6位led的位选通,带参数宏,参数为0~5*=""#define LED_OFF XBYTE[LED_SEG]=0x00 /*LED显示空*//**************在设置模式下对秒分时的宏定义*****************/#define SECOND 0 /*对应数码管右边两位*/#define MINUTE 1 /*对应数码管中间两位*/#define HOUR 2 /*对应数码管左边两位*//********************定义四种工作模式***********************/#define CLOCK clockstr /*时钟模式*/#define ALART alartstr /*闹钟模式*/#define DATE datestr /*日期模式*/#define TIMER timerstr /*秒表模式*//****************以下是所有子函数的声明*********************/void sys_init(void); /*系统的初始化程序*/void display(void); /*动态刷新一次数码管子程序*/void clockplus(void); /*时间加1S的子程序*/void update_clockstr(void); /*更新时间显示编码*/void update_alartstr(void); /*更新闹钟时间的显示编码*/void update_datestr(void); /*更新日期显示编码*/void update_timerstr(void); /*更新秒表时间的显示编码*/void deley(int); /*延时子程序*/void update_dispbuf(unsigned char *); /*更新显示缓冲区*/unsigned char getkeycode(void); /*获取键值子程序*/void keyprocess(unsigned char); /*键值处理子程序*/unsigned char getmonthdays(unsigned int,unsigned char);/*计算某月的天数子程序*//*功能键功能子函数*/void Akey(void); /*当前设置位+1 开关闹钟开关秒表*/void Bkey(void); /*当前设置位-1 开关闹钟*/void Ckey(void); /*设置位选择秒表清零*/void Dkey(void); /*切换四种工作模式*//**********************全局变量声明部分*********************/unsigned char led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*从0~9的LED编码*/unsigned char ledchar[3]={0x5c,0x54,0x71};/*o n f*///unsigned char key[24]={ /* 键值代码数组对应键位:*/// 0x70,0x71,0x72,0x73,0x74,0x75, /* 7 8 9 A TRACE RESET*/// 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5, /* 4 5 6 B STEP MON */// 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5, /* 1 2 3 C HERE LAST */// 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5}; /* 0 F E D EXEC NEXT */struct{ /*时间结构体变量*/unsigned char s;unsigned char m;unsigned char h;}clock={SET_SECOND,SET_MINUTE,SET_HOUR};struct{ /*闹铃时间结构体变量*/unsigned char m;unsigned char h;}alart={SET_MINUTE,SET_HOUR};struct{ /*日期结构体变量*/unsigned int year;unsigned char month;unsigned char day;}date={6,1,1};struct{ /*秒表时间结构体变量*/unsigned char ms;unsigned char s;unsigned char m;}timer={0,0,0};unsigned char dispbuf[6]; /*显示缓冲区数组*/unsigned char clockstr[6]; /*时间显示的数码管编码数组*/unsigned char alartstr[6]; /*闹钟显示的数码管编码数组*/unsigned char datestr[6]; /*日期显示的数码管编码数组*/unsigned char timerstr[6]; /*秒表显示的数码管编码数组*/unsigned int itime=0,idot; /*定时器0中断计数*/unsigned char itime1=0; /*定时器1中断计数*/sbit P3_1=P3^1; /*外接蜂鸣器的管脚*/bdata bit IsSet=0; /*设置模式标志位0:正常走时1:设置模式*/bdata bit Alart_EN=0; /*闹铃功能允许位0:禁止闹铃1:允许闹铃*/bdata bit IsBeep=0; /*响铃标志位0:未响铃1:正在响铃*/unsigned char SetSelect=0; /*在设置模式IsSet=1时,正在被设置的位,对应上面的宏*/unsigned char *CurrentMode; /*标志当前正设置的功能,如CurrentMode=CLOCK或CurrentMode=A LART等*/void timerplus(void);/**************************函数部分*************************/void main(void){sys_init();while(1){XBYTE[KEY_COLUMN,0x00]; /*给键盘列线赋全零扫描码,判断是否有键按下*/while((XBYTE[KEY_LINE]&0x0f)==0x0f) /*检测是否有键按下,无则一直进行LED的刷新显示*/ {if(Alart_EN&&(clock.h==alart.h)&&(clock.m==alart.m)) {IsBeep=1;}else{ IsBeep=0;P3_1=0;}display();}keyprocess(getkeycode()); /*有键按下时得到键值,并送入键值处理程序*/display(); /*可要可不要*/}}void sys_init(void){TMOD=0x22; /*定时器0和1都设置为工作方式2,基准定时250×2=500us=0.5ms*/TH0=6; /*定时器0中断服务用来产生1秒时钟定时及闹钟蜂鸣器蜂鸣脉冲*/TL0=6; /*定时器1中断服务留给秒表使用,产生1/100秒定时*/TH1=6;TL1=6;ET0=1;ET1=1;EA=1;TR0=1;update_clockstr(); /*初始化时钟显示编码数组*/update_alartstr(); /*初始化闹钟显示编码数组*/update_datestr(); /*初始化日期显示编码数组*/update_timerstr(); /*初始化秒表显示编码数组*/update_dispbuf(clockstr);/*初始化显示缓冲数组*/CurrentMode=CLOCK; /*默认的显示摸式为时钟*/P3_1=0; /*蜂鸣器接线引脚复位*/}void timer0(void) interrupt 1 using 1 /*定时器0中断服务器,用来产生1秒定时*/{itime++;if(itime==1000){if(IsSet) /*在设置模式下,对正在设置的位闪烁显示*/{dispbuf[SetSelect*2]=0; /*对正在设置的位所对应的显示缓冲区元素赋0,使LED灭*/ dispbuf[SetSelect*2+1]=0;}if(IsBeep) P3_1=!P3_1; /*闹钟模式时,产生峰鸣器响脉冲*/if(CurrentMode==CLOCK){dispbuf[2]=dispbuf[2]&0x7f;dispbuf[4]=dispbuf[4]&0x7f;}}if(itime==2000) /*两千次计数为1S 2000×0.5ms=1s*/{itime=0; /*定时1s时间到,软计数清零*/clockplus(); /*时间结构体变量秒数加1 */update_clockstr(); /* 更新时间显示编码数组*/if(CurrentMode!=TIMER) update_dispbuf(CurrentMode); /* 用时间编码数组更新显示缓冲区* /}}void timer1(void) interrupt 3 using 2 /*定时器1中断服务器,用来产生1/100秒定时*/{idot++;if(++itime1==20) /*20*0.5ms=10ms*/{itime1=0;timerplus();update_timerstr();if(CurrentMode==TIMER){update_dispbuf(timerstr);dispbuf[2]=dispbuf[2]&0x7f; /*关闭小数点的显示*/dispbuf[4]=dispbuf[4]&0x7f;if(idot<1000) /*闪烁显示小数点*/{dispbuf[2]=dispbuf[2]|0x80;dispbuf[4]=dispbuf[4]|0x80;}else{dispbuf[2]=dispbuf[2]&0x7f;dispbuf[4]=dispbuf[4]&0x7f;}}}if(idot==2000) idot=0;}/*功能模块子函数*/void clockplus(void) /*时间加1s判断分,时子函数*/{if(++clock.s==60) /*秒位判断*/{clock.s=0;if(++clock.m==60) /*分位判断*/{clock.m=0;if(++clock.h==24) /*时位判断*/{clock.h=0;if(++date.day==(getmonthdays(date.year,date.month)+1)){date.day=1;if(++date.month==13) date.month=1;}}}}}void timerplus() /*秒表1/100秒位加1,判断秒、分子程序*/ {if(++timer.ms==100){timer.ms=0;if(++timer.s==60){timer.s=0;if(++timer.m==60){timer.m=0;}}}}void update_clockstr(void) /*更新时钟显示代码数组clockstr*/{clockstr[0]=led[clock.s%10]; /*给元素0赋相应数码管显示编码,编码序号是秒数的个位*/clockstr[1]=led[(int)(clock.s/10)]; /*给元素1赋相应数码管显示编码,编码序号是秒数的十位*/ clockstr[2]=led[clock.m%10]; /*以下类推*/clockstr[3]=led[(int)(clock.m/10)];clockstr[4]=led[clock.h%10];clockstr[5]=led[(int)(clock.h/10)];}void update_alartstr(void) /*更新闹钟显示代码数组alartstr*/{ /*右边两位显示on:闹钟开启of:闹钟关闭*/if(Alart_EN) alartstr[0]=ledchar[1];/*显示字母n*/else alartstr[0]=ledchar[2]; /*显示字母f*/alartstr[1]=ledchar[0]; /*显示字母o*/alartstr[2]=led[alart.m%10];alartstr[3]=led[(int)(alart.m/10)];alartstr[4]=led[alart.h%10];alartstr[5]=led[(int)(alart.h/10)];}void update_datestr(void) /*更新日期显示代码数组datestr*/{datestr[0]=led[date.day%10];datestr[1]=led[(int)(date.day/10)];datestr[2]=led[date.month%10];datestr[3]=led[(int)(date.month/10)];datestr[4]=led[date.year%10];datestr[5]=led[(int)(date.year/10)];}void update_timerstr(void) /*更新秒表显示代码数组timerstr*/{timerstr[0]=led[timer.ms%10];timerstr[1]=led[(int)(timer.ms/10)];timerstr[2]=led[timer.s%10];timerstr[3]=led[(int)(timer.s/10)];timerstr[4]=led[timer.m%10];timerstr[5]=led[(int)(timer.m/10)];}void display(void) /*刷新显示六位LED一次*/{unsigned char i;for(i=0;i<6;i++){LED_ON(i); /*选通相应位*/XBYTE[LED_SEG]=dispbuf[i]; /*写显示段码*/deley(50); /*延时显示*/LED_OFF; /*写LED全灭段码*/}}void update_dispbuf(unsigned char *str) /*更新显示缓冲区子函数,参数为要用来更新缓冲区的源字符数组的首地址*/{dispbuf[0]=str[0]; /*将要更新的源字符数组内容COPY至dispbuf数组,用作显示缓冲区*/dispbuf[1]=str[1];dispbuf[2]=str[2]|0x80; /*默认把时位和分位后面的小数点显示出来,根据需要再取舍*/dispbuf[3]=str[3];dispbuf[4]=str[4]|0x80;dispbuf[5]=str[5];}void deley(int i) /*延时子函数*/{while(i--);}unsigned char getkeycode(void) /*键盘扫描子程序,返回获得的键码*/{unsigned char keycode; /*键码变量,一开始存行码*/unsigned char scancode=0x20; /*列扫描码*/unsigned char icolumn=0; /*键的列号*/display(); /*用刷新数码管显示的时间去抖*/XBYTE[KEY_COLUMN]=0x00;keycode=XBYTE[KEY_LINE]&0x0f; /*从行端口读入四位行码*/while((scancode&0x3f)!=0) /*取scancode的低六位,只要没变为全0,则执行循环*/{XBYTE[KEY_COLUMN]=(~scancode)&0x3f; /*给列赋扫描码,第一次为011111*/if((XBYTE[KEY_LINE]&0x0f)==keycode) break; /*检测按键所在的列跳出循环*/scancode=scancode>>1; /*列扫描码右移一位*/icolumn++; /*列号加1*/}keycode=keycode<<4; /*把行码移到高四位*/keycode=keycode|icolumn; /*由行码和列码组成键码*///等待按键放开XBYTE[KEY_COLUMN]=0x00;while((XBYTE[KEY_LINE]&0x0f)!=0x0f) display();return keycode;}void keyprocess(unsigned char keycode) /*键值处理函数*/{switch (keycode){case 0x73: Akey();break;case 0xB3: Bkey();break;case 0xD3: Ckey();break;case 0xE3: Dkey();break;default: break;}update_dispbuf(CurrentMode);}unsigned char getmonthdays(unsigned int year,unsigned char month)/*得到某月的天数*/ {unsigned char days;switch (month){case 4:case 6:case 9:case 11:days=30;break;case 2: if(year%4==0) days=29;else days=28;break;default:days=31;break;}return days;}/*功能键子函数部分*/void Akey(void) /*对当前设置位进行加一操作,如果设置秒位,则给秒位清零*/{if(CurrentMode==TIMER) /*秒表模式下启闭走时*/{ TR1=!TR1;return;}if(!IsSet) return; /*如果不是设置模式退出*/switch (SetSelect){case SECOND:if(CurrentMode==CLOCK){clock.s=0; /*如果当前被设置位是秒位,则清零秒位*/update_clockstr();}if(CurrentMode==ALART){Alart_EN=!Alart_EN;update_alartstr();}if(CurrentMode==DATE){if(++date.day==(getmonthdays(date.year,date.month)+1)) date.day=1;update_datestr();}if(CurrentMode==TIMER){TR1=!TR1;}break;case MINUTE:if(CurrentMode==CLOCK){if(++clock.m==60) clock.m=0; /*如果当前被设置分位,则分位加1*/ update_clockstr();}if(CurrentMode==ALART){if(++alart.m==60) alart.m=0;update_alartstr();}if(CurrentMode==DATE){if(++date.month==13) date.month=1;update_datestr();}break;case HOUR: if(CurrentMode==CLOCK){if(++clock.h==24) clock.h=0; /*如果当前被设置时位,则时位加1*/ update_clockstr();}if(CurrentMode==ALART){if(++alart.h==24) alart.h=0;update_alartstr();}if(CurrentMode==DATE){if(++date.year==100) date.year=0;update_datestr();}break;default: break;}update_dispbuf(CurrentMode);}void Bkey(void) /*对当前设置位进行减一操作,如果设置秒分,则给秒位清零,类比Akey()函数*/ {if(!IsSet) return;switch (SetSelect){case SECOND:if(CurrentMode==CLOCK){clock.s=0;update_clockstr();}if(CurrentMode==ALART){Alart_EN=!Alart_EN;update_alartstr();}if(CurrentMode==DATE){if(--date.day==0x00) date.day=getmonthdays(date.year,date.month);update_datestr();}break;case MINUTE:if(CurrentMode==CLOCK){if(--clock.m==0xff) clock.m=59;update_clockstr();}if(CurrentMode==ALART){if(--alart.m==0xff) alart.m=59;update_alartstr();}if(CurrentMode==DATE){if(--date.month==0x00) date.month=12;update_datestr();}break;case HOUR: if(CurrentMode==CLOCK){if(--clock.h==0xff) clock.h=23;update_clockstr();}if(CurrentMode==ALART){if(--alart.h==0xff) alart.h=23;update_alartstr();}if(CurrentMode==DATE){if(--date.year==0xffff) date.year=99;update_datestr();}break;default: break;}update_dispbuf(CurrentMode);}void Ckey(void) /*正常走时模式和设置模式的切换*/{if(CurrentMode==TIMER){TR1=0; /*初始化定时器1设置,停止秒表记时*/ TH1=6;TL1=6;timer.ms=0; /*初始化秒表数组*/timer.s=0;timer.m=0;update_timerstr();}else{if(IsSet==0) /*在非秒表模式下,第一次按下C键进入设置模式,设置时位*/{IsSet=1; /*置位标志位,进入设置模式*/SetSelect=HOUR;return;} /*第二次按C键设置分位,第三次按键设置秒位,第四次按键完成退出设置*/if(SetSelect==0) /*按到第四次,即设置完秒位后,将标志位IsSet置0,完成设置*/{IsSet=0; /*复位标志位,进入正常走时模式*/return;}if(SetSelect>0) SetSelect--; /*设置位的标志变量SetSelect=0:时位1:分位2:秒位*/ }}void Dkey(void) /*工作状态切换:时钟、闹钟、日期、秒表*/{if(CurrentMode==CLOCK) /*切换至闹钟,同时开关闹钟*/{ CurrentMode=ALART;Alart_EN=!Alart_EN;update_alartstr();return;}if(CurrentMode==ALART) /*切换至日期*/{ CurrentMode=DATE;return;}if(CurrentMode==DATE) /*切换至秒表,同时关闭设置模式*/{CurrentMode=TIMER;IsSet=0;return;}if(CurrentMode==TIMER) /*切换至时钟*/{CurrentMode=CLOCK;return;}}当我被上帝造出来时,上帝问我想在人间当一个怎样的人,我不假思索的说,我要做一个伟大的世人皆知的人。
电子闹钟源程序
电子闹钟源程序电子闹钟源程序模块一#includeextern void InitT0(void);extern void Init8255(void);extern unsigned char DispBuf[6];extern bit xTim,xKey;extern void KeyPro(void);extern unsigned char KeySts;extern void Delay(unsigned int ms) ;unsigned char sec,min,hour;Unsigned char code table[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0x88,0x83,0xC6,0xA1,0x86, 0x8E};sbit P1_1=P1^1;void TimUpdate(void){if(++sec==60){sec=0;if(++min==60){min=0;if(++hour==24){hour=0;}}}}void DisplayTim(){DispBuf[0]=table[sec % 10]; DispBuf[1]=table[sec / 10]; DispBuf[2]=table[min % 10]; DispBuf[3]=table[min / 10]; DispBuf[4]=table[hour % 10]; DispBuf[5]=table[hour / 10];}void main(void){unsigned char i,x, xi ;x=1;for (i=0;i<6;i++) DispBuf[i]=0xFF; sec=0;min=0;hour=0;InitT0();Init8255();KeySts=0;while(1){if (xTim && (KeySts == 0)){xTim=0;TimUpdate();DisplayTim();// P1= ~x;// x<<=1;//if (x==0) x=1;}if (xKey){xKey =0;KeyPro();}if((sec==0)&&(min==0)){ xi=hour;if (xi==0){ xi=24; }while(xi--){ P1_1=1;DisplayTim();Delay(500);P1_1=0;DisplayTim();Delay(500);sec++;}}}}模块二#includeunsigned char xdata PA _at_ 0x8000; unsigned char xdata PB _at_ 0x8001; unsigned char xdata PC _at_ 0x8002; unsigned char xdata CtrlW _at_ 0x8003;unsigned char pLED;unsigned char DispBuf[6];unsigned char Digit[6]={0xDF,0xEF,0xF7,0xFB,0xFD,0xFE};unsigned char count;bit xTim,xKey;unsigned char KeyV al;void InitT0(void){pLED=0;xTim=0;count=0;TMOD=(TMOD&0xF0)|0x01;TH0=0xF1;TL0=0x00;TR0=1;ET0=1;EA=1;}void Delay(unsigned int ms){int i,j;for(i=0;i<ms;i++)< p="">{for(j=0;j<114;j++){}}}void Init8255(void){Delay(1000);CtrlW=0x81;}void T0Srv(void) interrupt 1 using 1{TH0=0xF1;PA=0xFF;PB=Digit[pLED];PA=DispBuf[pLED];if(++pLED==6) pLED=0;count++;if((count&0x03)==0){KeyV al=PC & 0x0F;xKey=1;P1=KeyV al;}if(count==240){count=0;xTim=1;}}模块三#define SET 0x01#define LR 0x02#define UD 0x04#define OK 0x08#includeextern unsigned char sec,min,hour; extern unsigned char code table[16]; extern unsigned char DispBuf[6]; unsigned char EditSec,EditMin,EditHour; extern unsigned char KeyV al; unsigned char CurKey,LastKey; unsigned char KeySts;void DisplayEdit(){DispBuf[0]=table[EditSec%10]; DispBuf[1]=table[EditSec/10];DispBuf[2]=table[EditSec%10]; DispBuf[3]=table[EditSec/10];DispBuf[4]=table[EditSec%10]; DispBuf[5]=table[EditSec/10];DispBuf[6-KeySts]&=0x7F;}void Copy(){sec=EditSec;min=EditMin;hour=EditHour;}void KeyPro(void){unsigned char KeyPressed;LastKey=CurKey;CurKey=KeyV al;KeyPressed=CurKey^LastKey;if(KeyPressed==0) return;if(CurKey==0x0F) return;switch(KeySts){case 0:if(KeyPressed==SET){KeySts++;EditSec=sec;EditMin=min;EditHour=hour;}break;case 1:switch(KeyPressed){case LR: KeySts++;break;case UD: EditHour +=10;if(EditHour>=24) EditHour-=24; break; case OK: Copy();KeySts=0;break;}break;case 2:switch(KeyPressed){case LR: KeySts++;break;case UD: EditHour++;if(EditHour>=24) EditHour-=24; break; case OK: Copy();KeySts=0;break;}break;case 3:switch(KeyPressed){case LR: KeySts++;break;case UD:EditMin+=10;if(EditMin>=60) EditMin-=60; break; case OK:Copy();KeySts=0;break;}break;case 4:switch(KeyPressed){case LR: KeySts++;break;case UD: EditMin++;if(EditMin>=60) EditMin-=60; break; case OK: Copy();KeySts=0;break;}break;case 5:switch(KeyPressed){case LR: KeySts++;break;case UD: EditSec+=10;if(EditSec>=60) EditSec-=60; break; case OK: Copy();KeySts=0;break;}break;case 6:switch(KeyPressed){case LR:KeySts=1;break;case UD:EditSec++;if(EditSec>=60) EditSec-=60; break; case OK: Copy();KeySts=0; break;}break; default: KeySts=0;} DisplayEdit(); }</ms;i++)<>。
可设置八个闹钟的智能时钟(原理图+程序)
可设置8个闹钟时间的智能时钟广东珠海曾向文普通的家用时钟一般只能设置一个闹钟时间,但很多人均需为工作日、周末、早晨、午休等不同时段设置不同的闹钟时间。
如果是使用普通的闹钟,只好每次休息前重新设置,很不方便,有时甚至会出现忘记更改闹钟设置而睡过头的情况。
针对这种情况,本人利用89C51单片机设计了一款有8种闹钟设置的时钟,通过一段时间的使用,情况良好。
1、元件清单共阴极数码管8个4511七段译码芯片1片A TMEL89C51单片机1片24C08EEPROM 1片24M晶振1个9V变压器(3V A)1个LM317输出可调稳压IC 1个整流桥堆1个470uF电容1个100uF电容1个10uF电容1个0.1uF电容1个33pF电容2个蜂鸣器1个9014(或其它NPN管)8个ksp92(或其它PNP管)1个二极管2个1K欧电阻16个470欧电阻1个10K欧可调电阻1个10K欧电阻4个按钮开关4个可装四节电池的电池盒1个万能板(约12CM*17CM)1块所有元件按以下的电路图焊接在一块万能板上。
注意LM317的输出应由低调高,以免烧IC。
2、电路图3、功能简介该时钟以24小时制显示时间,并可显示2000年至2049年之间的任何日期及星期,日期与时间经按键可相互切换,可输入8个闹钟时间设置,每个闹钟设置包括响铃的时间(小时与分钟)、对工作日有效还是对周末有效的标志,以及本项设置是否启用的标志等三部分。
这8个闹钟设置均保存在EEPROM中,即使掉电也不用重新输入。
当然使用者可通过按钮对任何一个设置作修改。
数码管可经按钮关闭显示,避免夜间刺眼、影响睡眠。
调节LM317输出电压,可改变数码管亮度,但电压不能低于后备电池的电压,否则后备电池供电。
用四节1.25V电池串联作后备电源,保证市电停电时时钟继续走时。
时钟的精度取决于晶振频率的精度。
4、程序清单本程序用C语言编写,经Keil C51编译成二进制码后写入89C51内的EPROM内即可。
闹钟提醒的程序设计及代码示例
闹钟提醒的程序设计及代码示例闹钟提醒是人们日常生活中常用的功能之一,它可以帮助我们准时起床、提醒重要事件等。
在计算机编程中,我们可以通过程序设计实现一个闹钟提醒系统。
下面,将介绍闹钟提醒程序的设计原理、流程以及代码示例。
一、程序设计原理闹钟提醒程序的设计原理主要包括以下几个步骤:1. 用户输入设定的闹钟时间;2. 程序获取当前时间;3. 比较当前时间和设定的闹钟时间;4. 如果当前时间等于设定的闹钟时间,则触发提醒;5. 如果当前时间不等于设定的闹钟时间,则等待一段时间后重新执行第2步。
二、程序设计流程根据上述原理,我们可以设计出如下的闹钟提醒程序流程:1. 用户输入设定的闹钟时间,并保存到变量alarm_time中;2. 进入循环,不断执行以下步骤:1) 获取当前时间,并保存到变量current_time中;2) 比较current_time和alarm_time;3) 如果current_time等于alarm_time,则触发提醒,提示用户;4) 如果current_time不等于alarm_time,则等待一段时间后再次执行循环。
三、代码示例下面是一个使用Python语言编写的闹钟提醒程序代码示例:```pythonimport datetimeimport timedef alarm_clock(alarm_time):while True:current_time = datetime.datetime.now().strftime("%H:%M")if current_time == alarm_time:print("时间到了!该起床啦!")breakelse:print("当前时间:", current_time, "闹钟时间:", alarm_time)time.sleep(60) # 每隔60秒检查一次alarm_time = input("请输入设定的闹钟时间(如08:00):")alarm_clock(alarm_time)```在这个示例代码中,我们使用了Python内置的`datetime`和`time`模块来获取当前时间和控制程序等待的时间。
基于单片机控制的智能定时闹钟方案设计书(含完整程序仿真图)
本设计是定时闹钟的设计,由单片机AT89C51芯片和LED数码管为核心,辅以必要的电路,构成的一个单片机电子定时闹钟。
电子钟设计可采用数字电路实现,也可以采用单片机来完成。
数字电子钟是用数字集成电路构成的,用数码管显示“时”,“分”,“秒”的现代计时装置。
若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。
若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计中采用单片机利用AT89C51,它是低功耗、高性能的CMOS型8位单片机。
片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。
另外,AT89C51的指令系统和引脚与8051完全兼容,片内有128B的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。
AT89C51单片机结合七段显示器设计的简易定时闹铃时钟,可以设置现在的时间及显示闹铃设置时间,若时间到则发出一阵声响,进—步可以扩充控制电器的启停。
设计内容包括了秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分的设计。
采用四个开关来控制定时闹钟的工作状态,分别为:K1、设置时间和闹钟的小时;K2、设置小时以及设置闹钟的开关;K3、设置分钟和闹钟的分钟;K4、设置完成退出。
课设准备中我根据具体的要求,查找资料,然后按要求根据已学过的时钟程序编写定时闹钟的程序,依据程序利用proteus软件进行了仿真实验,对出现的问题进行分析和反复修改源程序,最终得到正确并符合要求的结果。
设计完成的定时闹钟达到课程设计的要求,在到达定时的时间便立即发出蜂鸣声音,持续一分钟。
显示采用的六位数码管电路,如果亮度感觉不够,可以通过提升电阻来调节,控制程序中延迟时间的长短,可以获得不同的效果。
基于单片机C语言电子时钟完整版(闹钟,整点报时)
《单片机技术》课程设计说明书数字电子钟系、部:电气与信息工程学院学生姓名:指导教师:职称专业:班级:完成时间:2013-06-07摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用ATMEL公司的AT89S52单片机为核心,使用12MHz 晶振与单片机AT89S52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEU5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词电子钟;AT89S52;硬件设计;软件设计ABSTRACTClock is widely used in life, and a simple digital clock is more welcomed by people. So to design a simple digital electronic clock is necessary.The system use a single chip AT89S52 of ATMEL’s as its core to control The crystal oscillator clock,using of E-12MHZ is connected with the microcontroller AT89S52, through the software programming method to achieve a 24-hour cycle, and eight 7-segment LED digital tube (two four in one digital tube) displays hours, minutes and seconds requirements, and in the time course of a timing function, when the time arrived ahead of scheduled time to buzz a good timekeeping. The clock has four buttons KEY1, KEY2, KEY3,KEY4 and KEY5 key, and make the appropriate action can be achieved when the school, timing, reset. With a time display, alarm clock settings, timer function, corrective action. Accurate travel time, display and intuitive, precision, stability, and so on. With a high application value.Key words Electronic clock;;AT89S52;Hardware Design;Software Design目录1设计课题任务、功能要求说明及方案介绍 (1)1.1设计课题任务 (1)1.2功能要求说明 (1)1.3设计总体方案介绍及原理说明 (1)2设计课题硬件系统的设计 (2)2.1设计课题硬件系统各模块功能简要介绍 (2)2.2设计课题电路原理图、PCB图、元器件布局图 (2)2.3设计课题元器件清单 (5)3设计课题软件系统的设计 (6)3.1设计课题使用单片机资源的情况 (6)3.2设计课题软件系统各模块功能简要介绍 (6)3.3设计课题软件系统程序流程框图 (6)3.4设计课题软件系统程序清单 (10)4设计结论、仿真结果、误差分析、教学建议 (21)4.1设计课题的设计结论及使用说明 (21)4.2设计课题的仿真结果 (21)4.3设计课题的误差分析 (22)4.4设计体会 (22)4.5教学建议 (22)结束语 (23)参考文献 (24)致谢 (25)附录 (26)1 设计课题任务、功能要求说明及方案介绍1.1 设计课题任务设计一个具有特定功能的电子钟。
电子时钟设计DS++可调闹钟+程序清单
电子时钟设计DS++可调闹钟+程序清单本文主要介绍一种新型的电子时钟设计,名为DS++可调闹钟。
这种电子时钟不仅能够显示当前日期和时间,而且其可调节的闹钟功能也十分实用。
同时,我们还提供程序清单,供各位读者借鉴学习。
1. 电子时钟设计的背景和目标电子时钟已经成为人们日常生活中不可或缺的物品之一。
在市场上,人们可以买到各种各样的电子时钟,从简单的数字显示到智能语音交互。
然而,我们常常发现,在时钟设计中,用户体验常常被忽视。
比如,有的时钟功能繁杂,使用起来困难;有的时钟质量低劣,经常出现故障。
为了解决这些问题,我们决定设计一种更为智能且易用的电子时钟,就是DS++可调闹钟。
本次电子时钟设计的目标是:1)提供准确的时间显示和日期显示;2)提供可调闹钟功能和提示功能;3)简单易用,方便用户使用。
2. DS++可调闹钟设计方案2.1 电路原理图DS++可调闹钟的电路包括微处理器、振荡器、液晶显示模块、蜂鸣器、按键等部分。
主控芯片采用AT89S52(51系列微控制器),与液晶显示模块通过IIC总线通信。
振荡器采用32.768kHz的石英晶体振荡器,保证时钟的准确性。
2.2 功能模块设计液晶显示模块的设计是优化DS++可调闹钟的关键。
我们选用了1602A型液晶显示屏,显示内容包括日期、时间和闹钟状态。
闹钟模块是DS++可调闹钟的核心模块之一,它通过可调节的闹钟时间和闹钟提示音,方便用户设置并响铃提醒。
2.3 电路调试及测试在电路设计和焊接完成后,我们需要进行电路调试和测试。
在调试过程中,我们主要测试了电子时钟的时间显示、日期显示、闹钟设置等功能。
同时,我们还测试了与之相协调的同时供电设备,比如移动电源和插座电源。
3. 程序清单DS++可调闹钟的程序基于Keil/µVision IDE的汇编语言编写。
半个时钟周期内的指令流水线技术使得程序库在嵌入式微控制器上的表现达到质的提升,且运行速度更快。
DS++可调闹钟的程序清单如下:- 初始化电路;- 显示日期、时间;- 等待用户按键;-用户按键相应操作;- 播放闹钟提示音;- 关闭闹钟。
51单片机电子时钟(C语言)
#include <reg51.h>#include <intrins.h>#define uchar unsigned char //宏定义#define uint unsigned intuchar sec,min,hour,sec50,jishu,dtp2; //sec、min、hour、为显示单元,sec50为60秒计数单元,jishu为扫描数码管计数单元uchar sec1,min1,hour1; //时间中介单元uchar nzmin,nzhour,nzjishu=0,dispjishu=0; //闹钟分、时定义uchar data nzbit=0; //闹钟标志位,闹钟默认为开启uchar data dispbit=0; //显示标志位,默认显示当前时间uchar data disp[8]; //秒、分、时个位与十位存放数组及‘—’uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字0-9sbit KEYmin=P3^2; //分加1按钮sbit KEYhour=P3^3; //时加1按钮sbit LABA=P1^0; //闹钟输出I/O口sbit NZdisplay=P3^4; //闹钟显示按钮,按住不放显示闹钟时间,放开则显示当前时间sbit KEYnzmin=P3^5; //闹钟分加1按钮sbit KEYnzhour=P3^6; //闹钟时加1按钮sbit KEYoff=P3^7; //关闭闹钟按钮,按第一次为关闭,第二次为开启void display(); //显示函数声明void keyscan(); //按键扫描函数声明void naozhong(); //闹钟判别函数声明void keynz(); //闹钟按键函数声明void main(){sec=0; //时间初始化为00—00—00min=0;hour=0;sec1=0; //显示单元初始化为00—00—00min1=0;hour1=0;nzmin=01; //闹钟初始时间为01:01nzhour=01;jishu=0;dtp2=0xfe;P0=0xff;TMOD=0x11; //设T0、T1为模式1IE=0x8a;TH0=0xb8; //T0定时20msTL0=0x0;TH1=0xfc; //T1定时1msTL1=0x66;TR0=1;TR1=1;while(1){display(); //调用显示子程序keyscan(); //调用按键子程序keynz(); //调用闹钟按键子程序}}void t0int() interrupt 1 //T0定时中断程序{TH0=0xb8;TL0=0x0;sec50++;if(sec50==50) //对20ms计数50次即1s{sec50=0; //清秒计数器,为下次做准备naozhong(); //调用闹钟判别子程序sec1++; //秒加1}if(sec1==60) //对秒计数60次即1min{sec1=0;min1++; //分加1}if(min1==60) //对分计数60次即1hour{min1=0;hour1++; //时加1}if(hour1==24){hour1=0;}if(dispbit==0) //判断显示标志位是否为0,为0显示当前时间{sec=sec1;min=min1;hour=hour1;}else //显示标志位为1,显示闹钟时间{min=nzmin; //将闹钟时间给显示单元hour=nzhour;}}void t1int() interrupt 3 //T1中断程序{TH1=0xfc;TL1=0x66;P2=0xff; //关闭所有数码管P2=dtp2;dtp2=_crol_(dtp2,1);P0=disp[jishu];jishu++;if(jishu==8) //扫描完8位数码管清0,重新从第一位开始扫描{jishu=0;}}void delay(uint x) //延时函数uchar i;while(x--){for(i=0;i<120;i++);}}void display() //显示子程序{disp[7]=table[sec%10]; //秒个位显示disp[6]=table[sec/10]; //秒十位显示disp[4]=table[min%10]; //分个位显示disp[3]=table[min/10]; //分十位显示disp[1]=table[hour%10]; //时个位显示disp[0]=table[hour/10]; //时十位显示disp[2]=0xbf; //显示‘_’disp[5]=0xbf;}void keyscan() //按键子程序{delay(20); //延时消抖if(KEYmin==0)//时间分加1按钮{min1++; //时间分加1if(min1==60){min1=0;hour1++; //分加到60对时加1}if(hour1==24){hour1=0;}while(!KEYmin); //等待按键放开}delay(20); //延时消抖if(KEYhour==0) //时间时加1按钮{hour1++; //时间时加1if(hour1==24){hour1=0;}while(!KEYhour); //等待按键放开}void naozhong() //闹钟判断{if(nzbit==0) //判断闹钟标志位,0为开启闹钟判断,1为关闭闹钟{if(min1==nzmin) //闹钟与时间分的判别if(hour1==nzhour) //闹钟与时间时的判别LABA=0; //时间分、时与闹钟分、时相等就打开蜂鸣器}elseLABA=1;}void keynz() //闹钟加、减及闹钟关闭、开启按键处理子程序{delay(20); //延时消抖if(KEYnzmin==0) //判别闹钟分加1按键{nzmin++; //闹钟分加1if(nzmin==60){nzmin=0;nzhour++; //闹钟分加到60对闹钟时加1if(nzhour==24)nzhour=0;}while(!KEYnzmin); //等待按键放开}delay(20); //延时消抖if(KEYnzhour==0) //判别闹钟时加1按键{nzhour++; //闹钟时加1if(nzhour==24)nzhour=0;while(!KEYnzhour); //等待按键放开}if(KEYoff==0)//判断关闭闹钟按键是否按下{delay(20); // 延时消抖nzjishu++;if(nzjishu==1) //判断是否为第一次按下{nzbit=1; //第一次按下关闭闹钟if(nzjishu==2) //判断是否为第二次按下{nzjishu=0; //第二次按下清计数单元nzbit=0; // 第二次按下开启闹钟判别}while(!KEYoff); //等待按键放开}if(NZdisplay==0) //判别显示切换闹钟按键是否按下{dispjishu++;if(dispjishu==1) //第一次按下显示闹钟时间{dispbit=1; //第一次按下,把标志位置1,显示切换为闹钟时间}if(dispjishu==2) //第二次按下显示为当前时间{dispjishu=0; //清零,重新计数dispbit=0; //第二次按下清零显示标志位,显示切换为当前时间}while(!NZdisplay); //等待按键放开}}。
数字闹钟说明书
说明书一、主程序、子模块流程图电子闹钟主流程图:调时、调日期、调星期流程图:倒计时结束流程图:音乐播放流程图:闹铃功能流程图:二、功能介绍:有计时,计日期,计星期,调时、调日期、调星期、闹钟、调闹钟、音乐闹铃、秒表、99秒倒计时、60秒倒计时、5秒倒计时、倒计时结束播放提醒音乐、直接按键播放音乐共计15个小的功能,分为四个功能模块,用四个按键来实现1.调时,查看日期以及调日期,查看星期以及调星期按键1进入该模块后,显示该模块的界面“1234”,分别代表在该界面中要用到的按键编号。
此时按1即进入调时界面,显示当前时间,按1秒加1,按2分加1,按3时加1,按4退出该界面而回到模块界面。
此时按2即进入查看日期以及调日期的界面,显示当前日期,按1天加1,按2月加1,按3年加1,按4退出该界面而回到模块界面。
此时按3即进入查看星期以及调星期的界面,显示当前星期,按1星期加1,按4退出该界面而回到模块界面。
此时按4则退出功能模块1而回到主界面。
2.调闹钟进入该模块时,显示闹钟时间,按1秒加1,按2分加1,按3时加1,按4退出调闹钟模块而回到主界面3.秒表,倒计时进入该模块后,显示界面“12 4”,分别代表在该界面中要用到的按键编号。
此时按1进入秒表计时状态,按4退出,回到模块界面。
此时按2进入99秒倒计时状态,按1切换到60秒倒计时,按1切换到5秒倒计时,在倒计时进行中,按4可以回到模块界面。
此时按4,可以回到主界面4.音乐进入该界面后,显示界面“00-00-00”,按1播放歌曲1,按2播放歌曲2,按3播放歌曲3,按4播放歌曲4,在播放歌曲时,按4可以结束播放音乐并且回到主界面。
多功能电子钟程序(完全好使)
/*设计功能:1.时钟功能(上排数码管)每秒更新一次时钟显示,显示方式为MM.SS,其中M为分钟,S为秒。
可以通过按键调整当前时间,调整时间时需要闪烁调整位置的数值。
2.秒表功能(下排数码管)按开始按键开始走秒,按停止按键停止走秒,按清除按键秒表归零,显示方式为:SSS.U,其中S为秒,U为0.1秒。
3.闹钟功能(下排数码管)用按键设置闹钟时间,显示格式为MM.SS。
闹钟时间到达后,闪烁一个指示灯。
可以用按键设置闹钟、取消闹钟。
各个按键功能可以自行定义,每按一次任何按键,D2灯会翻转一次状态*//*硬件连接:一个有上下两个4位共阳数码管,4个按键,2个LED指示灯P2高四位控制上排数码管位选,低4位控制下排数码管位选,P0控制段选四个按键为独立按键,与P2高4位相连,与数码管复用LED0接P34,LED1接P35*//*使用方法:第一步:设定系统时间,在上排的4位数码管显示,注意系统时间设定确认后就不得修改了第二步:选择秒表模式或闹钟模式,在下排的4位数码管显示。
两种模式只能选择一种,并且不能切换。
1.设定系统时间此时按键定义:S5 移位,S6 加,S7 减,S8确认一开始上电时数字全0不闪烁,默认从第一位开始设置,按下加减进行调节,如此要更换调节位置,每按一次S5会右移一位,移到第四位再按会重新移回第一位。
设置完系统时间,按下S8确认,跳出设定环节,进入秒表和闹钟模式选择环节。
2。
秒表和闹钟模式选择此时按键定义:S5 改变模式标志,S6 S7未用,S8确认进入该模式设置完系统时间,进入秒表和闹钟模式选择环节。
此时第一位为0 。
然后按S5,第一位会在1和2之间来回切换,在显示1时按S8进入秒表模式,在显示2时按S8进入闹钟模式,2.1秒表模式此时按键定义:S5 未用,S6 开始,S7停止,S8清除2.2闹钟模式此时按键定义:S5 移位,S6 加,S7 减,S8按一次确认,等报警到了,再按S8停止报警如设定系统时间的步骤,设定好闹钟时间,按S8确认设定(S8只能按一次哦),等时间到了D1灯会不断闪烁表示报警,按S8停止报警*/#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit keysource= P1^7;sbit S5= P2^4;sbit S6= P2^5;sbit S7= P2^6;sbit S8= P2^7;sbit led0=P3^4; //每按一次任何按键,D2灯会翻转一次状态sbit led1=P3^5; //闹钟报警用的灯uint shuju_1;uint shuju_2;uint count;uint stopwatch_count;int miao;int fen;int warn_miao;int warn_fen;uint shanshuo; //1 2 3 4bit shanshuo1,shanshuo2,shanshuo3,shanshuo4;uint num_settime_cnt; //标识按键5设置时间时,按下的次数uint num_setmode_cnt; //1 or 2uint stopwatch_miao;uint stopwatch_Umiao;uint stopwatch_miao_1;uint stopwatch_Umiao_1;uint mode_flag;uint warn_flag;uint stopflag = 1; //初始时先让秒表停止uchar code shuma[] = {0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/}; // 共阳数码管void delay(uint z) // 1ms{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display_1() // 上排{uchar qian,bai,shi,ge;qian = shuju_1/1000;bai = shuju_1%1000/100;shi = shuju_1%100/10;ge = shuju_1%10;////xianshi 1////P2 |= 0xf0; //高4位全部置1P2 &= 0xef; //改变高4位,低4位不变if(shanshuo1 == 1)P0= 0xff;elseP0= shuma[qian];delay(1);////xianshi 2////P2 |= 0xf0;P2 &= 0xdf;if(shanshuo2 == 1)P0= 0xff;elseP0=shuma[bai]&0x7f; //要点亮小数点delay(1);////xianshi 3////P2 |= 0xf0;P2 &= 0xbf;if(shanshuo3 == 1)P0= 0xff;elseP0=shuma[shi];delay(1);////xianshi 4////P2 |= 0xf0;P2 &= 0x7f;if(shanshuo4 == 1)P0= 0xff;elseP0=shuma[ge];delay(1);P2 = 0xff; //解除位选}void display_2() // 下排{uchar qian,bai,shi,ge;qian = shuju_2/1000;bai = shuju_2%1000/100;shi = shuju_2%100/10;ge = shuju_2%10;////xianshi 1////P2 |= 0x0f; //低4位全部置1P2 &= 0xfe; //改变低4位,高4位不变if(shanshuo1 == 1)P0= 0xff;elseP0= shuma[qian];delay(1);////xianshi 2////P2 |= 0x0f;P2 &= 0xfd;if(shanshuo2 == 1)P0= 0xff;else if (mode_flag == 2){P0=shuma[bai]&0x7f;}else{P0=shuma[bai] ;}delay(1);////xianshi 3////P2 |= 0x0f;P2 &= 0xfb;if(shanshuo3 == 1)P0= 0xff;else if (mode_flag == 1){P0=shuma[shi]&0x7f;}else{P0=shuma[shi] ;}delay(1);////xianshi 4////P2 |= 0x0f;P2 &= 0xf7;if(shanshuo4 == 1)P0= 0xff;elseP0=shuma[ge];delay(1);P2 = 0xff; //解除位选}void check_ledflash() //判断哪一位正在设置中,让该位闪烁{switch(shanshuo) //利用shanshuo标志来判断,当前正在在哪一位设定{case 1:shanshuo1 = ~shanshuo1; //如果为第一位,则第一位闪烁,其它位不闪烁shanshuo2 =0;shanshuo3 =0;shanshuo4 =0;break;case 2:shanshuo2 = ~shanshuo2;//如果为第二位,则第一位闪烁,其它位不闪烁shanshuo1 =0;shanshuo3 =0;shanshuo4 =0;break;case 3:shanshuo3 = ~shanshuo3;//如果为第三位,则第一位闪烁,其它位不闪烁shanshuo1 =0;shanshuo2 =0;shanshuo4 =0;break;case 4:shanshuo4 = ~shanshuo4;//如果为第四位,则第一位闪烁,其它位不闪烁shanshuo1 =0;shanshuo2 =0;shanshuo3 =0;break;default:shanshuo1 =0;shanshuo2 =0;shanshuo3 =0;shanshuo4 =0;break;}}void settime()//设定系统时间,时间格式:分-分。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AN_JIAN1 BIT P3.0AN_JIAN2 BIT P3.1AN_JIAN4 BIT P3.3SECOND EQU 30HAN_JIAN3 BIT P3.2MINUTE EQU 31H HOUR EQU 32HTIMEJ EQU 34HM_NAO EQU 35H H_NAO EQU 36H S_NAO EQU 37H SECOND_MIAO EQU 38H MINUTE_MIAO EQU 39HB_NAO EQU 40H SECOND_DAO EQU 41H MINUTE_DAO EQU 42H HOUR_DAO EQU 43H SECOND_1 EQU 44H HAO_MIAO EQU 45H YEAR EQU 46H MONTH EQU 47H DA Y EQU 48H XIANSHI1 EQU 49H XIANSHI2 EQU 50H XIANSHI3 EQU 51H XING_QI EQU 52H NUM_YIN EQU 53H ;****************************** ******************************* ;代码段ORG 00HJMP ST ARTORG0BH ;中断T0入口LJMP INT_T0ORG 001BH ;中断T1入口LJMP INT_T1ORG 100H ST ART: MOV DPTR,#T ABLEMOVNUM_YIN,#0MOVXING_QI,#01MOVYEAR,#10MOVMONTH,#01MOV DA Y,#03MOVHAO_MIAO,#0MOVSECOND_MIAO,#0MOVMINUTE_MIAO,#0MOVB_NAO,#0MOVH_NAO,#07MOVM_NAO,#0MOVS_NAO,#0MOV HOUR,#0MOV MINUTE,#0MOV SECOND,#0MOVSECOND_1,#0MOV TIMEJ,#0MOV TMOD,#11HMOV TH0,#3CHMOV TL0,#0B0HSETB EASETB ET1SETB ET0SETB TR0;****************************************************;主循环:显示当前时间,并检测按键状态,按1进入循环1,按2进入循环2,按3进入循环3,按4进入循环4MAIN:MOV XIANSHI1,SE CONDMOV XIANSHI2,MINUTEMOV XIANSHI3,HOURLCALL DISPLA YJNBAN_JIAN1,KMAIN1_TJNBAN_JIAN2,KMAIN2_TJNBAN_JIAN3,KMAIN3_TJNBAN_JIAN4,KMAIN4_TMOV A,B_NAOCJNE A,#0,P_NAOJMP MAIN;******************************************************;检测是否达到所设置的闹钟时刻,若达到则调用闹铃程序P_NAO: MOV A,HOURCJNE A,H_NAO,MAINMOV A,MINUTECJNE A,M_NAO,MAINMOV 56H,#HIGH T ABLE1MOV 57H,#LOW T ABLE1MOV NUM_YIN,#0FHLCALL ST ART1CLR TR1SETB TR0LJMP ST ART_L;******************************************************;跳转服务KMAIN1_T:LJM P KMAIN1KMAIN2_T:LJM P KMAIN2KMAIN3_T:LJM P KMAIN3KMAIN4_T:LJM P KMAIN4;*******************************************************;主循环中各个按键功能的具体实现,加入了防抖动和应对按键被长时间按下KMAIN1:LCA LL DELA YJB AN_JIAN1,MAIN1_TLJMP TIAO_MAIN1KMAIN2:LCA LL DELA YJB AN_JIAN2,MAIN2_TLJMP TIAO_MAIN2KMAIN3:LCA LL DELA YJB AN_JIAN3,MAIN3_TMOV HAO_MIAO,#0MOV SECOND_MIAO,#0MOV MINUTE_MIAO,#0LJMP TIAO_MAIN3KMAIN4:LCA LL DELA YMOV NUM_YIN,#0JB AN_JIAN4,MAIN4_TLJMP TIAO_MAIN4;****************************** ******************************* *;跳转服务MAIN1_T:LCALL DELA YLJMP MAIN1MAIN2_T:LCALL DELA YLJMP MAIN2MAIN3_T:LCALL DELA YLJMP MAIN3MAIN4_T:LCALL DELA YLJMP MAIN4;****************************** ******************************* ;应对按键被长时间按下的具体代码TIAO_MAIN1:JB AN_JIAN1,MAIN1_TMOVXIANSHI1,SE CONDMOVXIANSHI2,M INUTEMOVXIANSHI3,HOURLCALLDISPLA YSJMP TIAO_MAIN1 TIAO_MAIN2:JB AN_JIAN2,MAIN2_TMOV XIANSHI1,SE CONDMOVXIANSHI2,M INUTEMOVXIANSHI3,HOURLCALLDISPLA YSJMP TIAO_MAIN2TIAO_MAIN3:JB AN_JIAN3,MAIN3_TMOVXIANSHI1,SE CONDMOVXIANSHI2,M INUTEMOVXIANSHI3,HOURLCALLDISPLA YSJMP TIAO_MAIN3TIAO_MAIN4:JB AN_JIAN4,MAIN4_TMOVXIANSHI1,SE CONDMOVXIANSHI2,M INUTEMOVXIANSHI3,HOURLCALLDISPLA YSJMP TIAO_MAIN4;**************************************************************;循环1:显示循环1的界面,检测按键,按1进入调时间的循环,按2进入调日期和查看当前日期的循环,按3进入调星期和查看当前星期的循环,按4退出循环1而回到主循环MAIN1:LCALL DISPLA Y3JNB AN_JIAN1,KTIMEJNB AN_JIAN2,KDA TE_TJNB AN_JIAN3,KWEEK_TJNBAN_JIAN4,KRETURN1_TJMP MAIN1;**************************************************************;跳转服务KWEEK_T:LJM P KWEEKKDA TE_T:LJMP KDA TEKRETURN1_T:LJMP KRETURN1;***************************************************************KTIME:LCA LL DELA YJB AN_JIAN1,TIMEM1_TIMETIAO:JBAN_JIAN1,TIMELCALLDISPLA Y3SJMP M1_TIMETIAO;**************************************************************TIME:MOV XIANSHI1,SECONDMOV XIANSHI2,MINUTEMOV XIANSHI3,HOURLCALL DISPLA YJNB AN_JIAN1,KS_JIA1JNB AN_JIAN2,KM_JIA1JNB AN_JIAN3,KH_JIA1JNBAN_JIAN4,KRETURN_TIME2M1JMP TIME;**************************************************************;循环TIME中各个按键功能的具体实现,加入了防抖动和应对按键被长时间按下KS_JIA1:LCALL DELA YJB AN_JIAN1,MAIN1_T1INC SECONDMOV A,SECONDCJNE A,#60,M1_STIAOMOV SECOND,#0M1_STIAO:JBAN_JIAN1,MAIN1_T1MOVXIANSHI1,SE CONDMOV XIANSHI2,M INUTEMOV XIANSHI3,HOURLCALLDISPLA YSJMP M1_STIAO KM_JIA1:LCA LL DE LA YJB AN_JIAN2,MAIN1_T1 INC MINUTEMOV A,MINUTECJNE A,#60,M1_MTIAOMOV MINUTE,#0M1_MTIAO:JBAN_JIAN2,MAIN1_T1MOV XIANSHI1,SE CONDMOV XIANSHI2,M INUTEMOV XIANSHI3,HOURLCALLDISPLA YSJMP M1_MTIAOMAIN1_T1:LJM P TIME KH_JIA1:LCALL DELA YJB AN_JIAN3,MAIN1_T1 INC HOURMOV A,HOURCJNE A,#24,M1_HTIAOMOV HOUR,#0M1_HTIAO:JBAN_JIAN3,MAIN1_T1MOV XIANSHI1,SE CONDMOV XIANSHI2,M INUTEMOV XIANSHI3,HOURLCALLDISPLA YSJMP M1_HTIAO KRETURN_TIME2M1:LCA LL DELA YJBAN_JIAN4,TIME2M1KRETURN_TIAOM1:JBAN_JIAN4,TIME2M1LCALLDISPLA YSJMPKRETURN_TIAOM1TIME2M1:LJMP MAIN1;*****************************************************************KDA TE:LCA LL DE LA YJB AN_JIAN4,DA TEM1_DTIAO:JB AN_JIAN4,DA TELCALL DISPLA Y3SJMP M1_DTIAO;********************************************************************;循环DA TE:显示当前日期,并检测按键状态,按1给天加1,按2给月加1,按3给年加1, 按4退出循环DA TE而回到循环1DA TE:MOV XIANSHI1,DA YMOV XIANSHI2,MONTHMOV XIANSHI3,YEARLCALL DISPLA YJNB AN_JIAN1,KDY_JIA1JNB AN_JIAN2,KMH_JIA1JNB AN_JIAN3,KYR_JIA1JNB AN_JIAN4,KRETURNDJMP DA TE;********************************************************************;循环DA TE中的各个按键功能的实现,加入了防抖动和应对按键被长时间按下KDY_JIA1:LCALL DELA YJB AN_JIAN1,DA TE_TDINC DA YMOV A,DA YCJNE A,#32,D_DTIAOMOV DA Y,#01D_DTIAO:JBAN_JIAN1,DA TE_TDMOVXIANSHI1,DA YMOVXIANSHI2,MONTHMOVXIANSHI3,YEARLCALLDISPLA YSJMP D_DTIAOKMH_JIA1:LCALL DELA YJB AN_JIAN2,DA TE_TDINC MONTHMOV A,MONTHCJNE A,#13,D_MTIAOMOV MONTH,#01D_MTIAO:JBAN_JIAN2,DA TE_TDMOVXIANSHI1,DA YMOVXIANSHI2,MONTHMOVXIANSHI3,YEARLCALLDISPLA YSJMP D_MTIAODA TE_TD:LJMPDA TEKYR_JIA1:LCALL DE LA YJB AN_JIAN3,DA TE_TDINC YEARMOV A,YEARCJNE A,#100,D_YTIAOMOV YEAR,#0D_YTIAO: JB AN_JIAN3,DA TE_TDMOVXIANSHI1,DA YMOV XIANSHI2,MONTHMOV XIANSHI3,YEARLCALLDISPLA YSJMP D_YTIAO KRETURND:LCA LL DELA YJB AN_JIAN4,REDTD_RTIAO:JB AN_JIAN4,RE DTMOVXIANSHI1,DA YMOV XIANSHI2,MONTHMOV XIANSHI3,YEARLCALLDISPLA YSJMP D_RTIAOREDT:LJMP MAIN1;****************************** ******************************* *******KWEEK:LCA LL DELA YJB AN_JIAN3,WEEKWEEKM1_TIAO: JB AN_JIAN3,W EEKLCALL DISPLA Y3SJMP WEEKM1_TIAO ;****************************** ******************************* ********;循环WEEK:显示当前的星期,并检测按键状态,按1给星期加1,按4退出循环WEE K而回到循环1 WEEK:MOV XIANSHI1,XING_QIMOV XIANSHI2,XING_QIMOV XIANSHI3,XING_QILCALL DISPLA YJNB AN_JIAN1,KXQ_JIA1JNBAN_JIAN4,KRETURNWJMP WEEK;********************************************************************;循环WEEK中的各个按键功能的具体实现,加入了防抖动和应对按键被长时间按下KXQ_JIA1:LCALL DELA YJB AN_JIAN1,WEEK_TWINC XING_QIMOV A,XING_QICJNE A,#08,W_XQT IAOMOV XING_QI,#01W_XQTIAO:JBAN_JIAN1,W EEK_TWMOVXIANSHI1,XING_QIMOVXIANSHI2,XING_QIMOVXIANSHI3,XING_QILCALLDISPLA YSJMP W_XQTIAOWEEK_TW:LJMPWEEKKRETURNW:LCA LL DELA YJB AN_JIAN4,REWTW_RTIAO:JB AN_JIAN4,RE WTMOVXIANSHI1,XING_QIMOVXIANSHI2,XING_QIMOVXIANSHI3,XING_QILCALLDISPLA YSJMP W_RTIAOREWT:LCALL DELA YLJMPMAIN1;******************************************************************KRETURN1:LCA LL DE LA YJB AN_JIAN4,RE1TM1_RTIAO:JB AN_JIAN4,RE1TMOVXIANSHI1,SE CONDMOVXIANSHI2,M INUTEMOVXIANSHI3,HOURLCALLDISPLA YSJMP M1_RTIAORE1T:LJMPMAIN;*************************************************************************;循环2:显示闹钟时间,并检测按键状态,按1闹钟分加1,按2闹钟时加1,按3关闭闹钟功能并回到主循环,按4开启闹钟功能并回到主循环MAIN2:MOV XIANSHI1,S_NAOMOV XIANSHI2,M_NAOMOV XIANSHI3,H_NAOLCALL DISPLA YJNB AN_JIAN1,KNM_JIA1JNB AN_JIAN2,KNH_JIA1JNB AN_JIAN3,OFF_NAOJNB AN_JIAN4,ON_NAOJMP MAIN2;************************************************************************;循环2的各个按键功能的具体实现,加入了防抖动和应对按键被长时间按下KNM_JIA1:LCALL DE LA YJB AN_JIAN1,MAIN2_T2 INC M_NAOMOV A,M_NAOCJNE A,#60,M2_MTIAOMOV M_NAO,#0M2_MTIAO:JBAN_JIAN1,MAIN2_T2MOV XIANSHI1,S_NAOMOV XIANSHI2,M_NAOMOV XIANSHI3,H_NAOLCALLDISPLA YSJMP M2_MTIAOMAIN2_T2:LJMP MAIN2KNH_JIA1:LCALL DELA YJB AN_JIAN2,MAIN2_T2 INC H_NAOMOV A,H_NAOCJNE A,#24,M2_HTIAOMOV H_NAO,#0M2_HTIAO:JBAN_JIAN2,MAIN2_T2MOV XIANSHI1,S_NAOMOV XIANSHI2,M_NAOMOV XIANSHI3,H_NAOLCALLDISPLA YSJMP M2_HTIAO OFF_NAO:LCALL DELA YJB AN_JIAN3,RETURN2_T MOV B_NAO,#0M2_OTIAO:JBAN_JIAN3,RETURN2_TMOVXIANSHI1,S_NAOMOV XIANSHI2,M_NAOMOVXIANSHI3,H_NAOLCALLDISPLA YSJMP M2_OTIAORETURN2_T:LJM P MAINON_NAO:LCALL DELA YJB AN_JIAN4,RETURN2_TMOV B_NAO,#01M2_ONTIAO:JBAN_JIAN4,RETURN2_TMOVXIANSHI1,S_NAOMOVXIANSHI2,M_NAOMOVXIANSHI3,H_NAOLCALLDISPLA YSJMP M2_ONTIAO;********************************************************************;循环3,显示循环3的界面,并检测按键,按1进入秒表功能循环,按2进入倒计时功能循环,按4退出循环3而回到主循环MAIN3:LCALL DISPLA Y4JNB AN_JIAN1,KMIAOBIAOGJNB AN_JIAN2,KDAOJISHIGJNB AN_JIAN4,KM3TOMJMP MAIN3;********************************************************************KM3TOM:LCALL DELA YJBAN_JIAN4,KM3TOM_MAINKM3TOM_TIAO:JBAN_JIAN4,KM3TOM_MAINLCALLDISPLA Y4SJMPKM3TOM_TIAOKM3TOM_MAIN:LJMP MAIN;********************************************************************KMIAOBIAOG:LCA LL DELA YJBAN_JIAN1,M IAOBIAOGMOV HAO_MIAO,#0MIAOBIAOG_TIAO:JBAN_JIAN1,M IAOBIAOGLCALLDISPLA Y4SJMPMIAOBIAOG_TIAO;********************************************************************;秒表功能循环,进入秒表计时,并检测按键,按4退出秒表功能而回到循环3MIAOBIAOG: MOVXIANSHI1,HAO_MIAOMOVXIANSHI2,SE COND_MIAOMOVXIANSHI3,M INUTE_MIAOLCALLDISPLA Y2JNBAN_JIAN4,KRETURN3JMP MIAOBIAOG;********************************************************************KRETURN3:LCA LL DE LA YJB AN_JIAN4,RETURN3M3_RTIAO:JBAN_JIAN4,RETURN3MOVXIANSHI1,HAO_MIAOMOVXIANSHI2,SE COND_MIAOMOV XIANSHI3,M INUTE_MIAOLCALLDISPLA Y2SJMP M3_RTIAORETURN3: LJMP MAIN3;****************************** ******************************* *******KDAOJISHIG:LCALL DELA YJB AN_JIAN2,DAOJISHIGMOV HOUR_DAO,#99MOV MINUTE_DAO,#99MOV SECOND_DAO,#99MOV SECOND_1,#0DAOJISHIG_TIAOD:JB AN_JIAN2,DAOJISHIGLCALL DISPLA Y1SJMP DAOJISHIG_TIAOD;****************************** ******************************* ********;倒计时功能循环,进入99秒倒计时状态,并检测按键,按1切换到60秒倒计时,按4退出倒计时功能而回到循环3DAOJISHIG:LCALL DISPLA Y1JNBAN_JIAN1,KDAO60JNBAN_JIAN4,KRETURN4JMP DAOJISHIG;****************************** ******************************* *******KRETURN4:LCA LL DE LA YJB AN_JIAN4,RETURN4M4_RETIAO:JBAN_JIAN4,RETURN4LCALLDISPLA Y1SJMP M4_RETIAORETURN4:LJMP MAIN3;********************************************************************KDAO60:LCA LL DELA YJB AN_JIAN1,DAO60MOV SECOND_DAO,#60MOV MINUTE_DAO,#60MOV HOUR_DAO,#60MOV SECOND_1,#0M4_60TIAO:JBAN_JIAN1,DAO60LCALLDISPLA Y1SJMP M4_60TIAO;*******************************************************************;60秒倒计时功能循环,进行60秒倒计时,并检测按键,按1切换到5秒倒计时,按4退出60秒倒计时而回到循环3DAO60:LCALL DISPLA Y1JNB AN_JIAN1,KDAO5JNBAN_JIAN4,KRETURN4_60JMP DAO60;********************************************************************KDAO5:LCALL DE LA YJB AN_JIAN1,DAO5MOV SECOND_DAO,#05MOV MINUTE_DAO,#05MOV HOUR_DAO,#05MOV SECOND_1,#0M4_5TIAO: JBAN_JIAN1,DAO5LCALLDISPLA Y1SJMP M4_5TIAOKRETURN4_60:LCA LL DELA YJBAN_JIAN4,RETURN4_60M4_R60ETIAO:JBAN_JIAN4,RETURN4_60LCALLDISPLA Y1SJMPM4_R60ETIAORETURN4_60:LJMP MAIN3;********************************************************************;5秒倒计时,进行5秒倒计时,并检测按键,按4退出5秒倒计时而回到循环3DAO5:LCALL DISPLA Y1JNBAN_JIAN4,KRETURN4_05JMP DAO5;********************************************************************KRETURN4_05:LCA LL DELA YJBAN_JIAN4,RETURN4_05M4_R05ETIAO:JBAN_JIAN4,RETURN4_05LCALLDISPLA Y1SJMPM4_R05ETIAORETURN4_05:LJMP MAIN3;********************************************************************;跳转服务MAIN4_L:LCALL ST ART1LJMP ST ART_L;************************************************************* ********;循环4中的各个按键的具体实现,加入了防抖动和应对按键被长时间按下KCHOOSE1: LCALL DELA YJB AN_JIAN1,MAIN4_LMOV NUM_YIN,#01MOV 56H,#HIGH T ABLE1MOV 57H,#LOW T ABLE1TIAO_CH1:JBAN_JIAN1,MAIN4_LLCALL DISPLA YSJMP TIAO_CH1 KCHOOSE2: LCALL DELA YJB AN_JIAN2,MAIN4_LMOV NUM_YIN,#02MOV 56H,#HIGH T ABLE2MOV 57H,#LOW T ABLE2TIAO_CH2:JBAN_JIAN2,MAIN4_LLCALL DISPLA YSJMP TIAO_CH2 KCHOOSE3: LCALL DELA YJB AN_JIAN3,MAIN4_LMOV NUM_YIN,#03MOV 56H,#HIGH T ABLE3MOV 57H,#LOW T ABLE3TIAO_CH3: JB AN_JIAN3,MAIN4_LLCALL DISPLA YSJMP TIAO_CH3 KCHOOSE4: LCALL DELA YJB AN_JIAN4,MAIN4_LMOV NUM_YIN,#04MOV 56H,#HIGH T ABLE4MOV 57H,#LOWT ABLE4TIAO_CH4:JBAN_JIAN4,MAIN4_LLCALLDISPLA YSJMP TIAO_CH4;*********************************************************************;循环4:实现音乐盒功能,检测按键,按1播放歌曲1,按2播放歌曲2,按3播放歌曲3,按4播放歌曲4MAIN4:MOV XIANSHI1,NUM_YINMOV XIANSHI2,NUM_YINMOV XIANSHI3,NUM_YINLCALL DISPLA YJNB AN_JIAN1,KCHOOSE1TJNB AN_JIAN2,KCHOOSE2JNB AN_JIAN3,KCHOOSE3JNB AN_JIAN4,KCHOOSE4JMP MAIN4KCHOOSE1T:JMP K CHOOSE1;*********************************************************************;T0中断服务子程序,为时钟,秒表,倒计时,日期和星期等功能的实现提供服务INT_T0:MOVTH0,#3CHMOV TL0,#0B0HINC TIMEJINCHAO_MIAOMOV A,TIMEJCJNE A,#20,RETURNINCSECOND_1INC SECONDMOV TIMEJ,#0MOV A,SECONDCJNE A,#60,RETURNINC MINUTEMOV SECOND,#0MOV A,MINUTECJNE A,#60,RETURNINC HOURMOV MINUTE,#0MOV A,HOURCJNE A,#24,RETURNMOVHOUR,#0MOV MINUTE,#0MOV SECOND,#0MOV TIMEJ,#0INC DA YINC XING_QIMOV A,XING_QICJNE A,#08,XIA YICIMOVXING_QI,#01XIA YICI:MOV A,DA YCJNE A,#31,RETURNINC MONTHMOV DA Y,#01MOV A,MONTHCJNE A,#13,RETURNMOV MONTH,#01MOV DA Y,#01INC YEARMOV A,YEARCJNEA,#100,RETURNMOV YEAR,#0MOVMONTH,#01MOV DA Y,#01RETURN: RETI;************************************************************************************;中断T1服务子程序,为音乐的播放提供服务INT_T1:PUSH ACCPUSH PSWMOV TL1,20hMOV TH1,21hCPL P3.7POP PSWPOP ACCRETI;****************************** ******************************* *********************;显示子程序,为时间,秒表,倒计时,日期和星期的显示提供服务DISPLA Y: MOVA,XIANSHI1MOV B,#10DIV ABSETB P2.2SETB P2.1CLR P2.0MOVCA,@A+DPTRMOV P0,ALCALL DELA YMOV A,BSETB P2.0MOVCA,@A+DPTRMOV P0,ALCALL DELA YCLR P2.1MOV P0,#40HLCALL DELA YMOV A,XIANSHI2MOV B,#10DIV ABCLR P2.2SETB P2.1SETB P2.0MOVCA,@A+DPTRMOV P0,ALCALL DELA YMOV A,BSETB P2.2CLR P2.1CLR P2.0MOVCA,@A+DPTRMOV P0,ALCALL DELA YCLR P2.2SETB P2.1CLR P2.0MOV P0,#40HLCALL DELA YMOV A,XIANSHI3MOV B,#10DIV ABCLR P2.0CLR P2.1CLR P2.2MOVCA,@A+DPTRMOV P0,ALCALL DELA YMOV A,BSETB P2.0MOVCA,@A+DPTRMOV P0,ALCALL DELA YRETT ABLE: DB3FH,06H,5BH,4FH,66HDB6DH,7DH,07H,7FH,6FHDB77H,7CH,39H,5EH,79H,71H,76H;********************************************************************************;为倒计时功能的实现服务的子程序,倒计时结束播放音乐并返回主循环DISPLA Y1:MOVA,SECOND_1CJNE A,#1,JI_1DEC SECOND_DAODEC MINUTE_DAODEC HOUR_DAODEC SECOND_1MOV A,SECOND_DAOCJNE A,#0,JI_1MOV 56H,#HIGH T ABLE2MOV 57H,#LOWT ABLE2MOV NUM_YIN,#0EHLCALL ST ART1LJMP ST ART_LLJMP MAIN1JI_1: MOVXIANSHI1,SE COND_DAOMOVXIANSHI2,M INUTE_DAOMOVXIANSHI3,HOUR_DAOLCALL DISPLA YRET;*********************************************************************************;为秒表功能的实现服务的子程序DISPLA Y2:MOVA,HAO_MIAOCJNEA,#20,RETURN_1MIAOMOV HAO_MIAO,#0INC SECOND_MIAOMOV A,SECOND_MIAOCJNEA,#60,RETURN_1MIAOMOV HAO_MIAO,#0MOVSECOND_MIAO,#0INC MINUTE_MIAOMOV A,MINUTE_MIAOCJNEA,#60,RETURN_1MIAOMOVSECOND_MIAO,#0MOV HAO_MIAO,#0MOVMINUTE_MIAO,#0RETURN_1MIAO:LCALL DISPLA YRET;****************************** ******************************* *******************;循环1的界面显示,进入循环1后显示一个界面,界面内容是在这个循环里需要按的键的编号DISPLA Y3:MOV DPTR,#T ABLEMOV A,#1CLR P2.0CLR P2.1CLR P2.2MOVC A,@A+DPTRMOV P0,ALCALL DELA YMOV A,#2SETB P2.0MOVC A,@A+DPTRMOV P0,ALCALL DELA YMOV A,#3CLR P2.0SETB P2.1MOVC A,@A+DPTRMOV P0,ALCALL DELA YMOV A,#4SETB P2.0MOVC A,@A+DPTRMOV P0,ALCALL DELA YRET;*********************************************************************************;循环3的界面显示,进入循环3后显示一个界面,界面内容是在这个循环里需要按的键DISPLA Y4:MOV DPTR,#T ABLEMOV A,#1CLR P2.0CLR P2.1CLR P2.2MOVC A,@A+DPTRMOV P0,ALCALL DELA YMOV A,#2SETB P2.0MOVC A,@A+DPTRMOV P0,ALCALL DELA YMOV A,#4SETB P2.0SETB P2.1MOVC A,@A+DPTRMOV P0,ALCALL DELA YRET;*********************************************************************************;生成音乐的子程序,在其中有按键的检测,按4退出音乐播放而回到主循环ST ART1:ST ART0:mov 29h,#00NEXT:MOV DPTR,#T ABLEMOV A,NUM_YINSETB P2.0CLR P2.1CLR P2.2MOVC A,@A+DPTRMOV P0,ALCALL DELA YJNB AN_JIAN4,A1TTTTMOV a,29hMOV dpH,56HMOV DPL,57HMOVC a,@a+dptrMOV r2,aJZ end0ANL a,#0fhMOV r5,aMOV a,r2SWAP aANL a,#0fhJNZ singCLR tr1JMP d19SING:JNB AN_JIAN4,A1TTTTDEC aMOV 22h,aRL aMOV dptr,#tableAAMOVC a,@a+dptrMOV th1,aMOV 21h,aMOV a,22hJNB AN_JIAN4,A1TTTTRL aINC aMOVC a,@a+dptrMOV tl1,aMOV 20h,aSETB tr1d19:JNB AN_JIAN4,A1TTTTLcall delay11INC 29hJMP nextend0:clr tr1RET;****************************** ******************************* *******************;跳转服务A1TTTT:LCALL DELA YJB AN_JIAN4,A1TTTTIAO_A1T:JBAN_JIAN4,A1TTTSJMP TIAO_A1T A1TTT:MOV B_NAO,#0CLR TR1SETB TR0MOV DPTR,#T ABLELJMP MAINST ART_L:MOV DPTR,#T ABLELJMP MAIN;****************************** ******************************* *******************;歌曲T ABLE1:;两只蝴蝶DB32H,22H,38H,02H,22H,32H,22H,18H, 04H,92H,12H,24H,22H,32H,22H,12H, 92H,92H,88H,04H,32H,22HDB38H,02H,22H,32H,22H,18H,04H,92H, 12H,24H,22H,32H,22H,21H,92H,12H, 28H,04H,32H,22HDB38H,02H,22H,32H,22H,18H,04H,92H, 12H,24H,22H,32H,22H,12H,92H,91H, 11H,88HDB04H,32H,52H,58H,02H,52H,62H,52H, 38H,04H,22H,22H,24H,22H,32H,22H, 12H,92H,92HDB12H,12H,1cH,08H,02H,52H,52H,62H,0 b2H,72H,72H,62H,32H,22H,22H,22H DB38H,02H,32H,32H,52H,64H,64H,02H,92H,32H,22H,28H,04H,32H,52H,52H,32H,54H,02H,0b4H,72HDB62H,72H,34H,02H,62H,62H,72H,62H,52H,32H,22H,02H,32H,22H,32HDB58H,02H,52H,52H,62H,0b2H,72H,72H,62H,32H,22H,22H,22HDB38H,02H,32H,32H,52H,64H,64H,02H,92H,32H,22H,28H,04H,32H,52H,52H,32H,54H,02H,0b4H,72HDB62H,72H,34H,02H,62H,62H,72H,62H,52H,32H,22H,02H,84H,92H,1cHDB 00T ABLE2:;精忠报国DB66H,52H,36H,22H,12H,12H,22H,32H,98H,84H,82H,92H,14H,12H,22HDB32H,52H,22H,42H,38H,66H,52H,36H,22H,12H,22H,22H,32H,98HDB24H,22H,32H,54H,52H,32H,92H,12H,92H,82H,98H,66H,52H,36H,22HDB12H,12H,22H,32H,98H,84H,82H,92H,14H,12H,22H,32H,52H,22H,42H,38HDB66H,52H,36H,22H,12H,22H,22H,32H,98H,24H,22H,32H,54H,52H,32HDB22H,12H,92H,82H,98H,14H,24H,34H,44H,64H,0B4H,64H,32H,52HDB62H,0B2H,62H,52H,38H,24H,22H,32H,54H,52H,62H,52H,32H,32H,22H,38HDB64H,0B4H,64H,32H,52H,62H,0B2H,62H,52H,38H,22H,22H,22H,32H,52H,52HDB 52H,62H,7FH,74H,04H,58H,6FHDB 00T ABLE3:;大海DB82H,92H,12H,14H,12H,14H,92H,82H,12H,14H,22H,14H,92H,12H,22H,24HDB22H,24H,12H,92H,22H,24H,32H,24H,32H,52H,62H,54H,52H,64H,52H,32HDB22H,32H,22H,12H,94H,82H,92H,12H,14H,12H,14H,94H,1cHDB82H,92H,12H,14H,12H,14H,92H,82H,12H,14H,22H,14H,92H,12H,22H,24HDB22H,24H,12H,92H,22H,24H,32H,24H,32H,52H,62H,54H,52H,64H,52H,32HDB22H,32H,22H,12H,94H,82H,92H,12H,14H,12H,14H,22H,12H,1cH,32H,52HDB62H,64H,62H,64H,0b2H,62H,52H,54H,62H,54H,32H,22HDB12H,14H,12H,14H,24H,3cH,32H,22H,12H,14H,12H,14H,0b2H,62H,52H,54H,62H,54H,32H,52HDB66H,0b2H,0b4H,62H,52H,5cH,32H,52H,62H,64H,62H,64H,0b2H,62H,52H,54HDB62H,54H,32H,22H,12H,14H,12H,14H,54H,3cH,32H,22H,12H,14H,12H,14H,22H,32HDB52H,54H,32H,54H,32H,52H,6fH,04H,02H,92H,32H,24H,12H,1fHDB 00T ABLE4:;月亮代表我的心DB 02H,82HDB 16H,32H,54H,02H,52HDB 0A6H,32H,54H,02H,52HDB 64H,74H,0B6H,64HDB 52H,5CH,32H,22HDB 16H,12H,14H,32H,22HDB 16H,12H,14H,22H,32HDB 26H,12H,94H,22H,32HDB 2CHDB 32H,52HDB 36H,22H,14H,54HDB 0ACH,92H,0A2HDB 96H,0A2H,96H,82HDB 3CH,54HDB 36H,22H,14H,54HDB 0ACH,92H,0A2HDB 16H,12H,14H,22H,32HDB 2CH,02H,82HDB 16H,32H,56H,12HDB 0A6H,32H,56H,52HDB 66H,72H,0B6H,62HDB 62H,52H,58H,32H,22HDB 16H,12H,14H,32H,22HDB 16H,12H,14H,22H,32HDB 26H,92H,0A4H,12H,22HDB 1CHDB 00tableAA:DW 64580,64684,64777,64820DW 64898,64968,65030,64260DW 64400,64524,65058,63835,64021;****************************** ******************************* *********************;服务于音乐子程序的延时子程序delay11:mov r7,#02d29:mov r4,#125d39:mov r3,#248djnz r3,$JNB AN_JIAN4,A1TTTZTdjnz r4,d39JNB AN_JIAN4,A1TTTZTdjnz r7,d29djnz r5,delay11retA1TTTZT:LJMP A1TTTT;****************************** ******************************* *********************;服务于其它子程序的延时子程序DELA Y: MOV R6,#10D1: MOV R7,#175DJNZ R7,$DJNZ R6,D1RETEND。