单片机课程设计实验报告+基于单片机的数字时钟+含完整实验代码
基于单片机的数字钟毕业设计(附程序全)
基于单片机的数字钟毕业设计(附程序全) 电子时钟设计随着现代人类生活节奏的加快,人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。
对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以以数码管为显示器的时钟比指针式的时钟表现出了很大的优势。
数码管显示的时间简单明了而且读数快、时间准确性更高~数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。
数字钟的精度、稳定度远远超过老式机械钟。
在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,并且由单片机的定时器计数。
在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。
数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。
关键词:数字钟;单片机;数码管;时间;准确性1目录第一章绪论1. 数字电子钟的意义和应用…………………………………………………………………… 3 第二章整体设计方案2.1 单片机的选择…………………………………………………………………………… 3 2.2 单片机的基本结构……………………………………………………………………… 5 第三章数字钟的硬件设计3.1 最小系统设计…………………………………………………………………………… 9 3.2 LED显示电路…………………………………………………………………………… 12 3.3 键盘控制电路…………………………………………………………………………… 14 第四章数字钟的软件设计4.1 系统软件设计流程图…………………………………………………………………… 15 4.2 数字电子钟的原理图…………………………………………………………………… 18 4.3 主程序…………………………………………………………………………………… 19 4.4 时钟设置子程序………………………………………………………………………… 20 4.5 定时器中断子程序……………………………………………………………………… 20 4.6 LED显示子程序………………………………………………………………………… 21 4.7 按键控制子程序………………………………………………………………………… 23 第五章系统仿真5.1 PROTUES软件介绍................................................................................. 24 5.2 电子钟系统PROTUES仿真........................................................................ 24 结束语. (2)5 参考文献 (26)2第一章绪论1.数字电子钟的意义和应用数字钟是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭、车站、码头、办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
单片机数字时钟实验报告
数字时钟实验报告一、实验目的:通过实验进一步深刻理解单片机最小系统的工作原理。
着重掌握中断和定时器的使用,以及读键盘和LED显示程序的设计(具体设计在后面会涉及到)。
培养动手能力。
二、实验内容:使用单片机最小系统设计一个12小时制自动报时的数字时钟。
三、功能描述:★使用低六位数码管显示时、分、秒、使用第七位表示上午和下午。
符号A表示上午;符号P表示下午。
★通过按键分别调整小时位和分钟位。
★到达整点时以第八位数码管闪烁的方式报时,使用8作为显示内容。
★考虑整点报时功能。
四、设计整体思路以及个别重点部分的具体实现方式:下面这幅图展示主函数的流程下面描述的是调用T0中断时所进行的动作显示更新的函数具体见下面这幅图我们还一个对键盘进行扫描以获得有效键盘值,其具体的实现见下面这幅图● 要实现时钟的运行和时间的调整,我的设计思路是这样的:由于T0中断的时间间隔是4ms,那么我可以设置一个计数器i,在每次进入中断时进行加一调整,当i计满面250时就将时钟我秒的低位加一。
然后根据进位规则,对其后的各位依次进行调整。
●要实现整点报时功能,则可以根据时位是否为0判断是否要闪烁显示字符8。
至于闪烁的具体实现方式,见源程序。
至此,本实验的设计思路己基本介绍完毕。
下面就是本次实验的源程序代码。
/*********************************************************//** 数字时钟程序**//** **//*********************************************************/#include <absacc.h>#include <reg51.h>#define uchar unsigned char#define uint8 unsigned char#define uint16 unsigned int#define LED1 XBYTE [0xA000] //数码管地址#define LED2 XBYTE [0xA001]#define LED3 XBYTE [0xA002]#define LED4 XBYTE [0xA003]#define LED5 XBYTE [0xA004]#define LED6 XBYTE [0xA005]#define LED7 XBYTE [0xA006]#define LED8 XBYTE [0xA007]#define KEY XBYTE [0xA100] //键盘地址bit ap=0;//上下午int i=0;//计数器uchar data clock[7]={0,0,0,0,0,0,0};/*扫描键盘使用的变量 */sbit first_row = P1^4; //键盘第一行控制sbit second_row = P1^3; //键盘第二行控制bit first_getkey = 0,control_readkey = 0; //读键盘过程中的标志位bit getkey = 0; //获得有效键值标志位等于1时代表得到一个有效键值bit keyon = 0; //防止按键冲突标志位uchar keynum = 0; //获得的有效按键值寄存器/*数码管显示使用的变量和常量*/uchar lednum = 0; //数码管显示位控制寄存器uchar led[8] = {0,0,0,0,0,0,0,0}; //数码管显示内容寄存器uchar code segtab[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xff}; //七段码段码表// "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D","E", "F", "P" ,"black"void leddisp(void); //数码管显示函数void readkey(void); //读键盘函数void intT0() interrupt 1 //T0 定时中断处理函数{TH0 = -2720/256; //定时器中断时间间隔 4msTL0 = -2720%256;if((clock[2]==0)&&(clock[3]==0)&&(i==125)&&(clock[5]<=5)&&(clock[4]==0))led[7]=17;if((clock[2]==0)&&(clock[3]==0)&&(i==0)&&(clock[5]<=5)&&(clock[4]==0))led[7]=8;i=i+1;if(i==250){if((clock[2]==0)&&(clock[3]==0)&&(clock[4]==0)&&(clock[5]==0)&&(clock[6]==0)){ap=!ap;if(ap==0)led[6]=10;if(ap==1)led[6]=16;}clock[5]=clock[5]+1;i=0;}if(clock[5]==10){clock[5]=0;clock[4]=clock[4]+1;}if(clock[4]==6){clock[4]=0;clock[3]=clock[3]+1;}if(clock[3]==10){clock[3]=0;clock[2]=clock[2]+1;}if(clock[2]==6){clock[2]=0;clock[6]=clock[6]+1;}if(clock[6]==12){clock[6]=0;}clock[0]=clock[6]/10;clock[1]=clock[6]%10;led[5]=clock[0];led[4]=clock[1];led[3]=clock[2];led[2]=clock[3];led[1]=clock[4];led[0]=clock[5];leddisp(); //每次定时中断显示更新一次if(control_readkey == 1) //每两次定时中断扫描一次键盘{readkey();}c ontrol_readkey = !control_readkey;}void main(void){TMOD = 0x01; //TH0 = -2720/256; //定时器中断时间间隔 4msTL0 = -2720%256;TCON = 0x10;ET0 = 1;EA = 1;while(1){if(getkey == 1) //判断是否获得有效按键{getkey = 0;switch(keynum) //判断键值,对不同键值采取相应的用户定义处理方式{case 0x01: //当按下第一行第二列键时,分加一clock[3]=clock[3]+1;break;case 0x02: ////当按下第一行的第三列键时,分减一clock[3]=clock[3]-1;break;case 0x03://当按下第一行的第四列时,时加一clock[6]=clock[6]+1;break;case 0x04:clock[6]=clock[6]-1; //当按下第一行的第五列时,时减一break;default:break;}}}}/***************************************************键盘扫描函数原型: void readkey(void);功能: 当获得有效按键时,令getkey=1,keynum为按键值****************************************************/void readkey(void){uchar M_key = 0;second_row = 0;M_key = KEY;if(M_key != 0xff) //如果有连续两次按键按下,认为有有效按键按下。
基于51单片机的数字钟设计
基于51单片机的数字钟设计目录1 作品的背景与意义 12 功能指标设计 13 作品方案设计 13.1总体方案的选择 13.1.1方案一:基于单片机的数字钟设计 23.1.1方案二:基于数电实验的数字钟设计 33.1.2两种方案的比较......... (3)3.2控制方案比较 33.3显示方案比较 33.4单片机理论知识介绍 43.4.1单片机型号........ (5)3.4.2硬件电路平台.............. (6)3.4.3内部时钟电路........... . (7)3.4.4复位电路............. . (7)3.4.5按键部分............ (8)4 硬件设计94.1显示模块电路图95 软件设计115.1主程序流程图115.2中断服务以及显示 126 系统测试136.1测试环境136.2测试步骤136.2.1硬件测试6.2.2软件测试1.连接单片机和计算机串接............ ..136.2.3实施过程............. .. (14)6.3测试结果187 实验总结................ . (18)7.1代码编写过程中出现问题........... .. (18)7.2整个实验过程的体会................. . (19)7.3实验误差分析。
19参考文献20附录1 系统电路图21附录2 系统软件代码21附录3 系统器件清单261 作品的背景与意义数字钟是采用数字电路实现对.时,分,秒。
数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 而且大大地扩展了钟表原先的报时功能。
基于单片机的数字钟具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,生活中诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等也可广泛应用,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
基于单片机设计的数字钟实验报告
目录1 前言 (3)2 数字钟设计原理 (3)3 流程图 (4)4 51单片机系统的硬件连接 (4)5 程序设计 (6)5.1主程序5.2中断服务子程序5.3 显示子程序5.4 总的程序清单6 系统调试及结果分析 (12)7 注意事项 (12)8 感想与体会 (13)9 参考文献 (13)一.前言20世纪末,电子技术获得了飞速的发展,在其推动下,具有功能强、体积小、可靠性高、价格低廉的单片机在工业控制、数据采集、智能仪表、机电一体化、家用电器等领域得到了广泛的应用,极大的提高了这些领域的技术水平和自动化程度。
现在生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号,对于那些对时间把握非常严格和准确的人或事来说,时间的不准确性带来不小的麻烦,所以说以数码管显示的时钟比指针式的时钟表现出了很大的优势。
数码管显示的时间简明而且读数快,时间准确显示到秒。
数字钟是采用数字电路对时分秒数字显示的计时装置。
数字钟的精度,稳定性远远超过老式机械钟。
数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受到广大消费者的喜爱。
二.数字钟设计原理数字钟实际是对标准频率计数的电路,由于计数的起始时间不可能与标准时间一致,故需要在电路上加一个校时电路,同时标准的时间信号必须做到准确稳定。
通常使用石英晶体振荡电路构成数字钟。
数字钟电子钟由以下几部分组成:按键开关部分,振荡电路部分,89c51单片机控制器,4位数码管显示部分,7407数码管驱动部分。
按键开关振荡电路89C51单片机控制器4位数码管显示7407列驱动三.流程图主程序流程图如图2.3所示,定时器T0中断服务程序流程图如2.4所示。
返回图2.4中断服务程序流程图四.51单片机系统的硬件连接1.硬件电路的设计,硬件电路图如图2.2所示图2.2硬件电路图该电路采用AT89C51单片机最小化应用,采用共阴7段LED数码管显示器,P2.4~P2.7口作为列扫描输出,P0口输出段码数据,P1.2,P1.1口接2个按钮开关,用于调时及功能误差,采用12Mhz晶振,可提高秒计时的精确度。
单片机数字钟实习报告
一、实习目的随着电子技术的飞速发展,单片机作为一种重要的电子元件,在工业、医疗、通讯等领域得到了广泛的应用。
为了更好地掌握单片机的原理和应用,提高动手能力,我们选择了单片机数字钟作为实习项目。
通过本次实习,我们旨在掌握单片机的编程、调试、硬件连接等方面的知识,实现数字时钟的显示与控制。
二、实习内容1. 单片机数字钟硬件设计(1)选用AT89C51单片机作为核心控制单元,具有丰富的片上资源,方便编程和调试。
(2)采用LCD1602液晶显示屏,显示时间、日期等信息。
(3)使用DS1302实时时钟芯片,实现时间的存储和更新。
(4)选用按键作为输入设备,实现时间的调整和设置。
(5)选用蜂鸣器作为报警设备,实现定时报警功能。
2. 单片机数字钟软件设计(1)编写主程序,实现系统初始化、时间显示、按键扫描、时间调整等功能。
(2)编写中断服务程序,实现DS1302时钟芯片的读写、按键消抖等功能。
(3)编写子程序,实现时间的计算、格式化、显示等功能。
3. 单片机数字钟调试与测试(1)连接电路,检查各个模块的连接是否正确。
(2)编写程序,将程序烧录到单片机中。
(3)调试程序,确保程序运行正常。
(4)测试各个功能模块,如时间显示、按键调整、定时报警等。
三、实习过程1. 硬件设计(1)根据设计要求,绘制电路原理图。
(2)购买所需元器件,进行焊接。
(3)组装电路板,连接各个模块。
2. 软件设计(1)编写程序,采用C语言进行编程。
(2)使用Keil软件进行编译、烧录。
(3)在仿真软件Proteus中进行仿真,验证程序的正确性。
3. 调试与测试(1)连接电路,检查各个模块的连接是否正确。
(2)编写程序,将程序烧录到单片机中。
(3)调试程序,确保程序运行正常。
(4)测试各个功能模块,如时间显示、按键调整、定时报警等。
四、实习总结1. 通过本次实习,我们掌握了单片机的编程、调试、硬件连接等方面的知识。
2. 学会了使用LCD1602液晶显示屏、DS1302实时时钟芯片、按键等元器件。
单片机实验报告数字时钟设计报告
单片机实验报告数字时钟设计报告一、实验目的本次单片机实验的目的是设计并实现一个基于单片机的数字时钟。
通过该实验,深入了解单片机的工作原理和编程方法,掌握定时器、中断、数码管显示等功能的应用,提高综合运用知识解决实际问题的能力。
二、实验原理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、实验结果将程序下载到单片机后,数字时钟能够正常运行,准确显示时、分、秒,并且通过按键可以进行时间的调整。
单片机实验报告数字时钟设计报告
单片机实验报告题目:数字时钟的设计指导老师:班级:姓名:学号:一、实验目的通过实践设计出能准确显示时、分、秒的时钟,并可以调时、定时,包括蜂鸣器的整点报时与闹钟功能。
二、实验要求基本功能:准确计时,以数字形式显示时间,24时制;具备时、分调整和整点报时功能。
扩展功能:定时与闹钟功能三、设计方案及论证Ⅰ、硬件部分:1、时钟显示用七段LED数码管来实现,采用共阳管和PNP驱动方式。
PNP工作于开关状态,基极通过1K的电阻连到单片机的P2口。
为节省P口,将六位数码管的8段段选端分别并接并加上470Ω的限流电阻,由P0口控制,给低电平的段会被点亮。
因为六位管的段被并接只能通过动态扫描的方式来显示,即利用管子的余晖和人眼的视觉残留实现六位管子在“同一时间”显示不同的值,而扫描这是靠位选的轮流有效实现。
如左图。
2、整点报时和闹钟铃此部分用一个5V有源蜂鸣器来做,同样用PNP作为开关来控制,此外为防止其可能的方向电压尖峰在蜂鸣器两端反接一个IN4148二极管来保护。
如右图。
3、校时、定时此部分由4个按键控制,如下图,key1和key3用来选定要调校的时、分的位,被选中的为将闪烁;key2用来是选中的为按相应的进制增1变化;key4是进入定时模式,定时的时数改变与调时方法相同。
4、单片机最小系统本实验采用STC89C52RC单片机,指令系统完全与51兼容。
其最小系统包含电源电路、晶振电路、复位电路。
本实验才用STC单片机的典型系统,各模块参数配置如图:其中晶振频率为12MHz,震荡部分电容为30pF的瓷片电容。
复位电路采用图示的兼有上电复位和按键复位功能的方式,其中的电容为10uF电解电容。
5、硬件系统全电路图Ⅱ、软件部分软件部分主要有两大块:一是上电后程序靠定时器T1产生的中断而实现的常规时钟显示,这里面就是要处理时、分、秒的六位数字的循环和进位问题。
按照24时制的规则,其进位逻辑为:秒的个位为十进制(0~9)满10向秒的十位进1,而秒的十位为六进制(0~5)满6向分的个位进1,分与秒相似,时的个位在时的十位为0、1的时候也是10进制,而在时的十位为2的时候则只是0到4就进位了。
基于单片机的数字钟毕业设计(附程序全)
基于单片机的数字钟毕业设计(附程序全) 电子时钟设计随着现代人类生活节奏的加快,人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。
对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以以数码管为显示器的时钟比指针式的时钟表现出了很大的优势。
数码管显示的时间简单明了而且读数快、时间准确性更高~数字钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。
数字钟的精度、稳定度远远超过老式机械钟。
在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz的晶振产生振荡脉冲,并且由单片机的定时器计数。
在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。
数字钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。
关键词:数字钟;单片机;数码管;时间;准确性1目录第一章绪论1. 数字电子钟的意义和应用…………………………………………………………………… 3 第二章整体设计方案2.1 单片机的选择…………………………………………………………………………… 3 2.2 单片机的基本结构……………………………………………………………………… 5 第三章数字钟的硬件设计3.1 最小系统设计…………………………………………………………………………… 9 3.2 LED显示电路…………………………………………………………………………… 12 3.3 键盘控制电路…………………………………………………………………………… 14 第四章数字钟的软件设计4.1 系统软件设计流程图…………………………………………………………………… 15 4.2 数字电子钟的原理图…………………………………………………………………… 18 4.3 主程序…………………………………………………………………………………… 19 4.4 时钟设置子程序………………………………………………………………………… 20 4.5 定时器中断子程序……………………………………………………………………… 20 4.6 LED显示子程序………………………………………………………………………… 21 4.7 按键控制子程序………………………………………………………………………… 23 第五章系统仿真5.1 PROTUES软件介绍................................................................................. 24 5.2 电子钟系统PROTUES仿真........................................................................ 24 结束语. (2)5 参考文献 (26)2第一章绪论1.数字电子钟的意义和应用数字钟是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭、车站、码头、办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
单片机课程设计实验报告-基于单片机的数字时钟-含完整实验代码
单片机课程设计报告基于单片机的数字时钟姓名:班级:学号:一、前言利用实验板上的4个LED数码管,设计带有闹铃、秒表功能的数字时钟。
功能要求:a) b) c) d)计时并显示(LED)。
由于实验板上只有4位数码管,可设计成显示“时分”和显示“分秒”并可切换。
时间调整功能。
利用4个独立按钮,实现时钟调整功能。
这4 个按钮的功能为工作模式切换按钮(MODE),数字加(INC),数字减(DEC)和数字移位(SHITF)。
定闹功能。
利用4个独立按钮设定闹钟时间,时间到以蜂鸣器响、继电器动作作为闹铃。
秒表功能。
最小时间单位0.01秒。
二、硬件原理分析1.电源部分电源部份采用两种输入接口(如上图)。
a)外电源供电,采用2.1 电源座,可接入电源DC5V,经单向保护D1接入开关S1。
b) USB 供电,USB供电口输入电源也经D1单向保护,送到开关S1。
注:两路电源输入是并连的,因此只选择一路就可以了,以免出问题。
S1 为板子工作电源开关,按下后接通电源,提供VCC 给板子各功能电路。
电路采用两个滤波电容,给板子一个更加稳定的工作电源。
LED为电源的指示灯,通电后LED灯亮。
2.蜂鸣器蜂鸣器分为有源和无源两种,有源即两引脚有一个直流电源就可以长鸣,无源则需要一个1K左右的脉冲才可以蜂鸣,因此对于按键的提示音及报警蜂鸣使用有源来得方便。
有源也可以当无源使用,而无源则不能当有源使用,当然用有源蜂鸣器作音乐发声会失真厉害。
如上图:单片机P15输出高低电平经R21连接三极管B 极,控制三极管的导通与截止,从而控制蜂鸣器的工作。
低电平时三极管导通,蜂鸣器得电蜂鸣,高电平时三极管截止,蜂鸣器失电关闭蜂鸣。
3.数码管电路使用一个四位共阳型数码管,四个公共阳级由三极管放大电流来驱动,三极管由P10-P13控制开与关。
数码管的阴级由P0口经过电阻限流连接。
例如,要十位的数码管工作,P12输出0,使三极管Q12导通,8脚得电,当P0口相应位有输出0时,点亮相应的LED灯组合各种字符数字。
单片机课程设计实验报告 基于单片机的数字时钟 含完整实验代码..
单片机课程设计报告基于单片机的数字时钟姓名:班级:学号:一、前言利用实验板上的4个LED数码管,设计带有闹铃、秒表功能的数字时钟。
功能要求:a)计时并显示(LED)。
由于实验板上只有4位数码管,可设计成显示“时分”和显示“分秒”并可切换。
b)时间调整功能。
利用4个独立按钮,实现时钟调整功能。
这4个按钮的功能为工作模式切换按钮(MODE),数字加(INC),数字减(DEC)和数字移位(SHITF)。
c)定闹功能。
利用4个独立按钮设定闹钟时间,时间到以蜂鸣器响、继电器动作作为闹铃。
d)秒表功能。
最小时间单位0.01秒。
二、硬件原理分析1.电源部分电源部份采用两种输入接口(如上图)。
a)外电源供电,采用2.1电源座,可接入电源DC5V,经单向保护D1接入开关S1。
b)USB供电,USB供电口输入电源也经D1单向保护,送到开关S1。
注:两路电源输入是并连的,因此只选择一路就可以了,以免出问题。
S1为板子工作电源开关,按下后接通电源,提供VCC给板子各功能电路。
电路采用两个滤波电容,给板子一个更加稳定的工作电源。
LED为电源的指示灯,通电后LED灯亮。
2.蜂鸣器蜂鸣器分为有源和无源两种,有源即两引脚有一个直流电源就可以长鸣,无源则需要一个1K左右的脉冲才可以蜂鸣,因此对于按键的提示音及报警蜂鸣使用有源来得方便。
有源也可以当无源使用,而无源则不能当有源使用,当然用有源蜂鸣器作音乐发声会失真厉害。
如上图:单片机P15输出高低电平经R21连接三极管B极,控制三极管的导通与截止,从而控制蜂鸣器的工作。
低电平时三极管导通,蜂鸣器得电蜂鸣,高电平时三极管截止,蜂鸣器失电关闭蜂鸣。
电路使用一个四位共阳型数码管,四个公共阳级由三极管放大电流来驱动,三极管由P10-P13控制开与关。
数码管的阴级由P0口经过电阻限流连接。
例如,要十位的数码管工作,P12输出0,使三极管Q12导通,8脚得电,当P0口相应位有输出0时,点亮相应的LED灯组合各种字符数字。
电子钟单片机课程设计报告(含源码)
一、总设计思路电子时钟是我们日常生活中最常见的一种钟表,由于它结构简单、功耗低、时间精度比较准、等优点,使得广泛应用,在未来肯定有很大的市场。
这次课程设计我的目的就是尝试着做一个电子时钟。
1、系统功能显示时间、声音提示、调整时间、设置闹钟的功能。
2、功能硬件实现方案时间显示:时间的显示我选用的是六位七段数码管,由于数码管控制简单,而且显示效果好,所以选用它。
由于静态显示方式比较占资源,而且电路比较复杂,所以我们选择了动态显示方式,电路简单,效果挺好。
时间调整和闹钟设置:是通过外部两个按键触发单片机中断进而控制时间的调整。
其中一个按键是模式选择按键通过触发外部中断0来选择功能,功能主要是选择要调时、调分、调秒、闹钟调时、闹钟调分、闹钟调秒六种模式。
第二个按键通过触发外部中断1来在相应的模式下对时间的大小做调整。
声音提示:通过利用蜂鸣器来作为发生装置,有整点提示功能和闹铃功能。
时间发生:利用单片机自带定时器0做定时,通过软件控制来产生时、分、秒。
3、功能软件实现方案由于单片机C语言已经全面普及,它的程序容易理解、简单易写、可移植性好,所以我们选择用单片机C语言来写。
4、开发环境操作系统:window 7旗舰版64位程序编辑编译软件:KEIL μVision V4.60.6.10仿真软件;Proteus V ersion 7.85.、总设计原理框图STC89C52RC6位七段数码管显示时、分、秒蜂鸣器发声装置时钟复位电路按键调时模块一、硬件设计定时和程序执行及控制模块:我们选择的是宏晶科技生产的STC89C52RC芯片,它在很多硬件资源上比8051提升了不少,所以在后期我们可以做更多扩展和维护。
时间显示模块::采用六个七段带小数点的共阴极数码管。
声音提示模块:采用简单蜂鸣器做声音提示。
调时模块:通过两个简单按键来触发中断调时。
时钟复位模块:采用11.0592MHz的晶振,提供单片机工作频率。
二、设计原理图三、芯片解说STC89C52:是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash存储器。
单片机电子时钟报告及汇编代码
单片机电子日历时钟设计一、设计的目的及其意义(1)巩固、加深和扩大51系列单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力;(2)培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力;(3)对课题设计方案的分析、选择、比较、熟悉用51单片机做系统开发、研制的过程,软硬件设计的方法、内容及步骤。
二、本实验设计的功能2.1 基本功能1)显示北京时间2)校准时间;3)使用汇编语言4)时、分、秒之间或年、月、日间以小数点分隔;2.2 扩展功能(1)显示公历日期(2)校准日期(3)运动秒表(4)闹钟功能三、总体设计方案本实验使用汇编语言设计,程序的流程图大致如下:主程序流程图:显示闹钟子程序流程图:运动秒表子程序流程图:校准闹钟,日期和时间的子程序流程图:四、源程序ORG 0000HAJMP BEGINORG 000BHLJMP TINTOYEARH EQU 30H ;年高位存放地址YEARL EQU 31H ;年低位存放地址MONTH EQU 32H ;月存放地址DAY EQU 33H ;日存放地址HOUR EQU 34H ;时存放地址MIN EQU 35H ;分存放地址SEC EQU 36H ;秒存放地址MSEC EQU 37H ;10ms存放地址SECM EQU 38HYDMSEC EQU 39H ;运动秒针存放地址YDSECM EQU 40HBEEP BIT P1^3 ;蜂鸣器AHOUR EQU 41H ;闹钟时存放地址AMIN EQU 42H ;闹钟分存放地址DEDA EQU 43H ;5ms计数值PFOUR BIT P0.4PFIVE BIT P0.5PSIX BIT P0.6PSEVEN BIT P0.7BEGIN:CALL INITIALLOOP:CALL SHOW_TIME1 ;默认为显示时间CALL RINGCALL SCAN_KEY ;键盘扫描CJNE A,#0EEH,JUDGE1 ;如果A=EEH,则显示日期年和月CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE1CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2CALL SHOW_DATE2JUDGE1:CJNE A,#0DEH,JUDGE2 ;如果A=DEH,则显示闹钟SA:CALL SHOW_ALARMCALL SCAN_KEYCJNE A,#0EEH,SA ;在显示闹钟时按下EEH键则是返回时间模式JUDGE2:CJNE A,#0EDH,JUDGE3 ;如果A=EDH,则依次调闹钟,日期和时间CALL ADJUSTJUDGE3:CJNE A,#0DDH,JUDGE4 ;如果A=DDH,则显示时间分,秒ST2:CALL SHOW_TIME2CALL SCAN_KEYCJNE A,#0EDH,OTHER ;在显示分,秒时按下EDH 键则是运动秒表模式CLRYD:MOV MSEC,#0MOV SECM,#0AJMP ST3OTHER:CJNE A,#0EEH,ST2 ;按下EEH键则是返回时间模式AJMP JUDGE4ST3: ;运动秒表计时开始MOV YDMSEC,MSECMOV YDSECM,SECMCALL SHOW_TIME3CALL SCAN_KEYCJNE A,#0DEH,ST3 ;按下DEH键则是停止秒表STOP:CALL SHOW_TIME3CALL SCAN_KEYCJNE A,#0DDH,OW ;按下DDH键,运动秒表则从零从新开始计时AJMP CLRYDOW: CJNE A,#0EDH,OTHERWISE ;按下EDH键则继续运动秒表的计时,仍按DEH停止秒表MOV MSEC,YDMSECMOV SECM,YDSECMAJMP ST3OTHERWISE:CJNE A,#0EEH,STOP ;按下EEH键返回时间模式JUDGE4:AJMP LOOPRING: ;若闹钟时钟为24,则闹钟为关闭状态MOV A,HOURCJNE A,AHOUR,RTMOV A,MINCJNE A,AMIN,RTCLR BEEPRT:RETSHOW_TIME1: ;显示时间(时和分)MOV DPTR,#TABLE ;数字编码表基址MOV A,MIN ;显示分,minMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第三个数码管CALL SHOW ;显示数值CALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第四个数码管CALL SHOWCALL DELAYMOV A,HOUR ;显示小时,hourMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV DPTR,#TABLE2MOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYMOV P0,#00HRETSHOW_TIME2: ;显示时间(分和秒)MOV DPTR,#TABLE ;数字编码表基址MOV A,SEC ;显示秒,secMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第三个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第四个数码管CALL SHOWCALL DELAYMOV A,MIN ;显示分钟minMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV DPTR,#TABLE2MOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYMOV P0,#00H ;P0置零,熄灭数码管RETSHOW_TIME3: ;显示运动秒针(s和10ms) MOV DPTR,#TABLE ;数字编码表基址MOV A,YDMSEC ;显示10msMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第三个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第四个数码管CALL SHOWCALL DELAYMOV A,YDSECM ;显示秒MOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV DPTR,#TABLE2MOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYMOV P0,#00H ;P0置零,熄灭数码管RETSHOW_DATE1: ;显示日期(年)MOV DPTR,#TABLE ;数字编码表基址MOV A,YEARHMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01HCALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02HCALL SHOWCALL DELAYMOV A,YEARLMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04HCALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08HCALL SHOWCALL DELAYRETSHOW_DATE2: ;显示日期(月和日)MOV DPTR,#TABLE ;数字编码表基址MOV A,DAYMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第3个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第4个数码管CALL SHOWCALL DELAYMOV A,MONTHMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第1个数码管CALL SHOWCALL DELAYMOV DPTR,#TABLE2MOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第2个数码管CALL SHOWCALL DELAYMOV P0,#00HRETADJUST: ;调整闹钟,日期和时间ALARM1: ;调整闹钟的小时数MOV DPTR,#TABLEMOV A,AHOURMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV DPTR,#TABLE2MOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CHECK1 ;如果A=DEH,则闹钟小时加1MOV A,AHOURCJNE A,#24,INC1MOV AHOUR,#0CALL LDELAYAJMP ALARM1INC1:INC AMOV AHOUR,ACALL LDELAYAJMP ALARM1CHECK1:CJNE A,#0EEH,CHECK2 ;如果A=EEH,则闹钟小时减1MOV A,AHOURCJNE A,#0,DEC1MOV AHOUR,#24 ;当闹钟时钟调到24的时候,则相当于关闭闹钟CALL LDELAYAJMP ALARM1DEC1:DEC AMOV AHOUR,ACALL LDELAYAL1:AJMP ALARM1CHECK2:CJNE A,#0DDH,CHECK3 ;如果A=DDH,则返回RETCHECK3:CJNE A,#0EDH,AL1 ;如果A=EDH,则调整闹钟的分钟数ALARM2: ;调整闹钟的分钟数MOV DPTR,#TABLEMOV A,AMINMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第三个数码管CALL SHOW ;显示数值CALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第四个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CHECK4 ;如果A=DEH,则闹钟分钟加1 MOV A,AMINCJNE A,#59,INC2MOV AMIN,#0CALL LDELAYAJMP ALARM2INC2:INC AMOV AMIN,ACALL LDELAYAJMP ALARM2CHECK4:CJNE A,#0EEH,CHECK5 ;如果A=EEH,则闹钟小时减1 MOV A,AMINCJNE A,#0,DEC2MOV AMIN,#59CALL LDELAYAJMP ALARM2DEC2:DEC AMOV AMIN,ACALL LDELAYAL2:AJMP ALARM2CHECK5:CJNE A,#0DDH,CHECK6 ;如果A=DDH,则返回RETCHECK6:CJNE A,#0EDH,AL2 ;如果A=EDH,则调整日期(年)DA TE1: ;调整年的高位MOV DPTR,#TABLEMOV A,YEARHMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CHECKYH1 ;如果A=DEH,则日期年高位加1MOV A,YEARHCJNE A,#99,INCYRH1MOV YEARH,#0CALL LDELAYAJMP DA TE1INCYRH1:INC AMOV YEARH,ACALL LDELAYAJMP DA TE1CHECKYH1:CJNE A,#0EEH,CHECKYH2 ;如果A=EEH,则日期年高位减1MOV A,YEARHCJNE A,#0,DECYRH1MOV YEARH,#99CALL LDELAYAD1:AJMP DA TE1DECYRH1:DEC AMOV YEARH,ACALL LDELAYAJMP DA TE1CHECKYH2:CJNE A,#0DDH,CHECKYH3 ;如果A=DDH,则返回RETCHECKYH3:CJNE A,#0EDH,AD1 ;如果A=EDH,则调整日期年的低位DA TE2: ;调整年的低位MOV DPTR,#TABLEMOV A,YEARLMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第3个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第4个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CHECKYL1MOV A,YEARLCJNE A,#99,INCYRL1MOV YEARL,#0CALL LDELAYAJMP DA TE2INCYRL1: ;年低位加1INC AMOV YEARL,ACALL LDELAYAJMP DA TE2CHECKYL1:CJNE A,#0EEH,CHECKYL2MOV A,YEARLCJNE A,#0,DECYRL1MOV YEARL,#99CALL LDELAYAD2: AJMP DA TE2DECYRL1: ;年低位减1DEC AMOV YEARL,ACALL LDELAYAJMP DA TE2CHECKYL2:CJNE A,#0DDH,CHECKYL3 ;返回RETCHECKYL3:CJNE A,#0EDH,AD2 ;跳到调整月,日MON:MOV DPTR,#TABLEMOV A,MONTHMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CHECKM1 ;如果A=DEH,则月份加1MOV A,MONTHCJNE A,#12,INCM1MOV MONTH,#1CALL LDELAYAM: AJMP MONINCM1:INC AMOV MONTH,ACALL LDELAYAJMP MONCHECKM1:CJNE A,#0EEH,CHECKM2 ;如果A=EEH,则月份减1MOV A,MONTHCJNE A,#1,DECM1MOV MONTH,#12CALL LDELAYAJMP MONDECM1:DEC AMOV MONTH,ACALL LDELAYAJMP MONCHECKM2:CJNE A,#0DDH,CHECKM3 ;如果A=DDH,则返回RETCHECKM3:CJNE A,#0EDH,AM ;如果A=EDH,则调整日ADAY:MOV DPTR,#TABLEMOV A,DAYMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第3个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第4个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CH1 //如果A=DEH,判断月份MOV A,MONTHCJNE A,#1,N2AJMP T31N2:CJNE A,#2,N3AJMP T2N3:CJNE A,#3,N4AJMP T31N4:CJNE A,#4,N5AJMP T30N5:CJNE A,#5,N6AJMP T31N6:CJNE A,#6,N7AJMP T30N7:CJNE A,#7,N8AJMP T31N8:CJNE A,#8,N9AJMP T31N9:CJNE A,#9,N10AJMP T30N10:CJNE A,#10,N11AJMP T31N11:CJNE A,#11,T31AJMP T30CH1:AJMP CHECKD1T31: //该月份有31天MOV A,DAYCJNE A,#31,INCD1 //判断是否为31号MOV DAY,#0CALL LDELAYAJMP ADAYINCD1:INC AMOV DAY,ACALL LDELAYAJMP ADAYT30: //该月份有30天MOV A,DAYCJNE A,#30,INCDD1 //判断是否为30号MOV DAY,#0CALL LDELAYAJMP ADAYINCDD1:INC AMOV DAY,ACALL LDELAYAJMP ADAYT2: ;特殊的2月MOV B,#4MOV A,YEARLCJNE A,#0,NORMAL1AJMP CENTURY1NORMAL1:DIV ABMOV A,BCJNE A,#0,COMMON1BISSEXTILE1:MOV A,DAY ;闰年CJNE A,#29,INC2DAY ;未够29天MOV DAY,#1CALL DELAYAJMP ADAYINC2DAY:INC DAYCALL LDELAYAJMP ADAYCOMMON1:MOV A,DAY ;平年CJNE A,#28,INC2DAY2 ;未够28天MOV DAY,#1CALL DELAYAJMP ADAYINC2DAY2:INC DAYCALL LDELAYAJMP ADAYCENTURY1: ;世纪年MOV A,YEARHDIV ABMOV A,BCJNE A,#0,COMMON1AJMP BISSEXTILE1CHECKD1:CJNE A,#0EEH,CH2MOV A,MONTHCJNE A,#1,NN2AJMP U31NN2:CJNE A,#2,NN3AJMP U2NN3:CJNE A,#3,NN4AJMP U31NN4:CJNE A,#4,NN5AJMP U30NN5:CJNE A,#5,NN6AJMP U31NN6:CJNE A,#6,NN7AJMP U30NN7:CJNE A,#7,NN8AJMP U31NN8:CJNE A,#8,NN9AJMP U31NN9:CJNE A,#9,NN10AJMP U30NN10:CJNE A,#10,NN11AJMP U31NN11:CJNE A,#11,U31AJMP U30CH2:AJMP CHECKD2U31:MOV A,DAYCJNE A,#0,DECD1MOV DAY,#31CALL LDELAYAJMP ADAYDECD1:DEC AMOV DAY,ACALL LDELAYAJMP ADAYU30:MOV A,DAYCJNE A,#0,DECDD1MOV DAY,#30CALL LDELAYAJMP ADAYDECDD1:DEC AMOV DAY,ACALL LDELAYAJMP ADAYU2: ;特殊的2月MOV A,YEARLCJNE A,#0,NORMAL2AJMP CENTURY2NORMAL2:DIV ABMOV A,BCJNE A,#0,COMMON2BISSEXTILE2:MOV A,DAY ;闰年CJNE A,#1,DEC2DAY ;未够29天MOV DAY,#29CALL DELAYAJMP ADAYDEC2DAY:DEC DAYCALL LDELAYAJMP ADAYCOMMON2:MOV A,DAY ;平年CJNE A,#1,DEC2DAY2 ;未够28天MOV DAY,#28CALL DELAYAJMP ADAYDEC2DAY2:DEC DAYCALL LDELAYADA:AJMP ADAYCENTURY2: ;世纪年MOV A,YEARHDIV ABMOV A,BCJNE A,#0,COMMON2AJMP BISSEXTILE2CHECKD2:CJNE A,#0DDH,CHECKD3 ;如果A=DDH,则返回RETCHECKD3:CJNE A,#0EDH,ADA ;如果A=EDH,则调整时间;跳到调整月,日TIME1: ;调整时间的小时数MOV DPTR,#TABLEMOV A,HOURMOV B,#10MOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV DPTR,#TABLE2MOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CHECKT1 ;时间小时数加1 MOV A,HOURCJNE A,#23,INCT1MOV HOUR,#0CALL LDELAYAJMP TIME1INCT1:INC AMOV HOUR,ACALL LDELAYAJMP TIME1CHECKT1:CJNE A,#0EEH,CHECKT2MOV A,HOURCJNE A,#0,DECT1MOV HOUR,#23CALL LDELAYTI1:AJMP TIME1DECT1: ;时间小时数减1 DEC AMOV HOUR,ACALL LDELAYAJMP TIME1CHECKT2:CJNE A,#0DDH,CHECKT3RETCHECKT3:CJNE A,#0EDH,TI1 ;调整时间的分钟数TIME2:MOV DPTR,#TABLE ;数字编码表基址MOV A,MINMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第三个数码管CALL SHOW ;显示数值CALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第四个数码管CALL SHOWCALL DELAYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCALL SCAN_KEYCJNE A,#0DEH,CHECKT4MOV A,MINCJNE A,#59,INCT2MOV MIN,#0CALL LDELAYLJMP TIME2INCT2: ;时间分钟数加1 INC AMOV MIN,ACALL LDELAYLJMP TIME2CHECKT4:CJNE A,#0EEH,CHECKT5MOV A,MINCJNE A,#0,DECT2MOV MIN,#59CALL LDELAYLJMP TIME2DECT2: ;时间分钟数减1 DEC AMOV MIN,ACALL LDELAYTI2:LJMP TIME2CHECKT5:CJNE A,#0DDH,CHECKT6RETCHECKT6:CJNE A,#0EDH,TI2RETSHOW_ALARM: ;显示闹钟MOV DPTR,#TABLE ;数字编码表基址MOV A,AMINMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#04H ;点亮第三个数码管CALL SHOWCALL DELAYMOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#08H ;点亮第四个数码管CALL SHOWCALL DELAYMOV A,AHOURMOV B,#10DIV ABMOVC A,@A+DPTRANL P0,#0F0HORL P0,#01H ;点亮第一个数码管CALL SHOWCALL DELAYMOV DPTR,#TABLE2MOV A,BMOVC A,@A+DPTRANL P0,#0F0HORL P0,#02H ;点亮第二个数码管CALL SHOWCALL DELAYMOV P0,#00HRETSCAN_KEY: ;P2低4位控制行,高4位控制列MOV P2,#0FH ;行扫描MOV A,P2CJNE A,#0FH,KEY1 ;A不等于#0F,表示当前有键按下KEY1:CALL DELAYMOV A,P2CJNE A,#0FH,SCAN1 ;延时排除按键抖动情况MOV A,#0FFHRETSCAN1:MOV A,P2 ;记录行状态SCAN2:MOV P2,#0F0H ;列扫描MOV R6,P2ORL A,R6 ;行列读取结果相或得出键值,由A存放键值:RETINITIAL:MOV YEARH,#20 ;初始化控制变量MOV YEARL,#13MOV MONTH,#09MOV DAY,#20MOV HOUR,#10MOV MIN,#30MOV SEC,#46MOV MSEC,#00MOV SECM,#00MOV DEDA,#00MOV AHOUR,#10MOV AMIN,#31;对涉及到的中断,进行设置SETB EA ;开总中断SETB ES ;使能串口中断SETB ET0 ;使能定时器0中断SETB TR0 ;启动定时0CLR ET1 ;关定时器1中断CLR EX0 ;关外部中断0CLR EX1 ;关外部中断1MOV SCON,#50H ;SM0/SM1=0/1,设置成串口1方式,10位通用异步接发, ;8位数据,可变波特率,接收允许MOV TMOD,#21H ;T1: M1/M0=1/0 波特率发生器T1工作在模式2,8位自动重装初值定时计数;T0: M1/M0=0/1 工作在模式1,作16位定时器MOV PCON,#80H ;SMOD置1,使得波特率翻倍为2400x2=4800BPSMOV TH1,#0F3H ;预置初值(按照波特率2400BPS预置初值)MOV TL1,#0F3H ;预置初值(按照波特率2400BPS预置初值)SETB TR1 ;启动定时器T1SETB BEEP ;关闭蜂鸣器MOV TH0,#0ECHMOV TL0,#78HMOV P0,#00HRETDELAY: ;延迟子程序,延时10msMOV 05H,#100DE0: MOV 06H,#100DE1: DJNZ 06H,DE1DJNZ 05H,DE0RETLDELAY: ;延迟子程序,延时500ms MOV 07H,#50LDE0: MOV 05H,#100LDE1: MOV 06H,#100LDE2: DJNZ 06H,LDE2DJNZ 05H,LDE1LDE3: DJNZ 07H,LDE0RET;在数码管上显示数字SHOW: ;数码管显示函数MOV R6,AMOV R7,#01HS1:ANL A,R7 ;取出A的一位JNZ S3S2:CLR PSEVENAJMP S4S3:SETB PSEVENS4:SETB PFOUR ;将数据寄存器PSEVEN值移进移位寄存器NOPCLR PFOURNOPMOV A,R7RL AMOV R7,AMOV A,R6CJNE R7,#01H,S1 ;判断A的8位是否全部取出CLR PFIVENOPSETB PFIVERETTINTO: ;定时器0计时中断程序每隔5ms中断一次INC DEDAMOV 55H,DEDA ;运动秒针,低位MSEC每10ms计数ANL 55H,#01HMOV R6,55HCJNE R6,#0,POPACMOV R6,MSECCJNE R6,#99,INCMMOV MSEC,#00MOV R6,SECMCJNE R6,#59,INCSMOV SECM,#00AJMP POPACINCM:INC MSECAJMP POPACINCS:INC SECMPOPAC:MOV A,DEDACJNE A,#200,AGAIN ;判断是否1S到了MOV DEDA,#0SECOND:INC SECMOV A,SECCJNE A,#60,AGAIN ;判断是否1min到了MINUTE:MOV SEC,#0INC MINMOV A,MINCJNE A,#60,AGAIN ;判断是否1h到了HOURS:MOV MIN,#0MOV A,HOURCJNE A,#24,AGAINMOV A,MONTH ;辨别大月和小月CJNE A,#1,MONTH2AJMP THIRTY_ONE_DAYSMONTH2:CJNE A,#2,MONTH3AJMP FEBRUARYMONTH3:CJNE A,#3,MONTH4AJMP THIRTY_ONE_DAYSMONTH4:CJNE A,#4,MONTH5AJMP THIRTY_DAYSMONTH5:AJMP THIRTY_ONE_DAYSMONTH6:CJNE A,#6,MONTH7AJMP THIRTY_DAYSMONTH7:CJNE A,#7,MONTH8AJMP THIRTY_ONE_DAYSMONTH8:CJNE A,#8,MONTH9AJMP THIRTY_ONE_DAYSMONTH9:CJNE A,#9,MONTH10MONTH10:CJNE A,#10,MONTH11AJMP THIRTY_ONE_DAYSMONTH11:CJNE A,#11,MONTH12AJMP THIRTY_DAYSMONTH12:AJMP THIRTY_ONE_DAYSAGAIN:MOV TL0,#078HSETB TR0 ;启动定时器RETITHIRTY_ONE_DAYS: ;大月31天MOV HOUR,#0 ;时归0MOV A,DAYCJNE A,#31,INCDAY ;未够31天AJMP MONTHSAJMP AGAINTHIRTY_DAYS: ;小月30天MOV HOUR,#0 ;时归0MOV A,DAYCJNE A,#30,INCDAY2 ;未够30天AJMP MONTHSAJMP AGAINFEBRUARY: ;特殊的2月MOV B,#4MOV A,YEARLCJNE A,#0,NORMALAJMP CENTURYNORMAL:DIV ABCJNE A,#0,COMMONBISSEXTILE: ;闰年MOV HOUR,#0 ;时归0MOV A,DAYCJNE A,#29,INCDAY ;未够29天AJMP MONTHSCOMMON: ;平年MOV HOUR,#0 ;时归0CJNE A,#28,INCDAY ;未够28天AJMP MONTHSCENTURY: ;世纪年MOV A,YEARHMOV A,BCJNE A,#0,COMMONAJMP BISSEXTILEMONTHS:MOV DAY,#01CJNE A,#12,INCMONTHAJMP INCYEARINCMONTH:INC MONTHAJMP AGAININCYEAR: ;判断数字是否超出显示管显示范围MOV MONTH,#01MOV A,YEARLCJNE A,#99,INCYLAJMP GO_ONINCYL:INC YEARLGO_ON:MOV YEARL,#0MOV A,YEARHCJNE A,#99,INCYHAJMP ZEROINCYH:INC YEARHLJMP AGAINZERO:MOV YEARH,#0LJMP AGAINTABLE:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H ;0 1 2 34 5 6 7 8 9 ,不带小数点TABLE2:DB 0FDH,61H,0DBH,0F3H,67H,0B7H,0BFH,0E1H,0FFH,0F7H ;带小数点END五、系统的使用和操作说明按下开关,如下图所示显示初始设定的时间10:30分。
(完整word版)单片机课程设计数字钟报告
For personal use only in study and research; not for commercial use单片机课程设计正文数字钟是采用数字电路实现对时,分,秒,数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能.诸如定时自动报警、按时自动打铃、时程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的.因此,研究数字钟及扩大其应用,有着非常现实的意义。
二、For personal use only in study and research;not for commercial use三、四、题目及要求设计一个多功能数字钟,使其具有以下功能:1、由晶振电路产生标准秒信号.2、能够显示时、分、秒:完成显示由秒00一直加1至59,再恢复为00;分加1,由00至01,一直加1至59,再恢复00;时加1,由00至01,一直加1到23,再恢复00。
3、要有手动快速校时、校分、秒。
4、要有报时电路(蜂鸣器每分钟短叫一声,一小时长叫一声).5、自定义电路,设计、调试,并完成实验报告.要求设计基于单片机的多功能数字钟,即用单片机来实现课程设计。
五、总体思路数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。
由于计数的起始时间不可能与标准时间一致,故需要在电路上加一个校时电路。
对于一般的数字钟多会有报时功能.针对以上叙述,可整体构想:标准频率可由振荡电路产生,更精确时,可由石英晶体产生。
计数,可由2个60进制计数器,分别作为秒、分计数单元,一个24进制,作为时计数单元。
计数单元同样可采用中断定时方式,这就需要由软件来实现。
单片机数字时钟实验报告
单片机数字时钟实验报告引言:数字时钟是现代人们生活中不可或缺的物品之一。
现代数字时钟的核心是单片机,而且数字时钟的制作也是单片机初学者的必备实验之一。
本文将详细介绍单片机数字时钟的制作过程和原理。
实验原理:数字时钟的原理非常简单,它由单片机、时钟芯片、LED数码管等元件组成。
单片机通过时钟芯片来获取时间信息,并将时间信息通过端口输出给LED数码管,从而显示当前时间。
单片机的主要作用是控制时钟芯片的读取和LED数码管的显示。
实验材料:1. 单片机:STC89C522. 时钟芯片:DS13023. LED数码管:共阳极4位LED数码管4. 电路板、电阻、电容、晶体振荡器、按键、排针等元件实验步骤:1. 确定电路原理图:根据实验原理,确定单片机、时钟芯片和LED 数码管之间的电路连接方式。
2. 绘制电路布局图:将电路原理图转换为真实的电路布局图,并根据元件大小和数量选择合适的电路板。
3. 焊接电路:根据电路布局图进行电路的焊接,并进行电路的检查和修正。
4. 编写程序:根据实验原理编写单片机程序,并将程序下载到单片机中。
5. 测试程序:将电路接通电源后,通过按键和LED数码管来测试程序的正确性和稳定性。
实验结果:经过实验,我们成功制作了一款单片机数字时钟。
该数字时钟具有以下功能:1. 显示当前的小时、分钟和秒钟。
2. 可以通过按键进行时间的调整。
3. 每隔一秒钟左右,LED数码管上的数据会刷新一次,以显示最新的时间信息。
4. 当电源断开后,时钟芯片会自动保存当前时间信息,重新通电后,显示的时间信息仍然是正确的。
结论:通过本次实验,我们了解了单片机数字时钟的制作原理和步骤,并成功制作了一款数字时钟。
通过实验,我们深入了解了单片机的应用,也为我们今后的电子设计和制作提供了很好的基础。
基于C51单片机的数字时钟课程设计(C语言,带闹钟).
单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词:电子钟 AT89C52 硬件设计软件设计目录一、数字电子钟设计任务、功能要求说明及方案介绍 (4)1.1 设计课题设计任务 (4)1.2 设计课题的功能要求说明 (4)1.3 设计课的设计总体方案介绍及工作原理说明 (4)二、设计课题的硬件系统的设计 (5)2.1硬件系统各模块功能简要介绍 (5)2.1.1 AT89C52简介 (5)2.1.2 按键电路 (6)三、设计课题的软件系统的设计 (6)3.1 使用单片机资源的情况 (6)3.2 软件系统个模块功能简要介绍 (7)3.3 软件系统程序流程框图 (7)3.4 软件系统程序清单 (7)四、设计课题的设计结论、仿真结果、误差分析 (9)4.1 设计结论及使用说明 (9)4.2 仿真结果 (10)结束语 (12)参考文献 (12)附录 (13)附录A:程序清单 (13)一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。
具有时间显示,并有时间设定,时间调整功能。
1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。
该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。
单片机课程设计报告——数字时钟
单片机课程设计报告——数字时钟用8031单片机CPU及串口电路设计一个时钟第一章设计阐明 (3)1.1 设计内容 (3)1.2 设计请求 (3)1.3设备及工作环境 (3)第二章硬件计划 (3)2.1 设计思路 (3)2.2 原理电路图 (4)2.3 重要元件功效阐明 (5)2.4 硬件工作原理论述 (6)第三章软件计划 (6)3.1 分析论证 (6)3.2 程序流程图 (8)3.3 程序清单 (12)第四章调试过程及成果分析 (18)第五章设计总结 (19)参考文献 (19)第一章设计阐明1. 1设计内容用8013单片机CPU及串口电路设计并实现显示时间的实时时钟。
1. 2设计请求(1)在ZY15MCU12BD型综合单片机实验箱的硬件结构上编写软件完成设计。
(2)程序的首地址应使目标机可以直接运行,即从0000H开端。
在主程序的开端部分必须设置一个合适的栈底。
程序放置的地址须持续且靠前,不要在中间留下大批的空间地址,以使目标机可以应用较少的硬件资源。
(3) 6位显示器数码管从左到右分辨显示时. 分. 秒(各占用2位),采用24小时标准计时制。
开端计时时为000000,到235959后变成000000.(4)在XD1—2键盘上选定3个键分辨作为小时. 分. 秒的调校键。
每按一次键,对应的显示值便加1。
分. 秒加到59后变为00;小时加到23后再按键即变为00.再调校时均不向上一单位进位(例如分加到59后变为00;但小时不产生转变).(5)软件设计必须应用8031片内定时器,采用定时中断结构,不得应用软件延时法。
(6)上机调试程序。
(7)写出设计报告。
2. 3设备及工作环境(1) 硬件:盘算机一台、ZY15MCU12BD型综合单片机实验箱一台、通信电缆一根。
(2) 软件:Windows操纵系统、Keil C51软件。
第二章硬件计划2.1 设计思路电子时钟重要由显示模块、校时模块和时钟运算模块三大部分组成。
单片机数字电子钟课程设计实训报告
第一章设计概要设计要求:1、用单片机及6位LED数码管显示时、分、秒00时00分00秒——23时59分59秒循环运行2、整点提醒0,1…23时短蜂鸣3、用按键实现时、分、秒调整*4、省电功能(关闭显示)*5、定时设定提醒如设定08时15分00秒长蜂鸣*6、秒表功能显示××分××秒. ××健复位从00分00秒00开始计时启动从00分00秒00开始计时停止显示实际计时××分××秒××第二章硬件设计方案2.1设计框架图2.2总体设计方案说明设计框架图如图2.1所示总共分为5小部分:时间显示部分,键盘控制部分,单片机部分,闹钟部分,电源部分。
本设计各部分由统一电源集中供电,外加被用电源确保主电源断电时备用电源及时供电避免时间的丢失.采用12MHZ晶振为单片机提供时钟。
显示部分采用容易购买的LED八段数码显示管,利用单片机输出高低电平实现数码管的刷新显示。
LED具有显示明亮,容易识别,价格便宜等优点,特别适合时间的显示。
按键部分采用普通的按建开关,使用查询方式从而节约元件。
12.3数码显示管设计部分.图3.1-1数码显示部分采用八块共阳极八段数码显示管分别对时,分,秒进行显示。
将第三块和第六块显示横杠,可以使时间显示更美观.显示部分采用刷新显示方案.具体如下:当p2口输出第一块的三极管导通,u1数码管被选中,然后p0口输出数字的数码管编码。
如p0口输出时u1数码管就输出数字0。
当循环右移一位是u2被选通显示。
依次类推u1-u8数码管显示完成,再循环显示。
由于单片机的刷新速度很快所以8个数码管看起来就像同时显示的一样。
2.4 键盘控制电路键盘部分采用普通的按键进行设计,使用软件延时消除开关抖动.2.5 闹铃电路闹铃电路通过p1.7口输出1HZ脉冲使蜂鸣器发出间隔为一秒的蜂鸣声.32.6电源电路2.7 总体电路图设计图3.4-15第三章软件设计方案3.1 程序流程图3.2 总体程序设计//主程序ORG 0000HAJMP MAINORG 000BHAJMP TZPORG 0030HMAIN: MOV SP,#60HMOV R4,#00HMOV TMOD,#02hMOV TH0,#06HMOV TL0,#06HSETB EASETB ET0SETB TR0//初始化MOV R2,#3MOV R1,#30HLOOP: MOV @R1,#00HINC R1DJNZ R2,LOOPLCALL RINGPI//7LOOP2: MOV R2,#6MOV R1,#30HLCALL DPZP// 开启节能功能JB P1.0,XWJNJB P1.0,$//// 闹钟设置入口ZWJN: JB P1.1,XPP1LCALL RINGPLCALL RELAY////调时入口XPP1: JB P1.3,XPP2LCALL ZPP1XPP2: JB P1.2,ZPPLCALL ZPP2ZPP: AJMP LOOP2////定时器0中断TZP: PUSH 00HPUSH 03HINC R4 // 软件-硬件延时1秒CJNE R4,#40,ENDIMOV R4,#0INC R5CJNE R5,#100,ENDI //结束MOV R5,#0ZP: MOV R0,#30HMOV R3,#3MOV DPTR,#TCOUNTLCALL TTZPLCALL RINGENDI: POP 03HPOP 00HRETI//定时器0中断返回//软中断1ZPP1: MOV A,31HADD A,#1DA AMOV 31H,ACJNE A,#60H,END1MOV 31H,#00HEND1: LCALL RELAYRET////软中断2ZPP2: MOV A,32H9ADD A,#1DA AMOV 32H,ACJNE A,#24H,END2MOV 32H,#00HEND2: LCALL RELAYRET////延时显示程序RELAY: MOV R6,#255REP: MOV R7,#4REEE: MOV R2,#6MOV R1,#30HLCALL DPZPDJNZ R7,REEEDJNZ R6,REPRET//延时显示程序结束//显示子程序DPZP: MOV P0,#0FFH // 显示横杠MOV P2,#0DBHMOV P0,#0BFH // END DPZP1: MOV P0,#0FFHMOV DPTR,#CHART //P3partMOV A,R2MOVC A,@A+DPTRMOV P2,A //MOV DPTR,#LEDMOV A,@R1JNB F0,DPZPSINC R1SWAP ADPZPS: ANL A,#0FHMOVC A,@A+DPTRMOV P0,ACPL F0DJNZ R2,DPZP1RET//显示子程序结束//不规则循环加一子程序TTZP: MOV A,@R0ADD A,#1DA AMOV @R0,AMOV A,R3MOVC A,@A+DPTRCLR CSUBB A,@R011JNC RTTZPMOV @R0,#0INC R0DJNZ R3,TTZP RTTZP: RET// 响铃程序RING: MOV R0,#34HMOV 24H,#6 RRING: MOV A,31HSUBB A,@R0JNZ ERINGINC R0MOV A,32HSUBB A,@R0DEC R0JNZ ERINGCPL P1.7RETERING: MOV A,R0ADD A,#3MOV R0,ADJNZ 24H,RRINGSETB P2.1RET//// 闹钟调整程序RINGP: MOV 20H,#33HMOV 21H,#6MOV R3,#20MOV 22H,#5LPRP: LCALL RELAY1JB P1.1,LPRP1MOV R3,#20MOV A,20HADD A,#3MOV 20H,ADJNZ 22H,LPRPRETLPRP1: JB P1.3,LPRP2MOV R3,#20HMOV A,20HADD A,#1MOV R0,AMOV A,@R0ADD A,#1MOV @R0,ADA ACJNE A,#60H,LPRP21MOV @R0,#00H13LPRP21: LCALL RELAY1 LPRP2: JB P1.2,LPRP3MOV R3,#20HMOV A,20HADD A,#2MOV R0,AMOV A,@R0ADD A,#1DA AMOV @R0,ACJNE A,#24H,LPRP31MOV @R0,#00H LPRP31: LCALL RELAY1 LPRP3: DJNZ R3,LPRP LPRPEND: RET////闹钟组初始化程序(共5组) RINGPI: MOV R2,#5MOV R1,#41H LPRPI: MOV @R1,#00HDEC R1MOV @R1,#00HDEC R1MOV A,#00HORL A,#0A0HADD A,R2MOV @R1,ADEC R1DJNZ R2,LPRPIRET////延时显示程序1RELAY1: MOV R6,#255REP1: MOV R7,#4REEE1: MOV R2,21HMOV R1,20HLCALL DPZPDJNZ R7,REEE1DJNZ R6,REP1RET//延时显示程序结束//数据表LED: DB0c0H,0f9H,0a4H,0b0H,099H,092H,82H,0f8H,80H,90H,8EH,0A8H//0,1,2,3,4,5,6,7,8,9,F,n CHART: DB 0FEH,0FEH,0FDH,0F7H,0EFH,0BFH,7FHTCOUNT: DB 0,23H,59H,59HEND15第四章心得体会4.1心得体会在整个课程设计完后,总的感觉是:有收获。
课程设计实验报告基于单片机的数字时钟设计
绪论随着时代的进步和发展,单片机技术已经普及到生活、工作、科研等各个领域,已经成为一种比较成熟的技术。
本文将介绍一种基于单片机控制的数字温度计和数字钟,本数字温度计属于多功能温度计,可以任意设置温度的上下限报警功能,当温度不在设定范围内时,可以报警;本数字钟可以同步显示时间日历,日期和时间都可通过按键校整。
本系统采用的DS1302可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。
本系统显示部分采用LCD液晶显示屏显示,工作方便,外形美观一、方案设计本项目拟设计基于单片机的数字时钟和数字温度计,并将时间和温度显示在液晶显示器上。
本系统由主控模块、时钟模块、显示模块、测温模块共4个模块组成。
主控芯片使用89系列的AT89C52单片机。
时钟芯片使用DS1302,DS1302做为计时芯片,可以做到及时准确。
DS1302可以在很小电流的后备电源(2.5~5.5V电源,在2.5V时耗小于300nA)下继续计时,并可编程选择多种充电电流来对后备电源进行慢速充电,可以保证后备电源基本不耗电。
测温模块采用DS18B20,具有测温准确,测温范围宽,电路简单的优点。
显示模块采用液晶显示屏LCD1602,LCD1602电路简单,功耗低,显示信息量大,显示质量高,显示界面美观、友好。
1、主控制器的选择ATmega16是AVR系列中的一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准AVR指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的ATmega16单片机可为您提供许多较复杂系统控制应用场合。
另外,在校期间所涉及到也主要是MCS-51系列单片机,对于其内部功能和指令系统较为熟悉,能在较为短的项目内完成项目的设计和验证。
2、时钟功能的实现时钟功能的实现有两种方案:一是用软件实现,直接用单片机的定时器编程以实现时钟;二是用专门的时钟芯片实现时钟的记时,再把时间数据送入单片机,由单片机控制显示。
单片机课程设计数字钟实验报告
单片机课程设计:电子钟一、实现功能1、能够实现准确计时,以数字形式显示时、分、秒的时间。
2、小时以24小时计时形式,分秒计时为60进位,能够调节时钟时间。
3、闹钟功能,一旦走时到该时间,能以声或光的形式告警提示。
4、能够实现按键启动与停止功能。
5、能够实现整点报时功能。
6、能够实现秒表功能。
二、设计思路1、芯片介绍VCC:电源。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL 门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机课程设计报告基于单片机的数字时钟姓名:班级:学号:一、前言利用实验板上的4个LED数码管,设计带有闹铃、秒表功能的数字时钟。
功能要求:a)计时并显示(LED)。
由于实验板上只有4位数码管,可设计成显示“时分”和显示“分秒”并可切换。
b)时间调整功能。
利用4个独立按钮,实现时钟调整功能。
这4个按钮的功能为工作模式切换按钮(MODE),数字加(INC),数字减(DEC)和数字移位(SHITF)。
c)定闹功能。
利用4个独立按钮设定闹钟时间,时间到以蜂鸣器响、继电器动作作为闹铃。
d)秒表功能。
最小时间单位0.01秒。
二、硬件原理分析1.电源部分电源部份采用两种输入接口(如上图)。
a)外电源供电,采用2.1电源座,可接入电源DC5V,经单向保护D1接入开关S1。
b)USB供电,USB供电口输入电源也经D1单向保护,送到开关S1。
注:两路电源输入是并连的,因此只选择一路就可以了,以免出问题。
S1为板子工作电源开关,按下后接通电源,提供VCC给板子各功能电路。
电路采用两个滤波电容,给板子一个更加稳定的工作电源。
LED为电源的指示灯,通电后LED灯亮。
2.蜂鸣器蜂鸣器分为有源和无源两种,有源即两引脚有一个直流电源就可以长鸣,无源则需要一个1K左右的脉冲才可以蜂鸣,因此对于按键的提示音及报警蜂鸣使用有源来得方便。
有源也可以当无源使用,而无源则不能当有源使用,当然用有源蜂鸣器作音乐发声会失真厉害。
如上图:单片机P15输出高低电平经R21连接三极管B极,控制三极管的导通与截止,从而控制蜂鸣器的工作。
低电平时三极管导通,蜂鸣器得电蜂鸣,高电平时三极管截止,蜂鸣器失电关闭蜂鸣。
电路使用一个四位共阳型数码管,四个公共阳级由三极管放大电流来驱动,三极管由P10-P13控制开与关。
数码管的阴级由P0口经过电阻限流连接。
例如,要十位的数码管工作,P12输出0,使三极管Q12导通,8脚得电,当P0口相应位有输出0时,点亮相应的LED灯组合各种字符数字。
4.独立键盘如上图,由六个按键组成,每个按键的一端连接IO口,另一端直接连接GND(0电位)。
六个按键分别接入P37-P32,只要按下按键,相应位的IO口位将被拉为低电平(0),程序可以判断相应位是否为0来确认按键己按下。
动态显示驱动电路是单片机应用中最常用的显示方式。
动态显示接口电路是把所有显示器的8个笔划段的同名段连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。
CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是哪个显示器亮,则取决于COM端。
在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人眼的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
动态扫描显示必须由CPU不断地调用显示程序,才能保证持续不断的显示。
在实际工作中,当然不可能只显示,这样在两次调用显示程序之间的时间间隔就不一定了,如果时间间隔比较长,就会使显示不连续。
三、软件设计主程序将按键1设定为功能选择键,每按一次按键1,进入相应的功能模式。
●分秒显示分秒显示模式下,数码管显示时钟时间的分和秒。
当按键1按下后,进入下一模式。
●时分显示时分显示模式下,数码管显示时钟时间的时和分。
当按键1按下后,进入下一模式。
时间调整时间调整模式下,仅调整时钟的时、分。
数码管闪烁的为当前调整的位子,按键2为加,按键3为减,按键4为移位键。
闹钟闹钟模式下,可设置闹钟的时、分。
数码管闪烁的为当前调整的位子,按键2为加,按键3为减,按键4为移位键。
当闹钟时间调整完毕之后,按下按键5,确认闹钟时间。
随后等待时钟时间到达闹钟时间。
时钟时间到达闹钟时间后,蜂鸣器工作。
秒表秒表模式下,按下按键4,秒表开始计时;再次按下按键4,秒表暂停。
按下按键2或按键3,秒表清零。
四、软件调试在软件调试过程中碰到了很多问题。
其中比较重要的几个问题如下:1、时钟调整子程序中,时、分的十位数、个位数加减不符合常识。
比如在加减时,小时可以达到27、28等数值,而这是不符合常识的。
在查看代码后发现,可以在加、减过程中设置if函数判断当前所处位置,调整当前数值所能达到的最大值或最小值。
修改后代码如下:else if(keyval==0xbf) //按键2 加{if(pos==0){dispbuf[pos]++;if(dispbuf[pos]==3){dispbuf[pos]=0;}}else if(pos==1){if(dispbuf[0]==0||dispbuf[0]==1){dispbuf[pos]++;dispbuf[pos]=dispbuf[pos]%10;}if(dispbuf[0]==2){dispbuf[pos]++;if(dispbuf[pos]>=4){dispbuf[pos]=0;}}}else if(pos==2){dispbuf[pos]++;if(dispbuf[pos]==6){dispbuf[pos]=0;}}else if(pos==3){dispbuf[pos]++;dispbuf[pos]=dispbuf[pos]%10;}}else if(keyval==0xdf) //按键3 减{if(pos==0){if(dispbuf[pos]==0)dispbuf[pos]=2;else dispbuf[pos]--;}else if(pos==1){if(dispbuf[0]==0||dispbuf[0]==1){if(dispbuf[pos]==0)dispbuf[pos]=9;else dispbuf[pos]--;}if(dispbuf[0]==2){if(dispbuf[pos]>=4&&dispbuf[pos]<=9){dispbuf[pos]=3;}else if(dispbuf[pos]==0){dispbuf[pos]=3;}else{dispbuf[pos]--;}}}else if(pos==2){if(dispbuf[pos]==0)dispbuf[pos]=5;else dispbuf[pos]--;}else if(pos==3){if(dispbuf[pos]==0)dispbuf[pos]=9;else dispbuf[pos]--;}}2、秒表模式下,无法很好地区分当前计时所达到的具体数值。
在秒的个位数位子设置一个小数点,使秒表的显示更加直观。
修改后代码如下:在程序开始处,添加如下代码:unsigned char code segtab_dot[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点的数码管代码在void t0int(void) interrupt 1 using 1之中添加如下代码:if(mode==4&&P1==0xfd) //秒表处显示小数点的if语句{P0=segtab_dot[dispbuf[dispindex]];}else{P0=segtab[dispbuf[dispindex]];}3、在秒表运行一遍后,进入其他模式操作完毕,再次进入秒表模式下发现秒表无法清零。
检查代码后发现,在闹钟模式下,进入秒表模式时,未对秒表清零。
修改后代码如下:if(keyval==0x7f)//1号按键模式进入秒表模式{mode=4;old_ss=0;old_ms=0;miaobiao_ss=old_ss;miaobiao_ms=old_ms;dispbuf[0]=miaobiao_ss/10;dispbuf[1]=miaobiao_ss%10;dispbuf[2]=miaobiao_ms/10;dispbuf[3]=miaobiao_ms%10;clocksing=0;}附完整实验代码:/*********************************************************************** 基于单片机的数字时钟功能:时钟、闹钟、秒表模式0:时钟显示模式-分、秒模式0下,数码管显示时钟时间-分、秒。
按键说明:按键1:选择下一模式。
模式1:时钟显示模式-时、分模式1下,数码管显示时钟时间-时、分。
按键说明:按键1:选择下一模式。
模式2:时钟调整模式模式2下,调整时钟时间,仅调整时、分时间。
按键说明:按键1:选择下一模式。
按键2:增加选中数码管的数值。
按键3:减少选中数码管的数值。
按键4:移位键,按键选择下一数码管。
模式3:闹钟模式模式3下,设置闹铃时间之后,等时钟到达相应时间,发出铃声。
按键说明:按键1:选择下一模式。
按键2:增加选中数码管的数值。
按键3:减少选中数码管的数值。
按键4:移位键,按键选择下一数码管。
按键5:设置闹铃时间后,按键确认,数码管显示当前时钟时间。
模式4:秒表模式模式4为秒表模式,可记录0-59秒。
最小时间单位为0.01秒。
按键说明:按键1:选择下一模式。
按键2:清除秒表当前数值。
按键3:清除秒表当前数值。
按键4:开始、暂停秒表。
***********************************************************************/#include <reg52.h>unsigned char dispbuf[4]={0,0,0,0};unsigned char code segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //不带小数点的数码管代码unsigned char code segtab_dot[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点的数码管代码unsigned char code bittab[]={0xfe,0xfd,0xfb,0xf7};unsigned char dispindex;unsigned char mode;unsigned char pos;unsigned char keyval;unsigned char hh,mm,ss;unsigned char miaobiao_ms=0,miaobiao_ss=0; //秒表unsigned char old_ms,old_ss; //保存秒表时间unsigned char clock_hh,clock_mm; //用于存放所设闹钟时间unsigned int clock_shanshuo; //用于控制闹钟调整时间时是否闪烁 0:闪烁 1:不闪烁sbit clocksing=P1^5; //闹钟所用蜂鸣器unsigned int cnt; //用于10ms转1s计数unsigned char cnt1; //用于10ms转0.5s处计数(用于闪烁)unsigned char cnt2; //用于秒表处计时unsigned char keyscan(void);void delay(unsigned int t);void keypro(void);bit flash;/******************主函数******************/void main(void){TMOD=0x11;TH0=(0-2000)/256;TL0=(0-2000)%256;ET0=1;TR0=1;TH1=(0-2000)/256;TL1=(0-2000)%256;ET1=1;TR1=0; //秒表先不开EA=1;mode=0;hh=02;mm=03;ss=15;while(1){if(mode==3){if(hh==clock_hh){if(mm==clock_mm){clocksing=0;}}else{clocksing=1;}}else{clocksing=1;}if(keyscan()==0xff) continue;keypro();}}/******************键扫描程序******************/ unsigned char keyscan(void){P3=0xff;keyval=P3;if(keyval==0xff){return 0xff;}delay(10000);if(keyval!=P3){return 0xff;}else{while(P3!=0xff);return keyval;}}/******************时钟中断及显示程序******************/ void t0int(void) interrupt 1 using 1{TH0=(0-2000)/256; //2msTL0=(0-2000)%256;P0=0xff;P1=0xff;P1=bittab[dispindex];if(mode==4&&P1==0xfd) //秒表处显示小数点的if语句{P0=segtab_dot[dispbuf[dispindex]];}else{P0=segtab[dispbuf[dispindex]];}if((dispindex==pos)&&(flash==1)&&(mode==2||(mode==3&&clock_shanshuo==0))) //闪烁控制程序{P0=0xff;P1=0xf0;}dispindex++;dispindex=dispindex&0x03;cnt++;cnt1++;if(cnt1>=250) //0.5ms闪烁{cnt1=0;flash=~flash;}if(cnt>=500) //2ms*500=1s{cnt=0;ss++;if(ss>=60){ss=0;mm++;if(mm>=60){mm=0;hh++;if(hh>=24){hh=0;}}}if(mode==0){dispbuf[0]=mm/10;dispbuf[1]=mm%10;dispbuf[2]=ss/10;dispbuf[3]=ss%10;}else if(mode==1||(mode==3&&clock_shanshuo==1)){dispbuf[0]=hh/10;dispbuf[1]=hh%10;dispbuf[2]=mm/10;dispbuf[3]=mm%10;}}}/******************按键选择,进入不同模式******************/ void keypro(void){switch(mode){case 0://显示分秒if(keyval==0x7f){mode=1;dispbuf[0]=hh/10;dispbuf[1]=hh%10;dispbuf[2]=mm/10;dispbuf[3]=mm%10;}break;case 1://显示时分if(keyval==0x7f){mode=2;dispbuf[0]=hh/10;dispbuf[1]=hh%10;dispbuf[2]=mm/10;dispbuf[3]=mm%10;}break;case 2://时间调整(只调整时分)if(keyval==0x7f) //按键1 调整模式进入闹钟模式{mode=3;clock_hh=0;clock_mm=0;clock_shanshuo=0;hh=dispbuf[0]*10+dispbuf[1]; //保存调整后的时间mm=dispbuf[2]*10+dispbuf[3];dispbuf[0]=clock_hh/10; //显示闹钟的初始时间dispbuf[1]=clock_hh%10;dispbuf[2]=clock_mm/10;dispbuf[3]=clock_mm%10;TR0=1;}else if(keyval==0xbf) //按键2 加{if(pos==0){dispbuf[pos]++;if(dispbuf[pos]==3){dispbuf[pos]=0;}}else if(pos==1){if(dispbuf[0]==0||dispbuf[0]==1){dispbuf[pos]++;dispbuf[pos]=dispbuf[pos]%10;}if(dispbuf[0]==2){dispbuf[pos]++;if(dispbuf[pos]>=4){dispbuf[pos]=0;}}}else if(pos==2){dispbuf[pos]++;if(dispbuf[pos]==6){dispbuf[pos]=0;}}else if(pos==3){dispbuf[pos]++;dispbuf[pos]=dispbuf[pos]%10;}}else if(keyval==0xdf) //按键3 减{if(pos==0){if(dispbuf[pos]==0)dispbuf[pos]=2;else dispbuf[pos]--;}else if(pos==1){if(dispbuf[0]==0||dispbuf[0]==1){if(dispbuf[pos]==0)dispbuf[pos]=9;else dispbuf[pos]--;}if(dispbuf[0]==2){if(dispbuf[pos]>=4&&dispbuf[pos]<=9){dispbuf[pos]=3;}else if(dispbuf[pos]==0){dispbuf[pos]=3;}else{dispbuf[pos]--;}}}else if(pos==2){if(dispbuf[pos]==0)dispbuf[pos]=5;else dispbuf[pos]--;}else if(pos==3){if(dispbuf[pos]==0)dispbuf[pos]=9;else dispbuf[pos]--;}}else if(keyval==0xef) //按键4 移位{pos++;pos=pos&03;}break;case 3: //闹钟模式if(keyval==0x7f) //按键1 调整模式进入秒表模式{mode=4;old_ss=0;old_ms=0;miaobiao_ss=old_ss;miaobiao_ms=old_ms;dispbuf[0]=miaobiao_ss/10;dispbuf[1]=miaobiao_ss%10;dispbuf[2]=miaobiao_ms/10;dispbuf[3]=miaobiao_ms%10;}else if(keyval==0xbf) //按键2 加{clock_shanshuo=0;if(pos==0){dispbuf[pos]++;if(dispbuf[pos]==3){dispbuf[pos]=0;}}else if(pos==1){if(dispbuf[0]==0||dispbuf[0]==1){dispbuf[pos]++;dispbuf[pos]=dispbuf[pos]%10;}if(dispbuf[0]==2){dispbuf[pos]++;if(dispbuf[pos]>=4){dispbuf[pos]=0;}}}else if(pos==2){dispbuf[pos]++;if(dispbuf[pos]==6){dispbuf[pos]=0;}}else if(pos==3){dispbuf[pos]++;dispbuf[pos]=dispbuf[pos]%10;}}else if(keyval==0xdf) //按键3 减{clock_shanshuo=0;if(pos==0){if(dispbuf[pos]==0)dispbuf[pos]=2;else dispbuf[pos]--;}else if(pos==1){if(dispbuf[0]==0||dispbuf[0]==1){if(dispbuf[pos]==0)dispbuf[pos]=9;else dispbuf[pos]--;}if(dispbuf[0]==2){if(dispbuf[pos]>=4&&dispbuf[pos]<=9){dispbuf[pos]=3;}else if(dispbuf[pos]==0){dispbuf[pos]=3;}else{dispbuf[pos]--;}}}else if(pos==2){if(dispbuf[pos]==0)dispbuf[pos]=5;else dispbuf[pos]--;}else if(pos==3){if(dispbuf[pos]==0)dispbuf[pos]=9;else dispbuf[pos]--;}}else if(keyval==0xef) //按键4 移位{clock_shanshuo=0;pos++;pos=pos&03;}else if(keyval==0xf7) //按键5 设置闹钟时间{clock_shanshuo=1;clock_hh=dispbuf[0]*10+dispbuf[1]; //保存所设闹钟时间clock_mm=dispbuf[2]*10+dispbuf[3];dispbuf[0]=hh/10;dispbuf[1]=hh%10;dispbuf[2]=mm/10;dispbuf[3]=mm%10;}break;case 4: //秒表模式if(keyval==0x7f) //按键1 调整模式进入时钟显示模式{mode=0;TR1=0; //关闭秒表dispbuf[0]=mm/10;dispbuf[1]=mm%10;dispbuf[2]=ss/10;dispbuf[3]=ss%10;}else if(keyval==0xef) //按键4 开始、暂停{old_ss=miaobiao_ss;old_ms=miaobiao_ms;TR1=~TR1;}else if(keyval==0xbf||keyval==0xdf) //按键2或按键3 清零{miaobiao_ss=0;miaobiao_ms=0;dispbuf[0]=miaobiao_ss/10;dispbuf[1]=miaobiao_ss%10;dispbuf[2]=miaobiao_ms/10;dispbuf[3]=miaobiao_ms%10;}break;default:break;}}/******************延时程序******************/void delay(unsigned int t){while(t--);}/******************中断程序,用于秒表******************/ void t1int(void) interrupt 3 using 3{TH1=(0-2000)/256;TL1=(0-2000)%256;cnt2++;if(cnt2>=5){cnt2=0;miaobiao_ms++;if(miaobiao_ms>=100){miaobiao_ms=0;miaobiao_ss++;if(miaobiao_ss>=60){miaobiao_ss=0;}}dispbuf[0]=miaobiao_ss/10;dispbuf[1]=miaobiao_ss%10;dispbuf[2]=miaobiao_ms/10;dispbuf[3]=miaobiao_ms%10;}}五、学习体会通过本次单片机课程设计,不仅加深了我对单片机理论课程知识的认识,而且通过将理论与实践相结合,使我真正地全面理解单片机的功能。