单片机综合实验报告51电子时钟
单片机电子时钟实验报告
电子时钟预备知识:数码管:内部接线C语言程序:一、电子时钟(一)设计目的通过电子时钟综合设计,使学生学会利用8051定时器时间计时处理功能,了解按键扫描及控制LED数码管显示原理,掌握单片机和按键以及LED数码管硬件电路设计及控制程序的设计方法。
思考按键消除抖动、LED动态显示与静态显示的特点,从而提高学生解决实际问题的能力。
(二)设计任务及要求利用实验平台上4个LED数码管,设计带有闹铃功能的数字时钟,要求:1.在4位数码管上显示当前时间。
显示格式“时时分分”2.由LED闪动做秒显示。
3.利用按键可对时间及闹玲进行设置,并可显示闹玲时间。
当闹玲时间到蜂鸣器发出声响,按停止键使可使闹玲声停止。
(三)我采用的是TB-22766板子,单片机类型是STC89C52RC(四)软件设计思想:采用语言:C语言,主要中断:内部T0中断为唯一的中断,主程序大体分为两部分:无按键被按下时的显示,有按键被按下时,输入定时时间或者书输入当前时间,然后的显示软件,最后是一个蜂鸣器的控制程序。
前面是三个子程序:两个按键扫描和一个延时小程序。
N具体的C语言程序:/*---------------------------------------------------------------------------------------------------------------------=======================================基于JD51开发板的电子闹钟程序=======================================************************************程序功能说明********************************************************************* ***1、基础功能为计时,并显示当前时间。
基于单片机制作电子时钟实训分析报告
基于51单片机制作电子时钟实训报告————————————————————————————————作者:————————————————————————————————日期:2绪论单片机应用简述.................................... 电子时钟简介...................................... 电子时钟的基本特点................................ 任务要求.........................................设计方案.........................................控制系统的硬件设计................................芯片的选择....................................... AT89S51的功能概述............................... AT89S51引脚功能说明(附引脚图)................... LED数码管显示电路................................ 硬件设计及元器件技术说明电子元器件技术说明………. 控制系统的软件设计................................ 程序编程......................................... 流程图........................................... 测试调试........................................... 总结...............................................单片机应用简述目前,单片机正朝着高性能和多品种方向发展趋势是进一步向着CMOS化、低功耗、小体积,大容量、高性能、低价格和外围电路内装化等几个方面发展。
51单片机数字钟设计实习报告
51单片机数字钟设计实习报告目录一.设计方案: (3)二.设计内容: (3)三.相关总线及芯片介绍: (3)1.SPI总线: (3)2.74LS595芯片: (4)3. 实验箱电路图: (6)四.系统软件程序设计: (6)五.设计程序: (8)六.程序调试及显示: (11)七.实习心得: (12)八.参考文献: (13)一.设计方案:通过单片机内部的计数/定时器,采用软件编程来实现时钟计数,一般称为软时钟,这种方法的硬件线路简单,系统的功能一般与软件设计相关,通常用在对时间精度要求不高的场合。
二.设计内容:这里采用应用广泛的C51作为时钟控制芯片,利用单片机内部的定时/计数器T0 实现软时钟的目的。
首先将T0设定工作于定时方式,对机器周期计数形成基准时间(50ms),然后用另一个定时/计数器T1对基准时间计数形成秒,秒计60次形成分,分计60形成小时,小时计到12或者24。
通过外部中断实现12进制与24进制的切换。
最后通过数码管把它们的内容在相应的位置显示出来,达到时、分、秒计时的功能。
三.相关总线及芯片介绍:1.SPI总线:SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。
外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。
SPI 总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。
由于SPI系统总线一共只需3~4位数据线和控制即可实现与具有SPI总线接口功能的各种I/O器件进行接口,而扩展并行总线则需要8根数据线、8~16位地址线、2~3位控制线,因此,采用SPI总线接口可以简化电路设计,节省很多常规电路中的接口器件和I/O口线,提高设计的可靠性。
单片机电子时钟(LCD显示)综合实验报告
单片机综合实验报告题目:电子时钟(LCD)显示一、实验内容:以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间:●使用字符型LCD显示器显示当前时间。
●显示格式为“时时:分分:秒秒”。
●用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。
功能键K1~K4功能如下。
●K1—进入设置现在的时间。
●K2—设置小时。
●K3—设置分钟。
●K4—确认完成设置。
程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00:00”,然后开始计时。
二、实验电路及功能说明1)单片机主控制模块以AT89C51单片机为核心进行一系列控制。
2)时钟显示模块用1602为LCD显示模块,把对应的引脚和最小系统上的引脚相连,连接后用初始化程序对其进行简单的功能测试。
测试成功后即可为实验所用,如图:3)时间调整电路用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。
功能键K1~K4功能如下。
K1—进入设置现在的时间。
K2—设置小时。
K3—设置分钟。
K4—确认完成设置。
如图:三、实验程序流程图:主程序:时钟主程序流程子程序:四、实验结果分析实验结果及分析:单片机的晶振可以根据要求设定。
6MHZ为和现实时间显示相同。
实验采用12MHZ晶振采用方式1定时,选取50ms采用20次中断达到一秒,采用查表方式控制LCD显示。
当烧入程序后开始运行,根据初始值设定可以观察到显示的时间,这里为了更明显观察显示数据变化把起始值设为23:59:50 运行后显示,K1为进入现在设置时间,当按下K1后显示,和实验要求相比较,实现了按下K1进入现在时间设置,按下K4确认完成时间设置的功能;不同之处: 当进入时间设置时在按下K1设置小时,再次按下K1是设置分钟。
增加功能:进入时间设置并选择设置位置后K2键位数字增加功能,K3键为数字减小功能。
根据仿真结果能够确定编程正确,基本实现了所有功能,而且有所改进。
单片机实验报告(电子时钟)
一、课程设计的内容和要求:1了解单片机的种类,掌握单片机的工作原理;2 掌握利用单片机进行系统设计的方法;3掌握利用protel进行原理图设计和PCB设计的方法;4学会进行单片机硬件调试和软件调试;5 了解单片机系统整个设计开发流程。
二、设计装置功能1、用单片机实现设计要求(1)实现功能:①正常的24小时制的电子表功能显示(时/分/秒)。
②任意时间(时/分/秒)闹钟时刻的设置并在设定时刻响铃。
(2)所使用器件:STC 89C52RC单片机1个、2位共阳极数码管3个、蜂鸣器1个、74LS138一片、74LS47一片、74HC04一片、电阻、电容及其他辅助电子元件。
(3)显示时间与闹钟时刻的设置:单片机的人机操作部分由六个按钮组成。
从电子钟电路板上(从左到右)分别是:①单片机复位键②闹钟开关③小时位累加键④分钟位累加键⑤秒钟位累加键⑥闹钟/时间显示切换键按键说明:复位键——把3个2位数码管显示数字全部清零。
闹钟开关键——按下键,闹钟开关模式切换。
时针位累加键——按下键,则实现时针位的累加00-23(累加循环)。
分针位累加键——按下键,则实现分针位的累加00-59(累加循环)。
秒针位累加键——按下键,则实现秒针位的累加00-59(累加循环)。
闹钟/时间显示切换键——按下键,能够实现数码管闹钟和时间两种显示功能的切换。
三、设计问题分析面对的问题主要是两方面:一个是软件的设计,也就是实现计时定时的控制功能的程序编辑,在电脑上模拟需要实现的功能;另一个是硬件的设计,需要我们自己购买器件、设计并焊接电路板。
而更为重要的一步是将软件、硬件相结合,做好电路后,我们试着把程序写入芯片测试,然而没有获得应该有的显示,接着我们多次检查电路,修改程序,在不断调试中终于实现正确显示。
四、设计思路本次设计的系统以动态显示显示时分秒模块,它能显示正确的时间,而且所显示时间与北京时间相同,基本做到同步,显示清晰明亮,可读性强。
系统主程序开始后,首先是对系统环境初始化,设置好时分秒后系统开始运行;然后可打开闹钟,预设响铃的时刻,计时系统到该时刻后自动响设定铃声。
51单片机电子时钟课程设计报告实验报告
《单片机原理与应用》课程设计总结报告题目:单片机电子时钟(带秒表)的设计设计人员:张保江江润洲学号:********** **********班级:自动化1211指导老师:***目录1.题目与主要功能要求 (2)2.整体设计框图及整机概述 (3)3.各硬件单元电路的设计、参数分析及原理说明 (3)4.软件流程图和流程说明 (4)5.总结设计及调试的体会 (10)附录1.图一:系统电路原理图 (11)2.图二:系统电路PCB (12)3.表一:元器件清单 (13)4.时钟程序源码 (14)题目:单片机电子时钟的设计与实现课程设计的目的和意义课程设计的目的与意义在于让我们将理论与实践相结合。
培养我们综合运用电子课程中的理论知识解决实际性问题的能力。
让我们对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立完成某些单片机应用系统的开发和设计打下一个坚实的基础。
课程设计的基本任务利用89C51单片机最小系统,综合应用单片机定时器、中断、数码显示、键盘输入等知识,设计一款单片机和简单外设控制的电子时钟。
主要功能要求最基本要求1)使用MCS-51单片机设计一个时钟。
要求具有6位LED显示、3个按键输入。
2)完成硬件实物制作或使用Pruteus仿真(注意位驱动应能提供足够的电流)。
3)6位LED数码管从左到右分别显示时、分、秒(各占用2位),采用24小时标准计时制。
开始计时时为000000,到235959后又变成000000。
4)使用3个键分别作为小时、分、秒的调校键。
每按一次键,对应的显示值便加1。
分、秒加到59后再按键即变为00;小时加到23后再按键即变为00。
在调校时均不向上一单位进位(例如分加到59后变为00,但小时不发生改变)。
5) 软件设计必须使用MCS-51片内定时器,采用定时中断结构,不得使用软件延时法,也不得使用其他时钟芯片。
基于51单片机多功能电子时钟设计报告
单片机课程设计报告多功能电子数字钟姓名:学号:班级:指导教师:目录一课程设计题目-------------------------------- 3 二电路设计--------------------------------------- 4 三程序整体设计思路概述------------------- 5 四各模块程序设计及流程图---------------- 6 五程序及程序说明见附录------------------- ** 六课程设计心得及体会---------------------- 11 七参考资料--------------------------------------- 12一题目及要求本次单片机课程设计在Proteus软件仿真平台下实现,完成电路设计连接,编程、调试,仿真出实验结果。
具体要如下:用8051单片机设计扩展6位数码管的静态或动态显示电路,再连接几个按键和一个蜂鸣器报警电路,设计出一个多功能电子钟,实现以下功能:(1)走时(能实现时分秒,年月日的计时)(2)显示(分屏切换显示时分秒和年月日,修改时能定位闪烁显示)(3)校时(能用按键修改和校准时钟)(4)按时报警(能定点报时)本次课程设计要求每一个学生利用Proteus仿真软件独立设计制作出电路图、完成程序设计和系统仿真调试,验收时能操作演示。
最后验收检查结果,评定成绩分为:(1)完成“走时+显示+秒闪”功能----合格(2)完成“校时修改”功能----中等(3)完成“校时修改位闪”----良好(4)完成“定点报警”功能,且利用资源少----优秀二电路设计(电路设计图见附件电路图)(1)采纳89C51型号单片机(2)采纳8位共阴数码管(3)因为单片机输出高电平常输出的电流不足以驱动数码管,因此在P0口与8位数码管之间加74LS373来驱动数码管(4)P2口与数码管选择位直接加74LS138译码器(5)蜂鸣器接口。
51单片机电子时钟课程设计实验报告
《单片机原理与应用》课程设计总结报告题目:单片机电子时钟(带秒表)的设计设计人员:张保江江润洲学号: 13 29班级:自动化1211指导老师:阮海容目录1.题目与主要功能要求 (2)2.整体设计框图及整机概述 (3)3.各硬件单元电路的设计、参数分析及原理说明 (3)4.软件流程图和流程说明 (4)5.总结设计及调试的体会 (10)附录1.图一:系统电路原理图 (11)2.图二:系统电路 PCB (12)3.表一:元器件清单 (13)4.时钟程序源码 (14)题目:单片机电子时钟的设计与实现课程设计的目的和意义课程设计的目的与意义在于让我们将理论与实践相结合。
培养我们综合运用电子课程中的理论知识解决实际性问题的能力。
让我们对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立完成某些单片机应用系统的开发和设计打下一个坚实的基础。
课程设计的基本任务利用89C51单片机最小系统,综合应用单片机定时器、中断、数码显示、键盘输入等知识,设计一款单片机和简单外设控制的电子时钟。
主要功能要求最基本要求1)使用MCS-51单片机设计一个时钟。
要求具有6位LED显示、3个按键输入。
2)完成硬件实物制作或使用Pruteus仿真(注意位驱动应能提供足够的电流)。
3)6位LED数码管从左到右分别显示时、分、秒(各占用2位),采用24小时标准计时制。
开始计时时为000000,到235959后又变成000000。
4)使用3个键分别作为小时、分、秒的调校键。
每按一次键,对应的显示值便加1。
分、秒加到59后再按键即变为00;小时加到23后再按键即变为00。
在调校时均不向上一单位进位 (例如分加到59后变为00,但小时不发生改变)。
5) 软件设计必须使用MCS-51片内定时器,采用定时中断结构,不得使用软件延时法,也不得使用其他时钟芯片。
51单片机电子时钟设计报告
电子时钟实验报告全部代码在文档末尾:51单片机,LCD1602液晶显示屏平台下编程实现,可直接编译运行目录:一,实验目的 (1)二,实验要求 (2)三,实验基本原理 (2)四,实验设计分析 (2)五,实验要现 (3)A.电路设计 (3)1. 整体设计 (3)2. 分块设计 (4)2.1 输入部分 (4)2.2 输出部分 (5)2.3 晶振与复位电路 (6)B.程序设计 (6)B.1 程序总体设计 (6)B.2 程序主要模块 (7)五.实验总结及感想 (9)一,实验目的20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。
对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以电子钟是以其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,得到了广泛的使用。
1. 学习8051定时器时间计时处理、按键扫描及LCD液晶显示的设计方法。
2. 设计任务及要求利用实验平台上LCD1602液晶显示屏,设计带有闹铃功能的数字时钟二,实验要求A.基本要求:1. 在LCD1602液晶显示屏上显示当前日期,时间。
2. 利用按键可对时间及闹玲进行设置,并可显示设置闹玲的时间。
闹玲时间到蜂鸣器发出声响,一分钟后闹铃停止。
B.扩展部分:1.日历功能(能对年,月,日,星期进行显示,分辨平年,闰年以及各月天数,并调整)实现年月日时分秒的调整,星期准确的随着日期改变而改变进行显示。
2.定时功能(设定一段时间长度,定时到后,闹铃提示)C.可扩展部分:1.闹铃重响功能(闹铃被停止后,以停止时刻开始,一段时间后闹铃重响,且重响时间的间隔可调)2.可进行备忘录提示,按照年月日,可在设定的某年某月进行闹铃提示。
51单片机时钟实训报告
时、分、秒计时器设计一、任务及要求用51单片机设计时、分、秒计时器,具体要求如下。
1、具有时、分、秒计时功能和8位数码管显示功能,显示格式为:“时-分-秒”;2、用Proteus设计仿真电路进行结果仿真;3、4人组成设计小组完成,小组成员有明确分工,1人负责总体方案设计及报告撰写,2人负责功能模块函数设计,1人负责仿真电路设计及调试。
4、完成程序设计、仿真电路设计、结果仿真。
5、本实验要求设计一个数字计时器,可以完成0分00秒~23小时59分59秒的计时功能,并在控制电路的作用下有开机清零。
6、指标要求:①.显示时、分、秒。
②采用24小时制,小时计数器按“23翻00”规律计数。
.③为了保证计时准确、稳定,由单片机的定时器来计时。
7、设计要求:①画出电路原理图(或仿真电路图);②元器件及参数选择;③电路仿真与调试;④连接实物图,并调试;⑤写出报告,并做总结;二、设计方案1、总体设计方案(李文负责完成)(说明总体设计方案构思、程序模块构成、仿真电路构成等内容,不少于300字))。
构思:实现时钟的设计,如果采用软件延时的方法来实现时钟,太耗cpu了,因此采用51单片机的内部硬件资源来实现时钟,因此采用定时器来定时,由于单片机的最大定时的时间为65.536ms;但是我们要定时1s,为了方便,我们则选用定时器0工作方式1且定时50ms,然后在中断20次则有了1s,有了1s就好办了,分,时就好办了,只要在1秒的基础上加就可以实现时钟了,有了时,分,秒就要显示了,由于时,分,秒都是两位,因此要把个位与十位分离,然后在分别在数码管上显示,这样就实现时钟的设计。
程序模块:1、主函数:(调用初始化函数,调用显示函数)2、显示函数:(延时函数,数码管显示代码)3、中断服务函数:(时,分,秒的实现)仿真电路构成:数字钟的结构组成:1)晶体振荡器电路2)复位电路3)数码管使用非门驱动及数码管具体:52单片机的最小系统(52单片机,晶振电路(12MHz晶振,和30pF的无极性电容),复位电路(10k电阻,10uf极性电容,开关)),外加八位一体的数码管,数码管驱动电路;2、显示模块程序流程图(赵宝龙负责完成):(程序流程图及简单文字说明)(见附录);3、中断服务函数模块程序流程图(肖广负责完成):(程序流程图及简单文字说明)(见附录);4、主函数模块的设计(李文负责)(见附录);5、仿真电路设计(黄涛负责完成)(仿真电路图)三、程序代码:/*功能:用共阴的八位一体的数码管显示时间“小时-分钟-秒”位码接P2口;段码接P0口;使用定时器0定时1s,*/#include <reg51.h>//头文件#define uchar unsigned char //宏定义#define uint unsigned int //uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴七段编码uchar sec,min,hour,count;// 定义变量void delay (uchar x)//延时1ms的函数{uchar z ,y;for (y=x;y>0;y--)for (z=124;z>0;z--);}void init (void)//初始化函数{TMOD=0X01;//定时器0工作在方式1TH0=0X3C;//装初值TL0=0XB0;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0sec=0; //秒设初值min=0; //分设初值hour=0;//时设初值count=0; //计数设初值P0=0xff; //P2=0xff; //}void display ()//显示函数{uchar sec1,sec2,min1,min2,hour1,hour2;//定义变量sec1= sec/10; //秒的十位sec2= sec%10; //秒的个位min1= min/10; //分的十位min2= min%10; //分的个位hour1= hour/10;//时的十位hour2= hour%10;//时的个位P2= 0x80; //秒个位的位码P0= table[sec2]; //秒个位的段码delay(5);P2= 0x40; //秒十位的位码P0= table[sec1]; //秒十位的段码delay(5);P2= 0x20; //“-”的位码P0= 0x40; //“-”的段码delay(5);P2= 0x10; //分十位的位码P0= table[min1];//分十位的段码delay(5);P2= 0x08; //分个位的位码P0= table[min2];//分个位的段码delay(5);P2= 0x04; //“-”的位码P0= 0x40; //“-”的段码delay(5);P2= 0x02; //时个位的位码P0= table[hour2];//时个位的段码delay(5);P2= 0x01; //时的十位的段码P0= table[hour1];//时的十位的段码delay(5);}void main(){init(); //初始化函数while(1){display(); //时间显示函数}}void time() interrupt 1 //中断服务函数{TH0=0X3C; //重装初值TL0=0XB0;if(count==20) //定时一秒{count=0; //计数清零if(sec==59) //秒计时到60秒{sec=0; //秒清零if(min==59) //分计时到60秒{min=0; //分清零if(hour==23) //小时计数到24{hour=0;//小时清零}else hour++; //小时加一}else min++; //分加一}else sec++; //秒加一}count++; //计数加一}五、设计总结单片机作为我们主要的专业课程之一,我觉得单片机课程设计很有必要,而且很有意义。
51单片机电子时钟课程设计汇本实验报告
《单片机原理与应用》课程设计总结报告题目:单片机电子时钟(带秒表)的设计设计人员:保江江润洲学号:2012197213 2012118029班级:自动化1211指导老师:阮海容目录1.题目与主要功能要求 (2)2.整体设计框图及整机概述 (3)3.各硬件单元电路的设计、参数分析及原理说明 (3)4.软件流程图和流程说明 (4)5.总结设计及调试的体会 (10)附录1.图一:系统电路原理图 (11)2.图二:系统电路PCB (12)3.表一:元器件清单 (13)4.时钟程序源码 (14)题目:单片机电子时钟的设计与实现课程设计的目的和意义课程设计的目的与意义在于让我们将理论与实践相结合。
培养我们综合运用电子课程中的理论知识解决实际性问题的能力。
让我们对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立完成某些单片机应用系统的开发和设计打下一个坚实的基础。
课程设计的基本任务利用89C51单片机最小系统,综合应用单片机定时器、中断、数码显示、键盘输入等知识,设计一款单片机和简单外设控制的电子时钟。
主要功能要求最基本要求1)使用MCS-51单片机设计一个时钟。
要求具有6位LED显示、3个按键输入。
2)完成硬件实物制作或使用Pruteus仿真(注意位驱动应能提供足够的电流)。
3)6位LED数码管从左到右分别显示时、分、秒(各占用2位),采用24小时标准计时制。
开始计时时为000000,到235959后又变成000000。
4)使用3个键分别作为小时、分、秒的调校键。
每按一次键,对应的显示值便加1。
分、秒加到59后再按键即变为00;小时加到23后再按键即变为00。
在调校时均不向上一单位进位(例如分加到59后变为00,但小时不发生改变)。
5) 软件设计必须使用MCS-51片定时器,采用定时中断结构,不得使用软件延时法,也不得使用其他时钟芯片。
单片机实验报告--电子时钟制作
电子时钟制作学院计算机科学与技术专业计算机科学与技术(师范) 学号学生姓名一、设计内容与设计目的1、编写出一个电子钟,六个数码管每两个一组来分别显示小时、分和秒;一个蜂鸣器来实现报时或闹铃等声音功能;八个二极管玩花样设计,完美电子的整体设计。
2、熟悉整个电路图,练习一下焊接操作。
3、熟练掌握C51的编程方法与技巧。
4、能够有效地控制数码管、二极管、蜂鸣器和键盘的操作(可采用多种形式)。
5、能够根据原理图焊接电路板,经过调试,保证整个电路板没有虚焊点。
硬件设计要求1、根据项目要求,去选择相应的电路,比如MCU系统,输入输出驱动电路,电源供电电路。
2、整体布局合理,标注规范、明确、美观、不产生歧义。
3、列出完整的元件清单(标号、型号及大小、封装形式、数量)。
4、估算电路板的功耗,并对供电形式提出要求。
5、根据设计好的原理图,焊接实物。
软件设计要求1、所编代码要能够实现以下基本功能,当时时间的设定,定点闹铃,秒针走一下四个二极管同时向右移一位。
2、根据项目要求,设计软件整体规划,人机对话,各模块的关联,底层驱动模块。
3、程序在必要的地方进行注释。
每个函数的出入口要有输入输出参数的说明。
程序必须具有具有良好的可读性,可重用,容易调试和维护。
4、使用c语言进行编程。
二、硬件系统设计1.STC12C5A60S2控制模块考虑到设计功能需要,控制器的功能用于外部键盘信号的接收和识别、数码管的显示控制等,我们选择了学习过的12C5A60S2系列单片机,具有反应速度极快,工作效率特高的特点。
12C5A60S2是一种低功耗、高性能得微控制器,具有8K 在系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
另外掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
2.键盘功能模块根据系统的基本的要求,基于时间的观看和设定等功能,采用由四个键构成的独立式键盘分别接在单片机的P3.2-P3.5口,非常的方便,同时相对于独立式键盘大大节省了空间,在软件的设计时带来了极大的方便,使程序简易明了,可读性强。
基于51单片机的电子闹钟设计报告
*********大学********学院电子闹钟设计报告专业:******学号:******姓名:*******一.仿真电路图:二. 器件30P电容2个12MHZ晶振1个喇叭1个38译码器1个89c52单片机1个按键4个5V电源300欧电阻7个8位共阴数码管1个三.流程图:电子闹钟主流程图:调时、调日期、调星期流程图:倒计时结束流程图:音乐播放流程图:闹铃功能流程图:四.功能介绍:有计时,计日期,计星期,调时、调日期、调星期、闹钟、调闹钟、音乐闹铃、秒表、99秒倒计时、60秒倒计时、5秒倒计时、倒计时结束播放提醒音乐、直接按键播放音乐共计15个小的功能,分为四个功能模块,用四个按键来实现1.调时,查看日期以及调日期,查看星期以及调星期按键1进入该模块后,显示该模块的界面“1234”,分别代表在该界面中要用到的按键编号。
此时按1即进入调时界面,显示当前时间,按1秒加1,按2分加1,按3时加1,按4退出该界面而回到模块界面。
此时按2即进入查看日期以及调日期的界面,显示当前日期,按1天加1,按2月加1,按3年加1,按4退出该界面而回到模块界面。
此时按3即进入查看星期以及调星期的界面,显示当前星期,按1星期加1,按4退出该界面而回到模块界面。
此时按4则退出功能模块1而回到主界面。
2.调闹钟进入该模块时,显示闹钟时间,按1秒加1,按2分加1,按3时加1,按4退出调闹钟模块而回到主界面3.秒表,倒计时进入该模块后,显示界面“12 4”,分别代表在该界面中要用到的按键编号。
此时按1进入秒表计时状态,按4退出,回到模块界面。
此时按2进入99秒倒计时状态,按1切换到60秒倒计时,按1切换到5秒倒计时,在倒计时进行中,按4可以回到模块界面。
此时按4,可以回到主界面4.音乐进入该界面后,显示界面“00-00-00”,按1播放歌曲1,按2播放歌曲2,按3播放歌曲3,按4播放歌曲4,在播放歌曲时,按4可以结束播放音乐并且回到主界面。
单片机汇编程序51电子时钟.doc
单片机汇编程序 51电子时钟电子钟设计实验报告一)实验目的:1、进一步掌握定时器的使用和编程方法。
2、进一步掌握中断处理程序的编程方法。
3、进一步掌握数码显示电路的驱动方法。
4、进一步掌握键盘电路的驱动方法。
5、进一步掌握软件数据处理的方法。
二)内容要求:1、利用CPU的定时器和数码显示电路,设计一个电子时钟。
格式如下:XX XX XX 由左向右分别为:时、分、秒。
2、电子时钟有秒表功能。
3、并能用键盘调整时钟时间。
4、电子时钟能整点报时、整点对时功能。
5、能设定电子时钟的闹铃。
三)主要元件:电阻4.7K 10个 2K 1个四位共阳数码管1个二位共阳数码管1个按钮开关4个万用板(中板)1个 9012PNP 7个排线排阵若干电线一捆蜂鸣器1个最小系统一个四)系统说明:按P1.0键,如果按下的时间小于1秒进入省电模式(数码管不显示,开T0计时器),如果按下的时间大于1秒则进入时间调整.。
在时间调整状态:再按P1.0,如果按下时间大于0.5秒转调小时状态,按下时间小于0.5秒加1分钟操作。
在小时调整状态再按P1.0键,如果按下时间大于0.5秒退出时间调整,如果按下时间小于0.5秒加1小时操作。
按P1.1键,进入闹铃调分状态,按P1.2分加1,按P1.0分减1。
若再按P1.3,则进入调整状态,按P1.2时加1,按P1.0分时。
按P1.1键,闹铃有效,显示式样变为00:00:—0;再按P1.1键,闹铃无效,显示式样变为00:00:—。
按P1.3键,调整闹钟时间结束。
按P1.2键,进入秒表计时功能,按P1.2键暂停或清零,按P1.1键退出秒表回到时钟状态。
而且本系统还有整点报时功能,以及按键伴有声音提示。
五)程序流程图:开始 TO中断初始化保护现场进入功能调用显示定时初值校正程序子程序N Y键按下, 1S到,Y N加1S处理整点到NY恢复现场,中断返回按时间鸣叫次数主程序流程图 T0中断计时程序流程图T1中断保护现场T1中断服务程序流程图秒表/闪烁,时钟调时闪烁加10MS处理闪烁处理恢复现场,中断返回六)电路图七)程序清单:中断入口程序 ;; DISPFIRST EQU 30H BELL EQU P1.4CONBS EQU 2FHOUTPX EQU P2 ;P2位选OUTPY EQU P0 ;P0段选INP0 BIT P1.0INP1 BIT P1.1INP2 BIT P1.2ORG 0000H ;程序执行开始地址LJMP START ;跳到标号START执行ORG 0003H ;外中断0中断程序入口RETI ;外中断0中断返回ORG 000BH ;定时器T0中断程序入口LJMP INTT0 ;跳至INTTO执行ORG 0013H ;外中断1中断程序入口RETI ;外中断1中断返回ORG 001BH ;定时器T1中断程序入口LJMP INTT1 ;跳至INTT1执行ORG 0023H ;串行中断程序入口地址RETI ;串行中断程序返回;QQQQ:MOV A,#10HMOV B,79HMUL ABADD A,78HMOV CONBS,ABSLOOP:LCALL DS20MSLCALL DL1SLCALL DL1SLCALL DL1SDJNZ CONBS,BSLOOPCLR 08HAJMP START;; 主程序 ;;START:MOV R0,#00H ;清70H-7AH共11个内存单元MOV R7,#80H ;CLEARDISP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARDISP ;MOV 20H,#00H ;清20H(标志用)MOV 7AH,#0AH ;放入"熄灭符"数据MOV TMOD,#11H ;设T0、T1为16位定时器MOV TL0,#0B0H ;50MS定时初值(T0计时用) MOV TH0,#3CH ;50MS定时初值MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用) MOV TH1,#3CH ;50MS定时初值SETB EA ;总中断开放SETB ET0 ;允许T0中断SETB TR0 ;开启T0定时器MOV R4,#14H ;1秒定时用初值(50MS×20)MOV DISPFIRST ,#70HSTART1: LCALL DISPLAY ;调用显示子程序JNB INP0,SETMM1 ;P1.0口为0时转时间调整程序JNB INP1,FUNSS ; 秒表功能,P1.1按键调时时作减1加能JNB INP2,FUNPT ;STOP,PUSE,CLRJNB P1.3,TSFUNSJMP START1 ;P1.0口为1时跳回START1SETMM1: LJMP SETMM ;转到时间调整程序SETMM FUNSS: LCALL DS20MSJB INP1,START1WAIT11: JNB INP1,WAIT11CPL 03HMOV DISPFIRST,#00H :显示秒表数据单元MOV 70H,#00HMOV 71H,#00HMOV 76H,#00HMOV 77H,#00HMOV 78H,#00HMOV 79H,#00HAJMP START1FUNPT: LCALL DS20MSJB INP2,START1WAIT22: JNB INP2,WAIT21CLR ET0CLR TR0WAIT33: JB INP2,WAIT31 LCALL DS20MSJB INP2,WAIT33WAIT66: JNB INP2,WAIT61 MOV R0,#70H ;清70H-79H共10 个内存单元MOV R7,#0AH ;CLEARP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARP ;WAIT44: JB INP2,WAIT41 LCALL DS20MSJB INP2,WAIT44WAIT55: JNB INP2,WAIT51 SETB ET0SETB TR0AJMP START1WAIT21: LCALL DISPLAY AJMP WAIT22WAIT31: LCALL DISPLAY AJMP WAIT33WAIT41: LCALL DISPLAYAJMP WAIT44WAIT51: LCALL DISPLAYAJMP WAIT55WAIT61: LCALL DISPLAYAJMP WAIT66 TSFUN:LCALL DS20MSWAIT113:JNB P1.3,WAIT113JB 05H,CLOSESPMOV DISPFIRST,#50HMOV 50H,#0CHMOV 51H,#0AHDSWAIT:SETB EALCALL DISPLAYJNB P1.2,DSFINCJNB P1.0,DSDECJNB P1.3,DSSFU AJMP DSWAITCLOSESP:CLR 05HCLR BELLAJMP START1 DSSFU:LCALL DS20MS JB P1.3,DSWAIT LJMP DSSFUNN DSFINC:LCALL DS20MS JB P1.2,DSWAIT DSWAIT12:LCALL DISPLAY JNB P1.2,DSWAIT12 CLR EAMOV R0,#53H LCALL ADD1MOV A,R3CLR CCJNE A,#60H,ADDHH22ADDHH22:JC DSWAITACALL CLR0AJMP DSWAITDSDEC:LCALL DS20MSLCALL DISPLAYDSWAITEE:LCALL DISPLAYJNB P1.0,DSWAITEECLR EAMOV R0,#53HLCALL SUB1LJMP DSWAIT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1秒计时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;T0中断服务程序INTT0: PUSH ACC ;累加器入栈保护PUSH PSW ;状态字入栈保护CLR ET0 ;关T0中断允许CLR TR0 ;关闭定时器T0JB 03H,FSSMOV A,#0B7H ;中断响应时间同步修正ADD A,TL0 ;低8位初值修正MOV TL0,A ;重装初值(低8位修正值)MOV A,#3CH ;高8位初值修正ADDC A,TH0 ;MOV TH0,A ;重装初值(高8位修正值)SETB TR0 ;开启定时器T0DJNZ R4, OUTT0 ;20次中断未到中断退出ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值MOV R0,#71H ;指向秒计时单元(71H-72H)ACALL ADD1 ;调用加1程序(加1秒操作)MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)CLR C ;清进位标志CJNE A,#60H,ADDMM ;ADDMM: JC OUTT0 ;小于60秒时中断退出ACALL CLR0 ;大于或等于60秒时对秒计时单元清0 MOV R0,#77H ;指向分计时单元(76H-77H)ACALL ADD1 ;分计时单元加1分钟MOV A,R3 ;分数据放入ACLR C ;清进位标志CJNE A,#60H,ADDHH ;ADDHH: JC OUTT0 ;小于60分时中断退出ACALL CLR0 ;大于或等于60分时分计时单元清0MOV R0,#79H ;指向小时计时单元(78H-79H)ACALL ADD1 ;小时计时单元加1小时MOV A,R3 ;时数据放入ACLR C ;清进位标志JB 03H,OUTT0 ;秒表时最大数为99CJNE A,#24H,HOUR ;HOUR: JC OUTT0 ;小于24小时中断退出ACALL CLR0 ;大于或等于24小时小时计时单元清0OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移MOV 73H,77H ;入对应显示单元MOV 74H,78H ;MOV 75H,79H ;LCALL BAOJPOP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器SETB ET0 ;开放T0中断RETI ;中断返回 ;秒表计时程序(10MS加1),低2位为0.1、0.01秒,中间2位为秒,最高位为分。
单片机综合实验报告51电子时钟
一、实验内容:设计一个数字时钟,显示范围为00:00:00~23:59:59。
通过5个开关进行控制,其中开关K1用于切换时间设置(调节时钟)和时钟运行(正常运行)状态;开关K2用于切换修改时、分、秒数值;开关K3用于使相应数值加1调节;开关K4用于减1调节;开关K5用于设定闹钟,闹钟同样可以设定初值,并且设定好后到时间通过蜂鸣器发声作为闹铃。
选做增加项目:还可增加秒表功能(精确到0.01s)或年月日设定功能。
二、实验电路及功能说明1602显示器电路(不需接线)电子音响电路按键说明:按键键名功能说明K1切换键进入设定状态K2 校时依次进入闹钟功能是否启用,闹钟时,分秒,年,月,日及时间时,分,秒的设置,直到退出设置状态K3 加1键调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字三、实验程序流程图:四、实验结果分析定时程序设计:单片机的定时功能也是通过计数器的计数来实现的,此时的计数脉冲来自单片机的内部,即每个机器周期产生一个计数脉冲,也就是每经过1个机器周期的时间,计数器加1。
如果MCS-51采用的12MHz晶体,则计数频率为1MHz,即每过1us的时间计数器加1。
这样可以根据计数值计算出定时时间,也可以根据定时时间的要求计算出计数器的初值。
MCS-51单片机的定时器/计数器具有4种工作方式,其控制字均在相应的特殊功能寄存器中,通过对特殊功能寄存器的编程,可以方便的选择定时器/计数器两种工作模式和4种工作方式。
定时器/计数器工作在方式0时,为13位的计数器,由TLX(X=0、1)的低5位和THX的高8位所构成。
TLX低5位溢出则向THX进位,THX计数溢出则置位TCON中的溢出标志位TFX.当定时器/计数器工作于方式1,为16位的计数器。
本设计师单片机多功能定时器,所以MCS-51内部的定时器/计数器被选定为定时器工作模式,计数输入信号是内部时钟脉冲,每个机器周期产生一个脉冲使计数器增1。
我的51单片机课设报告——电子钟
课程设计任务书课程名称:微型计算机技术设计题目:多功能数字钟基于AT89C51单片机的电子钟的设计电子钟使用外接时钟芯片作为时钟源,精确到秒。
显示部分为LED动态显示设计;并有键盘设计;硬件设计:1)最小系统设计:AT89C51单片机为本设计的控制器,包括外扩ROM,RAM各32 M(其大小由设计者自己设计),系统时钟电路、复位电路等构成的最小系统;2)接口电路的设计:设计者扩展一个并行接口〔8155或8255〕,键盘设计由设计者根据需要设计键盘的数量,显示采用LED显示,显示电路也根据显示的内容设计(年、月、日,时、分、秒;可用两屏显示);3)有开机显示状态(如显示888888);4)在完成基本设计功能同时可以增加功能。
软件设计:1)主程序设计(包括初始化芯片,定时器,中断以及SP指针等);2)各功能子程序设计,键盘子程序、\显示子程序设计,定时,中断程序等;引言:单片机因将其主要组成部分集成在一个芯片上而得名,单片机具有体积小、功能多、价格低廉、使用方便、系统设计灵活等优点。
它把中央处理单元、随机存储器、只读存储器、定时/计数器以及I/O接口电路等主要部件集成在一块半导体芯片上。
因此从某种意义上说,一块单片机芯片就是一台微型计算机。
自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,录像机、摄像机、全自动洗衣机的控制等等,这些都离不开单片机。
随着半导体技术的飞速发展,以及移动通信、网络技术、多媒体技术在嵌入式系统设计中的应用,从4位、8位、16位到32位,单片机功能越来越强大,价格越来越低,同时应用领域的扩大也使得更多人加入到基于单片机系统的开发行列中,推动着单片机技术的创新进步。
数字时钟应用广泛,在现实生活中有着至关重要的作用,在工业控制和日常生活中它不仅可以用于计时、提醒又可用于对机器的控制。
单片机电子时钟实验报告
单⽚机电⼦时钟实验报告郑州轻⼯业学院单⽚机实验报告实验名称:姓名:院(系):专业班级:学号:指导教师:陈晓雷、王⼩瑞成绩:时间:年⽉⽇⾄年⽉⽇实验电⼦时钟(定时器、中断综合实验)⼀、实验⽬的熟悉MCS-51定时器,中断初始化编程⽅法,了解定时器的应⽤,时钟程序的设计与调试技巧。
⼆、实验内容按照STC单⽚机实验板电路,或者⾃⼰设计电路原理图,编写程序,基本要求:⽤定时器产⽣0.1S定时中断,对时钟计数器计数,并将数值实时地送数码管显⽰。
扩展要求:可键盘调整时间、万年历、定时报警等。
三、程序框图1定时中断四、实验步骤连续运⾏程序,在键盘上输⼊时间初值,执⾏,数码管上实时显⽰时间值。
五、思考题1.电⼦钟⾛时精度和程序中哪些常数有关?2.修改程序使定时器⼯作⽅式改变,调节有关参数,进⼀步提⾼精度。
3.设计⼀个倒计时时钟,如何来修改程序?六、参考程序0030 758160 CHK00: MOV SP,#60H0033 1204A5 LCALL LEDP0036 900081 MOV DPTR,#CLOCK0039 A882 MOV R0,DPL003B A983 MOV R1,DPH003D 90000B MOV DPTR,#000BH0040 7402 MOV A,#02H0042 F0 MOVX @DPTR,A0043 A3 INC DPTR0044 E9 MOV A,R120045 F0 MOVX @DPTR,A0046 A3 INC DPTR0047 E8 MOV A,R00048 F0 MOVX @DPTR,A0049 120DF0 CHK0: LCALL LCK0 ;键扫,显⽰⼦程序004C 120068 LCALL PTDS0 ;显⽰缓冲区放数⼦程序004F 758901 MOV TMOD,#01H0052 43A882 ORL IE,#82H0055 758AB7 MOV TL0,#0B7H0058 758C3C MOV TH0,#3CH ;定时中断初始化005B 752300 MOV 23H,#00H005E D28C SETB TR0 ;开定时0060 120425 LOO5: LCALL DIS ;显⽰0063 120068 LCALL PTDS00066 80F8 SJMP LOO50068 7879 PTDS0: MOV R0,#79H006A E522 MOV A,22H006C 1177 ACALL PTDS006E E521 MOV A,21H0070 1177 ACALL PTDS0072 E520 MOV A,20H0074 1177 ACALL PTDS0076 22 RET0077 F9 PTDS: MOV R1,A ;拆送显⽰缓冲区0078 117C ACALL PTDS1007A E9 MOV A,R1007B C4 SWAP A007C 540F PTDS1: ANL A,#0FH007E F6 MOV @R0,A007F 08 INC R00080 22 RET0081 758AB7 CLOCK: MOV TL0,#0B7H0084 758C3C MOV TH0,#3CH ;恢复初值0087 C0D0 PUSH PSW0089 C0E0 PUSH ACC008B D2D3 SETB 0D3H ;保护008D 0523 INC 23H ;0.1秒加1008F E523 MOV A,23H0091 B40A27 CJNE A,#0AH,DONE ;1秒到吗?0094 752300 MOV 23H,#00H ;清0.1秒单元0097 E522 MOV A,22H0099 04 INC A ;秒加1009A D4 DA A009B F522 MOV 22H,A ;⼗进制调整009D B4601B CJNE A,#60H,DONE ;60秒到吗?00A0 752200 MOV 22H,#00H ;秒单元清零00A3 E521 MOV A,21H00A5 04 INC A300A6 D4 DA A ;分加1,⼗进制调整00A7 F521 MOV 21H,A00A9 B4600F CJNE A,#60H,DONE ;60分到吗?00AC 752100 MOV 21H,#00H ;分单元清零00AF E520 MOV A,20H00B1 04 INC A00B2 D4 DA A ;时加1,⼗进制调整00B3 F520 MOV 20H,A00B5 B42403 CJNE A,#24H,DONE ;24⼩时到吗?00B8 752000 MOV 20H,#00H ;时单元清零00BB D0E0 DONE: POP ACC ;退栈00BD D0D0 POP PSW00BF 32 RET1ORG 0D59H0D59 D2D4 SSEE: SETB RS1 ;换⼯作区0D58 7D05 MOV R5,#05H0D5D 753020 SSE2: MOV 30H,#20H0D60 75317E MOV 31H,#7EH0D63 7F06 MOV R7,#06H0D65 79DD SSE1: MOV R1,#0DDH0D67 E530 MOV A,30H0D69 F3 MOVX @R1,A ;字位送⼊0D6A A831 MOV R0,31H0D6C E6 MOV A,@R00D6D 900D85 MOV DPTR,#0DDFFH0D70 93 MOVC A,@A+DPTR ;取字形代码0D71 79DC MOV R1,#0DCH0D73 F3 MOVX @R1,A ;字形送⼊0D74 E530 MOV A,30H ;右移0D76 03 RR A0D77 F530 MOV 30H,A0D79 1531 DEC 31H0D7B 74FF MOV A,#0FFH0D7D F3 MOVX @R1,A ;关显⽰0D7E DFE5 DJNZ R7,SSE1 ;6位显⽰完了吗?0D80 DDDB DJNZ R5,SSE2 ;5次显⽰完了吗?0D82 C2D4 CLR RS10D84 22 RET0D85 C0F9A4 ODFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H 0D88 B09992, DB 0F8H,80H,90H0D8B 82F8800D8E 900D8F 8883C6 DB 88H,83H,0C6H,0A1H,86H0D92 A1868E DB 8EH,0FFH,0CH,89H,0DEH0D95 FF0C890D98 DE4ORG 038EH038E FC X3: MOV R4,A038F 7850 MOV R0,#50H 0391 E6 MOV A,@R00392 F9 MOV R1,A0393 EC MOV A,R40395 E4 CLR A0396 D083 POP DPH0398 D082 POP DPL039A 93 MOVC A,@A+DPTR 039B A3 INC DPTR039C B5010A CJNE A,01H,X30 039F 19 DEC R103A0 E4 CLR A03A1 93 MOVC A,@A+DPTR 03A2 F6 X31: MOV @R0,A 03A3 A3 INC DPTR03A4 C082 PUSH DPL03A6 C083 PUSH DPH03A8 22 RET03A9 19 X30: DEC R103AA E9 MOV A,R103AB 80F5 SJMP X31;--------------------------------------03AD 7E50 X2: MOV R6,#50H03AF 71D1 X0: ACALL XLE03B1 30E51C JNB ACC.5,XX003B4 DEF9 DJNZ R6,X003B6 7E20 MOV R6,#20H03B8 7850 MOV R0,#50H03BA E6 MOV A,@R003BB F8 MOV R0,A03BC E6 MOV A,@R003BD FF MOV R7,A03BE 7410 MOV A,#10H03C0 F6 MOV @R0,A03C1 71D1 X1: ACALL XLE03C3 30E506 JNB ACC.5,XX103C6 DEF9 DJNZ R6,X103C8 EF MOV A,R703C9 F6 MOV @R0,A03CA 80E1 SJMP X203CC FE XX1: MOV R6,A03CE F6 MOV @R0,A03CF EE MOV A,R603D0 22 XX0: RET03D1 9125 XLE: ACALL DIS 03D3 9164 ACALL KEY03D5 FC MOV R4,A503D6 7948 MOV R1,#48H03D8 E7 MOV A,@R103D9 FA MOV R2,A03DA 09 INC R103DB E7 MOV A,@R103DC FB MOV R3,A03DD EC MOV A,R403DE 6B XRL A,R303DF AB04 MOV R3,04H03E1 AC02 MOV R4,02H03E3 6004 JZ X1003E5 7A88 MOV R2,#88H03E7 7C88 MOV R4,#88H03E9 1C X10: DEC R403EA EC MOV A,R403EB 6482 XRL A,#82H03ED 600F JZ X1103EF EC MOV A,R403F0 640E XRL A,#0EH03F2 600A JZ X1103F4 EC MOV A,R403F5 6005 JZ X1203F7 7C02 MOV R4,#20H03F9 1A DEC R203FA 8006 SJMP X1303FC 7C0F X12: MOV R4,#0FH 03FE AA04 X11: M OV R2,04H0400 AC03 MOV R4,03H0402 7948 X13: MOV R1,#48H0404 EA MOV A,R20405 F7 MOV @R1,A0406 09 INC R10407 EB MOV A,R30408 F7 MOV @R1,A0409 EC MOV A,R4040A 20E507 JB ACC.5,X113040D 20E404 JB ACC.4,X1130410 900415 MOV DPTR,#LS30413 93 MOVC A,@A+DPTR0414 22 X113: RET0415 070408 LS3: D B 07H,04H,08H,05H,09H,06H,0AH 0418 050906 041B 0A041C 0B0100 DB 0BH,01H,00H,02H,0FH,03H,0EH041F 020F030422 0E0423 0C0D DB 0CH,0DH0425 C083 DIS: PUSH DPH0427 C082 PUSH DPL0429 D2D4 SETB RS1042B 787E MOV R0,#7EH6042D 7A20 MOV R2,#20H042F 7B00 MOV R3,#00H0431 90044F MOV DPTR,#LS00434 E6 LS2: M OV A,@R00435 93 MOVC A,@A+APTR0436 79DC MOV R1,#0DCH0438 F3 MOVX @R1,A0439 EA MOV A,R2043A 09 INC R1043B F3 MOVX @R1,A043C DBFE LS1: DJNZ R3,LS1043E C3 CLR C043F 13 RRC A0440 FA MOV R2,A0441 18 DEC R00442 70F0 JNZ LS20444 F2 MOVX @R0,A0445 18 DEC R00446 F4 CPL A0447 F2 MOVX @R0,A0448 C2D4 CLR RS1044A D082 POP DPL044C D083 POP DPH044E 22 RET044F C0F9A4 LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H0452 B099920455 82F880 DB 82H,0F8H,80H,90H,88H,83H,0C6H 0458 908883045B C6045C A1868E DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH 045F FF0C89 0462 7FBF0464 D2D4 KEY: SETB RS10466 7AFE MOV R2,#0FEH0468 7B08 MOV R3,#08H046A 7800 MOV R0,#00H046C 79DD LP1: MOV R1,#0DDH046E EA MOV A,R2046F F3 MOVX @R1,A0470 23 RL A0471 FA MOV R2,A0472 09 INC R10473 E3 MOVX A,@R10474 F4 CPL A0475 540F ANL A,#0FH0477 700E JNZ LP00479 08 INC R0047A DBF0 DJNZ R3,LP1047C 7420 XP33: MOV A,#20H047E FA XP3: MOV R2,A047F E4 CLR A70480 79DD MOV R1,#0DDH 0482 F3 MOVX @R1,A0483 EA MOV A,R20484 C2D4 CLR RS10486 22 RET0487 F4 LP0: C PL A0488 20E004 JB ACC.0,XP0048B 7400 MOV A,#00H048D 8013 SJMP LPP048F 20E104 XP0: JB ACC.1,XP1 0492 7408 MOV A,#08H 0494 800C SJMP LPP0496 20E204 XP1: JB ACC.2,XP2 0499 7410 MOV A,#10H 049B 8005 SJMP LPP049D 20E3DC XP2: JB ACC.3,XP33 04A0 7418 MOV A,#18H 04A2 28 LPP: ADD A,R004A3 80D9 SJMP XP3;---------------------------------------04A5 75507E LEDP: MOV 50H,#7EH 04A8 7410 MOV A,#10H 04AA 7879 MOV R0,#79H04AC F6 LEDS: MOV @R0,A04AD 08 INC R004AE B87EFB CJNE R0,#7EH,LEDS 04B1 04 INC A04B2 F6 MOV @R0,A04B3 7420 MOV A,#20H04B5 F548 MOV 48H,A04B7 F549 MOV 49H,A04B9 22 RETEND8。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验内容:设计一个数字时钟,显示范围为00: 00: 00~23: 59: 59。
通过5个开关进行控制,其中开关K1用于切换时间设置(调节时钟)和时钟运行(正常运行)状态;开关 K2用于切换修改时、分、秒数值;开关K3用于使相应数值加1调节;开关K4用于减1调节;开关K5用于设定闹钟,闹钟同样可以设 定初值,并且设定好后到时间通过蜂鸣器发声作为闹铃。
选做增加项目:还可增加秒表功能(精确到0.01s )或年月日设定功能。
二、实验电路及功能说明按键键名 功能说明 K1切换键进入设定状态K2校时依次进入闹钟功能是否启用,闹钟时 ,分秒,年,月,日及时间时,分,秒的设置,直到退出 设置状态K3加1键调整是否起用闹钟和调节闹钟时 ,分,秒,年,月,日,时间的时,分,秒的数字三、实验程序流程图:1602显示器电路(不需接线)闹钟複攧时钟擾换单片机最小采绕电子音响电路四、实验结果分析定时程序设计:单片机的定时功能也是通过计数器的计数来实现的,此时的计数脉冲来自单片机的内部,即每个 机器周期产生一个计数脉冲,也就是每经过 1个机器周期的时间,计数器加1。
如果MCS-51采用的12MHz 晶体,则计数频率为 1MHz ,即每过1us 的时间计数器加1。
这样可以根据计数值计算出定时时 间,也可以根据定时时间的要求计算出计数器的初值。
MCS-51单片机的定时器/计数器具有4种工作方式,其控制字均在相应的特殊功能寄存器中,通过对特殊功能寄存器的编程,可以方便的选择定时器 计数器两种工作模式和 4 种工作方式。
定时器/计数器工作在方式 0时,为13位的计数器,由TLX (X=O 、1)的低5位和THX 的高8位所 构成。
TLX 低 5 位溢出则向 THX 进位, THX 计数溢出则置位 TCON 中的溢出标志位TFX.是--- ►调用校时子程序是调用定时子程序 -■是■调用复位子程序 L■初始化显示当定时器/计数器工作于方式1,为16 位的计数器。
本设计师单片机多功能定时器,所以MCS-51 内部的定时器/计数器被选定为定时器工作模式,计数输入信号是内部时钟脉冲,每个机器周期产生一个脉冲使计数器增1。
实时时钟实现的基本方法:这次设计通过对单片机的学习、应用,以AT89S51 芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它主要通过51 单片机综合仿真实验仪实现,通过1602 能够准确显示时间,调整时间,它的计时周期为24小时,从而到达学习、设计、开发软、硬件的能力。
主要实现功能为显示时间,时间校准调时(采用手动按键调时),闹铃功能(设置定时时间,到点后闹铃发出响声)。
通过键盘可以进行校时、定时。
闹铃功能使用I/O 口定时翻转电平驱动的无源蜂鸣器。
本文主要介绍了工作原理及调试实现。
四个按键K1、K2、K3、K4、一个蜂鸣器。
1602 显示时钟、跑表。
时钟的最小计时单位是秒,但使用定时器的方式1,最大的定时时间也只能达到131ms。
我们可把定时器的定时时间定为50ms。
这样,计数溢出20次即可得到时钟的最小计时单位:秒。
而计数20次可以用软件实现。
秒计时是采用中断方式进行溢出次数的累积,计满20次,即得到秒计时。
从秒到分,从分到时是通过软件累加并进行比较的方法来实现的。
要求每满 1 秒,则“秒”单元中的内容加 1 ;“秒”单元满60,则“分”单元中的内容加 1 ;“分”单元满60,则“时”单元中的内容加1;“时”单元满24,则将时、分、秒的内容全部清零。
实时时钟程序设计步骤:先对系统进行初始化,如:LCD1602 初始化, DS1302 初始化等,然后才能进入主显示模块, 即可在LCD1602 上看到相应的信息。
对于LCD1602 的初始化,主要是对开启显示屏,清屏,设置显示初始行等操作。
DS1302 的初始化主要是先开启写功能,然后写入一个初始值。
本系统采用的是LCD1602 液晶显示器,由于其是本身带有驱动模块的液晶屏,所以对于LCD1602 操作程序可分为开显示、设置显示初始行、写数据和清屏等部分。
LCD1602 的写命令程序和写数据程序分别以子程序的形式写在程序里,以便主程序中的调用。
( 1 )选择工作方式,计算初值;(2)采用中断方式进行溢出次数累计;(3)计时是通过累加和数值比较实现的;(4)时钟显示缓冲区:时钟时间在方位数码管上进行显示,为此在内部RAM 中要设置显示缓冲区,共 6 个地址单元。
显示缓冲区从左到右依次存放时、分、秒数值;(5)主程序:主要进行定时器/计数器的初始化编程,然后反复调用显示子程序的方法等待中断的到来;(6)中断服务程序:进行计时操作;(7)加 1 子程序:用于完成对时、分、秒的加操作,中断服务程序在秒、分、时加 1 时共有三种条调用加 1 子程序,包括三项内容:合字、加 1 并进行十进制调整、分字。
程序说明:按K1 按键进入设定状态按K2,依次进入闹钟功能是否启用,闹钟时,分秒,年,月,日及时间时,分,秒的设置,直到退出设置状态按K3,调整是否起用闹钟和调节闹钟时,分秒,年月,日,时间的时,分,秒的数字LCD 第二排中间显示小喇叭,表示启用闹钟功能,无则禁止闹钟功能(可在调整状态进行设置)正常状态,LCD 上排最前面显示自定义字符,LCD 下排最前面闪动"_"设置状态,LCD 上排最前面显示"P",下排最前面在设置闹钟时间时显示"alarm_",其它状态显示"time"年代变化2000--2099, 星期自动转换程序中有自定义字符写入在整个系统中,在单片机的30H 、31H 和32H 中存储当前时间的小时、分钟和秒。
由于要用数码管显示当前的时间,必须用到分字和合字,因此在33H 、34H、35H、36H、37H 和38H 中存储当前时间的时十位、时个位、分十位、分个位、秒十位和秒个位,方便显示。
本设计有由四个轻触按键组成的小键盘,这些按键可以任意改变当前的状态。
按功能移位键一次,表示当前要校对小时的十位;按第二次,表示当前校对的是小时的个位;按第三次,则表示校对的是分钟的十位;第四次,表示的校对的是分钟的个位。
按下数字“ +” 键和数字“ -”键可在当前校对的数字上相应加上 1 或者减去1。
本设计采用查表方式,在程序里预先存储两个表格,即日常作息时间表和考试时间表,可以通过手动按键来选择所要执行的时间表。
并且用红、绿发光二极管来区别当前所执行的时间表。
系统开机后,按功能移位键就可以调整当前的时间,整个系统操作简单,功能明确。
显示数据时,先把要显示的数据送到数据缓冲区SBUF 中,再从SBUF 中显示。
串行口缓冲寄存器SBUF 器是可直接寻址的专用寄存器。
在物理上,它对应着两个寄存器,一个发送寄存器,一个接收寄存器。
CPU 写SBUF ,就是修改发送寄存器;读SBUF ,就是读接收寄存器。
接收器是双缓冲的,以避免在接收下一帧数据之前,CPU 未能及时响应接收器的中断,没有把上一帧数据读走,而产生两帧数据重叠的问题。
对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU 是主动的,不会产生写重叠的问题。
五、心得体会在享受我们成果之时,懂得的重要性与高难度性,所以为期一周的单片机课程设计没有浪费,我们从中学到了很多知识.,也让我们对单片机有了更深一步的了解.虽然最后结果是出来了,可这与老师的精心指导是分不开的。
通过对这程序的制作,是我对单片机的基本知识的使用更加熟练,同时也增加了我对单片机的一些认识,在作业完成过程中通过和同学的交流,也增加了合作的技巧。
通过查阅资料也学到了一些课本上没有的东西,拓宽了自己的知识面,增加了学好单片机的信心。
这次实训虽然其中会有些错误和失败,但总的来说是受益匪浅,在运用中发现问题,解决问题,就是最大的收获。
专心做自己的事,是一种乐趣;互相交流,是大家一起进步的必要过程;上网查阅资料,是获得所需信息的有效途径。
我想,这些练习和经验都将是我以后最宝贵的财富!附录:实验主程序及注释#include <reg51.h>#include <intrins.h> unsigned char codedis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"}Junsigned char codepara_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5};// 星期月参变数unsigned char data dis_buf1[16];//lcd 上排显示缓冲区unsigned char data dis_buf2[16];//lcd 下排显示缓冲区unsigned char data year,month,date,week;// 年、月、日、星期unsigned char data armhour,armmin,armsec;// 闹钟时、分、秒unsigned char data hour,min,sec,sec100; // 时、分、秒、百分之一秒void pro_timedate(); // 时间日期处理程序void pro_display(); // 显示处理程序void pro_key(); // 按键处理程序void time_alarm(); // 定时报警功能( 闹钟)unsigned char scan_key(); // 按键扫描程序unsigned char week_proc(); // 星期自动计算与显示函数bit leap_year(); // 判断是否为闰年void lcd_sef_chr(); //LCD 自定义字符程序void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned charunsigned char data flag,vkey,skey;// 设置状dis_m,unsigned char dis_s);态计数标志、按键先前值、按键当前值bit alarm; // 标识是否启用闹钟,1-- 启用,0-- 缓冲区函数关闭sbit rs = P2A0; //LCD 数据/命令选择端(H/L) // 延时程序sbit rw = P2A1; //LCD 读/ 写void delay(unsigned char ms)选择端(H/L) { while(ms--)sbit ep = P2A2; //LCD 使能{ unsigned char i;控制for(i = 0; i< 250;i++)sbit PRE = P3A3; // 调整键{(AN3) _nop_();sbit SET = P3A4; // 调整键一条_nop_() 指令为一个机器周期(AN4) _nop_();sbit SPK = P3A6; _nop_();void delayms(unsigned char ms); // 延时程序_nop_();bit lcd_busy(); // 测试LCD }忙碌状态程序}void lcd_wcmd(char cmd); // 写入指令}到LCD程序void lcd_wdat(char dat); // 写入数据到LCD程序//测试LCD忙碌状态void lcd_pos(char pos); //LCD 数据bit lcd_busy() // 更新显示// 执行void lcd_init(); //LCD 初始bit result; 指针位置程序{rw = 1;ep = 1;_n op_();_n op_();_n op_();_n op_();result =(bit)(PO&0x80); //LCD 的D0--D7 中,D7=1为忙碌,D7=0为空闲ep = 0;return result;}//写入指令到LCDvoid lcd_wcmd(char cmd){while(lcd_busy()); // 当lcd_busy 为 1 时,再次检测LCD忙碌状态,lcd-busy 为0时,开始写指令rs = 0;rw = 0;ep = 0;_n op_();_n op_();P0 = cmd;_n op_();_n op_();_n op_();_n op_();ep = 1;_n op_();_n op_();_n op_();_n op_();ep = 0;}//写入数据到LCDvoid lcd_wdat(char dat){while(lcd_busy()); // 当lcd_busy 为 1 时,再次检测LCD忙碌状态,lcd-busy 为0时,开始写数据rs = 1;rw = 0;ep = 0;P0 = dat;_n op_();_n op_();_n op_();_n op_();ep = 1;_n op_();_n op_();_n op_();_n op_();ep = 0;}//LCD数据指针位置程序void lcd_pos(char pos){lcd_wcmd(pos|0x80); // 数据指针=80+地址码(00H~27H,40H~67H)}//设定二个自定义字符,(注意:LCD1602中自定义字符的地址为0x00--0x07,即可定义8个字符)//这里我们设定把一个自定义字符放在0x00位置(000),另一个放在0x01位子(001)void lcd_sef_chr(){ //第一个自定义字符lcd_wcmd(0x40); 〃"01 000 000" 第1行地址(D7D6为地址设定命令形式D5D4D3为字符存放位置(0--7) ,D2D1DC为字符行地址(0--7))lcd_wdat(0x1f); //"XXX 11111" 第1行数据(D7D6D5为XXX表示为任意数(一般用000),D4D3D2D1D为字符行数据(1-点亮,0-熄灭)lcd_wcmd(0x41); 〃"01 000 001" 第2行地址lcd_wdat(0x11); //"XXX 10001" 第2行数据lcd_wcmd(0x42); //"01 000 010" 第3行地址Icd_wdat(0x15); //"XXX 10101" 第3行数据lcd_wcmd(0x43); //"01 000 011" 第4行地址lcd_wdat(0x11); //"XXX 10001" 第4行数据lcd_wcmd(0x44); //"01 000 100" 第5行地址lcd_wdat(0x1f); //"XXX 11111" 第5行数据数据lcd_wcmd(0x45); //"01 000 101" 第6行地址lcd_wdat(0x0a); //"XXX 01010" 第6行数据}lcd_wcmd(0x46); //"01 000 110" 第7行地址//LCD 初始化设定lcd_wdat(0x1f); //"XXX 11111" 第7行void lcd_init()数据{lcd_wcmd(0x47); //"01 000 111" 第8行lcd_wcmd(0x38); // 设置LCD为16X2显地址示,5X7点阵,八位数据借口lcd_wdat(0x00); //"XXX 00000" 第8行delay(1);数据lcd_wcmd(0x0c); //LCD 开显示及光标// 第二个自定义字符设置(光标不闪烁,不显示"-")lcd_wcmd(0x48); //"01 001 000" 第1行delay(1);地址lcd_wcmd(0x06); //LCD 显示光标移动lcd_wdat(0x01); //"XXX 00001" 第1行设置(光标地址指针加1,整屏显示不移动)数据delay(1);lcd_wcmd(0x49); //"01 001 001" 第2行lcd_wcmd(0x01); // 清除LCD 的显示内地址容lcd_wdat(0x1b); //"XXX 11011" 第2行delay(1);数据}lcd_wcmd(0x4a); //"01 001 010" 第3行地址// 闰年的计算lcd_wdat(0x1d); //"XXX 11101" 第3行bit leap_year()数据{bit leap;lcd_wcmd(0x4b); //"01 001 011" 第4行地址if((year%4==0&&year%100!=0)||year%400= lcd_wdat(0x19); //"XXX 11001" 第4行=0)// 闰年的条件数据leap=1;lcd_wcmd(0x4c); //"01 001 100" 第5行else地址leap=0;lcd_wdat(0x1d); //"XXX 11101" 第5行return leap;数据}lcd_wcmd(0x4d); //"01 001 101" 第6行地址// 星期的自动运算和处理unsigned char week_proc()lcd_wdat(0x1b); //"XXX 11011" 第6行数据{ unsigned char num_leap;lcd_wcmd(0x4e); //"01 001 110" 第7行unsigned char c;地址num_leap=year/4-year/100+year/400;// 自lcd_wdat(0x01); //"XXX 00001" 第7行00 年起到year 所经历的闰年数数据if( leap_year()&& month<=2 ) // 既lcd_wcmd(0x4f); //"01 001 111" 第8行是闰年且是 1 月和 2 月地址c=5;lcd_wdat(0x00); //"XXX 00000" 第8行elsec=6; dis_buf2[14]=dis_s/10+48;week=(year+para_month[month]+date+num_ dis_buf2[15]=dis_s%10+48;leap+c)%7;// 计算对应的星期return week; }}// 时间和日期处理程序// 更新显示缓冲区void pro_timedate()void update_disbuf(unsigned char t1,unsigned {char t2[],unsigned char dis_h,unsigned char sec++;dis_m,unsigned char dis_s) if(sec > 59){ dis_buf1[0]=t1; // {sec = 0;dis_buf1[1]=0x20; // 空格min++;dis_buf1[2]=50; //'2' if(min>59)dis_buf1[3]=48; //'0' {min=0;dis_buf1[4]=year/10+48; hour++;dis_buf1[5]=year%10+48; if(hour>23)dis_buf1[6]=0x2d; {hour=0;dis_buf1[7]=month/10+48; date++;dis_buf1[8]=month%10+48; ifdis_buf1[9]=0x2d; //'-' (month==1||month==3||month==5||month==7||mdis_buf1[10]=date/10+48; onth==8||month==10||month==12)dis_buf1[11]=date%10+48; if (date>31) dis_buf1[12]=0x20; {date=1;month++;} // 大月dis_buf1[13]=dis_week[4*week]; 31天dis_buf1[14]=dis_week[4*week+1]; ifdis_buf1[15]=dis_week[4*week+2]; (month==4||month==6||month==9||month==11)dis_buf2[0]=t2[0]; if (date>30) dis_buf2[1]=t2[1]; {date=1;month++;} // 小月dis_buf2[2]=t2[2]; 30 天dis_buf2[3]=t2[3]; if (month==2)dis_buf2[4]=t2[4]; {if( leap_year())dis_buf2[5]=t2[5]; // 闰年的条件dis_buf2[6]=t2[6]; // 空格{if (date>29) if (alarm) {date=1;month++;}} // 闰年 2 月为29 dis_buf2[7]=0x01; //alarm=1 ,天显示闹钟启用标致(第二个自定义字符)elseelse {if (date>28) dis_buf2[7]=0x20; //alarm=0 ,{date=1;month++;}} // 平年 2 月为28 不显示闹钟启用标致天dis_buf2[8]=dis_h/10+48; }dis_buf2[9]=dis_h%10+48; if (month>12) dis_buf2[10]=0x3a; //':' {month=1;year++;}dis_buf2[11]=dis_m/10+48; if (year>99) year=0;dis_buf2[12]=dis_m%10+48; }dis_buf2[13]=0x3a; }}week_proc();if (sec==armsec && min==armmin &&hour==armhour){if (alarm)TR1=1; // 闹钟启用时,报警时间到, 启动Timer1}}// 显示处理程序void pro_display(){ unsigned char i;lcd_pos(0x00);for (i=0;i<=15;i++){lcd_wdat(dis_buf1[i]);}lcd_pos(0x40);for (i=0;i<=15;i++){lcd_wdat(dis_buf2[i]);}}//Timer0 中断处理程序, 秒的产生void timer0() interrupt 1{TH0=0xD8;TL0=0xF0;sec100++;if(sec100 >= 100) //1 秒时间(100*10ms=1000ms=1s){sec100 = 0;pro_timedate();// 调用时间和日期处理程序}if (sec&0x01)//"__run__" 闪一秒,停一秒update_disbuf(0x00,"",hour,min,sec); //0x00 表示显示00 位置的自定义字符elseupdate_disbuf(0x00,"__run__",hour,min,sec)Jpro_display(); // 调用显示处理函数}// 按键扫描程序unsigned char scan_key(){skey=0x00;// 给变量vkey 置初值skey|=PRE;//读取PRE键的状态skey=skey<<1;//将PRE键的状态存于skey的B1位skey|=SET;//读取SET键的状态,并存于skey的B0 位return skey;II返回skey的键值(即PRE,SET的状态)}II 外部中断INT0 中断处理程序void int0() interrupt 0{TR0=0;II 禁止Timer0IE=0;II 禁止中断lcd_wcmd(0x0e);II 显示光标"_", 整个光标不闪烁alarm=1;update_disbuf(0x50,"alarm_",armhour,armmin,armsec); II 更新显示数据,0x50 表示要显示"P"pro_display();II 调用显示处理程序lcd_pos(0x47);II 使光标位于第一个调整项下flag=0;vkey=0x03; while(flagAOxOa) {skey =scan_key();II 扫描按键状态if (skeyWkey)// 若skey 与vkey 相同,跳出循环, 相异执行循环体{ delay(10);// 去按键抖动skey = scan_key();// 转回扫描按键状态if (skey A vkey)// 若skey 与vkey 相同,跳出循环, 相异执行循环体{ vkey=skey;// 将skey 的值付给vkey if (skey==0x01)//PRE 键按下{ flag++; // 调整标志位加 1光标置月调整位置case 6: lcd_pos(0x0b);break; // 光标置日调整位置case 7: lcd_pos(0x49);break; // 光标置时调整位置case 8: lcd_pos(0x4c);break; // 光标置分调整位置case 9: lcd_pos(0x4f);break; // 光标置秒调整位置switch (flag) // 将光标置于相应调整位置{case 1: lcd_pos(0x49);break; // 光标置小时报警设置位置case 2: lcd_pos(0x4c);break; // 光标置分钟报警设置位置case 3: lcd_pos(0x4f);break; // 光标置秒时报警设置位置case 4: update_disbuf(0x50,"time_",hour,min,sec);pro_display();lcd_pos(0x05);break; // 光标置年调整位置case 5: lcd_pos(0x08);break; //default:break;}}if (skey==0x02) //SET 键按下{ pro_key();// 转设置按键处理程序}}}}lcd_wcmd(0x0c);//设置LCD开显示及光标不闪烁,不显示II IIlcd_wcmd(0x01);// 清除LCD的显示内容IE=0x8f;//CPU 开中断,INT0,INT1,开中断TR0=1;//Timer0 启动}// 主程序,初始化及初值设定void main(){lcd_init(); // lcd_pos(0x47);break;初始化LCD // 光标回到原调lcd_sef_chr(); // 整位置写入自定义字符号case 1:armhour++;hour=0;min=0;sec=0; // if (armhour>23) armhour=0;开机时的时, 分, 秒显示armhour=0;armmin=0;armsec=0; // update_disbuf(0x50,"alarm_",armhour,ar开机时的时, 分, 秒报警初值mmin,armsec); // 更新显示数据year= 5; month=1;date=1; // pro_display();开机时的年, 月,日, 星期显示// 调用显示处理week_proc(); lcd_pos(0x49);break;alarm=1; // // 光标回到原调初始开机,启用闹钟整位置IE = 0x8f; case 2:armmin++;//CPU 开中断,INT0,INT1,Timer0,Timer1 开if (armmin>59) armmin=0;中断IP = 0x04; // update_disbuf(0x50,"alarm_",armhour,ar设置INT0 为中断最高优先级mmin,armsec);IT0=0;IT1=0; //片丄pro_display();外部INT0,INT1 设置为电平触发方式(注意,触lcd_pos(0x4c);break;发不要选边沿方式,易误动) case 3:armsec++;TMOD = 0x11; if (armsec>59) armsec=0;//Timer0,Timer1 工作于模式1, 16 位定时方式update_disbuf(0x50,"alarm_",armhour,ar TH0 = 0xdc;TL0 = 0x00; mmin,armsec);//Timer0 置10ms 定时初值pro_display();TH1 = 0xff;TL1 = 0x00; lcd_pos(0x4f);break;//Timer1 置初值TR0 = 1; case 4:year++;//Timer0 启动if (year> 99) year= 0;TR1 = 0; week_proc();while(1); // 星期自动运算}update_disbuf(0x50,"time_",hour,min,sec);// 设置按键处理程序pro_display();void pro_key() lcd_pos(0x05);break;{case 5:month++;switch (flag) if (month>12) month=1;{week_proc();case 0:alarm=!alarm; // // 星期自动运算启用或关闭闹钟(alarm=1: 启用,alarm=0: 关闭)update_disbuf(0x50,"time_",hour,min,sec);update_disbuf(0x50,"alarm_",armhour,ar pro_display();mmin,armsec); // 更新显示数据lcd_pos(0x08);break;pro_display(); case 6:date++;// 调用显示处理if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)if (date>31) date=1;// 大月31 天if(month==4||month==6||month==9||month==11)if (date>30) date=1;// 小月30 天if (month==2){if(leap_year())// 闰年的条件{if (date>29) date=1;} // 闰年 2 月为29 天else{if (date>28)date=1;}} // 平年 2 月为28 天week_proc();// 星期自动运算update_disbuf(0x50,"time_ ",hour,min,sec);pro_display();lcd_pos(0x0b);break;case 7:hour++;if (hour>23) hour=0;update_disbuf(0x50,"time_",hour,min,sec);pro_display();lcd_pos(0x49);break;case 8:min++;if (min>59) min=0;update_disbuf(0x50,"time_",hour,min,sec);pro_display();lcd_pos(0x4c);break;case 9:sec++;if (sec>59) sec=0;update_disbuf(0x50,"time_",hour,min,sec);pro_display();lcd_pos(0x4f);break;default: break ;//Timer1 中断处理程序, 产生报警的声音void timer1() interrupt 3{TH1=0x80;TL1=0x00;SPK=~SPK; t++;}// 外部中断INT1 中断处理程序, 停止报警声音void int1() interrupt 2{if(TR1) TR1=0;}。