基于KeilC51软件的电子钟设计与制作
- 格式:pdf
- 大小:129.99 KB
- 文档页数:3
基于单片机的电子钟的设计学院:班级:姓名:学号:小组成员:姓名:学号:指导老师:第一章绪论1.1数字电子钟的背景20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
1.2数字电子钟的意义数字钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
课设报告工程学院软件学院题目:时钟班级:姓名:学号:指导老师:日期: 2013 年 10 月 11日目录1 摘要32 设计要求32.1 功能需求32.2 设计要求33 硬件设计与描述33.1 总体描述33.2 系统总体框图 43.3 Proteus电路图43.4 各部分硬件介绍44 软件设计流程与描述84.1 程序流程图84.2 函数模块与功能94.2.1单片机主控制模块94.2.2数码管显示模块94.2.3 按键模块114.2.4计时模块115 功能实现136 心得体会147 源程序141 摘要众所周知单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
本设计要制作的就是单片机于生活中最为常见的几种应用——时钟。
本设计以AT89S52单片机作为核心,可以显示当前的时间,时间也可以人为设定,显示格式为时(两位),分(两位),秒(两位)。
设置时间的数值、启动定时器。
时钟显示电路由数码管组成,制作该装置的材料需要有软硬件的支持,硬件方面AT89C51单片机,晶振,电源,数码管。
2 设计要求2.1 功能需求1、在数码管上显示初始时间如12-23-33,从初始设置的时间开始走时,每一秒自动加1,当59秒后自动向分进位、59分后自动向时进位。
2、通过按键设置时间,按下键1,时钟分加1;按下键2,时钟分减1,。
从而实现用按键设置时间的功能。
2.2 设计要求本次设计的是时钟,本电路是由AT89S52单片机为控制核心,通过按键实现时钟分的自增自减进行时间的设置,在数码管上进行显示。
3 硬件设计与描述3.1 总体描述单片机采用STC90C516RD+,采用MCS-51实验开发板。
课程名称:单片机原理与接口技术实践设计课题:基于MCS 51单片机实现电子闹钟功能的设计学院:电子与信息工程学院专业:通信工程小组成员:电子闹钟在科学技术高度发展的今天,千家万户都少不了它,所以很多家庭个人都需要有一个电子闹钟,为人们提供报时方便,但普通电子闹钟不够方便实用。
本文给出了一种基于MCS51单片机实现电子闹钟功能的设计方法,从而给人们带来更为方便的工作与生活。
一.电子闹钟简介我们设计的电子闹钟是以MCS 51单片机中的计时器作为时钟,用8位数码管显示当前时间,并且可以设置闹钟时间,并在设置的时间点发出闹铃。
简易闹钟具有以下功能:1.时钟能准确地走时,并可以通过数码管进行显示2.复位后可以进行当前时间的设置3.可以随意设置闹钟时间,闹钟会在设置时间响铃整个系统的任务要求:1)输入数字按键的功能。
保证数字的输入。
2)复位电路的功能。
所有时间回到初始化状态,用于启动设定时间参数(调时或设定闹钟时间);3)显示电路的功能。
当输入数字时显示24小时时间功能。
4)闹铃功能设置闹铃的时间后.能按设置好的时间准时闹铃。
二.系统方案的设计要求根据以上各模块并结合显示屏的功能及元器件材料的情况,决定采用AT89C51为内核显示设计方案。
先进行系统的整体规划确定整个系统的功能,然后按照每个功能的具体要求,进行各个模块的实物设计并逐个调试,待全部通过后,进行整个系统的联调,最终实现一个完整的系统。
整个系统的设计步骤如下:在单片机最小系统的基础上,完成按键电路和复位电路的设计。
完成显示电路、数字按键、单片机时钟电路。
Ⅰ硬件设计系统硬件的设计可以根据系统的各个功能,把整个系统划分成若干个模块,分别对这些模块来进行设计,然后在通过单片机程序来实现对各个硬件模块功能的调度。
本系统涉及到的硬件模块有:按键电路、数码管显示电路、单片机时钟电路、蜂鸣器电路。
各部分实现功能如下:按键电路:提供按键信号。
单片机时钟电路、复位电路:提供内部时钟。
摘要这个设计时基于AT89C2051设计的电子时钟,通过对硬件资源和软件的编写,初步了解设计的思路以及实现过程。
电子闹钟是采用电子电路实现对时、分、秒进行数字显示的装置,广泛应用于个人家庭、医院、车站、码头、办公室等公共场所,成为人们日常生活中不可缺少的必需品。
本设计基于单片机技术原理,以AT89SC2051作为核心控制器,通过硬件电路的制作及软件程序的编制,设计制作了一种利用四位LED数码管动态扫描显示时间的电子闹钟系统。
整个电子闹钟系统主要由时间显示模块、时间设置、闹铃模块、闹钟响应模块。
可实现时间显示、时间调整、闹钟设置和整点闹铃功能,具有制作简单、调整方便、稳定性好、便于扩展等特点。
电子时钟还通过对比实际的数字电子时钟,来校正和调整,从而找出误差的来源,尽可能的减少误差,是系统可以达到实际数字电子时钟允许的误差范围内。
关键词:单片机AT89SC2051、电子闹钟、LED动态显示目录摘要 (I)1.引言 (1)2 系统设计 (1)2.1设计要求 (1)2.2总设计方案 (1)2.2.1 系统实现 (2)3系统硬件电路设计 (2)3.1时钟电路设计 (3)3.2显示模块的设计 (4)3.3按键模块的设计 (5)3.4复位电路设计 (5)3.5闹铃的设计 (6)3.6发光二极管闪烁电路设计 (6)4 软件设计 (7)4.1程序流程 (7)4.1.1主程序 (8)4.1.2 时钟走时模块 (9)4.1.3时间设置模块 (10)4.1.4闹钟设置模块 (11)4.1.5 奏乐模块 (11)5 系统测试 (15)5.1硬件调试 (15)5.2软件调试 (15)6 结论 (15)附录 (15)附录1器件清单 (15)附录2调试仪器 (16)附录3原理图和PCB图 (16)附录4实物 ............................................... 错误!未定义书签。
附录5程序清单 ........................................... 错误!未定义书签。
深圳职业技术学院Shenzhen Polytechnic 嵌入式C语言课程设计报告课题:学院:班级:姓名:目录一、设计方案 (1)1、功能简介 (1)2、开发测试环境选择 (1)二、液晶时钟程序设计 (1)1、功能状态转换图 (1)2、主要功能模块 (2)2.1主显示模块 (2)2.2功能选择模块 (2)2.3时间修改模块 (3)2.4闹铃修改模块 (3)2.6其他辅助模块函数以及变量 (4)三、小结 (4)四、附录 (5)1、使用说明 (5)2、参考文献资料 (5)3、附表1 (6)一、设计方案1、功能简介本文所设计的简易电子时钟可输出当前时间以及闹铃时间,并可通过机械按键来实现修改当前时间、修改闹铃时间、退出修改以及控制闹铃的打开和关闭,并通过1602型号的液晶屏显示出不同操作时的不同界面。
本程序共设计按键5个,按键及功能分别是1键:选择功能界面下选择时间修改、时间和闹铃修改状态下的增加“1”计数;2键:选择功能界面下选择闹铃修改、时间和闹铃修改状态下的减少“1”计数;3键:主显示界面下进入选择功能界面、时间和闹铃修改状态下切换修改项目、修改完成退回主显示界面;4键:时间和闹铃修改状态下直接退回主显示界面;5键:主显示界面下控制闹铃的开关。
2、开发测试环境选择开发软件选择了ARM公司的KeiluVision4,仿真软件选择了英国Labcenter electronics公司的proteus7 professional,测试硬件选择了普中的HC6800开发箱。
首先在KeiluVision4下进行程序设计,编译通过后用proteus7 professional进行仿真并尝试下载到开发箱中进行操作,最后下载到开发箱中进行操作演示。
二、液晶时钟程序设计1、功能状态转换图2、主要功能模块注:本文中提到的函数均见附表1的液晶时钟源程序中,本次使用的是1602液晶。
2.1主显示模块主显示模块包含了时间显示模块void TimeDisplay(void)函数,其运行过程为首先读取初始值,再通过定时器中断TO的中断服务函数void T0_int () interrupt 1 来进行秒计时并通过void TimeRunning(void)函数进行时间的加计数和进位运算;闹铃显示模块void AlarmDisplay(void),其运行过程为首先读取初始值,再通过void AlarmRunning(void)来进行比较,如果预设时间与当前时间相等就将响铃标记变量SoundFlage_1置为1,进而引发主函数中的响铃事件。
电子时钟设计一、设计目的在我们现代日常生活中,电子时钟已得到及其广泛的应用,已成为我们日常生活中的不可或缺的一部分。
本次设计的主要目的即是利用51单片机设计一个可实现24小时计时的电子时钟,计时从0时0分0秒开始,到23小时59分59秒后返回0时0分0秒自动重新开始计时。
本设计拥有时间调整功能和时间显示功能,无年、月计数和闹钟功能。
二、需求分析本设计中的时钟要求使用8个8段数码管显示当前时间,其中秒单元与分单元中间以“-”符号隔开,分单元与时单元中间同样以“-”符号隔开。
计时范围为从00-00-00到23-59-59,当计时到23-59-59后自动返回00-00-00并重新开始计时。
设计中使用3个按键分为set、add和sub,当在计时功能工作时按下set键即可进入调时模式,在调试模式下累计按6次set后便退出调时功能,重新返回计时功能。
三、总体设计1、总体设计框图2、器件选型:主要使用的器件为STC89C51RC型单片机。
该型号的单片机有P1、P2、P3、P4共4个准双向口,且包含3个16位可编程定时/计数器T0、T1、T2。
其定时可由硬件电路与中断方式控制,而定时时间和范围则完全由所编写的代码来确定和改变。
在本次设计中主要实用0号和1号定时/计数器,通过设置使它们均实图3-1 总体设计框图现50ms计数,其中0号计数器配合20次循环计数以实现1m计时,1号计数器配合10次循环计数以实现对相应调整位的0.5m闪烁。
设计中还主要使用到3个74LS373数据锁存器、1个74LS244输入缓冲器以及8个8段数码显示器。
四、硬件设计1、硬件框图图4-1 硬件框图2、硬件模块设计a、时间计时模块设计:该模块的功能实现是将十位时、个位时、十位分、个位分、十位秒和个位秒分别存入s_hou、g_hou、s_min、g_min、s_sec和g_sec中,每个数值对应一个无符号字节。
T0计数器实现计数功能,但计数满20次50ms即1000ms时,g_sec 的值加1,当g_sec计数值为10时将g_sec清零并使s_sec计数加1,以此类推,直到计数值为23-59-59,并在下一秒返回00-00-00。
1 系统电路设计1.1 系统总体设计思路此设计原理框图如下所示,电路包括四个部分:单片机,键盘,锁存及显示电路,掉电保护电路。
图1.1 单片机实现数码管显示电子钟总框图对于各部分:(1)单片机发送的信号经过锁存电路最终在数码管上显示出来。
(2)单片机通过输出各种电脉冲信号来驱动控制各部分正常工作。
(3)掉电保护电路保证系统掉电时时钟不会停止。
(4)为使时钟走时与标准时间一致,校时电路是必不可少的,键盘用来校正数码管上显示的时间。
1.2 工作原理设计的电路主要由四大模块构成:掉电保护电路,单片机控制电路,显示电路以及校正电路。
本设计采用C语言程序设计,使单片机控制数码管显示年、月、日、时、分、秒,当秒计数计满60时就向分进位,分计数器计满60后向时计数器进位,小时计数器按“23翻0”规律计数。
时、分、秒的计数结果经过数据处理可直接送显示器显示。
当计时发生误差的时候可以用校时电路进行校正。
时计数器计满24小时后自动向日计数器进一,日计数器需判断平年、闰年和大月、小月,当日计数器计满时,向月计数器进位,月计数器计满12月向年计数器进位。
设计采用的是年、月、日、时、分、秒显示,单片机对数据进行处理同时在数码管上显示。
2 单元电路设计2.1 单片机电路设计本设计采用AT89C52单片机进行设计,它是一种低功耗,高性能的CMOS8位微处理器,内部有8K字节的程序存储器和256字节的数据存储单元,32个I/O端口,3个16位定时/计数器,8个中断源。
时钟电路是单片机系统的心脏,它控制着单片机的工作节奏。
本设计采用内部时钟方式,12MHz的石英晶体振荡器。
电路图如下图2.1 时钟电路复位电路由单片机引脚RST接入,只要RST端保持10ms以上的高电平,就能使单片机有效地复位,本设计采用上电复位和手动复位两种方式。
电路图如下图2.2 复位电路2.2 掉电保护电路设计本设计采用如下掉电保护电路,当电源供电正常时,一方面给单片机供电,另一方面给电池充电,当电源断电时,电池放电,继续给单片机供电,保证其正常工作。
功能最全的电子钟【单片机】c51数字时钟(带年月日显示)摘要:本设计以单片机为核心,lcd1602显示。
采用独立键盘输入能任意修改当前时间日期和设定闹钟时间。
具有显示年月日(区分闰年和二月),闹钟报警和整点报时功能主程序:/********************************************************************************************************************************************************************************* ****************************************** lcd1602电子钟********************************************************************************************************************************** *************************************************************************************************** ********************/# include <reg52.h># include "lcd16024.h"sbit key1 = P2^0; //调整sbit key2 = P2^1; //加1sbit key3 = P2^2; //减1sbit speaker = P2^3; //蜂鸣器sbit key4 = P2^4; //闹钟设计bit cal_year = 1; //进入判断闰年标志位bit leap_year; //闰年标志位bit calculate = 0; //日加一标记bit run = 0; //闹钟标志bit beep = 0; //整点报时标志//uint8 num = 0; //调整是给的脉冲uint8 code str1[] = "D: ";uint8 code str2[] = "T: ";uint8 code str3[] = "Wek";uint8 daystr[]="2013-07-29 "; //年月日格式uint8 timestr[]="21:30:59 N"; //时分秒格式uint8 daystr1[]="2013-07-29 "; //闹钟年月日格式uint8 timestr1[]="21:30:59 N"; //闹钟时分秒格式uint8 numweek = 0; //星期加1标记char week = 1; //星期char sec = 53; //秒char min = 50; //分char hour = 23; //时uint8 day = 30; // 日uint8 month = 9; //月uint16 year = 2013; //年char week1 = 1; //闹钟星期char sec1 = 58; //闹钟秒char min1 = 50; //闹钟分char hour1 = 23; //闹钟时uint8 day1 = 30; //闹钟日uint8 month1 = 9; //闹钟月uint16 year1 = 2013; //闹钟年uint8 WeekData1; //闹钟星期标记uint8 number = 0; //定时uint8 WeekData; //星期标记uint8 speaker_num; //整点报时次数uint8 scan_key(void); //函数声名/****************************************************************************** ***************************** 更新LCD时间分离读取******************************************************************************************************************* *******/void TimeChange(){//时分秒timestr[7] = sec%10+'0';timestr[6] = sec/10+'0';timestr[4] = min%10+'0';timestr[3] = min/10+'0';timestr[1] = hour%10+'0';timestr[0] = hour/10+'0';//年月日daystr[9] = day%10+'0';daystr[8] = day/10+'0';daystr[6] = month%10+'0';daystr[5] = month/10+'0';daystr[3] = year%10+'0';daystr[2] = year/10%10+'0';daystr[1] = year/100%10+'0';daystr[0] = year/1000+'0';//星期WeekData = week+'0';}/****************************************************************************** ***************************** 闹钟更新LCD时间分离读取******************************************************************************************************************* *******/void TimeChange1(){//时分秒timestr1[7] = sec1%10+'0';timestr1[6] = sec1/10+'0';timestr1[4] = min1%10+'0';timestr1[3] = min1/10+'0';timestr1[1] = hour1%10+'0';timestr1[0] = hour1/10+'0';//年月日daystr1[9] = day1%10+'0';daystr1[8] = day1/10+'0';daystr1[6] = month1%10+'0';daystr1[5] = month1/10+'0';daystr1[3] = year1%10+'0';daystr1[2] = year1/10%10+'0';daystr1[1] = year1/100%10+'0';daystr1[0] = year1/1000+'0';//星期WeekData1 = week1+'0';}/****************************************************************************** ***************************** 初始化系统定时器0 ******************************************************************************************************************* *******/void systimer0_init(void){TMOD |=0x01;//设置为1时用或(|)TMOD &=0xfd;//设置为0时用与(&)TH0 = 0xDC; // 定时10msTL0 = 0x00;EA = 1;ET0=1;TR0=1;EX0 = 1;}/****************************************************************************** ***************************** 闹钟时间设置*************************************************************************************************************** *******/void naozhong(){uint8 number = 1;uint8 a = 0;uint8 b = 0;if(0 == key4){Delay1Ms(5);if(0 == key4){a = 1;LCD_write_command(0xc0+9);LCD_write_command(0x0f);}while(!key4);}while(a){if(0 == key4){Delay1Ms(5);if(0 == key4){a = 0;run = ~run;while(!key4);}}if(run){timestr[9] = 'Y';}else{timestr[9] = 'N';}if(0 == key1){Delay1Ms(5);if(0 == key1){b = 1;}while(!key1);}while(b){if(0 == key1){Delay1Ms(5);if(0 == key1){number++;if(4 == number)b = 0;}while(!key1);if(number == 1){LCD_write_command(0xc0+9);LCD_write_command(0x0f);}if(number == 2){LCD_write_command(0xc0+6);LCD_write_command(0x0f);}if(number == 3){LCD_write_command(0xc0+3);LCD_write_command(0x0f);}}}switch(number){case 1:if(0 == key2) //闹钟秒加1的设置{Delay1Ms(5);if(0 == key2){sec1++;if(60 == sec1){sec1 = 0;}while(!key2);timestr1[7] = sec1%10+'0';timestr1[6] = sec1/10+'0';LCD_write_char(8,1,timestr1[6]);LCD_write_char(9,1,timestr1[7]);LCD_write_command(0xc0+9);}}if(0 == key3) //闹钟秒减1的设置Delay1Ms(5);if(0 == key3){sec1--;if(sec1 < 0){sec1 = 59;}while(!key3);timestr1[7] = sec1%10+'0';timestr1[6] = sec1/10+'0';LCD_write_char(8,1,timestr1[6]);LCD_write_char(9,1,timestr1[7]);LCD_write_command(0xc0+9);}}break;case 2:if(0 == key2) //闹钟分加1的设置{Delay1Ms(5);if(0 == key2){min1++;if(60 == min1){min1 = 0;}while(!key2);timestr1[4] = min1%10+'0';timestr1[3] = min1/10+'0';;LCD_write_char(5,1,timestr1[3]);LCD_write_char(6,1,timestr1[4]);LCD_write_command(0xc0+6);}}if(0 == key3) //闹钟分减1的设置{Delay1Ms(5);if(0 == key3){min1--;if(min1 < 0){min1 = 59;}while(!key3);timestr1[4] = min1%10+'0';timestr1[3] = min1/10+'0';;LCD_write_char(5,1,timestr1[3]);LCD_write_char(6,1,timestr1[4]);LCD_write_command(0xc0+6);}}break;case 3:if(0 == key2) //闹钟时加1的设置{Delay1Ms(5);if(0 == key2){hour1++;if(24 == hour1){hour1 = 0;}while(!key2);timestr1[1] = hour1%10+'0';timestr1[0] = hour1/10+'0';LCD_write_char(2,1,timestr1[0]);LCD_write_char(3,1,timestr1[1]);LCD_write_command(0xc0+3);}}if(0 == key3) //闹钟时减1的设置{Delay1Ms(5);if(0 == key3){hour1--;if(hour1 < 0){hour1 = 23;}while(!key3);timestr1[1] = hour1%10+'0';timestr1[0] = hour1/10+'0';LCD_write_char(2,1,timestr1[0]);LCD_write_char(3,1,timestr1[1]);LCD_write_command(0xc0+3);}}break;case 4:b = 0;LCD_write_command(0x0c);break;}}}LCD_write_command(0x0c);while(!key4);}/****************************************************************************** ***************************** 判断按键进入时间调整*************************************************************************************************************** *******/uint8 scan_key(void){uint8 number = 1;uint8 a = 0;if(0 == key1){Delay1Ms(5);if(0 == key1){while(!key1);a = 1;LCD_write_command(0xc0+9);LCD_write_command(0x0f);}}while(a){if(0 == key1){Delay1Ms(5);if(0 == key1){number++;while(!key1);TR0 = 0;if(number == 2){LCD_write_command(0xc0+6);LCD_write_command(0x0f);}if(number == 3){LCD_write_command(0xc0+3);LCD_write_command(0x0f);}if(number == 4){LCD_write_command(0x80+11);LCD_write_command(0x0f);}if(number == 5){LCD_write_command(0x80+8);LCD_write_command(0x0f);}if(number == 6){LCD_write_command(0x80+5);LCD_write_command(0x0f);}if(number == 7){LCD_write_command(0xc0+14);LCD_write_command(0x0f);}if(8 == number){LCD_write_command(0x0c);a = 0;number = 0;}}}switch(number){case 1:if(0 == key2) //秒加1的设置{Delay1Ms(5);if(0 == key2){sec++;if(60 == sec){sec = 0;}timestr[7] = sec%10+'0';timestr[6] = sec/10+'0';LCD_write_char(8,1,timestr[6]);LCD_write_char(9,1,timestr[7]);LCD_write_command(0xc0+9);while(!key2);}}if(0 == key3) //秒减1的设置{Delay1Ms(5);if(0 == key3){sec--;if(sec < 0){sec = 59;}timestr[7] = sec%10+'0';timestr[6] = sec/10+'0';LCD_write_char(8,1,timestr[6]);LCD_write_char(9,1,timestr[7]);LCD_write_command(0xc0+9);while(!key3);}}break;case 2:if(0 == key2) //分加1的设置{Delay1Ms(5);if(0 == key2){min++;if(60 == min){min = 0;}timestr[4] = min%10+'0';timestr[3] = min/10+'0';;LCD_write_char(5,1,timestr[3]);LCD_write_char(6,1,timestr[4]);LCD_write_command(0xc0+6);while(!key2);}}if(0 == key3) //分减1的设置{Delay1Ms(5);if(0 == key3){min--;if(min < 0){min = 59;}timestr[4] = min%10+'0';timestr[3] = min/10+'0';LCD_write_char(5,1,timestr[3]);LCD_write_char(6,1,timestr[4]);LCD_write_command(0xc0+6);while(!key3);}}break;case 3:if(0 == key2) //时加1的设置{Delay1Ms(5);if(0 == key2){hour++;while(!key2);if(24 == hour){hour = 0;}timestr[1] = hour%10+'0';timestr[0] = hour/10+'0';LCD_write_char(2,1,timestr[0]);LCD_write_char(3,1,timestr[1]);LCD_write_command(0xc0+3);}}if(0 == key3) //时减1的设置{Delay1Ms(5);if(0 == key3){while(!key3);hour--;if(hour < 0){hour = 23;}timestr[1] = hour%10+'0';timestr[0] = hour/10+'0';LCD_write_char(2,1,timestr[0]);LCD_write_char(3,1,timestr[1]);LCD_write_command(0xc0+3);}}break;case 4:if(0 == key2) //日加1的设置{Delay1Ms(5);if(0 == key2){while(!key2);calculate = 1;if(calculate == 1){if(month==1|month==3|month==5|month==7|month==8|month==10|month==12){day++;if(day > 31){day=1;}}if(month==4|month==6|month==9|month==11){day++;if(day > 30){day=1;}}if(month == 2){cal_year = 1;while(cal_year == 1){leap_year = ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0));cal_year = 0;}if(leap_year==1){day++;if(day > 30){day=1;}}else{day++;if(day > 29){day=1;}}}calculate = 0;}daystr[9] = day%10+'0';daystr[8] = day/10+'0';LCD_write_char(10,0,daystr[8]);LCD_write_char(11,0,daystr[9]);LCD_write_command(0x80+11);}}if(0 == key3) //日减1的设置{Delay1Ms(5);if(0 == key3){while(!key3);calculate = 1;if(calculate == 1){if(month==1|month==3|month==5|month==7|month==8|month==10|month==12){day--;if(day == 0){day=31;}}if(month==4|month==6|month==9|month==11){day--;if(day == 0){day=30;}}if(month == 2){cal_year = 1;while(cal_year == 1){leap_year = ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0));cal_year = 0;}if(leap_year==1){day--;if(day == 0){day=30;}}else{day--;if(day == 0){day=29;}}}calculate = 0;}daystr[9] = day%10+'0';daystr[8] = day/10+'0';LCD_write_char(10,0,daystr[8]);LCD_write_char(11,0,daystr[9]);LCD_write_command(0x80+11);}}break;case 5:if(0 == key2) //月加1的设置{Delay1Ms(5);if(0 == key2){while(!key2);month++;if(13 == month){month = 1;}daystr[6] = month%10+'0';daystr[5] = month/10+'0';LCD_write_char(7,0,daystr[5]);LCD_write_char(8,0,daystr[6]);LCD_write_command(0x80+8);}}if(0 == key3) //月减1的设置{Delay1Ms(5);if(0 == key3){while(!key3);month--;if(month == 0){month = 12;}daystr[6] = month%10+'0';daystr[5] = month/10+'0';LCD_write_char(7,0,daystr[5]);LCD_write_char(8,0,daystr[6]);LCD_write_command(0x80+8);}}break;case 6:if(0 == key2) //年加1的设置{Delay1Ms(5);if(0 == key2){while(!key2);year++;}daystr[3] = year%10+'0';daystr[2] = year/10%10+'0';daystr[1] = year/100%10+'0';daystr[0] = year/1000+'0';LCD_write_char(2,0,daystr[0]);LCD_write_char(3,0,daystr[1]);LCD_write_char(4,0,daystr[2]);LCD_write_char(5,0,daystr[3]);LCD_write_command(0x80+5);}if (0 == key3) //年减1的设置{Delay1Ms(5);if(0 == key3){while(!key3);year--;if(year == 0){year = 2020;}daystr[3] = year%10+'0';daystr[2] = year/10%10+'0';daystr[1] = year/100%10+'0';daystr[0] = year/1000+'0';LCD_write_char(2,0,daystr[0]);LCD_write_char(3,0,daystr[1]);LCD_write_char(4,0,daystr[2]);LCD_write_char(5,0,daystr[3]);LCD_write_command(0x80+5);}}break;case 7:if(0 == key2) //星期加1的设置{Delay1Ms(5);if(0 == key2){while(!key2);week++;if(7 == week){week = 0;}LCD_write_char(14,1,week+'0');LCD_write_command(0xc0+14);}}if (0 == key3) //星期减1的设置{Delay1Ms(5);if(0 == key3){while(!key3);week--;if(week < 0){week = 6;}LCD_write_char(14,1,week+'0');LCD_write_command(0xc0+14);}}break;case 8:TR0 = 1;break;}}}/****************************************************************************** ***************************** 主函数******************************************************************************************************************* *******/void main(void){systimer0_init();LCD_init();LCD_write_str(0,0,str1);LCD_write_str(0,1,str2);LCD_write_str(13,0,str3);speaker = 0;while (1){TimeChange();scan_key();naozhong();LCD_write_str(2,0,daystr);LCD_write_str(2,1,timestr);LCD_write_char(14,1,WeekData);if(1 == run){if(sec==sec1 & month==month1 & hour==hour){speaker_num =30;beep = 1;}}else{speaker_num =0;beep = 0;}}}/****************************************************************************** ***************************** 定时中断0 ******************************************************************************************************************* *******/void time_0() interrupt 1{TH0 = 0xDC; // 定时10msTL0 = 0x00;number++;if(number ==100){sec++;if(beep){speaker=!speaker;speaker_num--;if(speaker_num == 0){beep=0;speaker = 0;}}if(sec == 60){sec = 0;min++;if(min == 60){min = 0;hour++; //小时加1speaker_num = hour%12; //蜂鸣器响的次数beep = 1;if(hour == 24){hour = 0;calculate = 1;if(calculate == 1) //判断这个月有多少天{if(month==1|month==3|month==5|month==7|month==8|month==10|month==12){day++;if(month==7|month==12){week++;if(7 == week){week = 0;}}else{if(day <= 31){week++;if(7 == week){week = 0;}}}if(day > 31){if(month==7|month==12){day = 1;}else{day=0;}month++;if(month > 12){month=1;year++;cal_year=1;}}}if(month==4|month==6|month==9|month==11) {day++;week++;if(7 == week){week = 0;}if(day > 30){day=1;month++;if(month > 12){month=1;year++;cal_year=1;}}}if(month == 2){while(cal_year == 1){leap_year = ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0));cal_year = 0;}if(leap_year==1){day++;if(day <= 30){week++;if(7 == week){week = 0;}}if(day > 30){day=1;month++;if(month > 12){month=1;year++;cal_year=1;}}}else{day++;week++;if(7 == week){week = 0;}if(day > 29){day=1;month++;if(month > 12){month=1;year++;cal_year=1;}}}}}calculate=0;}}}}}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Lcd1602.c子程序:////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /****************************************************************************** ***************************** lcd1602低层函数********************************************************************************************************************* *******/# include <reg52.h># include <intrins.h># include "lcd16024.h"# define LCD_DATA P0 //LCD1602的数据口定义sbit LCD_RS = P0^0; //LCD1602控制线的定义,4位控制方式sbit LCD_RW = P0^1;sbit LCD_EN = P0^2;/****************************************************************************** ***************************** 延时1MS********************************************************************************************************************* *******/void Delay1Us(uint16 n){for(;n>0;n--){_nop_();}}/****************************************************************************** ***************************** 延时1MS********************************************************************************************************************* *******/void Delay1Ms(uint16 n){while(n--){Delay1Us(1000);}}/****************************************************************************** ***************************** 延时1MS********************************************************************************************************************* *******/void LCD_en_write(void){LCD_EN=0;LCD_EN=1;Delay1Us(1);LCD_EN=0;}/****************************************************************************** ************************ LCD写一个字节命令函数************************************************************************************************************ *******/void LCD_write_command(uint8 command){Delay1Us(16);LCD_RS=0;LCD_RW=0;LCD_DATA&=0x0f;LCD_DATA|=command&0xf0;LCD_en_write();command=command<<4;LCD_DATA&=0x0f;LCD_DATA|=command&0xf0;LCD_en_write();}/****************************************************************************** ********************** LCD写一个字节数据函数*************************************************************************************************************** *******/void LCD_write_data(uint8 Data){Delay1Us(16);LCD_RS=1;LCD_RW=0;LCD_DATA&=0x0f;LCD_DATA|=Data&0xf0;LCD_en_write();Data=Data<<4;LCD_DATA&=0x0f;LCD_DATA|=Data&0xf0;LCD_en_write();}/****************************************************************************** ***************************** LCD1602光标定位函数************************************************ x--列0~15;y--行0~1********************************************************************************************************* *******/void LCD_set_xy(uint8 x,uint8 y){uint8 address;if(y==0)address=0x80+x;else address=0xc0+x;LCD_write_command(address);}/***************************************************************************************************** LCD1602 初始化函数,四位显示方式******************************************************************************************************* *******/void LCD_init(){LCD_write_command(0x28);// Delay1Us(40);LCD_write_command(0x28);LCD_write_command(0x0c);LCD_write_command(0x01);LCD_write_command(0x06);Delay1Ms(2);}/****************************************************************************** ***************************** LCD写字符串函数******************************************************* x--列0~15;y--行0~1******************************************************* s指向字符串数组**************************************************************************************************************** *******/void LCD_write_str(uint8 x,uint8 y,uint8 *s){LCD_set_xy(x,y);while(*s){LCD_write_data(*s);s++;}}/****************************************************************************** ***************************** LCD写一个字符函数******************************************************* x--列0~15;y--行0~1******************************************************* d--字符的ASCII码**************************************************************************************************************** *******/void LCD_write_char(uint8 x,uint8 y,uint8 d){LCD_set_xy(x,y);LCD_write_data(d);}/*////////////////////////////////////////////////////////////////// 等待繁忙标志/////////////////////////////////////////////////////////////////void LCD_wait(void){P0 = 0xFF;do{LCD_RS = 0;LCD_RW = 1;LCD_EN = 0;LCD_EN = 1;}while (BUSY == 1);LCD_EN = 0;}*//****************************************************************************** ***************************** LCD1602左移********************************************************************************************************************* *******void LCD_youyi(uint8 y,uint8 *s){LCD_write_str(17,y,s);for(a=0;a<16;a++){LCD_write_command(0x1c); //左移LCD_write_command(0x1c); 为右移Delay1Ms(6);}}*///LCD_write_command(0x0d);//光标闪烁//LCD_write_command(0x0e);//光标显示不闪烁//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Lcd1602.h头文件////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _LCD16024_H_#define _LCD16024_H_typedef unsigned char uint8;typedef unsigned int uint16;typedef unsigned long uint32;void Delay1Us(uint16 n);void Delay1Ms(uint16 n);void LCD_write_data(uint8 dat);void LCD_write_command(uint8 com); //BuysC为0时忽略忙检测void LCD_set_xy(uint8 x,uint8 y);void LCD_en_write(void);void LCD_write_char(uint8 x, uint8 y, uint8 Data1);void LCD_write_str(uint8 x, uint8 y,uint8 *s);void LCD_init();//void LCD_wait(void);//void LCD_youyi(uint8 y,uint8 *s);#endif。
课程名称:单片机原理与接口技术实践设计课题:基于MCS 51单片机实现电子闹钟功能的设计学院:电子与信息工程学院专业:通信工程小组成员:电子闹钟在科学技术高度发展的今天,千家万户都少不了它,所以很多家庭个人都需要有一个电子闹钟,为人们提供报时方便,但普通电子闹钟不够方便实用。
本文给出了一种基于MCS51单片机实现电子闹钟功能的设计方法,从而给人们带来更为方便的工作与生活。
一.电子闹钟简介我们设计的电子闹钟是以MCS 51单片机中的计时器作为时钟,用8位数码管显示当前时间,并且可以设置闹钟时间,并在设置的时间点发出闹铃。
简易闹钟具有以下功能:1.时钟能准确地走时,并可以通过数码管进行显示2.复位后可以进行当前时间的设置3.可以随意设置闹钟时间,闹钟会在设置时间响铃整个系统的任务要求:1)输入数字按键的功能。
保证数字的输入。
2)复位电路的功能。
所有时间回到初始化状态,用于启动设定时间参数(调时或设定闹钟时间);3)显示电路的功能。
当输入数字时显示24小时时间功能。
4)闹铃功能设置闹铃的时间后.能按设置好的时间准时闹铃。
二.系统方案的设计要求根据以上各模块并结合显示屏的功能及元器件材料的情况,决定采用AT89C51为核显示设计方案。
先进行系统的整体规划确定整个系统的功能,然后按照每个功能的具体要求,进行各个模块的实物设计并逐个调试,待全部通过后,进行整个系统的联调,最终实现一个完整的系统。
整个系统的设计步骤如下:在单片机最小系统的基础上,完成按键电路和复位电路的设计。
完成显示电路、数字按键、单片机时钟电路。
Ⅰ硬件设计系统硬件的设计可以根据系统的各个功能,把整个系统划分成若干个模块,分别对这些模块来进行设计,然后在通过单片机程序来实现对各个硬件模块功能的调度。
本系统涉及到的硬件模块有:按键电路、数码管显示电路、单片机时钟电路、蜂鸣器电路。
各部分实现功能如下:按键电路:提供按键信号。
单片机时钟电路、复位电路:提供部时钟。
基于51的电⼦闹钟设计报告(附原理图、PCB图、程序)成都信息⼯程学院第五届嵌⼊式创新技术⼤赛基于MCS51的智能电⼦闹钟设计报告姓名学院班级实物图⽬录1.电⼦时钟的设计原理和⽅法 (1)1.1设计原理 (1)1.2 硬件电路的设计 (1)1.2.1 STC89C51RC简介 (1)1.2.2 键盘电路的设计 (2)1.2.3蜂鸣器驱动电路 (3)1.2.4 数码管驱动电路 (3)1.2.5 电源电路 (4)1.3软件部分的设计 (4)1.3.1主程序部分的设计 (4)1.3.2中断计时器及时间进位 (5)1.3.3 闹钟⼦函数 (7)1.3.4 按键扫描 (8)1.3.5 时钟闹钟设置 (9)1.3.6 显⽰数字函数 (10)1.3.7 显⽰界⾯函数 (10)1.3.8 闹钟记录及读取 (11)2.硬件调试 (13)附录A:电路原理图 (15)附录B:电路PCB图 (16)附录C:源程序 (17)1.电⼦时钟的设计原理和⽅法1.1设计原理系统框图1.2硬件电路的设计1.2.1 STC89C51RC简介STC89C52R CSTC89C51RC是⼀种带8K闪烁可编程可擦除只读存储器(FPETOM-FlashProgrammabalandErasableReadOnlyMemory )的低电压、⾼性能CMOS8位微型处理器,即单⽚机芯⽚。
单⽚机的可擦除只读存储器可以反复擦除1000次,内部FLASH 擦写次数为100000次以上。
该芯⽚使⽤⾼密度⾮易失存储制造技术,与⼯业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU 和闪烁存储器集成在单个芯⽚中,使得STC89C51RC 成为了⼀种性价⽐极⾼的微型处理器芯⽚,在许多电路设计中都得到了应⽤。
STC89C51RC 单⽚机特点:⼯作电压:5.5V-3.4V ⼯作频率:0-40MHz ⽤户应⽤程序空间:8K ⽚上集成128*8RAMISP (在系统可编程)/IAP (在应⽤可编程),⽆需专⽤编程器/仿真器可通过串⼝(P3.0/P3.1)直接下载⽤户程序EEPROM 功能共3个16位定时器/计数器,其中定时0还可以当成2个8位定时器使⽤外部中断4路通⽤异步串⾏⼝(UART ),还可⽤定时器软件实现多个UART ⼯作温度范围:0-75℃引脚说明:VCC:供电电压 GND :接地P0:P0是⼀个8位漏级开路双向I/O ⼝,低8位地址复⽤总线端⼝。
单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词:电子钟 AT89C52 硬件设计软件设计目录NO TABLE OF CONTENTS ENTRIES FOUND.一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。
具有时间显示,并有时间设定,时间调整功能。
1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。
该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。
1.3 设计课的设计总体方案介绍及工作原理说明本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:图1-1总体设计方案图本电子钟的所有的软件、参数均存放在AT89C52的Flash ROM和内部RAM 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。
键盘采用动态扫描方式。
利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
51单片机的电子时钟设计一、引言随着科技的发展和人们对时间的准确度的要求日益提高,电子时钟成为了人们生活中不可缺少的一部分。
本文将介绍一种基于51单片机的电子时钟设计。
二、硬件设计1.主控部分本设计使用了51单片机作为主控芯片,51单片机具有丰富的接口资源和强大的处理能力,非常适合用于电子时钟的设计。
2.显示部分采用了数码管显示屏作为显示部分。
为了提高显示的清晰度,我们选用了共阳数码管。
使用4位数码管即可显示时、分和秒。
3.时钟部分时钟部分由振荡器和RTC电路构成。
振荡器提供时钟脉冲信号,RTC 电路实现对时钟的准确计时。
4.按键部分按键部分采用矩阵按键,以实现对时间的设置和调整。
三、软件设计1.系统初始化在系统初始化阶段,需要对硬件进行初始化设置。
包括对I/O口的配置,定时器的初始化等。
2.时间设置用户可以通过按键设置当前的时间。
通过矩阵按键扫描,检测到用户按下了设置键后,进入时间设置模式。
通过按下加减键,可以增加或减少时、分、秒。
通过按下确认键,将设置的时间保存下来。
3.时间显示在正常运行模式下,系统将会不断检测当前的时间,并将其显示在数码管上。
通过对时钟模块的调用,可以获取当前的时、分、秒并将其显示出来。
4.闹钟功能在时间设置模式下,用户还可以设置提醒闹钟的功能。
在设定时间到来时,系统会发出蜂鸣器的声音,提醒用户。
四、测试与验证完成软硬件设计后,进行测试与验证是必不可少的一步。
通过对硬件的连线接触检查和软件的功能测试,可以确保整个设计的正确性和可靠性。
五、总结通过本次设计,我对51单片机的使用和原理有了更清晰的认识,同时也对电子时钟的设计和制作有了更深入的了解。
电子时钟作为一种常见的电子产品,在我们的日常生活中发挥了重要的作用。
这次设计过程中,我遇到了许多问题,但通过查阅资料并与同学一起探讨,最终解决了问题。
相信通过不断的学习和实践,我可以在未来的设计中取得更好的成果。
设计任务书题目:基于C51单片机地实用电子时钟设计初始条件1.一台装有PROTEL软件或以上版本地电脑及使用PROTEL软件绘制电路原理图和印刷电路板地基本技能;2.模拟、数字、高频、单片机、或者一个具有完备功能地电子电路系统.要求完成地主要任务:1.绘制具有一定规模、一定复杂程度地电路原理图*.sch(自选).可以涉及模拟、数字、高频、单片机、或者一个具有完备功能地电子电路系统.2.绘制相应电路原理图地双面印刷版图*.pcb,对电路原理图进行仿真,给出仿真结果(如波形*.sdf、数据)并说明是否达到设计意图.参考书目:1. 谢自美.电子线路设计·实验·测试(第三版).武汉:华中科技大学出版社2. 康华光. 电子技术基础模拟部分.高等教育出版社,2005时间安排查阅资料2天Protel设计2天电路仿真2天报告撰写1天指导教师签名:2013年月日系主任(或责任教师)签名:2013年月日摘要Altium Designer 是业界第一款一体化电子产品设计解决方案,它将设计流程、集成化PCB设计、可编程器件(如FPGA)设计和基于处理器地嵌入式软件开发功能整合在一起地产品,是一种能同时进行原理图、PCB和FPGA设计及嵌入式设计地解决方案,具有将设计方案从概念转变为最终产品所需地全部功能.作为电子专业地学生,掌握EDA软件是十分重要地,熟练使用各种EDA软件对以后地学习研究、工作都很有帮助.本次课程设计主要是设计一个基于C51单片机地实用电子时钟.通过课程设计,掌握Altium Designer地基本使用方法,学会画原理图,进行PCB制作,并给予必要地仿真.关键词:Altium Designer;原理图;PCB制作;电子时钟AbstractAltium Designer is the industry's first unified electronics design solutions that will design flow, integrated PCB design, programmable devices (eg FPGA) design and processor-based embedded software development capabilities integrated products, is the one kind can simultaneously schematic, PCB and FPGA design and embedded design solutions with the design from concept to final product all the necessary functions.As electronics majors, master EDA software is very important, skilled use of a variety of EDA software for future study and research work are very helpful.The course design is to design a practical C51 microcontroller based electronic clock. Through curriculum design, master the basics of using Altium Designer, learn drawing schematics for PCB production and give the necessary simulation.Keywords:Altium Designer。
摘要单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。
单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。
由于具有上述优点,在我国,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。
这次毕业设计通过对它的学习、应用,以AT89S51芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它由4.5V直流电源供电,通过数码管能够准确显示时间,调整时间,从而到达学习、设计、开发软、硬件的能力。
电子时钟是采用数字电路实现对“时”、“分”、“秒”数字显示的计时装置。
电子时钟的精度、稳定度远远超过老式机械钟。
在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,用12MHz 的晶振产生振荡脉冲,定时器计数。
在此次设计中,电路具有显示时间的其本功能,还可以实现对时间的调整。
电子时钟是其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。
关键词:单片机;AT89S51ABSTRACTSince the 1970 s chip since the advent, with its high cost performance and attention by people and attention, it is widely used and fast development. SCM small volume, light weight, strong anti-jamming capability, environmental demand is not high, low cost, high reliability, flexibility is good, development more easy. Because of the above features, in our country, the microcontroller is widely used in industrial automation control, automatic detection, intelligent instrument and apparatus, household appliances, power electronics, mechanical and electrical equipment, and other aspects, and 51 SCM is the most typical chip and most representative one. The graduation design through to its study, application to AT89S51 chips as the core, with the necessary circuit, design of a simple electronic clock, it by 4.5 V dc power supply, through the electronic tube can show time, adjust the time, thus to learning, the design, the development of software and hardware in the ability.Electronic Clock is a electronic circuit implementation of the "when", "sub", "seconds" The figures show the timing device. Electronic clock precision, stability, far more than the old mechanical clock. In this design, we use LED electronic display hours, minutes, seconds, to 24-hour time mode, according to electronic control theory to dynamic display to display, use the 12MHz crystal oscillation pulse, the timer count. In this design, the circuit has a display time of the this function, you can also realize the time adjustment. Electronic clock is its compact, low cost, travel time and high precision, easy to use, features and more, easy integration and loved by the general consumer, so widely used.Key words:Single-chip microcomputer ; AT89S51独创声明本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议。
第14卷第2期VoL.14 No .2鄂 州 大 学 学 报Journal of Ezhou University 2007年3月Mar .2007收稿日期:2007-01-08作者简介:万胜前(1973- ),女,湖北鄂州人,硕士,鄂州大学电子工程系副教授,研究方向:计算机应用。
基于Keil C51软件的电子钟设计与制作万胜前(鄂州大学电子工程系,湖北 鄂州 436000) 摘 要:该文介绍了Keil C51软件作为单片机应用系统设计工具的强大功能,并以单片机为核心实现电子钟的设计为例,阐述如何借助该软件进行单片机应用系统的设计与仿真。
关键词:Keil C51软件;单片机应用系统;电子钟;设计与仿真 中图分类号:TP368.1文献标识码:A文章编号:1008-9004(2007)02-0017-03 单片机作为实时控制已经应用到各个领域,应用现代工具开发单片机应用系统是现代电子类专业人员必须掌握的技术。
Keil C51是目前世界上最好的MCS -51单片机汇编和C 语言的开发工具,支持汇编、C 语言以及混合编程。
可以完成编辑、编译、连接、调试、仿真等整个开发流程,同时具备功能强大的软件仿真和硬件仿真(用mon51协议)功能。
下面用Keil C51软件和MF -89S52开发系统为平台,以单片机为核心,实现电子钟的设计与制作。
所设计的电子钟有以下功能:(1)自动计时,由6位LED 显示器显示时、分、秒。
(2)具备校准功能,可以直接由0~9数字键设置当前时间。
(3)具备定时起闹功能。
(4)一天时差不超过1秒钟。
1 硬件设计电子钟电路的核心是MCS -51单片机,运用单片机内部的定时/计数器进行中断定时,配合软件延时实现时、分、秒的计时。
该方案节省硬件成本。
我们选用性价比高的常规芯片89C51,采用12MHz 晶振,其内部带有4K B 的F LASH ROM ,无须外扩程序存储器;电脑时钟没有大量的运算和暂存数据,现有的128B 片内RA M 已能满足要求,也不必外扩片外RA M 。
第14卷第2期VoL.14 No .2鄂 州 大 学 学 报Journal of Ezhou University 2007年3月Mar .2007收稿日期:2007-01-08作者简介:万胜前(1973- ),女,湖北鄂州人,硕士,鄂州大学电子工程系副教授,研究方向:计算机应用。
基于Keil C51软件的电子钟设计与制作万胜前(鄂州大学电子工程系,湖北 鄂州 436000) 摘 要:该文介绍了Keil C51软件作为单片机应用系统设计工具的强大功能,并以单片机为核心实现电子钟的设计为例,阐述如何借助该软件进行单片机应用系统的设计与仿真。
关键词:Keil C51软件;单片机应用系统;电子钟;设计与仿真 中图分类号:TP368.1文献标识码:A文章编号:1008-9004(2007)02-0017-03 单片机作为实时控制已经应用到各个领域,应用现代工具开发单片机应用系统是现代电子类专业人员必须掌握的技术。
Keil C51是目前世界上最好的MCS -51单片机汇编和C 语言的开发工具,支持汇编、C 语言以及混合编程。
可以完成编辑、编译、连接、调试、仿真等整个开发流程,同时具备功能强大的软件仿真和硬件仿真(用mon51协议)功能。
下面用Keil C51软件和MF -89S52开发系统为平台,以单片机为核心,实现电子钟的设计与制作。
所设计的电子钟有以下功能:(1)自动计时,由6位LED 显示器显示时、分、秒。
(2)具备校准功能,可以直接由0~9数字键设置当前时间。
(3)具备定时起闹功能。
(4)一天时差不超过1秒钟。
1 硬件设计电子钟电路的核心是MCS -51单片机,运用单片机内部的定时/计数器进行中断定时,配合软件延时实现时、分、秒的计时。
该方案节省硬件成本。
我们选用性价比高的常规芯片89C51,采用12MHz 晶振,其内部带有4K B 的F LASH ROM ,无须外扩程序存储器;电脑时钟没有大量的运算和暂存数据,现有的128B 片内RA M 已能满足要求,也不必外扩片外RA M 。
6位共阴极数码管分别显示时、分、秒,4×3键盘输入,采用8155作为键盘/显示接口电路。
电子钟硬件原理图如图1所示。
利用8155的A 口作为6位LED 显示的位选口,其中,P A0~P A5分别对应位LED0~LED5,B口则作为段选口,C 口的低3位为键盘输入口,对应0~2行,A 口同时用作键盘的列扫描口。
由于采用共阴极数码管,因此A 口输出低电平选中相应的位,而B 口输出高电平点亮相应的段。
P1.0接蜂鸣器,低电平驱动蜂鸣器鸣叫启闹。
由图1可见,8155的地址分配为:控制寄存器:8000H,定义为P ORT;A 口:8001H,定义为P ORT A;B 口:8002H,定义为P ORT B;C 口:8003H,定义为P ORT C。
图1 电子钟硬件原理图2 软件设计2.1 系统资源分配为编写程序方便,先对系统的资源分配加以说明。
(1)定时器:定时器0用作时钟定时,按方式1工作,每隔100m s 溢出中断一次。
(2)片内RAM 及标志位的分配与定义见表1。
18 鄂 州 大 学 学 报第14卷表1 电子钟控制软件片内RAM 及标志位分配表地 址功 能名 称初始化值30H ~35H 显示缓冲区,时、分、秒(高位在前)D I SP0~D I SP500H 3CH ~3FH 计时缓冲区,时、分、秒、100m s HOUR,M I N ,SEC,MSEC 00H 40H ~42H 闹钟值寄存区,时、分、秒AHOUR,AM I N ,ASECFFH50H ~7FH 堆栈区PS W.5计时显示允许位(1:禁止,0:允许)F00PS W.1闹钟标志位(1:正在闹响,0:未闹响)F12.2 软件设计软件设计可分为以下几个功能模块:(1)主程序:初始化与键盘监控。
流程图如图2所示:图2 主程序流程图(2)计时:为定时器0中断服务子程序,完成刷新计时缓冲区的功能。
定时器0每隔100m s 溢出中断一次,则循环中断10次延时时间为1s,上述过程重复60次为1分,分计时60次为1小时,小时计时24次则时间重新回到00:00:00。
注意:第一,定时器溢出产生中断请求,CP U 并不一定立即响应中断,而可能需要延迟一个中断响应时间之后才能响应中断,中断响应时间大约为3~8个机器周期。
显然,这将在定时时间中加入额外的延时时间,导致计时误差。
为了保证计时精度,必须采取措施进行补偿。
我们采用增大重装的定时器0初值的方法来减少定时器0定时时间。
具体应调整为多大,一般需要通过调试来确定。
第二,时间是按十进制递增,而MCS -51单片机只有二进制加法指令,因此用加法指令计时必须进行二-十进制转换。
下面给出定时器0中断服务子程序CLOCK 程序。
;333定时器0中断服务子程序CLOCK 333CLOCK:MOV T L0,#0B7HMOV TH0,#3CH;重装初值P USH PS WP USH ACC;现场保护I N C MSEC MOV A,MSECCJNE A ,#10,DONE MOV MSEC,#00H MOV A,SEC I N C A DA AMOV SEC,ACJNE A ,#60,DONE MOV SEC,#00H MOV A,M I N I N C A DA A MOV M I N ,ACJNE A ,#60,DONE MOV M I N ,#00H MOV A,HOUR I N C A DA AMOV HOUR,ACJNE A ,#24,DONE MOV HOUR,#00HDONE:P OP ACCP OP PS W ;恢复现场RETI E ND(3)时间设置与闹钟设置:由键盘输入设置当前时间与定时启闹时间。
(4)显示:完成6位动态显示,分别显示时、分、秒。
(5)键盘扫描:判断是否有键按下,并求取键号。
(6)定时比较:判断启闹时间到否?如时间到,则启动蜂鸣器鸣叫。
(7)其它辅助功能子程序,如键盘设置、拆字、合字、时间合法性检测等。
3 在线仿真调试在线仿真调试的任务是利用开发工具,发现和纠正程序错误,同时也能发现硬件故障。
Keil C51提供了如复位、运行、暂停、单步、过程单步等多种调试命令,提供了如输出、观察、存第2期万胜前:基于Keil C51软件的电子钟设计与制作19储器等多种调试窗口,为了能够比较直观地了解单片机中定时器、中断、并行端口、串行端口等常用外设的使用情况,还提供了一些外围接口对话框,充分利用这些功能,可以很方便地进行程序调试。
程序的调试应一个模块一个模块地进行,首先单独调试各功能子程序,检验程序是否能够实现预期的功能,接口电路的控制是否正常等;最后逐步将各子程序连接起来联调。
联调需要注意的是,各程序模块间能否正确传递参数,特别要注意各子程序的现场保护与恢复。
调试的基本步骤如下:(1)用仿真器修改显示缓冲区内容,屏蔽拆字程序,调试动态扫描显示功能。
例如将D I SP0~D I SP5单元置为“012345”,应能在LED上从左到右显示“012345”。
若显示不正确,可在D I SP子程序相应位置设置断点调试检查。
然后用仿真器修改计时缓冲区内容,调用拆字程序,调试显示模块D I SP LAY。
例如,将HOUR、M I N、SEC单元置为“123456”,检查是否能正确显示“12:34:56”。
若显示不正确,应在SEP A子程序相应位置设置断点,调试检查。
(2)运行主程序调试计时模块,不按下任何键,检查是否能从由00:00:00开始正确计时。
若不能正确计时则应在定时器中断服务子程序中设置断点,检查HOUR、M I N、SEC、MSEC单元是否随断点运行而变化。
然后屏蔽缓冲区初始化部分,用仿真器修改计时缓冲区内容为23:58:48,运行主程序(不按下任何键),检验能否正确进位。
(3)调试键盘扫描模块KEYSCAN,先用延时10m s子程序代替显示子程序延时消抖,在求取键号后设置断点,中断后观察A累加器中的键号是否正确;然后恢复用显示子程序延时消抖,检验与D I SP LAY模块能否正确连接。
(4)调试时间设置/闹钟定时模块MOD I FY。
首先屏蔽COMB子程序,单独调试键盘设置模块KEYI N,观察显示缓冲区D I SP0~D I SP5单元的内容是否随键入的键号改变,以及键号能否在LE D 上显示。
然后屏蔽KEYI N子程序,单独调试合字模块COMB,分别将R1设置为时间设置缓冲区和闹钟值寄存区的首地址,修改显示缓冲区内容,程序运行后查看时间设置缓冲区HOUR、M I N、SEC 单元和闹钟值寄存区AHOUR、AM I N、ASEC单元内容是否正确。
最后联调MOD I FY模块。
(5)运行主程序联调,检查能否用键盘修改当前时间以及设置闹钟,能否正确计时、启闹、停闹。
4 系统调试、制作与脱机运行在线仿真调试无误后,我们就可以制作电子钟。
4.1 硬件调试硬件调试的主要任务是排除硬件故障,其中包括设计错误和工艺性故障。
4.2 脱机运行软硬件调试成功之后,可以将程序固化到89C51的F LASH ROM中,插入89C51芯片,接上电源脱机运行。
有可能出现以下故障:(1)系统不工作。
其原因主要有晶振不起振(晶振损坏、晶振电路不正常导致晶振信号太弱等),或EA引脚没有接高电平(接地或悬空)等。
(2)系统工作时好时坏。
这主要是由干扰引起的。
由于本系统没有传感输入通道和控制输出通道,干扰源相对较少且简单,因此,在电源、总线处对地接滤波电容一般可以解决问题。
5 结束语用Keil C51软件设计单片机应用系统,方便了设计过程,提高了设计效率。
Keil C51以其高品质的性能、强大的在线分析能力让设计者轻松、愉快、卓有成效地完成设计任务。
【参考文献】[1]李广第,朱月秀,王秀山.单片机基础[M].北京:北京航空航天大学出版社,2001:184-191.[2]高鹏,安涛,寇怀成.电路设计与制版-Pr otel99入门与提高[M].北京:人民邮电出版社,2004:31-33.[3]李国丽,朱维勇.E DA与数字系统设计[M].北京:机械工业出版社,2004:158-159.Design and fabr ication of the electron ic clock based on the software of Ke ilC51WAN Sheng-qian(Depart m ent of Electr onic Engineering,Ezhou University,Ezhou,Hubei436000,China)Abstract:This paper illustrates the powerful functi ons of Keil C51as the t ool of designing Single Chi p M icr ocom2 puter app licati on syste m.And by setting as an exa mp le the electr on cl ock design taking Single Chi p M icr ocom2 puter as the core,it als o elaborates ho w t o app ly this s oft w are t o the design and sti m ulati on of Single Chi p M icr o2 computer app licati on syste m.Key words:the s oft w are of Keil C51;Single Chi p M icr ocomputer app licati on syste m;the electr onic cl ock;design and sti m ulati on。