时钟程序设计报告
- 格式:doc
- 大小:51.00 KB
- 文档页数:6
实验报告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;。
单片机闹钟设计程序报告1. 引言闹钟作为人们日常生活中的常用物品,不仅有叫醒人们起床的功能,还可以作为提醒的工具。
随着科技的进步,单片机闹钟逐渐取代了传统的机械闹钟,成为人们生活中不可或缺的一部分。
本报告旨在介绍一个基于单片机的简单闹钟设计程序。
2. 设计方案本设计方案使用了单片机和数码管作为主要硬件,通过对单片机的编程,实现了闹钟的基本功能,包括时间设置、闹钟时间设置、闹钟触发、蜂鸣器报警等。
2.1 硬件设计硬件方面,本设计基于某型号的单片机和数码管。
单片机通过相关的引脚与数码管相连,通过控制引脚的电平来显示不同的数字。
2.2 软件设计软件方面,本设计使用C语言编程实现。
主要的功能包括获取当前时间、显示时间、设置时间、设置闹钟时间、闹钟触发检测、蜂鸣器报警等。
3. 程序实现3.1 初始化设置在程序的开始部分,需要对单片机进行初始化设置。
包括设置引脚的输入输出模式、设置计时器、设置中断等。
3.2 时间显示为了实现时间显示的功能,我们需要通过单片机的计时器来不断获取当前时间,并将其转换为时、分、秒的格式。
然后通过数码管显示出来。
3.3 时间设置通过给单片机的某个引脚接入按钮,实现时间设置功能。
当按钮被按下时,单片机进入时间设置模式。
此时,用户可以通过另外的按钮来逐个调整时、分、秒的数值。
3.4 闹钟时间设置类似于时间设置,闹钟时间设置也需要通过按钮来实现。
用户可以按下对应的按钮来设置闹钟的时、分,设置完毕后,单片机会将设置的时间保存起来。
3.5 闹钟触发检测在每一次时间显示的循环中,程序都会检测当前时间是否与闹钟时间相符。
如果相符,则触发闹钟,蜂鸣器开始报警。
3.6 蜂鸣器报警通过单片机的一个输出引脚,连接到蜂鸣器,实现蜂鸣器的报警功能。
当闹钟触发时,单片机会给对应的引脚输出一个高电平,从而使蜂鸣器发声。
4. 总结通过对单片机闹钟设计程序的实现,我们成功实现了闹钟的基本功能,包括时间设置、闹钟时间设置、闹钟触发、蜂鸣器报警等。
时钟功能处理程序王岑06级计算机科学与技术2班200630740221胡启威06级计算机科学与技术2班200630740207一、问题描述时钟功能处理程序”是运行于Windows 系统下的应用软件,主要用于实现时钟显示与时钟调整功能。
“时钟功能处理程序”为用户提供了一个简单的人机对话界面。
在屏幕右上角显示系统当前的日期与时间是它的首要功能,同时,它可以接受用户对系统日期和系统时间的常规性修改,并在确认修改后显示新时钟。
二、运行环境与需求分析(1)系统运行环境:1.硬件环境●处理器:Intel Pentium 166 MX 或更高●内存:32MB●硬盘空间:1GB●显卡:SVGA显示适配器2.软件环境●操作系统:Windows98/ME/2000/XP(2)功能需求描述:“时钟功能处理程序”为用户提供了一个简易的时钟功能操作环境,给用户提供了一个简单友好的用户窗口,其功能需求如下。
①用户操作交互界面。
通过对界面的不断清屏更新,简洁地为用户列出程序的所有功能。
时钟修改过程省去烦琐的“回去确认输入”步骤,只要用户正确输入位数,程序将自动进入下一操作对话提示。
当用户完成时钟的修改,将先提示用户是否更新时钟信息,在得到肯定答复后方修改时钟。
欢迎界面显示。
程序启动后,在屏幕右上角分两行显示系统的当前日期与时间。
程序启动后,在屏幕左边显示程序的功能目录,包括时钟日期的修改、时钟时间的修改、退出等选项。
②时钟修改流程。
当用户选择修改时钟,旧时钟的显示将停止,进入时钟修改界面。
程序一步一步提示用户对时钟的修改。
例如,若用户选择修改的是日期,那么程序将以“年-月-日”的顺序提示用户输入更新信息,若用户输入的格式错误,程序将提示输入错误并询问用户下一操作步骤。
时钟修改的顺序是“时钟-分钟”。
正确输入的数字格式除了年份为4位,其它统一为2位,否则出错。
当用户修改时钟完毕,更新后的时钟将再次显示在屏幕右上角。
三、总体分析下面从程序的整体流程、各个功能模块以及数据结构几个方面进行总体设计分析。
单片机实验报告数字时钟设计报告一、实验目的本次单片机实验的目的是设计并实现一个基于单片机的数字时钟。
通过该实验,深入了解单片机的工作原理和编程方法,掌握定时器、中断、数码管显示等功能的应用,提高综合运用知识解决实际问题的能力。
二、实验原理1、单片机选择本次实验选用了常见的 51 系列单片机,如 STC89C52。
它具有丰富的资源和易于编程的特点,能够满足数字时钟的设计需求。
2、时钟计时原理数字时钟的核心是准确的计时功能。
通过单片机内部的定时器,设定合适的定时时间间隔,不断累加计时变量,实现秒、分、时的计时。
3、数码管显示原理采用共阳或共阴数码管来显示时间数字。
通过单片机的 I/O 口控制数码管的段选和位选信号,使数码管显示相应的数字。
4、按键控制原理设置按键用于调整时间。
通过检测按键的按下状态,进入相应的时间调整模式。
三、实验设备与材料1、单片机开发板2、数码管3、按键4、杜邦线若干5、电脑及编程软件(如 Keil)四、实验步骤1、硬件连接将数码管、按键与单片机开发板的相应引脚通过杜邦线连接起来。
确保连接正确可靠,避免短路或断路。
2、软件编程(1)初始化单片机的定时器、中断、I/O 口等。
(2)编写定时器中断服务程序,实现秒的计时。
(3)设计计时算法,将秒转换为分、时,并进行进位处理。
(4)编写数码管显示程序,将时间数据转换为数码管的段选和位选信号进行显示。
(5)添加按键检测程序,实现时间的调整功能。
3、编译与下载使用编程软件将编写好的程序编译生成可执行文件,并下载到单片机中进行运行测试。
五、程序设计以下是本次数字时钟设计的主要程序代码片段:```cinclude <reg52h>//定义数码管段选码unsigned char code SEG_CODE ={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//定义数码管位选码unsigned char code BIT_CODE ={0x01, 0x02, 0x04, 0x08, 0x10,0x20, 0x40, 0x80};//定义时间变量unsigned int second = 0, minute = 0, hour = 0;//定时器初始化函数void Timer_Init(){TMOD = 0x01; //定时器 0 工作在方式 1 TH0 =(65536 50000) / 256; //定时 50ms TL0 =(65536 50000) % 256;EA = 1; //开总中断ET0 = 1; //开定时器 0 中断TR0 = 1; //启动定时器 0}//定时器 0 中断服务函数void Timer0_ISR() interrupt 1{TH0 =(65536 50000) / 256;TL0 =(65536 50000) % 256;second++;if (second == 60){second = 0;minute++;if (minute == 60){minute = 0;hour++;if (hour == 24){hour = 0;}}}}//数码管显示函数void Display(){unsigned char i;for (i = 0; i < 8; i++)P2 = BIT_CODEi;if (i == 0){P0 = SEG_CODEhour / 10;}else if (i == 1){P0 = SEG_CODEhour % 10;}else if (i == 2){P0 = 0xBF; //显示“”}else if (i == 3){P0 = SEG_CODEminute / 10;else if (i == 4){P0 = SEG_CODEminute % 10;}else if (i == 5){P0 = 0xBF; //显示“”}else if (i == 6){P0 = SEG_CODEsecond / 10;}else if (i == 7){P0 = SEG_CODEsecond % 10;}delay_ms(1);//适当延时,防止闪烁}}//主函数void main(){Timer_Init();while (1){Display();}}```六、实验结果与分析1、实验结果将程序下载到单片机后,数字时钟能够正常运行,准确显示时、分、秒,并且通过按键可以进行时间的调整。
目录1 前言时钟在人们日常生活中必不可少,时钟的原理是怎么样的呢,本程序将模拟一个电子时钟。
为了使程序更加美观,本程序是使用Visual C++编写一个可视化的模拟电子时钟程序。
电子时钟的关键在于延时,为了达到延时的准确性,不受程序执行时间的影响,采用了系统两秒之间的间隔进行延时。
该程序还加入了显示星期功能,在知道1901年每月1号是星期几的情况下,再根据年、月、日即可算出星期几。
2需求分析要求设计类结构,模拟电子时钟的行走,在屏幕上显示一个活动时钟。
任务(1)显示日期的格式:XXXX年XX月XX日(2)显示时间的格式:XX:XX:XX。
(3)添加显示星期的格式:星期X运行环境(1)WINDOWS2000/XP系统(2)Visual C++ 编译环境或DEV C++ 编译环境开发工具C++语言3分析和设计+ 系统分析及设计思路为了使程序的显示更加美观,该程序使用了C++可视化程序设计方法进行设计。
在可视化程序设计中,建立了一个MFC单文档应用程序工程,该工程包括了视图类、文档类对话框类和主框架类。
在主框架类中修改窗口等属性,使整个时间的显示更加协调。
模拟电子时钟是一个显示和计时的小程序,因此只要在视图类和文档类添加相关的属性和方法即可完成模拟电子时钟的功能。
文档类定义时钟的相关属性,包括int类型的year、month、day、hour、minute、second,和包括CString类型的str_year、str_month、str_day、str_hour、str_minute、str_second等信息。
int类型的时间日期属性用以计算,CSrting类型的时间日期属性用以显示,通过CString类中的成员函数Formart可以把int型的数据转成CString型的。
视图类实现时钟的主要功能,在该类的OnDraw函数里面对时间日期进行显示输出。
向窗口输出信息时,为了保证高刷新率下绘图不闪烁,使用内存绘图的方法,在内存中创建一个与屏幕绘图区域一致的对象,使得重绘视图时可以大大提高运行速度。
电子时钟设计报告(项目编号:CLK02)一、设计思路1.要达到的目的①利用51单片机及数码管实现时钟的基本功能。
②在4个数码管上显示时分,秒不显示。
③利用3个按键,实现分秒的调整。
④能设置一组闹钟。
2.关键问题的解决①4个数码管的动态扫描。
②走时需要使用定时中断,以确保精度。
③闹钟功能模块需要重复利用4个数码管来显示,需要组织好复杂的逻辑。
三、部分程序关键源代码及注释按钮扫描------------------------------------------------------------------------*/uchar KeyCode=0; //按键码缓冲区,定义为字节型uint KeyTick=0; //按键按下计数,达到指定时长才有效,防止干扰。
uchar PreKey=0; //前一次按下的是哪个键,用来判断是否一直按住某个键。
void KeyScan(void) //按键扫描子程序{uchar tmpKey=0; //定义临时实时按下键的缓存if (K1==0 && K2==0) //按下的是3号键,注意3号键在电路中是由两个二极管引入IO的。
tmpKey=3;else if (K1==0) //按下的是1号键tmpKey=1;else if (K2==0) //按下的是2号键tmpKey=2;if (tmpKey!=0) //当有键按下时,进时以下处理{ if (tmpKey==PreKey) //如果是和前一次扫描相同的按键,时{ KeyTick++; //用来进行抗抖动计数if (KeyTick==20) //单次按键,即短按KeyCode=tmpKey; //将完成了检测的按键值传入变量KeyCode中以备调用。
if (KeyTick>=700) //接收长按{ KeyCode=tmpKey; //将完成了检测的按键值传入变量KeyCode中以备调用。
电子课程设计题目:数字时钟数字时钟设计实验报告一、设计要求:设计一个24小时制的数字时钟。
要求:计时、显示精度到秒;有校时功能。
采用中小规模集成电路设计。
发挥:增加闹钟功能。
二、设计方案:由秒时钟信号发生器、计时电路和校时电路构成电路。
秒时钟信号发生器可由振荡器和分频器构成。
计时电路中采用两个60进制计数器分别完成秒计时和分计时;24进制计数器完成时计时;采用译码器将计数器的输出译码后送七段数码管显示。
校时电路采用开关控制时、分、秒计数器的时钟信号为校时脉冲以完成校时。
三、电路框图:时计数分计数秒计数图一数字时钟电路框图四、电路原理图:(一)秒脉冲信号发生器秒脉冲信号发生器是数字电子钟的核心部分,它的精度和稳定度决定了数字钟的质量。
由振荡器与分频器组合产生秒脉冲信号。
振荡器: 通常用555定时器与RC构成的多谐振荡器,经过调整输出1000Hz脉冲。
分频器: 分频器功能主要有两个,一是产生标准秒脉冲信号,一是提供功能扩展电路所需要的信号,选用三片74LS290进行级联,因为每片为1/10分频器,三片级联好获得1Hz标准秒脉冲。
其电路图如下:图二秒脉冲信号发生器(二)秒、分、时计时器电路设计秒、分计数器为60进制计数器,小时计数器为24进制计数器。
60进制——秒计数器秒的个位部分为逢十进一,十位部分为逢六进一,从而共同完成60进制计数器。
当计数到59时清零并重新开始计数。
秒的个位部分的设计:利用十进制计数器CD40110设计10进制计数器显示秒的个位。
个位计数器由0增加到9时产生进位,连在十位部计数器脉冲输入端CP,从而实现10进制计数和进位功能。
利用74LS161和74LS11设计6进制计数器显示秒的十位,当十位计数器由0增加到5时利用74LS11与门产生一个高电平接到个位、十位的CD40110的清零端,同时产生一个脉冲给分的个位。
其电路图如下:图三 60进制--秒计数电路60进制——分计数电路分的个位部分为逢十进一,十位部分为逢六进一,从而共同完成60进制计数器。
目录1. 基本功能描述 (1)2. 设计思路 (2)3. 软件设计 (3)3.1 设计步骤 (3)3.2 界面设计 (6)3.3 关键功能的实现 (7)3.3.1 指针式时钟的实现 (7)3.3.2 数字式时钟的实现 (8)3.3.3 设置部分的实现 (8)4 结论与心得体会 (8)5 参考文献 (9)6 思考题 (9)7 附录 (10)7.1 调试报告 (10)7.2 测试结果 (11)7.3 关键源代码 (12)模拟时钟程序1. 基本功能描述计时器是程序中最常用的后台任务机制之一,其时间间隔最低约55毫秒,被广泛用于时钟、磁盘备份程序或需要在某一时刻运行的程序等。
而模拟时钟是一种集计时器和时钟显示于一体的程序。
以实例为背景学习基于MFC的WINDOWS程序设计,编写一个指针式时钟程序.界面上包括数字式时钟、指针式时钟,可以实现对系统时间的修改与再定义。
具体要求包括以下三点:1)指针式时钟包含均匀分布的十二个刻度点、时/分/秒三指针,具体表盘形式可自由设计,要求时钟样式得体、易于辨认。
同理,要求指针位置随系统时间变化运动且与数字式时钟同步。
2)数字钟的钟面为一个规则的矩形,其显示时间的格式是时:分:秒,小时为24进制,分钟和秒是60进制,显示时间随系统时间变化跳变且与指针式时钟同步。
3)包含修改系统时间菜单项,可在弹出对话框中修改并再定义系统时间。
该对话框弹出时,数字式时钟与指针式时钟不停止跳变(与WINDOWS系统自带时钟程序一致)。
4)程序界面设计合理,色彩得体大方,显示正确。
效果图如图1所示:图1 时钟效果显示图2. 设计思路图2CView类OnDraw( )函数中。
下面对上页程序流程图中关键步骤作出简要分析说明:1)要实现时钟程序的显示及同步跳变,实质上是在实现每隔一秒定时刷新屏幕重新绘图。
OnCreate( )函数创建计时器并定义计时间隔为一秒,OnTimer( )函数作计时器的消息处理函数用于通知OnDraw( )函数重新绘图。
单片机电子时钟课程设计报告一、设计目的。
本课程设计旨在通过单片机技术的应用,设计并制作一个简单的电子时钟。
通过这一设计,学生将能够掌握单片机的基本原理和应用,培养学生的动手能力和创新意识,提高学生的实际操作能力。
二、设计原理。
本电子时钟采用单片机作为控制核心,通过晶振产生的时钟信号来实现时间的计时和显示。
利用数码管来显示小时和分钟,通过按键来调整时间。
同时,通过蜂鸣器发出报时信号,实现基本的闹钟功能。
三、设计方案。
1. 硬件设计。
(1)单片机选择,本设计选用常见的51单片机作为控制核心,具有成本低、易于编程的特点。
(2)时钟电路,采用晶振作为时钟信号源,通过单片机的定时器来实现时间的计时。
(3)显示模块,采用数码管来显示小时和分钟,通过数码管的扫描显示来实现时间的动态显示。
(4)按键输入,设计按键来调整时间,包括调整小时和分钟。
(5)报时功能,通过蜂鸣器来实现基本的报时功能,可以设置闹钟时间。
2. 软件设计。
(1)时钟控制,通过单片机的定时器来实现时间的计时和更新。
(2)显示控制,设计数码管的扫描显示程序,实现时间的动态显示。
(3)按键处理,设计按键扫描程序,实现对时间的调整。
(4)报时功能,设计蜂鸣器的报时程序,实现基本的闹钟功能。
四、设计实现。
1. 硬件实现。
根据上述设计方案,完成了电子时钟的硬件连接和布线,保证各个模块之间的正常通讯和工作。
2. 软件实现。
编写了单片机的程序,实现了时钟的计时、显示和控制功能,保证了电子时钟的正常运行。
五、实验结果。
经过调试,电子时钟能够准确显示当前的时间,并能够通过按键调整时间和设置闹钟功能,报时功能也能够正常工作。
六、总结与展望。
通过本课程设计,学生掌握了单片机的基本原理和应用,培养了动手能力和创新意识。
在今后的学习和工作中,学生将能够更好地应用单片机技术,设计和制作更加复杂的电子产品。
同时,也为学生今后的科研和创新工作奠定了良好的基础。
课程设计报告
简易时钟程序设计实验报告
院(系):计算机与信息工程学院
专业:计算机科学与技术
班级:13计科
学号:20131104765
姓名:娄心玲
指导教师:朝力萌
完成日期:2014/12/27
《程序设计基础》课程设计报告
目录
第1章概要设计 (2)
1.1题目的内容与要求 (2)
1.2总体结构 (2)
第2章详细设计 (2)
2.1主模块 (2)
第3章调试分析 (4)
第4章使用说明与执行结果 (5)
第1章概要设计
1.1题目的内容与要求
内容:本文讨论的是基于Visual studio2010平台所设计的简易时钟显示程序。
本设计使用定时器,并通过调用绘图函数,画出模拟的时钟表盘,其秒针、分针、时针每秒钟跳动一次。
跳动的幅角不同。
要求:通过本设计,我们进一步掌握Visual studio 2010应用程序,系统地学习面向对象编程思想,了解MFC架构,逐步熟悉可视化编程环境visual studio2010。
1.2总体结构
本设计使用定时器,并通过调用绘图函数,画出模拟的时钟表盘,其秒针、分针、时针每秒钟跳动一次。
三根针的每秒针的跳动幅角大小不同
第2章详细设计
2.1主模块
double x,y;
double a,b;
double m,n;
double PI=3.1415926;
CClientDC DC(this);
CPen *oldpen;
CPen newpen1(PS_SOLID,1,RGB(255,0,0));
CPen newpen2(PS_SOLID,1,RGB(0,255,0));
CPen newpen3(PS_SOLID,1,RGB(0,0,255)); CPen delepen1(PS_SOLID,5,RGB(255,255,255)); CPen delepen2(PS_SOLID,10,RGB(255,255,255)); CPen delepen3(PS_SOLID,15,RGB(255,255,255));
DC.SetWindowOrg(-100,-100);
DC.Ellipse(0,0,200,200);
DC.TextOutW(0,100,L"9");
DC.TextOutW(100,0,L"12");
DC.TextOutW(200,100,L"3");
DC.TextOutW(100,200,L"6");
oldpen=DC.SelectObject(&newpen1);
x=50*cos(del0);
y=50*sin(del0);
DC.MoveTo(100,100);
del0=del0-PI/30;
DC.LineTo(x,y);
oldpen=DC.SelectObject(&delepen1);
DC.MoveTo(100,100);
DC.LineTo(x,y);
oldpen=DC.SelectObject(&newpen2);
DC.MoveTo(100,100);
del1=del1-PI/1800;
a=80*cos(del1);
b=80*sin(del1);
DC.LineTo(a,b);
oldpen=DC.SelectObject(&delepen2);
DC.MoveTo(100,100);
DC.LineTo(a,b);
oldpen=DC.SelectObject(&newpen3);
DC.MoveTo(100,100);
del2=del2-PI/43200;
m=80*cos(del2);
n=80*sin(del2);
DC.LineTo(m,n);
oldpen=DC.SelectObject(&delepen3);
DC.MoveTo(100,100);
DC.LineTo(m,n);
第3章调试分析
计算机与信息工程学院课程设计报告
第4章使用说明与执行结果
运行操作及结果:
二.课程设计小结
在实验中发现——分析——总结的问题有:
在试验中,发现时钟的功能太单一,不够完全。
不足之处:
此时钟显示程序功能还不是很多,设计效果也不是很理想,数字标识太少,这样可以方便用户识别,同时可以添加一个闹铃指针,方便用户设置闹铃。
参考文献:
[1] 严蔚敏,吴伟民.数据结构(C语言版).北京:清华大学出版社,2007
[2] 谭浩强.c++面向对象程序设计.清华大学出版社,2006
[3]吴文虎.程序设计基础(第2版).清华大学出版社2004。