实时时钟设计试验报告
实时时钟设计实验报告
实验报告源代码:#pragma sfr //使用特殊功能寄存器#pragma EI //开中断#pragma DI //关中断#pragma access //使用绝对地址指令#pragma interrupt INTTM000 Time //定义时间中断函数为Time#pragma interrupt INTKR OnKeyPress //定义按键中断为OnKeyPress#pragma interrupt INTP5 OnKeyOver //定义INT中断为OnKeyOvervoid Init_Led();void InitKey_INTKR();void Init_Lcd();void Init_Inter();void LightOneLed(unsigned char ucNum);void LightOff();int Count_Day(int month);char i=0; //定义变量i,是切换时间的标志int key=0; //定义key=0int temp=1; //用于存放当前月的天数int temp1=1;int second=0; //默认的秒second=0int minute=0; //默认的分minute=0int hour=12; //默认的时hour=12int day=1; //默认的天day=1int month=5; //默认的月month=5int year=2014; //默认的年year=2014int c_hour=1; //默认的闹钟时=1int c_minute=1; //默认的闹钟分=1int buffs[2]; //秒的数码显示缓存区int buffm[2]; //分的数码显示缓存区int buffh[2]; //时的数码显示缓存区int buffday[2]; //天的数码显示缓存区int buffmonth[2]; //月的数码显示缓存区int buffyear[4]; //年的数码显示缓存区int buffmd[4]; //月,天的数码显示缓存区int buffhm[4]; //时,分的数码显示缓存区int buffms[4]; //分,秒的数码显示缓存区int buffch[2]; //闹钟时的数码显示缓存区int buffcm[2]; //闹钟分的数码显示缓存区unsigned char Que = 0; //INT中断中间变量intLCD_num[10]={0X070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0700,0x070f,0x070b};//数字0~~9的显示码unsigned char Scond;//…………………………延时函数1……………………//void Delay(int k){i nt i,j;f or(i=0;i<k;i++){for(j=0;j<k;j++){}}}//………………………初始化Led函数……………………// void Init_Led(){P M13=0XF0; //端口13的第四位为输出模式P M14=0XF0; //端口14的第四位为输出模式P M15=0XF0; //端口15的第四位为输出模式}//……………………………按键中断函数……………………// void InitKey_INTKR(){PM4 = 0x3F; //P4的六个端口设置为输入模式P U4 = 0x3F; //接通上拉电阻K RM = 0x3F; //允许六个按键中断K RMK = 0;P M3.0 = 1;P U3.0 = 1;E GP.5 = 1;P MK5 = 0;P PR5 = 0;K RPR = 1;}//……………初始化lcd函数……………………//void Init_Lcd(){P FALL=0x0F; //所有接lcd引脚指定为lcd引脚L CDC0=0x34; //设置原时钟和时钟频率L CDMD=0x30; //设置lcd电压为3/5电压L CDM=0xC0; //4分时1/3偏压模式}//………………初始化定时器Inter函数……………………// void Init_Inter(){C RC00.0=0; //CR000为比较寄存器P RM00=0X04; //计数时钟为fprs/2^8C R000=0X7FFF;//时间间隔为1sT MMK010=1; //TMMK010中断屏蔽T MMK000=0; //TMMK000中断允许T MC00=0X0C; //TM00和CR000相等时进入清零&启动模式}void Time(){s econd++;}//……………………………按键中断函数……………………// void OnKeyPress(){D I();s witch(P4&0x3F) //判断哪个按键按下{case 0x3e:key=1; //按键key1按下break;case 0x3d:key=2; //按键key2按下break;case 0x3b:key=3; //按键key3按下break;case 0x37:key=4; //按键key4按下break;case 0x2f:key=5; //按键key5按下break;case 0x1f:key=7; //按键key6按下break;default:break;}E I();}//……………………………INT按键中断函数……………………//void OnKeyOver(){D I();Q ue = 0; //判断Que是否为0B ZOE = 0; //蜂鸣器关闭E I();}//………………………Led小灯函数……………………//void LightOneLed(unsigned char ucNum){s witch(ucNum){ //检测变量ucNumcase 0:case 1:case 2:case 3:P13 |= (unsigned char) 1 << (ucNum);//如果为0到3中的一个值则让LED1到LED4中的一个亮break;case 4:case 5:case 6:case 7:P14 |= (unsigned char) 1 << (ucNum - 4);//如果为4到7中的一个值则让LED5到LED8中的一个亮break;case 8:case 9:case 10:case 11:P15 |= (unsigned char) 1 << (ucNum - 8);//如果为8到11中的一个值则让LED9到LED12中的一个亮break;default:break;}}//………………………Led小灯熄灭函数……………………//void LightOff(){P13 = 0;P14 = 0;P15 = 0;}//……………………时间函数……………………//void Time1(){i f((second % 5) == 0){ //秒大于5变为0Scond = second / 5 + 1;LightOff(); //调用小灯亮函数LightOneLed(Scond % 12);}i f(second>=60){minute++; //秒大于60时分加1second=0;if(minute>=60){minute=0;hour++; //分大于60时时加1if(hour>=24){hour=0;day++; //时大于24时天加1temp=Count_Day(month);if(day>=temp){day=1;month++; //天大于当前月份的天数时月加1if(month>=13){month=1;year++; //月大于12时年加1}}}}}}//…………………计算当前月的天数……………………//int Count_Day(int month){i nt day;i f((month==4)||(month==6)||(month==9)||(month==11))//4,6,9,11月为30天day=30;e lse if(month==2){if((year%4==0&&year%100==0)||(year%400==0))day=29; //闰年2月29天elseday=28; //平年2月28天}e lseday=31; //1,3,5,7,8,10,12月为31天r eturn (day);}//………………倒计时函数.............//void Show_Time(){p okew(0xFA40,0x00);p okew(0xFA42,0x00);p okew(0XFA48,buffs[1]); //在lcd右边显示1p okew(0XFA4A,buffs[0]); //在lcd右边显示0p okew(0XFA44,buffm[1]); //在lcd右边显示1p okew(0XFA46,buffm[0]); //在lcd右边显示0p okew(0xFA4C,0x00);p okew(0xFA4E,0x00);D elay(100);}//………………………………日期显示函数……………………// void Display_Date(){b uffm[0]|=0x0800;p okew(0xFA40,buffyear[3]); //显示年p okew(0xFA42,buffyear[2]);p okew(0xFA44,buffyear[1]);p okew(0xFA46,buffyear[0]);p okew(0xFA48,buffmonth[1]); //显示月p okew(0xFA4A,buffmonth[0]);p okew(0xFA4C,buffday[1]); //显示日p okew(0xFA4E,buffday[0]);t emp1=0;}//………………………………时间显示函数……………………// void Display_Time(){p okew(0xFA40,0x00);p okew(0xFA42,0x00);p okew(0xFA44,buffh[1]); //显示时p okew(0xFA46,buffh[0]);p okew(0xFA48,buffm[1]); //显示分p okew(0xFA4A,buffm[0]);p okew(0xFA4C,buffs[1]); //显示秒p okew(0xFA4E,buffs[0]);}//………………………………设定时间函数……………………// void Set_D_T(){i nt lcd_addr;l cd_addr = 0xFA40;s witch(i){case 1:pokew(lcd_addr,buffyear[3]); //时间年pokew(lcd_addr+2,buffyear[2]);pokew(lcd_addr+4,buffyear[1]);pokew(lcd_addr+6,buffyear[0]);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 2:pokew(lcd_addr,0x00);pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,0x00);pokew(lcd_addr+6,0x00);pokew(lcd_addr+8,buffmonth[1]); //时间月pokew(lcd_addr+10,buffmonth[0]);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 3:pokew(lcd_addr,0x00);pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,0x00);pokew(lcd_addr+6,0x00);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,buffday[1]); //时间日pokew(lcd_addr+14,buffday[0]);break;case 4:pokew(lcd_addr,0x00);pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,buffh[1]); //时间时pokew(lcd_addr+6,buffh[0]);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 5:pokew(0xFA40,0x00);pokew(0xFA42,0x00);pokew(0xFA44,0x00);pokew(0xFA46,0x00);pokew(0xFA48,buffm[1]); //时间分pokew(0xFA4A,buffm[0]);pokew(0xFA4C,0x00);pokew(0xFA4E,0x00);break;case 6:pokew(0xFA40,0xd1);pokew(0xFA42,0xd0);pokew(0xFA44,0xd7);pokew(0xFA46,0xd1);pokew(0xFA48,0x50);pokew(0xFA4A,0x56);pokew(0xFA4C,buffch[1]); //闹钟时pokew(0xFA4E,buffch[0]);break;case 7:pokew(0xFA40,0xd1);pokew(0xFA42,0xd0);pokew(0xFA44,0xd7);pokew(0xFA46,0xd1);pokew(0xFA48,0x50);pokew(0xFA4A,0x00);pokew(0xFA4C,buffcm[1]); //闹钟分pokew(0xFA4E,buffcm[0]);break;default:break;}}//…………………………切换时间函数……………………// void d_c_inter(){D I(); //关中断i++;i f(i>7) //切换标志>7,i=1,否则i++i=1;E I(); //开中断}//…………………………调整时间加函数……………………// void UpNum(){s witch(i){case 1:year++;case 2:month++;if(month > 12){month = 1;}break;case 3:temp = Count_Day(month);day++;if(temp < day)day = 1;break;case 4:hour++;if(hour > 23)hour = 1;break;case 5:minute++;if(minute > 59)minute = 0;break;case 6:c_hour++;if(c_hour > 23)c_hour = 1;break;case 7:c_minute++;if(c_minute > 59)c_minute = 0;break;default:break;}}//…………………………调整时间减函数……………………//void DownNum(){s witch(i){case 1:year--;case 2:month--;if(month < 1){month = 12;}break;case 3:temp = Count_Day(month);day--;if(day < 1)day = temp;break;case 4:hour--;if(hour < 1)hour = 23;break;case 5:minute--;if(minute < 0)minute = 59;break;case 6:c_hour--;if(c_hour < 1)c_hour = 23;break;case 7:c_minute--;if(c_minute < 0)c_minute = 59;break;default:break;}}//………………………闹铃以及小灯函数……………………//void noise(){i f(c_hour == hour && c_minute == minute && Que == 1){ //闹铃的时,分与系统时,分相等,并且闹钟标志开启CKS=0XE0; //开启蜂鸣器输出,输出频率为0.98khz的音频Time1(); //调用时间函数}}//…………………………显示缓存区刷新时间函数……………………//void Freshddisplaybuffer(){b uffs[1]=LCD_num[second/10];//秒的显示码放入秒的数码显示缓存区b uffs[0]=LCD_num[second%10];b uffm[1]=LCD_num[minute/10];//分的显示码放入分的数码显示缓存区b uffm[0]=LCD_num[minute%10];b uffm[0]|=0x0800; //分的后面显示一个"."b uffh[1]=LCD_num[hour/10]; //时的显示码放入时的数码显示缓存区b uffh[0]=LCD_num[hour%10];b uffh[0]|=0x0800; //时的后面显示一个"."b uffday[1]=LCD_num[day/10]; //天的显示码放入天的数码显示缓存区b uffday[0]=LCD_num[day%10];b uffmonth[1]=LCD_num[month/10];//月的显示码放入月的数码显示缓存区b uffmonth[0]=LCD_num[month%10];b uffmonth[0]|=0x0800; //月的后面显示一个"."b uffyear[3]=LCD_num[year/100/10];//年的显示码放入年的数码显示缓存区b uffyear[2]=LCD_num[(year/100)%10];b uffyear[1]=LCD_num[(year%100)/10];b uffyear[0]=LCD_num[(year%100)%10];b uffyear[0]|=0x0800; //年的后面显示一个"."b uffmd[3]=LCD_num[month/10];//月,天的显示码放入月,天的数码显示缓存区b uffmd[2]=LCD_num[month%10];b uffmd[2]|=0x0800; //月,天后显示一个"."b uffmd[1]=LCD_num[day/10];b uffmd[0]=LCD_num[day%10];b uffhm[3]=LCD_num[hour/10];//时,分的显示码放入时,分的数码显示缓存区b uffhm[2]=LCD_num[hour%10];b uffhm[2]|=0x0800; //时,分的后显示一个"."b uffhm[1]=LCD_num[minute/10];b uffhm[0]=LCD_num[minute%10];b uffms[3]=LCD_num[minute/10];//分,秒的显示码放入分,秒的数码显示缓存区b uffms[2]=LCD_num[minute%10];b uffms[2]|=0x0800; //分,秒的后显示一个"."b uffms[1]=LCD_num[second/10];b uffms[0]=LCD_num[second%10];b uffch[1]=LCD_num[c_hour/10];//闹钟时的显示码放入闹钟时的数码显示缓存区b uffch[0]=LCD_num[c_hour%10];b uffcm[1]=LCD_num[c_minute/10];//闹钟分的显示码放入闹钟分的数码显示缓存区b uffcm[0]=LCD_num[c_minute%10];}//………………主函数……………………//void main(){D I(); //关中断P M3.4 = 0; //P3.3,P3.4端口设置为输出模式P3.4 = 1; //led灯初始化为点亮状态P M3.3 = 0;P3.3 = 0;B ZOE = 0; //蜂鸣器初始化为熄灭I nit_Lcd(); //初始化lcdI nit_Led(); //初始化ledI nitKey_INTKR(); //初始化按键E I(); //开中断I nit_Inter(); //初始化中断w hile(1){T ime1(); //调用计算时间函数n oise(); //调用闹钟函数s witch(key){case 0: //没有按键执行Freshddisplaybuffer(); //调用刷新函数Time1(); //计算时间Show_Time(); //调用显示时间函数Show_Time();break;case 1: //按键1执行Time1(); //计算时间Freshddisplaybuffer(); //调用刷新函数Display_Date(); //调用显示日期函数noise(); //调用闹钟函数break;case 2: //按键2执行Time1(); //计算时间Freshddisplaybuffer(); //调用刷新函数Display_Time(); //调用时间显示函数noise(); //调用闹钟函数break;case 3: //按键3执行d_c_inter(); //调用时间切换函数Freshddisplaybuffer(); //调用刷新函数Set_D_T(); //调用时间设置函数noise(); //调用闹钟函数key=7;break;case 4: //按键4执行UpNum(); //调用时间加函数Freshddisplaybuffer(); //调用刷新函数Set_D_T(); //调用时间设置函数noise(); //调用闹钟函数key=7;break;case 5: //按键5执行DownNum(); //调用时间减函数Freshddisplaybuffer(); //调用刷新函数Set_D_T(); //调用时间设置函数noise(); //调用闹钟函数key=7;break;case 6: //按键6执行key = 0;if(i > 5) //判断是否确认Que = 1;i = 0;noise(); //调用闹钟函数case 7: //虚拟按键7 Time1();Freshddisplaybuffer(); //调用刷新函数Set_D_T(); //调用时间设置函数noise(); //调用闹钟函数break;}}}。
实时时钟实验总结
实时时钟实验总结一、实验目的本实验的主要目的是了解实时时钟的原理及其应用,掌握实时时钟的使用方法,以及通过实验学习如何编写驱动程序。
二、实验原理1. 实时时钟是一种能够提供时间和日期信息的芯片,它通常由一个晶体振荡器和一组计数器组成。
2. 实时时钟可以通过I2C总线与处理器进行通信,读取或设置时间和日期信息。
3. 实现实时时钟需要编写相应的驱动程序,并将其与操作系统进行集成。
三、实验设备与材料1. 实验板:STM32F407ZET6开发板;2. 模块:DS1307实时时钟模块;3. 软件:Keil uVision5开发环境。
四、实验内容1. 硬件连接:将DS1307模块与STM32F407ZET6开发板连接,包括SDA、SCL、VCC和GND等引脚。
2. 编写驱动程序:根据DS1307模块手册编写相应的驱动程序,并将其集成到操作系统中。
3. 测试程序:编写测试程序,通过读取DS1307模块返回的时间和日期信息来验证驱动程序是否正常工作。
五、实验步骤1. 连接硬件:将DS1307模块与STM32F407ZET6开发板连接。
2. 编写驱动程序:根据DS1307模块手册编写相应的驱动程序,并将其集成到操作系统中。
3. 编写测试程序:编写测试程序,通过读取DS1307模块返回的时间和日期信息来验证驱动程序是否正常工作。
4. 下载程序:使用Keil uVision5开发环境将编写好的程序下载到STM32F407ZET6开发板上。
5. 运行测试:启动STM32F407ZET6开发板,通过串口助手等工具查看DS1307模块返回的时间和日期信息,验证驱动程序是否正常工作。
六、实验结果经过测试,实时时钟模块能够正确返回当前时间和日期信息,并且能够根据需要进行设置和调整。
七、实验总结本次实验通过对实时时钟原理的学习以及编写驱动程序和测试程序的练习,加深了对嵌入式系统中硬件与软件协同工作的理解。
同时也掌握了一些基本的嵌入式系统开发技能,如硬件连接、驱动编写、调试等。
大学数字钟实训报告
一、摘要本次实训旨在通过设计和制作一个数字时钟,加深对数字电子技术理论知识的理解,提高动手实践能力。
在实训过程中,我们学习了数字钟的原理、电路设计、元件选择、焊接调试等技能。
最终,我们成功制作出了一个具有时、分、秒显示功能的数字时钟,并通过实际运行验证了其功能。
二、实训目的1. 掌握数字电子钟的原理和设计方法。
2. 熟悉常用数字电路元件的功能和特性。
3. 提高动手实践能力,培养创新意识。
4. 增强团队协作精神,提高沟通能力。
三、实训内容1. 数字钟原理数字钟是一种将时间信息转换为数字信号,并通过数码管显示的电子计时设备。
其基本原理是利用石英晶体振荡器产生稳定的时钟信号,通过计数器进行计数,并通过译码器和数码管显示时间。
2. 电路设计本次实训采用以下电路设计:(1)时钟信号产生:利用555定时器产生1Hz的时钟信号。
(2)秒计数器:采用CD4060计数器,实现秒的计数。
(3)分计数器:采用CD4518计数器,实现分的计数。
(4)时计数器:采用CD4518计数器,实现时的计数。
(5)译码器:采用CD4511译码器,将计数器的输出信号转换为数码管所需的信号。
(6)数码管显示:采用共阴极七段数码管,显示时、分、秒。
3. 元件选择本次实训选用的元件如下:(1)时钟信号产生:555定时器、电阻、电容。
(2)计数器:CD4060、CD4518。
(3)译码器:CD4511。
(4)数码管显示:共阴极七段数码管。
(5)其他元件:电阻、电容、电位器、晶体管、开关等。
4. 焊接调试(1)按照电路图进行元件焊接。
(2)检查电路连接是否正确,并进行初步调试。
(3)调整电位器,使数码管显示正确的时间。
(4)测试电路功能,确保时、分、秒显示准确。
四、实训总结1. 通过本次实训,我们掌握了数字电子钟的原理和设计方法,熟悉了常用数字电路元件的功能和特性。
2. 在实训过程中,我们提高了动手实践能力,培养了创新意识。
3. 团队协作精神得到了加强,沟通能力得到提高。
实时时钟实验报告
四川大学网络教育学院专业课课程设计题目办学学院四川大学电气信息学院学习中心黔江奥鹏专业层次专升本年级0903学生姓名石胜良学号aDH1091g10322010年7 月15 日四川大学网络教育学院实验报告实验名称: 实时时钟实验学习中心姓名学号实验内容:根1、实验题目分析1.1 问题描述结合实时时钟,IIC(控制小键盘和数码管等)来做具备定期功能的实时时钟。
1.2功能分析至少完成以下功能:(1)能显示每秒的时刻(2)按下功能键能切换显示日期(3)能设置定时闹钟,定时到产生某种输出(4)可以扩展考虑加入外部中断,如停止闹钟功能等。
1.3 开发平台及工具介绍实验器材有:CITK2410开发板,JTAG连接线,RS-232直通连接线RVDS集成开发环境,超级终端工具,2、实验概要设计2.1 实验基本原理IIC总线:IIC总线的器件分为主器件和从器件。
主器件的功能是启动在总线上传送数据,并产生时钟脉冲,以允许与被寻址的器件进行数据传送。
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
超始和停止信号图数据传送时序图IIC总线(IICSDA、IICSCL)经过VDD33的上拉后,进入ZLG7290数码管:实验使用的数码管是广州周立公司单片机发展有限公司自行设计的一款数码管显示驱动及键盘扫描管理芯片。
下面是介绍该数码管的特点还有电路图:1 I2C 串行接口提供键盘中断信号方便与处理器接口2 可驱动8 位共阴数码管或64 只独立LED 和64 个按键3 可控扫描位数可控任一数码管闪烁4 提供数据译码和循环移位段寻址等控制5 8 个功能键可检测任一键的连击次数6 无需外接元件即直接驱LED 可扩展驱动电流和驱动电压7 提供工业级器件多种封装形式PDIP24 SO24采用24 引脚封装引脚图如图所示其引脚功能分述如下:实时时钟(Real Time Clock):2410提供了一个实时时钟,该时钟使用独立的一路1.8V 供电,保证主电源切断时能正常维持RTC工作。
时钟实验报告分析
一、实验背景随着科技的发展,时钟作为日常生活中不可或缺的设备,其设计和应用越来越受到重视。
本实验报告旨在分析时钟实验,探讨时钟的设计原理、实现方法以及在实际应用中的优势。
二、实验目的1. 了解时钟的设计原理和实现方法;2. 掌握时钟的编程技巧;3. 分析时钟在实际应用中的优势;4. 提高学生的实践能力和创新意识。
三、实验内容1. 时钟设计原理时钟的设计主要分为硬件设计和软件设计两部分。
(1)硬件设计:时钟硬件主要包括晶振、计数器、译码器、显示器等。
晶振产生稳定的时钟信号,计数器用于计数,译码器将计数结果转换为对应的显示信号,显示器用于显示时间。
(2)软件设计:时钟软件主要实现以下功能:① 初始化:设置时钟的初始时间,包括年、月、日、时、分、秒等;② 计时:根据晶振信号,对时钟进行计时;③ 显示:将计时结果通过译码器转换为对应的显示信号,显示在显示器上;④ 调整:允许用户通过按键调整时钟时间。
2. 时钟实现方法(1)基于单片机的时钟实现:利用单片机的定时器/计数器功能,实现时钟的计时和显示。
通过编写程序,控制单片机的定时器/计数器,达到计时目的。
(2)基于PC机的时钟实现:利用PC机的操作系统和编程语言,实现时钟的计时和显示。
通过编写程序,控制PC机的计时器,实现时钟的计时和显示。
3. 时钟实验步骤(1)搭建实验平台:根据实验要求,搭建实验电路,包括晶振、计数器、译码器、显示器等。
(2)编写程序:根据实验要求,编写时钟程序,实现时钟的计时、显示和调整功能。
(3)调试程序:通过实验仪器和软件,对程序进行调试,确保时钟的正常运行。
(4)实验结果分析:对实验结果进行分析,验证时钟功能的实现。
四、实验结果与分析1. 实验结果(1)时钟能够实现计时、显示和调整功能;(2)时钟计时准确,显示效果良好;(3)时钟调整方便,用户可随时调整时间。
2. 实验分析(1)时钟设计原理合理,实现方法可行;(2)编程技巧熟练,程序结构清晰;(3)实验过程严谨,实验结果可靠。
实时时钟设计报告分解
《单片机系统设计》(课程设计)实验报告题目:实时时钟组号:任课教师:组长:成员:联系方式:年月日目录一、实施方案 11.1设计要求 11.2实现功能 11.3设计方案 1二、原理简述 22.1主控模块 22.2时钟电路 3 2.3显示电路 5 2.4键盘输入电路 72.5蜂鸣器电路 8三、调试过程 93.1硬件调试 93.2软件调试 9四、主要程序 10五、心得体会 12一、实施方案1.设计要求通过对DS1302编程,实现实时时钟功能,用数码管显示时、分,用小数点作秒闪。
可用键盘设置时间。
2.实现功能本组的课程设计成果最终将实现如下功能:(1)实现实时时钟功能,四位数码管前两位显示时、后两位显示分,小数点作秒闪;(2)按下S8键,可实现对小时的加1设置;(3)按下S7键,可实现对分钟的加1设置;(4)按下S1键,可实现小时的单独显示;(5)实现整点蜂鸣器报时功能。
3.设计方案根据系统设计的功能的要求,初步确定设计系统由主控模块、时钟电路、显示电路、键盘输入电路及蜂鸣器电路组成。
电路系统框图如图1所示。
图1 系统设计框图其中,主控芯片使用51系列AT89C52单片机,时钟芯片使用DS1302,晶振为11.0592MHz,显示电路由四位共阳LED数码管完成,键盘采用线性连接,使用查询法实现调整功能,蜂鸣器电路由有源蜂鸣器完成。
二、原理简述1.主控模块图2 AT89C52 管脚图AT89C52是低功耗、高性能的CMOS8位单片机。
片内带有8KB的Flash 存储器,且允许在系统内改写或用编程器编程。
另外,AT89C52的指令系统和引脚与80C52完全兼容。
管脚功能如下:VCC:供电电压;GND:接地;P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
;P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流;P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL 门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
实时时钟设计实验报告
实验报告/ 115/ 215/ 3154 / 15源代码:#pragma sfr //使用特殊功能寄存器#pragma EI //开中断#pragma DI //关中断#pragma access //使用绝对地址指令#pragma interrupt INTTM000 Time //定义时间中断函数为Time#pragma interrupt INTKR OnKeyPress //定义按键中断为OnKeyPress #pragma interrupt INTP5 OnKeyOver //定义INT中断为OnKeyOvervoid Init_Led();void InitKey_INTKR(); void Init_Lcd();void Init_Inter();void LightOneLed(unsigned char ucNum);void LightOff();int Count_Day(int month);char i=0; //定义变量i,是切换时间的标志int key=0; //定义key=0int temp=1; //用于存放当前月的天数int temp1=1;int second=0; //默认的秒second=0int minute=0; //默认的分minute=0int hour=12; //默认的时hour=12int day=1; //默认的天day=1int month=5; //默认的月month=5int year=2014; //默认的年year=2014int c_hour=1; //默认的闹钟时=1int c_minute=1; //默认的闹钟分=1int buffs[2]; //秒的数码显示缓存区int buffm[2]; //分的数码显示缓存区int buffh[2]; //时的数码显示缓存区int buffday[2]; //天的数码显示缓存区int buffmonth[2]; //月的数码显示缓存区int buffyear[4]; //年的数码显示缓存区int buffmd[4]; //月,天的数码显示缓存区int buffhm[4]; //时,分的数码显示缓存区int buffms[4]; //分,秒的数码显示缓存区int buffch[2]; //闹钟时的数码显示缓存区int buffcm[2]; //闹钟分的数码显示缓存区unsigned char Que = 0; //INT中断中间变量intLCD_num[10]={0X070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0700,0x070f,0x070 b};//数字0~~9的显示码unsigned char Scond;//…………………………延时函数1……………………//void Delay(int k){int i,j;for(i=0;i<k;i++){for(j=0;j<k;j++){5 / 15}} }//………………………初始化Led函数……………………//void Init_Led(){PM13=0XF0; //端口13的第四位为输出模式PM14=0XF0; //端口14的第四位为输出模式PM15=0XF0; //端口15的第四位为输出模式}//……………………………按键中断函数……………………//void InitKey_INTKR(){PM4 = 0x3F; //P4的六个端口设置为输入模式PU4 = 0x3F; //接通上拉电阻KRM = 0x3F; //允许六个按键中断KRMK = 0;PM3.0 = 1;PU3.0 = 1; EGP.5 = 1;PMK5 = 0;PPR5 = 0;KRPR = 1;}//……………初始化lcd函数……………………//void Init_Lcd(){PFALL=0x0F; //所有接lcd引脚指定为lcd引脚LCDC0=0x34; //设置原时钟和时钟频率LCDMD=0x30; //设置lcd电压为3/5电压LCDM=0xC0; //4分时1/3偏压模式}//………………初始化定时器Inter函数……………………// void Init_Inter(){CRC00.0=0; //CR000为比较寄存器PRM00=0X04; //计数时钟为fprs/2^8CR000=0X7FFF;//时间间隔为1sTMMK010=1; //TMMK010中断屏蔽TMMK000=0; //TMMK000中断允许TMC00=0X0C; //TM00和CR000相等时进入清零&启动模式}void Time(){second++;}//……………………………按键中断函数……………………// void OnKeyPress(){DI();switch(P4&0x3F) //判断哪个按键按下{case 0x3e:6 / 15key=1; //按键key1按下break;case 0x3d:key=2; //按键key2按下break;case 0x3b:key=3; //按键key3按下break; case 0x37:key=4; //按键key4按下break;case 0x2f:key=5; //按键key5按下break; case 0x1f:key=7; //按键key6按下break; default:break;}EI();}//……………………………INT按键中断函数……………………//void OnKeyOver(){DI();Que = 0; //判断Que是否为0BZOE = 0; //蜂鸣器关闭EI();}//………………………Led小灯函数……………………//void LightOneLed(unsigned char ucNum){switch(ucNum){ //检测变量ucNumcase 0: case 1:case 2:case 3:P13 |= (unsigned char) 1 << (ucNum);//如果为0到3中的一个值则让LED1到LED4中的一个亮break;case 4:case 5:case 6:case 7: P14 |= (unsigned char) 1 << (ucNum - 4);//如果为4到7中的一个值则让LED5到LED8中的一个亮break;case 8: case 9:case 10:case 11:P15 |= (unsigned char) 1 << (ucNum - 8);//如果为8到11中的一个值则让LED9到LED12中的一个亮break;default:break;7 / 15}}//………………………Led小灯熄灭函数……………………//void LightOff(){P13 = 0; P14 = 0;P15 = 0;//……………………时间函数……………………//void Time1(){if((second % 5) == 0){ //秒大于5变为0Scond = second / 5 + 1;LightOff(); //调用小灯亮函数LightOneLed(Scond % 12);} if(second>=60){minute++; //秒大于60时分加1second=0; if(minute>=60){minute=0;hour++; //分大于60时时加1if(hour>=24){ hour=0;day++; //时大于24时天加1temp=Count_Day(month); if(day>=temp){day=1;month++; //天大于当前月份的天数时月加1if(month>=13){ month=1;year++; //月大于12时年加1} }}}}}//…………………计算当前月的天数……………………//int Count_Day(int month){int day;if((month==4)||(month==6)||(month==9)||(month==11))//4,6,9,11月为30天day=30;else if(month==2){if((year%4==0&&year_x0010_0==0)||(year@0==0))day=29; //闰年2月29天elseday=28; //平年2月28天}elseday=31; //1,3,5,7,8,10,12月为31天return (day);}8 / 15//………………倒计时函数.............//void Show_Time(){pokew(0xFA40,0x00);pokew(0xFA42,0x00);pokew(0XFA48,buffs[1]); //在lcd右边显示1pokew(0XFA4A,buffs[0]); //在lcd右边显示0pokew(0XFA44,buffm[1]); //在lcd右边显示1 pokew(0XFA46,buffm[0]); //在lcd右边显示0pokew(0xFA4C,0x00); pokew(0xFA4E,0x00);Delay(100);}//………………………………日期显示函数……………………// void Display_Date(){buffm[0]|=0x0800;pokew(0xFA40,buffyear[3]); //显示年pokew(0xFA42,buffyear[2]);pokew(0xFA44,buffyear[1]);pokew(0xFA46,buffyear[0]);pokew(0xFA48,buffmonth[1]); //显示月pokew(0xFA4A,buffmonth[0]);pokew(0xFA4C,buffday[1]); //显示日pokew(0xFA4E,buffday[0]);temp1=0;}//………………………………时间显示函数……………………// void Display_Time(){pokew(0xFA40,0x00);pokew(0xFA42,0x00);pokew(0xFA44,buffh[1]); //显示时pokew(0xFA46,buffh[0]);pokew(0xFA48,buffm[1]); //显示分pokew(0xFA4A,buffm[0]);pokew(0xFA4C,buffs[1]); //显示秒pokew(0xFA4E,buffs[0]);}//………………………………设定时间函数……………………// void Set_D_T(){int lcd_addr;lcd_addr = 0xFA40;switch(i){pokew(lcd_addr,buffyear[3]); //时间年pokew(lcd_addr+2,buffyear[2]);pokew(lcd_addr+4,buffyear[1]);pokew(lcd_addr+6,buffyear[0]);pokew(lcd_addr+8,0x00); pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 2: pokew(lcd_addr,0x00);9 / 15pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,0x00); pokew(lcd_addr+6,0x00);pokew(lcd_addr+8,buffmonth[1]); //时间月pokew(lcd_addr+10,buffmonth[0]);pokew(lcd_addr+12,0x00); pokew(lcd_addr+14,0x00);break;case 3:pokew(lcd_addr,0x00);pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,0x00); pokew(lcd_addr+6,0x00);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);时间日pokew(lcd_addr+12,buffday[1]); // pokew(lcd_addr+14,buffday[0]); break;case 4:pokew(lcd_addr,0x00);pokew(lcd_addr+2,0x00);// 时间时pokew(lcd_addr+4,buffh[1]);pokew(lcd_addr+6,buffh[0]);pokew(lcd_addr+8,0x00); pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 5:pokew(0xFA40,0x00);pokew(0xFA42,0x00); pokew(0xFA44,0x00);pokew(0xFA46,0x00);时间分// pokew(0xFA48,buffm[1]);pokew(0xFA4A,buffm[0]);pokew(0xFA4C,0x00);pokew(0xFA4E,0x00);break;pokew(0xFA40,0xd1); pokew(0xFA42,0xd0);pokew(0xFA44,0xd7);pokew(0xFA46,0xd1);pokew(0xFA48,0x50);pokew(0xFA4A,0x56);闹钟时// pokew(0xFA4C,buffch[1]);pokew(0xFA4E,buffch[0]);break;case 7: pokew(0xFA40,0xd1);pokew(0xFA42,0xd0);pokew(0xFA44,0xd7);pokew(0xFA46,0xd1);pokew(0xFA48,0x50);pokew(0xFA4A,0x00);闹钟分// pokew(0xFA4C,buffcm[1]);pokew(0xFA4E,buffcm[0]);break;10 / 15default:break; }}//…………………………切换时间函数……………………// void d_c_inter(){DI(); //关中断i++;if(i>7) //切换标志>7,i=1,否则i++i=1;EI(); //开中断}//…………………………调整时间加函数……………………// void UpNum(){switch(i){case 1:year++; case 2:month++;if(month > 12){month = 1;}break; case 3:temp = Count_Day(month);day++;if(temp < day)day = 1; break;case 4:hour++;if(hour > 23)hour = 1;break;case 5: minute++;if(minute > 59)minute = 0;break;case 6:c_hour++; if(c_hour > 23)c_hour = 1;break;case 7: c_minute++;if(c_minute > 59)c_minute = 0;break;default:break; }}11 / 15//…………………………调整时间减函数……………………// void DownNum(){switch(i){case 1:year--;case 2: month--;if(month < 1){month = 12;}break;case 3: temp = Count_Day(month);day--;if(day < 1)day = temp;break;case 4: hour--;if(hour < 1)hour = 23;break;case 5: minute--;if(minute < 0)minute = 59;break;case 6:c_hour--;if(c_hour < 1) c_hour = 23;break;case 7:c_minute--;if(c_minute < 0) c_minute = 59;break;default:break;} }//………………………闹铃以及小灯函数……………………//void noise(){if(c_hour == hour && c_minute == minute && Que == 1){ //闹铃的时,分与系统时,分相等,并且闹钟标志开启CKS=0XE0; //开启蜂鸣器输出,输出频率为0.98khz的音频Time1(); //调用时间函数}}//…………………………显示缓存区刷新时间函数……………………//void Freshddisplaybuffer(){buffs[1]=LCD_num[second/10];//秒的显示码放入秒的数码显示缓存区12 / 15buffs[0]=LCD_num[second_x0010_];buffm[1]=LCD_num[minute/10];//分的显示码放入分的数码显示缓存区buffm[0]=LCD_num[minute_x0010_];buffm[0]|=0x0800; //分的后面显示一个.buffh[1]=LCD_num[hour/10]; //时的显示码放入时的数码显示缓存区buffh[0]=LCD_num[hour_x0010_];buffh[0]|=0x0800; //时的后面显示一个.buffday[1]=LCD_num[day/10]; //天的显示码放入天的数码显示缓存区buffday[0]=LCD_num[day_x0010_];buffmonth[1]=LCD_num[month/10];//月的显示码放入月的数码显示缓存区buffmonth[0]=LCD_num[month_x0010_];buffmonth[0]|=0x0800; //月的后面显示一个.buffyear[3]=LCD_num[year/100/10];//年的显示码放入年的数码显示缓存区buffyear[2]=LCD_num[(year/100)_x0010_];buffyear[1]=LCD_num[(year_x0010_0)/10];buffyear[0]=LCD_num[(year_x0010_0)_x0010_];buffyear[0]|=0x0800; //年的后面显示一个.buffmd[3]=LCD_num[month/10];//月,天的显示码放入月,天的数码显示缓存区buffmd[2]=LCD_num[month_x0010_];buffmd[2]|=0x0800; //月,天后显示一个.buffmd[1]=LCD_num[day/10];buffmd[0]=LCD_num[day_x0010_];buffhm[3]=LCD_num[hour/10];//时,分的显示码放入时,分的数码显示缓存区buffhm[2]=LCD_num[hour_x0010_];buffhm[2]|=0x0800; //时,分的后显示一个.buffhm[1]=LCD_num[minute/10];buffhm[0]=LCD_num[minute_x0010_];buffms[3]=LCD_num[minute/10];//分,秒的显示码放入分,秒的数码显示缓存区buffms[2]=LCD_num[minute_x0010_];buffms[2]|=0x0800; //分,秒的后显示一个.buffms[1]=LCD_num[second/10];buffms[0]=LCD_num[second_x0010_];buffch[1]=LCD_num[c_hour/10];//闹钟时的显示码放入闹钟时的数码显示缓存区buffch[0]=LCD_num[c_hour_x0010_];buffcm[1]=LCD_num[c_minute/10];//闹钟分的显示码放入闹钟分的数码显示缓存区buffcm[0]=LCD_num[c_minute_x0010_];}//………………主函数……………………//void main(){DI(); //关中断PM3.4 = 0; //P3.3,P3.4端口设置为输出模式P3.4 = 1; //led灯初始化为点亮状态PM3.3 = 0;P3.3 = 0;BZOE = 0; //蜂鸣器初始化为熄灭Init_Lcd(); //初始化lcdInit_Led(); //初始化ledInitKey_INTKR(); //初始化按键EI(); //开中断Init_Inter(); //初始化中断13 / 15while(1){Time1(); //调用计算时间函数noise(); //调用闹钟函数switch(key){case 0: //没有按键执行Freshddisplaybuffer(); //调用刷新函数Time1(); //计算时间Show_Time(); //调用显示时间函数Show_Time();break;case 1: //按键1执行Time1(); //计算时间调用刷新函数// Freshddisplaybuffer();//调用显示日期函数Display_Date();noise(); //调用闹钟函数break;//按键2执行case 2://计算时间Time1();//调用刷新函数Freshddisplaybuffer();Display_Time(); //调用时间显示函数//调用闹钟函数noise();break;case 3: //按键3执行d_c_inter(); //调用时间切换函数调用刷新函数Freshddisplaybuffer(); //Set_D_T(); //调用时间设置函数调用闹钟函数noise();//key=7;break;4执行按键case 4: // UpNum(); //调用时间加函数Freshddisplaybuffer(); //调用刷新函数Set_D_T(); 调用时间设置函数//// 调用闹钟函数noise();key=7; break;case 5: 5按键执行//DownNum(); 调用时间减函数// Freshddisplaybuffer(); //调用刷新函数// Set_D_T(); 调用时间设置函数// 调用闹钟函数noise();key=7;break;执行按键case 6: //6key = 0;判断是否确认if(i > 5) //Que = 1;i = 0;noise(); // 调用闹钟函数case 7: 7 虚拟按键// Time1();调用刷新函数Freshddisplaybuffer(); //Set_D_T(); // 调用时间设置函数/ 1415noise(); //调用闹钟函数break;}}}15 / 15。
数字时钟时实习报告
一、实习背景随着科技的不断发展,电子技术在各个领域得到了广泛应用。
数字时钟作为一种常见的电子设备,在日常生活中具有很高的实用价值。
为了提高自身实践能力,我参加了数字时钟的实习课程,通过实际操作,了解了数字时钟的设计原理和制作方法。
二、实习目的1. 掌握数字时钟的基本原理和设计方法。
2. 提高电子制作和调试技能。
3. 培养团队合作精神,提高沟通能力。
三、实习内容1. 数字时钟的组成数字时钟主要由以下几个部分组成:(1)振荡器:产生时钟信号,为时钟电路提供稳定的时钟源。
(2)分频器:将振荡器产生的时钟信号分频,得到秒脉冲信号。
(3)计数器:对秒脉冲信号进行计数,得到时、分、秒的数值。
(4)译码器:将计数器输出的数值转换为七段数码管显示的信号。
(5)显示器:将译码器输出的信号转换为可视的数字显示。
2. 数字时钟的设计与制作(1)设计要求根据实习要求,设计的数字时钟应具备以下功能:1)显示时、分、秒;2)采用BCD码形式输出;3)具有时钟调整功能;4)具有闹钟功能。
(2)设计步骤1)选择合适的电子元件,如振荡器、分频器、计数器、译码器、显示器等。
2)绘制电路原理图,确定各元件的连接方式。
3)根据原理图,进行PCB板设计,布局和布线。
4)制作PCB板,焊接元件。
5)调试电路,确保时钟功能正常。
6)测试闹钟功能,确保其准确性。
3. 实习过程在实习过程中,我们首先了解了数字时钟的基本原理,然后根据设计要求,选择合适的电子元件。
在绘制电路原理图时,我们严格按照设计要求进行,确保电路的稳定性和可靠性。
在PCB板设计过程中,我们注重布局和布线,力求提高电路的散热性能和抗干扰能力。
在焊接过程中,我们遵循焊接规范,确保焊接质量。
最后,我们对电路进行调试和测试,确保时钟功能正常。
四、实习成果通过本次实习,我们成功制作了一台具有时、分、秒显示和闹钟功能的数字时钟。
在实习过程中,我们不仅掌握了数字时钟的设计原理和制作方法,还提高了电子制作和调试技能。
实时钟实验报告小结
实时钟实验报告小结实验目标和要求实时钟实验的目标是设计并实现一个能够显示当前时间的实时钟系统。
要求能够使用外部振荡器作为时钟源,实现时钟的计时和显示功能,同时能够通过按键进行时间的设置和调整。
实验过程和方法实验中,我们使用了数码管、按键、外部振荡器和微控制器等硬件组件。
其中,数码管用于显示时间信息,按键用于设置和调整时间,外部振荡器提供时钟信号,微控制器作为控制中心。
在实验过程中,首先进行了硬件的连接。
将数码管的七段显示引脚与微控制器的IO口连接,按键引脚与IO口连接,外部振荡器的时钟引脚连接到微控制器的定时器输入引脚。
根据实验要求,我们使用了定时器/计数器来控制时间的计时和显示。
其次,进行了软件的编写。
使用C语言编写了控制程序,实现了时钟的计时和显示功能。
通过定时器中断的方式,每秒钟触发一次中断,计时器加一,重新更新数码管显示的时间。
通过按键的中断,可以设置和调整时间的小时和分钟。
最后,进行了调试和测试。
将程序烧录到微控制器中,将外部振荡器连接并提供时钟源,随后按下按键进行时间的设置和调整。
观察数码管显示的时间是否正确,确保实时钟系统能够正常运行。
实验结果评价经过实验测试,实时钟系统能够实现预期的功能,能够准确地计时并显示时间。
通过按键的设置和调整功能,时间也能够根据需要进行修改。
在不接通外部振荡器的情况下,实时钟系统会使用内部振荡器提供的时钟信号,确保时钟系统可以继续运行。
然而,在实验过程中也发现了一些问题。
首先是按键的抖动问题,由于按键的机械结构,按键在按下和释放的瞬间会有抖动现象,导致程序可能多次响应按键中断。
为了解决这个问题,需要在程序中增加合适的延时机制。
其次是外部振荡器的稳定性问题。
如果外部振荡器的频率不稳定,会导致计时显示的时间不准确。
因此,在选择外部振荡器时,需要注意其稳定性和精度。
另外,实时钟系统的显示模式也可以进一步优化。
目前,我们使用了数码管来显示时间,但是显示的信息有限。
实时时钟课程设计报告
河海大学计算机与信息学院(常州)课程设计报告题目实时时钟电路设计专业、学号自动化0862510126授课班号275803学生姓名潘增岩同组同学倪舟指导教师奚吉完成时间2010-12-30课程设计(报告)任务书(理工科类)Ⅰ、课程设计(报告)题目:实时时钟电路设计Ⅱ、课程设计(论文)工作内容一、课程设计目标1、培养综合运用知识和独立开展实践创新的能力;2、增强学以致用的思想,提高解决问题的能力和百折不饶的品质。
二、研究方法及手段应用1、将任务分成若干模块,查阅相关论文资料,分模块调试和完成任务;2、数字钟为人们日常生活提供准确时间,并且可以提供定时闹钟,整点报时等。
三、课程设计预期效果1、本次课设统一采用学校实验箱Alter Cyclone EP1C6Q240C8N型号。
2、进度安排①2010.10.27 ——2010.10.28 深入理解课题要求,查询相关的资料。
②2010.10.28 ——2010.10.29 编写各个功能模块并进行相应测试。
③2010.10.29 ——2010.10.30 整体功能的测试,为答辩做相关准备。
④2010.10.30 ——2010.10.31 撰写课程设计论文。
学生姓名:潘增岩专业年级:08自动化摘要Verilog是广泛应用的硬件描述语言,可以用在硬件设计流程的建模、综合和模拟等多个阶段。
随着硬件设计规模的不断扩大,应用硬件描述语言进行描述的CPLD结构,成为设计专用集成电路和其他集成电路的主流。
通过应用Verilog HDL对多功能电子钟的设计,达到对Verilog HDL的理解,同时对CPLD器件进行简要了解。
数字钟是日常生活中随处可见的一种生活用品,市场上出现的数字钟大都非常的花哨,外观很美,而它们实际上都是同一个原理。
数字钟是采用设计数字电路,并显示出时、分、秒,广泛用于个人家庭,车站,学校,医院等公共场所,成为人们日常生活中不可少的必需品。
本次数字钟采用Verilog HDL语言设计一个数字钟电路,并且在8个数码管上显示。
数字时钟设计的实习报告
一、实习背景随着科技的不断发展,数字电子技术在各个领域得到了广泛应用。
数字时钟作为一种常见的电子设备,其设计和制作已成为电子技术专业学生的必备技能。
本实习报告旨在通过设计、制作和调试数字时钟,使学生掌握数字电路的基本原理和实际操作技能。
二、实习目的1. 熟悉数字电路的基本原理和组成;2. 掌握数字时钟的设计方法;3. 学会使用数字电路实验设备;4. 培养学生的动手能力和团队协作精神。
三、实习内容1. 设计要求(1)功能要求:数字时钟应能显示时、分、秒,具有计时、校时和报时功能。
(2)性能要求:计时精度高,显示清晰,操作简便。
(3)硬件要求:使用CMOS或TTL系列中小规模集成电路,如计数器、译码器、显示器等。
2. 设计方案(1)设计逻辑框图:数字时钟主要由晶体振荡器、分频器、计数器、译码器、显示器和校时电路等组成。
(2)硬件电路设计:① 晶体振荡器:采用12MHz石英晶体振荡器,输出1Hz标准信号。
② 分频器:将1Hz信号分频为1s、1min、1h信号。
③ 计数器:分别对1s、1min、1h信号进行计数,实现时、分、秒的计时。
④ 译码器:将计数器的输出信号转换为显示器所需的信号。
⑤ 显示器:采用七段数码显示器,显示时、分、秒。
⑥ 校时电路:通过按键输入校时信号,实现时、分的校准。
(3)软件设计:编写程序,实现数字时钟的功能。
3. 制作与调试(1)制作:根据设计方案,选用合适的元器件,进行电路板焊接和元器件安装。
(2)调试:对电路进行测试,确保各部分功能正常。
调试过程中,注意观察电路状态,及时发现问题并解决。
四、实习成果1. 成功制作了一台具有计时、校时和报时功能的数字时钟。
2. 掌握了数字电路的基本原理和设计方法。
3. 学会了使用数字电路实验设备,提高了动手能力。
4. 培养了团队协作精神。
五、实习心得1. 在设计过程中,要充分了解各个元器件的功能和特性,合理选择元器件。
2. 电路设计要遵循一定的规范,如电路布局、走线等。
实时时钟设计试验报告
实时时钟设计试验报告一、实验目的本实验的目的是设计一个实时时钟系统,具有实时显示时间、日期和闹钟功能。
通过该实验,我们可以了解实时时钟的设计原理、硬件电路连接及软件程序编写方法。
二、实验原理实时时钟系统由时钟芯片、显示模块、按键模块和控制模块组成。
时钟芯片负责计时和日期的记录,显示模块用于显示时间和日期,按键模块用于设置时间和日期,控制模块用于控制各模块之间的协作。
三、实验器材1.STM32开发板2.DS3231时钟模块3.数码管显示模块4.按键模块5.连接线四、实验步骤1.连接硬件电路。
将STM32开发板与DS3231时钟模块、数码管显示模块和按键模块进行连接,确保电路连接正确无误。
2.编写程序。
使用C语言编写程序,通过读取DS3231时钟模块的寄存器获取时间和日期数据,并将其显示在数码管模块上。
同时,设置按键模块的功能,使其可以进行时间和日期的设置。
3.烧录程序。
使用烧录器将编写好的程序烧录到STM32开发板上,并进行调试。
4.运行实验。
接通电源,启动实时时钟系统,观察数码管是否正确显示时间和日期,按下按键模块进行时间和日期的设置,并观察设置是否生效。
五、实验结果经过实验,我们成功设计出了一个实时时钟系统。
系统能够实时地显示当前的时间和日期,并且可以通过按键进行时间和日期的设置。
在设置新的时间和日期后,系统能够正确地更新并显示。
六、实验总结通过本次实验,我们深入地了解了实时时钟系统的设计原理和实现方法。
我们熟悉了DS3231时钟模块的使用方法,并学会了通过C语言编写程序来实现实时时钟系统的功能。
同时,我们也发现了实时时钟系统的一些问题,并加以解决。
我们对实时时钟系统的稳定性和精确性进行了测试,发现系统的计时精度较高,能够达到亚秒级的准确度。
然而,在用户进行时间和日期的设置时,可能由于误操作导致时间和日期出错。
需要在后续的工作中进一步优化系统的操作界面,提高用户设置的便捷性和准确性。
总而言之,实时时钟系统是一种非常有实用价值的设计,可以广泛应用于各种计时需求的场合,如办公室、实验室、车载设备等。
时钟课程设计实验报告
时钟课程设计实验报告一、课程目标知识目标:1. 让学生理解时钟的基本结构,掌握时针、分针、秒针的作用及其相互关系;2. 使学生掌握时间的读法,包括小时、分钟、秒的表示方法;3. 引导学生了解不同类型的时钟,如机械时钟、电子时钟等,以及其工作原理。
技能目标:1. 培养学生运用所学知识,进行时钟读时、计算时间间隔等实际操作能力;2. 提高学生运用绘图、手工制作等技巧,设计和制作创意时钟的能力;3. 培养学生通过合作、探究的方式,解决时钟相关问题。
情感态度价值观目标:1. 培养学生对时间管理的重视,树立珍惜时间的价值观;2. 激发学生对科学知识的好奇心,培养勇于探索、创新的精神;3. 培养学生团队协作意识,学会尊重他人、分享成果。
分析课程性质、学生特点和教学要求,本课程将目标分解为以下具体学习成果:1. 学生能够正确读出时钟显示的时间,并计算出时间间隔;2. 学生能够通过绘图、手工制作等方式,设计并展示创意时钟;3. 学生能够以小组合作形式,探讨时钟的工作原理,解决实际问题;4. 学生能够意识到时间的重要性,养成良好的时间管理习惯。
二、教学内容本课程依据课程目标,选择以下教学内容,确保科学性和系统性:1. 时钟的基本结构- 时针、分针、秒针的作用及其相互关系;- 时钟的表盘布局及数字表示。
2. 时间读法- 小时、分钟、秒的表示方法;- 不同时间段的读法,如:整点、半点、一刻等。
3. 时钟类型及工作原理- 机械时钟的工作原理及特点;- 电子时钟的工作原理及特点;- 其他创意时钟的设计理念。
4. 实践活动- 制作创意时钟,锻炼动手能力;- 小组合作探讨时钟工作原理,培养团队协作能力;- 课堂展示与分享,提高表达和沟通能力。
教学内容安排和进度:第一课时:时钟的基本结构及时钟读法;第二课时:时钟类型及工作原理;第三课时:实践活动——制作创意时钟;第四课时:课堂展示与分享。
教材章节及内容:第一章:时钟的基本概念;第二章:时间的读法及时钟类型;第三章:时钟的制作与设计;第四章:时间的运用与时间管理。
单片机实时时钟实训报告
一、引言随着单片机技术的不断发展,其在各个领域的应用越来越广泛。
实时时钟(Real-Time Clock,RTC)作为一种重要的功能模块,被广泛应用于嵌入式系统中,用于实现时间的记录、显示和控制等功能。
本实训报告以单片机为平台,设计并实现了一个实时时钟系统,旨在巩固和深化单片机相关知识,提高动手实践能力。
二、实训目的1. 理解实时时钟的工作原理和基本概念;2. 掌握单片机与实时时钟芯片的接口连接方法;3. 学会使用实时时钟芯片实现时间记录、显示和控制功能;4. 提高单片机编程能力和嵌入式系统设计能力。
三、实训内容1. 实时时钟芯片介绍本实训采用DS1302实时时钟芯片,该芯片具有以下特点:(1)低功耗设计,适用于电池供电的应用场景;(2)支持闰年、星期和夏令时等功能;(3)具有32.768kHz晶振振荡器,提供精确的时间基准;(4)具有64字节RAM,可用于存储数据。
2. 单片机与DS1302的接口连接本实训选用AT89C51单片机作为控制核心,与DS1302的接口连接如下:(1)VCC:连接单片机的5V电源;(2)GND:连接单片机的地;(3)RST:DS1302复位引脚,连接单片机的P1.0引脚;(4)CE:DS1302片选引脚,连接单片机的P1.1引脚;(5)IO:DS1302数据引脚,连接单片机的P1.2引脚;(6)SQW/OUT:DS1302闹钟输出引脚,连接单片机的P1.3引脚。
3. 实时时钟系统设计(1)时间记录通过DS1302芯片的RAM存储功能,实现时间的记录。
具体操作如下:① 初始化DS1302芯片,设置时间基准;② 设置闰年、星期和夏令时等信息;③ 读取当前时间,并存入单片机的内部RAM。
(2)时间显示使用单片机的并行I/O口,将时间数据输出到LED数码管或LCD液晶显示屏,实现时间显示。
具体操作如下:① 设计显示模块的硬件电路;② 编写显示模块的驱动程序,实现时间数据的读取和显示;③ 通过按键操作,实现时间的切换和调整。
实时时钟实验总结
实时时钟实验总结一、引言实时时钟(Real Time Clock,RTC)是一种能够提供准确时间和日期信息的设备。
在各种应用中,实时时钟都扮演着重要的角色,例如计算机系统中的时间同步、电子设备中的时间戳记录等。
本文将对实时时钟实验进行总结,包括实验目的、实验原理、实验步骤以及实验结果分析等内容。
二、实验目的本实验旨在通过搭建实时时钟电路,并使用相应的程序进行控制,实现对时间和日期的准确显示。
具体目的如下: 1. 理解实时时钟的基本原理和工作方式; 2. 掌握实时时钟电路的搭建方法; 3. 学会使用程序控制实时时钟的功能。
三、实验原理实时时钟电路由晶振、RTC芯片、电池及其他辅助电路组成。
其工作原理如下: 1. 晶振产生基准时钟信号,供RTC芯片使用; 2. RTC芯片通过与晶振的配合,实时计时,并将时间和日期信息存储在相关寄存器中; 3. 电池供电保证RTC芯片在断电情况下仍能持续工作,避免时间和日期信息的丢失。
四、实验步骤1. 准备实验材料和工具•Arduino开发板•DS1302实时时钟模块•面包板•连接线•电池2. 搭建电路按照以下步骤搭建实时时钟电路: 1. 将DS1302模块插入面包板中,确保引脚与面包板上的连接良好; 2. 将Arduino开发板与DS1302模块通过连接线连接起来,注意连接的引脚要与程序中定义的引脚对应; 3. 连接电池到DS1302模块的电池接口上,确保电池正负极正确连接。
3. 编写程序使用Arduino开发环境,编写相应的程序代码,实现对DS1302模块的控制和时间显示功能。
程序主要包括如下功能: - 初始化DS1302模块; - 读取DS1302模块中的时间和日期信息; - 在串口监视器上显示时间和日期信息; - 实现时间和日期的设置功能。
4. 上传程序并测试将编写好的程序上传到Arduino开发板上,并打开串口监视器,观察时间和日期信息的显示情况。
同时,通过修改程序中的设置功能,验证实时时钟的准确性和可靠性。
时间显示设计实验报告
一、实验目的1. 掌握时间显示的基本原理和设计方法。
2. 学习使用时间显示模块进行时间数据的读取和处理。
3. 提高实践操作能力,培养创新思维。
二、实验原理时间显示设计是指将时间数据以数字、字符等形式直观地展示给用户。
常见的显示方式有LED、LCD、OLED等。
本实验采用LED显示方式,通过单片机读取实时时间,并通过LED显示模块将时间信息显示出来。
三、实验仪器与材料1. 单片机(如51系列)2. LED显示模块3. 12MHz晶振4. 电阻、电容等元件5. 编程器、编程软件等四、实验步骤1. 准备工作(1)搭建实验电路,将单片机、LED显示模块、晶振等元件连接好。
(2)编写程序,实现时间数据的读取和处理。
2. 程序设计(1)初始化单片机端口,设置I/O口为输出模式。
(2)设置晶振频率,初始化定时器。
(3)读取实时时间,包括年、月、日、时、分、秒。
(4)将读取的时间数据转换为LED显示模块所需的编码。
(5)控制LED显示模块显示时间。
3. 程序实现(1)初始化```void init(void){TMOD = 0x01; // 设置定时器模式 TH0 = 0xFC; // 设置定时器初值 TL0 = 0x18;ET0 = 1; // 开启定时器中断 EA = 1; // 开启全局中断 TR0 = 1; // 启动定时器}```(2)读取时间```void read_time(void){// 读取实时时间,此处代码省略}```(3)转换编码```void encode_time(unsigned char time){// 将时间数据转换为LED显示模块所需的编码}```(4)显示时间```void display_time(void){unsigned char time_data[6];read_time(); // 读取实时时间encode_time(time_data); // 转换编码// 控制LED显示模块显示时间}```4. 实验调试(1)将编写好的程序烧录到单片机中。
实时时钟系统设计报告
实时时钟系统设计报告电⼦设计⼤赛初赛实时时钟系统设计报告⽬录⼀、⽅案的论证和⽐较 (1)1.1 单⽚机型系统的选择与论证 (1)1.2显⽰模块的选择与论证 (1)1.3 时钟实现 (2)⼆、系统框图及⼯作原理 (2)2.1 系统总体设计结构框图 (2)2.2 系统的硬件电路设计 (3)2.2.1单⽚机控制部分 (3)2.2.2 液晶显⽰模块部分………………………………………………… ..6 2.2.3 键盘输⼊部分………………………………….………………… . 72.2.4时钟系统 (8)三、软件编程 (9)3.1 主程序流程图 (9)3.2 键盘程序 (10)3.2.1 按键使⽤流程图 (13)3.3 LCD液晶显⽰流程图 (14)3.4DS1302时间部分 (17)四、测试结果和结论 (18)五、参考⽂献 (19)附录 (20)实时时钟摘要在设计中我们主要⽤到AT89S52芯⽚为系统控制核⼼,通过LCD 来显⽰该设计的主要的功能,⽤6个按键来操作所有设计的控制,以及通过对单⽚机进⾏编程来实现对时间设置,按键控制及该时钟所拥有的功能进⾏控制。
⼀、⽅案的论证和⽐较:1.1 单⽚机型系统的选择与论证⽅案⼀:此⽅案采⽤AT89C51⼋位单⽚机实现。
它内存较⼩,只有4K字节Flash闪速存储器,128字节内部RAM,32个I/O⼝线,两个16位定时/计数器,⼀个5向量两级中断结构,⼀个全双⼯串⾏通信⼝,⽆在线下载编程功能,也⽆在线仿真功能。
只能通过编程器烧写成以.hex为后缀名的⽂件。
⽅案⼆:此⽅案采⽤AT89S52⼋位单⽚机实现。
它内存较⼤,有8K的字节Flash闪速存储器,⽐AT89C51要多4K。
它可在线编程,可在线仿真的功能,这让调试变得⽅便。
单⽚机软件编程的⾃由度⼤,可通过编程实现各种各样的算术算法和逻辑控制。
⽽且体积⼩,硬件实现简单,安装⽅便。
另外AT89S52在⼯业控制上也有着⼴泛的应⽤,编程技术及外围功能电路的配合使⽤都很成熟。
实时时钟设计报告
《单片机系统设计》(课程设计)实验报告题目: 实时时钟组号:任课教师:组长:成员:联系方式:年月日目录一、实施方案 11.1设计要求 11。
2实现功能 11。
3设计方案 1 二、原理简述 22。
1主控模块 2 2。
2时钟电路 3 2。
3显示电路 5 2.4键盘输入电路 7 2。
5蜂鸣器电路 8三、调试过程 93.1硬件调试 93.2软件调试 9四、主要程序 10五、心得体会 12一、实施方案1。
设计要求通过对DS1302编程,实现实时时钟功能,用数码管显示时、分,用小数点作秒闪。
可用键盘设置时间。
2。
实现功能本组的课程设计成果最终将实现如下功能:(1)实现实时时钟功能,四位数码管前两位显示时、后两位显示分,小数点作秒闪;(2)按下S8键,可实现对小时的加1设置;(3)按下S7键,可实现对分钟的加1设置;(4)按下S1键,可实现小时的单独显示;(5)实现整点蜂鸣器报时功能。
3。
设计方案根据系统设计的功能的要求,初步确定设计系统由主控模块、时钟电路、显示电路、键盘输入电路及蜂鸣器电路组成。
电路系统框图如图1所示。
图1 系统设计框图其中,主控芯片使用51系列AT89C52单片机,时钟芯片使用DS1302,晶振为11。
0592MHz,显示电路由四位共阳LED数码管完成,键盘采用线性连接,使用查询法实现调整功能,蜂鸣器电路由有源蜂鸣器完成。
二、原理简述1.主控模块图2 AT89C52 管脚图AT89C52是低功耗、高性能的CMOS8位单片机。
片内带有8KB的Flash 存储器,且允许在系统内改写或用编程器编程。
另外,AT89C52的指令系统和引脚与80C52完全兼容.管脚功能如下:VCC:供电电压;GND:接地;P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
;P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流;P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1"时,其管脚被内部上拉电阻拉高,且作为输入。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告5.按下Key4 Key3执行时,该按键执行加一操作,Led灯按照5秒顺时针一个一个亮。
6.按下Key5 Key3执行时,该按键执行减一操作,Led灯按照5秒顺时针一个一个亮。
7.按下Key6 Key3执行时,该按键执行确定操作,Led灯按照5秒顺时针一个一个亮。
8.按下INT 闹钟关闭。
5、实验总结本次实验是对课本上“电子日历钟设计”的加深。
通过本次试验我对led和led显示有了更加熟悉的认识,能熟练应用它们的功能。
同时我对时钟计数器也有了一定的认识,可以使用定时中断实现实时时钟,更重要的是我的实践能力有很大的提高。
程序设计中遇到的问题(1)、问题:初始完成程序后秒针走的时间很快,不是精确的一秒走一次。
原因:单片机只能用主系统时间,修改fprs后可以真确显示。
(2)、问题:时间切换函数与显示函数和设计的不一样,如只需要显示时,却多显示分。
原因:在仔细看代码后发现每次按键中断都在调用time1()函数,而seeond++在里面,所以每次都会加快秒的运行。
把seeond++移到外面放入time()函数后这个问题就解决了。
(3)、问题:运行时发现按键中断总会加快秒的运行,不是很精确。
原因:最后设置了一个虚拟的key7,当执行完时间指向ease7,然后调用Freshddisplaybuffer函数,这样就很好的解决了这个问题。
在程序调试过程中,设置断点并且在断点处增加一个LED灯,通过判断灯是否亮可以判断程序是否执行到该位置,对程序调试有很大的帮助。
开始WhileKey? 6 1 3 2 4 结束主程序流程图附件程序流程图:Yd_c_inter() Freshddisp laybuffer(); Set_D_T(); noise(); key=7; , 5 NDownNum() ; Freshddispl aybuffer(); Set_D_T(); noise(); key=7; FreshddisplaybufferTime1();Show_Time();Show_Time(); Time1() Freshddis playbuffer ();; Display_D ate(); noise(); 初始化蜂鸣器并关闭蜂鸣器BZOE = 0;初始化 INT 按键 Init_Inter();初始化 Lcd 和 Led; Init_Lcd(),Init_Led();UpNum(); Freshddis playbuffer (); Set_D_T(); noise(); key=7; key = 0; noise(); Time1(); Freshddis playbuffer (); Set_D_T(); noise();初始化按键中断InitKey_INTKR();Time1(); noise();关中断DI ()关中断EI()开中断EI();源代码:#pragma sfr#pragma EI#pragma DI#pragma access#pragma interrupt INTTM000 Time#pragma interrupt INTKR OnKeyPress#pragma interrupt INTP5 OnKeyOver void Init_Led();void InitKey_INTKR();void Init_Lcd();void Init_Inter();void LightOneLed(unsigned char ucNum);void LightOff();int Count_Day(int month);〃定义变量i,是切换时间的标志//定义 key=0 〃用于存放当前月的天数 〃默认的秒second=0 〃默认的分minute=0 〃默认的时hour=12 〃默认的天day=1 〃默认的月month=5 〃默认的年year=2014 〃默认的闹钟时=1 〃默认的闹钟分=1 〃秒的数码显示缓存区 〃分的数码显示缓存区 〃时的数码显示缓存区 〃天的数码显示缓存区 〃月的数码显示缓存区 〃年的数码显示缓存区 〃月,天的数码显示缓存区 〃时,分的数码显示缓存区 〃分,秒的数码显示缓存区 〃闹钟时的数码显示缓存区 〃闹钟分的数码显示缓存区 //INT 中断中间变量LCD_num[10]={0X070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0700,0x070f,0x070b);//数字0〜〜9的显示码unsigned char Scond;// ......................................................... 延时函数1 .............................................. //void Delay(int k){int i,j;for(i=0;i<k;i++){for(j=0;j<k;j++){〃使用特殊功能寄存器 〃开中断 〃关中断 〃使用绝对地址指令 〃定义时间中断函数为Time 〃定义按键中断为OnKeyPress //定义INT 中断为OnKeyOverchar i=0;int key=0;int temp=1;int temp1 = 1;int second=0;int minute=0;int hour=12;int day=1;int month=5;int year=2014;int c_hour=1;int c_minute=1;int buffs[2];int buffm[2];int buffh[2];int buffday[2];int buffmonth[2];int buffyear[4];int buffmd[4];int buffhm[4];int buffms[4];int buffch[2];int buffcm[2];unsigned char Que = 0;int// .................................................. 初始化Led函数................ //void Init_Led(){PM13=0XF0; 〃端口13的第四位为输出模式PM14=0XF0; 〃端口14的第四位为输出模式PM15=0XF0; 〃端口15的第四位为输出模式)// ............................................................. 按键中断函数............... •//void InitKey_INTKR(){PM4 = 0x3F; //P4的六个端口设置为输入模式PU4 = 0x3F; 〃接通上拉电阻KRM = 0x3F; 〃允许六个按键中断KRMK = 0;PM3.0 = 1;PU3.0 = 1;EGP.5 = 1;PMK5 = 0;PPR5 = 0;KRPR = 1;)// ............................... 初始化lcd函数............... //void Init_Lcd(){ PFALL=0x0F; 〃所有接lcd引脚指定为lcd引脚LCDC0=0x34; 〃设置原时钟和时钟频率LCDMD=0x30; //设置lcd电压为3/5电压LCDM=0xC0; //4分时1/3偏压模式)// ............................... 初始化定时器Inter函数.............. 〃void Init_Inter(){ CRC00)=0; //CR000为比较寄存器PRM00=0X04; 〃计数时钟为fprs/2A8 CR000=0X7FFF;//时间间隔为1s TMMK010=1;//TMMK010 中断屏蔽TMMK000=0; //TMMK000 中断允许TMC00=0X0C; //TM00和CR000相等时进入清零&启动模式)void Time(){ second++;)// ............................................................. 按键中断函数............... •//void OnKeyPress(){DI();switch(P4&0x3F) 〃判断哪个按键按下{case 0x3e:key=1; //按键keyl按下break;case 0x3d:key=2; //按键key2按下break;case 0x3b:key=3; //按键key3按下break;case 0x37:key=4; //按键key4按下break;case 0x2f:key=5; //按键key5按下break;case 0x1f:key=7; //按键key6按下break;default:break;)EI();)// ............................................................... I NT按键中断函数............... //void OnKeyOver(){DI();Que = 0; //判断Que是否为0BZOE = 0; 〃蜂鸣器关闭EI();)// ................................................... Led小灯函数............... //void LightOneLed(unsigned char ucNum){switch(ucNum){ 〃检测变量ucNumcase 0:case 1:case 2:case 3:P13 |= (unsigned char) 1 << (ucNum);〃如果为0到3中的一个值则让LED1到LED4中的一个亮break;case 4:case 5:case 6:case 7:P14 |= (unsigned char) 1 << (ucNum - 4);〃如果为4到7中的一个值则让LED5到LED8中的一个亮break;case 8:case 9:case 10:case 11:P15 |= (unsigned char) 1 << (ucNum - 8);〃如果为8至U 11中的一个值则让LED9至U LED12中的一个亮break;default:break;))// ................................................... Led小灯熄灭函数............... 〃void LightOff(){P13 = 0;P14 = 0;P15 = 0;)// ............................................. 时间函数.............. 〃void Time1(){if((second % 5) == 0){ 〃秒大于 5 变为0Scond = second / 5 + 1;LightOff(); 〃调用小灯亮函数LightOneLed(Scond % 12);)if(second>=60){minute++; //秒大于60时分加1second=0;if(minute>=60){minute=0;hour++; //分大于60时时加1if(hour>=24){hour=0;day++; 〃时大于24时天加1temp=Count_Day(month);if(day>=temp){day=1;month++; 〃天大于当前月份的天数时月加1if(month>=13){month=1;year++; //月大于12时年加1))))))// ...................................... 计算当前月的天数.............. •//int Count_Day(int month){int day;if((month==4)||(month==6)||(month==9)||(month==11))//4,6,9,11 月为30 天day=30;else if(month==2){if((year%4==0&&year%100==0)||(year%400==0))day=29; 〃闰年2月29天elseday=28; //平年2月28天)elseday=31; //1,3,5,7,8,10,12 月为31 天return (day);)// ................................ 倒计时函数 ...... //void Show_Time(){ pokew(0xFA40,0x00); pokew(0xFA42,0x00); pokew(0XFA48,buffs[1]); pokew(0XFA4A,buffs[0]); pokew(0XFA44,buffm[1]); pokew(0XFA46,buffm[0]); pokew(0xFA4C,0x00); pokew(0xFA4E,0x00); Delay(100);) // ..................................................................... 日期显示函数 ................. •// void Display_Date(){buffm[0]|=0x0800;pokew(0xFA40,buffyear[3]);〃显示年 pokew(0xFA42,buffyear[2]);pokew(0xFA44,buffyear[1]);pokew(0xFA46,buffyear[0]);pokew(0xFA48,buffmonth[1]);〃显示月 pokew(0xFA4A,buffmonth[0]);pokew(0xFA4C,buffday[1]);〃显示日pokew(0xFA4E,buffday[0]);temp1=0;) // .................................................................... 时间显示函数 .............. •//void Display_Time(){ pokew(0xFA40,0x00);pokew(0xFA42,0x00);pokew(0xFA44,buffh[1]);〃显示时 pokew(0xFA46,buffh[0]);pokew(0xFA48,buffm[1]);〃显示分 pokew(0xFA4A,buffm[0]);pokew(0xFA4C,buffs[1]);〃显示秒 pokew(0xFA4E,buffs[0]);)// ..................................................................... 设定时间函数 .............. •//void Set_D_T(){int lcd_addr;lcd_addr = 0xFA40;switch(i){case 1:pokew(lcd_addr,buffyear[3]);〃时间年 pokew(lcd_addr+2,buffyear[2]);pokew(lcd_addr+4,buffyear[1]);pokew(lcd_addr+6,buffyear[0]);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 2:pokew(lcd_addr,0x00);pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,0x00);pokew(lcd_addr+6,0x00);pokew(lcd_addr+8,buffmonth[1]);〃时间月 pokew(lcd_addr+10,buffmonth[0]);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 3:pokew(lcd_addr,0x00); //在lcd 右边显示1〃在lcd 右边显示0 〃在lcd 右边显示1 〃在lcd 右边显示0pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,0x00);pokew(lcd_addr+6,0x00);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,buffday[1]); 〃时间日pokew(lcd_addr+14,buffday[0]);break;case 4:pokew(lcd_addr,0x00);pokew(lcd_addr+2,0x00);pokew(lcd_addr+4,buffh[1]); 〃时间时pokew(lcd_addr+6,buffh[0]);pokew(lcd_addr+8,0x00);pokew(lcd_addr+10,0x00);pokew(lcd_addr+12,0x00);pokew(lcd_addr+14,0x00);break;case 5:pokew(0xFA40,0x00);pokew(0xFA42,0x00);pokew(0xFA44,0x00);pokew(0xFA46,0x00);pokew(0xFA48,buffm[1]); 〃时间分pokew(0xFA4A,buffm[0]);pokew(0xFA4C,0x00);pokew(0xFA4E,0x00);break;case 6:pokew(0xFA40,0xd1);pokew(0xFA42,0xd0);pokew(0xFA44,0xd7);pokew(0xFA46,0xd1);pokew(0xFA48,0x50);pokew(0xFA4A,0x56);pokew(0xFA4C,buffch[1]); 〃闹钟时pokew(0xFA4E,buffch[0]);break;case 7:pokew(0xFA40,0xd1);pokew(0xFA42,0xd0);pokew(0xFA44,0xd7);pokew(0xFA46,0xd1);pokew(0xFA48,0x50);pokew(0xFA4A,0x00);pokew(0xFA4C,buffcm[1]); 〃闹钟分pokew(0xFA4E,buffcm[0]);break;default:break;))// ........................................................ 切换时间函数 .............. …// void d_c_inter(){DI(); 〃关中断i++;if(i>7) 〃切换标志>7, i=1,否则i++i=1;EI(); 〃开中断)// ........................................................ 调整时间加函数 .............. •// void UpNum(){ switch(i){ case 1:year++;case 2:month++;if(month > 12){month = 1;)break;case 3:temp = Count_Day(month);day++;if(temp < day)day = 1;break;case 4:hour++;if(hour > 23)hour = 1;break;case 5:minute++;if(minute > 59)minute = 0;break;case 6:c_hour++;if(c_hour > 23)c_hour = 1;break;case 7:c_minute++;if(c_minute > 59)c_minute = 0;break;default:break;))// ........................................................ 调整时间减函数.............. …// void DownNum(){switch(i){case 1:year--;case 2:month--;if(month < 1){month = 12;)break;case 3:temp = Count_Day(month);day--;if(day < 1)day = temp;break;case 4:hour--;if(hour < 1)hour = 23;break;case 5:minute--;if(minute < 0)minute = 59;break;case 6:c_hour--;if(c_hour < 1)c_hour = 23;break;case 7:c_minute--;if(c_minute < 0)c_minute = 59;break;default: break;))// .................................................. 闹铃以及小灯函数.............. •//void noise(){if(c_hour == hour && c_minute == minute && Que == 1){ 〃闹铃的时,分与系统时,分相等,并且闹钟标志开启CKS=0XE0; 〃开启蜂鸣器输出,输出频率为0.98khz的音频Time1(); 〃调用时间函数))// ........................................................ 显示缓存区刷新时间函数.............. •//void Freshddisplaybuffer(){buffs[1]=LCD_num[second/10];/期的显示码放入秒的数码显示缓存区buffs[0]=LCD_num[second%10];buffm[1]=LCD_num[minute/10];//分的显示码放入分的数码显示缓存区buffm[0]=LCD_num[minute%10];buffm[0]|=0x0800; 〃分的后面显示一个"."buffh[1]=LCD_num[hour/10]; 〃时的显示码放入时的数码显示缓存区buffh[0]=LCD_num[hour%10];buffh[0]|=0x0800; 〃时的后面显示一个"."buffday[1]=LCD_num[day/10];//天的显示码放入天的数码显示缓存区buffday[0]=LCD_num[day%10];buffmonth[1]=LCD_num[month/10];//月的显示码放入月的数码显示缓存区buffmonth[0]=LCD_num[month%10];buffmonth[0]|=0x0800; 〃月的后面显示一个"."buffyear[3]=LCD_num[year/100/10];/^的显示码放入年的数码显示缓存区buffyear[2]=LCD_num[(year/100)%10];buffyear[1]=LCD_num[(year%100)/10];buffyear[0]=LCD_num[(year%100)%10];buffyear[0]|=0x0800; 〃年的后面显示一个"."buffmd[3]=LCD_num[month/10];//月,天的显示码放入月,天的数码显示缓存区buffmd[2]=LCD_num[month%10];buffmd[2]|=0x0800; 〃月,天后显示一个"."buffmd[1]=LCD_num[day/10];buffmd[0]=LCD_num[day%10];buffhm[3]=LCD_num[hour/10];//时,分的显示码放入时,分的数码显示缓存区buffhm[2]=LCD_num[hour%10];buffhm[2]|=0x0800; 〃时,分的后显示一个"."buffhm[1]=LCD_num[minute/10];buffhm[0]=LCD_num[minute%10];buffms[3]=LCD_num[minute/10];/^,秒的显示码放入分,秒的数码显示缓存区buffms[2]=LCD_num[minute%10];buffms[2]|=0x0800; 〃分,秒的后显示一个"."buffms[1]=LCD_num[second/10];buffms[0]=LCD_num[second%10];buffch[1]=LCD_num[c_hour/10];//闹钟时的显示码放入闹钟时的数码显示缓存区buffch[0]=LCD_num[c_hour%10];buffcm[1]=LCD_num[c_minute/10];//闹钟分的显示码放入闹钟分的数码显示缓存区buffcm[0]=LCD_num[c_minute%10];)// ................................. 主函数............... 〃void main(){DI(); 〃关中断PM3.4 = 0; //P3.3,P3.4端口设置为输出模式P3.4 = 1; //led灯初始化为点亮状态PM3.3 = 0;P3.3 = 0;BZOE = 0; 〃蜂鸣器初始化为熄灭Init_Lcd(); 〃初始化lcdInit_Led(); 〃初始化ledInitKey_INTKR(); 〃初始化按键EI(); 〃开中断Init_Inter(); //初始化中断while(1){ Time1(); noise(); switch(key){ case 0: Freshddisplaybuffer(); Time1(); Show_Time();Show_Time(); break; case 1:Time1();Freshddisplaybuffer(); Display_Date(); noise();break;case 2:Time1();Freshddisplaybuffer(); Display_Time(); noise();break;case 3:d_c_inter();Freshddisplaybuffer(); Set_D_T();noise();key=7; break;case 4:UpNum();Freshddisplaybuffer(); Set_D_T();noise();key=7; break;case 5:DownNum();Freshddisplaybuffer(); Set_D_T();noise();key=7; break;case 6:key = 0;if(i > 5)Que = 1;1 = 0;noise();case 7:Time1();Freshddisplaybuffer(); Set_D_T(); 〃调用计算时间函数 〃调用闹钟函数 〃没有按键执行 〃调用刷新函数 〃计算时间 〃调用显示时间函数 //按键1执行 〃计算时间 〃调用刷新函数 〃调用显示日期函数 〃调用闹钟函数 //按键2执行 //计算时间 //调用刷新函数 //调用时间显示函数 //调用闹钟函数 //按键3执行 〃调用时间切换函数 //调用刷新函数 〃调用时间设置函数 //调用闹钟函数 //按键4执行 〃调用时间加函数 //调用刷新函数 //调用时间设置函数 //调用闹钟函数 //按键5执行〃调用时间减函数 //调用刷新函数 //调用时间设置函数//调用闹钟函数//按键6执行〃判断是否确认 //调用闹钟函数〃虚拟按键7 //调用刷新函数//调用时间设置函数〃调用闹钟函数noise();break;。