C51单片机LCD电子时钟课程设计精讲
51电子时钟课程设计
51电子时钟课程设计一、课程目标知识目标:1. 学生能理解51单片机的内部结构及其工作原理;2. 学生能掌握电子时钟的基本原理,包括时钟芯片的初始化和使用方法;3. 学生能运用C语言编写程序,实现电子时钟的基本功能,如时、分、秒显示。
技能目标:1. 学生能运用已学的电子知识和编程技巧,完成51电子时钟的电路设计和程序编写;2. 学生通过实际操作,培养动手能力,提高解决实际问题的能力;3. 学生能通过课程学习,掌握基本的焊接技能,完成电子时钟的制作。
情感态度价值观目标:1. 学生在课程学习过程中,培养对电子技术和编程的兴趣,提高主动学习的积极性;2. 学生通过团队协作,培养沟通与合作的意识,增强团队精神;3. 学生在作品展示环节,学会欣赏他人的优点,提高自信心,培养创新精神和实践能力。
课程性质:本课程为实践性较强的课程,结合51单片机技术和电子时钟原理,注重培养学生的动手能力和实际问题解决能力。
学生特点:学生在前期课程中已掌握基本的电子知识和编程技巧,具备一定的实践基础。
教学要求:教师需引导学生运用所学知识,完成电子时钟的设计与制作,注重培养学生的创新思维和团队协作能力。
在教学过程中,关注学生的个体差异,提供个性化的指导。
通过课程目标的分解,确保学生能够实现预期的学习成果。
二、教学内容本课程教学内容主要包括以下几部分:1. 51单片机基础:复习51单片机的内部结构、工作原理,重点掌握时钟电路、复位电路和I/O口的使用。
2. 电子时钟原理:介绍电子时钟的基本构成,包括时钟芯片、晶振、显示屏等,分析时钟芯片的初始化和使用方法。
3. C语言编程:回顾C语言基础知识,重点讲解51单片机编程的语法和技巧,为编写电子时钟程序打下基础。
4. 电路设计与制作:指导学生进行电子时钟的电路设计,包括元器件的选择、电路图的绘制和PCB板的设计。
5. 程序编写与调试:教授学生编写电子时钟程序,实现时、分、秒的显示功能,并进行程序调试。
基于C51单片机技术的时钟课程设计报告
课设报告工程学院软件学院题目:时钟班级:姓名:学号:指导老师:日期: 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实验开发板。
C51单片机毕业设计电子钟
概述单片机具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。
C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。
此外,C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。
因此,使用C语言进行程序设计已成为软件开发的一个主流。
C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可靠性,便于改进和扩展,从而研制出规模更大、性能更完备的系统。
因此,用C语言进行8051单片机程序设计是单片机开发与应用的必然趋势。
本课程的目的是学习运用C语言开发单片机应用系统软件。
为将来从事单片机应用系统的开发打下坚实的基础。
一、题目电子钟二、课程设计目的(1)巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力;(2)培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力;(3)过对课题设计方案的分析、选择、比较、熟悉单片机用系统开发、研制的过程,软硬件设计的方法、内容及步骤。
三、课程设计系统环境(1)ADEK5196ET;(2)AEDK机电实验平台;(3)Keil c51软件调试环境;四、课程设计要求(1)掌握ADEK5196实验开发系统中的实验模块原理;(2)综合运用实验模块,用C51开发设计具有一定功能的单片机控制系统,进行软、硬件设计及调试;(3)写出完整的设计任务书:课题的名称、系统的功能、硬件原理图、软件框图、程序清单、参考资料;五、系统功能说明利用8279键盘显示接口电路。
使用8279可实现对键盘/显示器的自动扫描,以减轻CPU负担,其具有显示稳定、程序简单、不会出现误动作等特点。
电子钟的格式为:XX XX XX,由左向右分别为:时、分、秒。
单片机课程设计基于51单片机的红外控制电子时钟(lcd显示)设计
《单片机原理及应用课程设计》报告—基于红外控制电子时钟(LCD显示)设计巩固和加深对单片机原理和接口技术知识的理解;培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图和流程图。
2.课程设计要求以AT89C51单片机为核心的时钟,在1602显示器上显示当前的时间,显示格式为“时时:分分:秒秒”,并开始计时。
具体功能如下:用红外遥控器上5个按键设置当前时间,调闹钟,控制开关等。
功能键K1~K5功能如下。
●K1—暂停。
●K2—设置时间。
●K3—秒,分,时之间的切换。
●K4—调闹钟。
●K5—控制开关。
3.硬件设计3.1 设计思想原理框图接收头通过接收红外遥控器发送的数据传送给单片机,通过单片机控制显示屏和蜂鸣器的工作。
1)红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
红外线遥控器使用TC9012专用发射集成模块做的,用频率为38、占空比为1/3的PPM方式调制,当一个键按下超过36ms 振荡器使芯片激活如果这个键按下且延迟大约108ms,这108ms 发射代码由一个起始码9ms ,一个结果码4.5ms (结果码加起始码构成一个12.5ms的引导码), 低8位地址码9ms-8ms, 8位地址码9ms-8ms ,8位数据码9ms-8ms和这8位数据的反码 9ms-8ms 组成,我们提取的即是那8位的数据码。
其数据帧如下图:数字0和1的脉冲如下:当接受端当检测到有红外线发过来, 将接收端置低, 否则置高。
C51单片机LCD电子时钟课程设计精讲
单片机原理课程设计报告题目:LCD时钟设计班级:自动111学号:1104010307姓名:纪尚峰成绩:指导教师:苏维均北京工商大学信息工程学院2014.6一、设计任务要求分析本设计要实现的功能是:实时显示当前的时钟,并且可以设定闹铃,以蜂鸣器鸣响5秒的方式作为闹铃。
1.1设计总体方案及其方案论证按照系统的设计功能所要求的,液晶显示电子时钟原理图如图所示。
液晶显示电子时钟原理图本系统以AT89C51单片机为核心,该单片机可把数据进行处理,从而把数据传输到显示模块LCD1602液晶显示器,实现时间及日期的显示。
以LCD 液晶显示器为显示模块,把单片机传来的数据显示出来,并且显示多样化,还可以对时间和日期进行设置,主要靠按键来实现。
三、组成电路介绍1) 复位电路:复位电路复位电路有两种方式:上电复位和按钮复位,我们主要用按钮复位方式。
如图所示:2)晶振电路:晶振电路如图所示:晶振模块原理图选取原则:电容选取22pF,晶振为12MHz。
3)电源:AT89S51单片机的供电电源是5V的直流电。
4)EA非/Vpp脚:我们没有用外部扩展ROM,因此EA非/Vpp为高电平,即接+5V电源。
3.2、键盘控制系统设计:按键需要4个,分别实现为时间调整、时间的加、时间的减、闹钟调整四个功能。
用单片机的4个I/O口接收控制信号,其电路如图所示:按键调时电路通过控制键来控制所要调节的是时、分、还是秒。
在控制键按下后LCD中会在相应的位置出现光标,这时在通过加数键或减数键来控制时分秒的加或减。
在调闹钟键按下后LCD中也会在相应的位置出现光标,这时也通过加数键或减数键来设置闹钟。
3.3、闹钟部分:闹钟部分主要由蜂鸣器,三极管,电阻组成。
其电路图如图所示:闹钟电路当单片机的P1^5接口输出为高电平时,蜂鸣器响,当输出为低电平时,蜂鸣器停止。
3.4显示电路设计3.4.1 LCD1602简介LCD1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块,它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
C51单片机实现电子闹钟
课程名称:单片机原理与接口技术实践设计课题:基于MCS 51单片机实现电子闹钟功能的设计学院:电子与信息工程学院专业:通信工程小组成员:电子闹钟在科学技术高度发展的今天,千家万户都少不了它,所以很多家庭个人都需要有一个电子闹钟,为人们提供报时方便,但普通电子闹钟不够方便实用。
本文给出了一种基于MCS51单片机实现电子闹钟功能的设计方法,从而给人们带来更为方便的工作与生活。
一.电子闹钟简介我们设计的电子闹钟是以MCS51单片机中的计时器作为时钟,用8位数码管显示当前时间,并且可以设置闹钟时间,并在设置的时间点发出闹铃。
简易闹钟具有以下功能:1.时钟能准确地走时,并可以通过数码管进行显示2.复位后可以进行当前时间的设置3.可以随意设置闹钟时间,闹钟会在设置时间响铃整个系统的任务要求:1)输入数字按键的功能。
保证数字的输入。
2)复位电路的功能。
所有时间回到初始化状态,用于启动设定时间参数(调时或设定闹钟时间);3)显示电路的功能。
当输入数字时显示24小时时间功能。
4)闹铃功能设置闹铃的时间后.能按设置好的时间准时闹铃。
二.系统方案的设计要求根据以上各模块并结合显示屏的功能及元器件材料的情况,决定采用AT89C51为内核显示设计方案。
先进行系统的整体规划确定整个系统的功能,然后按照每个功能的具体要求,进行各个模块的实物设计并逐个调试,待全部通过后,进行整个系统的联调,最终实现一个完整的系统。
整个系统的设计步骤如下:在单片机最小系统的基础上,完成按键电路和复位电路的设计。
完成显示电路、数字按键、单片机时钟电路。
Ⅰ硬件设计系统硬件的设计可以根据系统的各个功能,把整个系统划分成若干个模块,分别对这些模块来进行设计,然后在通过单片机程序来实现对各个硬件模块功能的调度。
本系统涉及到的硬件模块有:按键电路、数码管显示电路、单片机时钟电路、蜂鸣器电路。
各部分实现功能如下:按键电路:提供按键信号。
单片机时钟电路、复位电路:提供内部时钟。
C51课程设计报告(液晶时钟)
深圳职业技术学院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,进而引发主函数中的响铃事件。
基于c51功能最全的电子钟程序(lcd1602)
功能最全的电子钟【单片机】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。
基于C51单片机的数字时钟课程设计(C语言带闹钟)
单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用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 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。
键盘采用动态扫描方式。
利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
c51电子秒表课程设计
c51电子秒表课程设计一、课程目标知识目标:1. 学生能够理解C51单片机的基础知识,掌握其编程方法。
2. 学生能够掌握电子秒表的基本原理,包括计时、暂停、清零等功能。
3. 学生能够了解并掌握电子秒表中的中断处理、定时器/计数器等硬件资源的使用。
技能目标:1. 学生能够运用C语言编写C51单片机程序,实现电子秒表的计时功能。
2. 学生能够通过实验操作,学会使用开发板、编译器等工具进行程序编写和调试。
3. 学生能够培养实际动手能力,独立完成电子秒表的搭建和调试。
情感态度价值观目标:1. 学生能够培养对电子制作的兴趣和热情,提高学习积极性。
2. 学生能够培养团队协作意识,学会与他人共同解决问题。
3. 学生能够认识到科技发展对社会进步的重要性,增强科技创新意识。
课程性质:本课程为实践性课程,注重培养学生的动手能力和实际操作技能。
学生特点:学生具备一定的C语言基础,对单片机有一定了解,但实践经验不足。
教学要求:教师需引导学生通过实际操作,掌握C51单片机编程和电子秒表制作技能,同时注重培养学生的情感态度价值观。
将课程目标分解为具体学习成果,以便在教学设计和评估中逐一实现。
二、教学内容1. 理论部分:- C51单片机基础知识:介绍C51单片机的结构、工作原理和编程环境。
- 中断处理和定时器/计数器:讲解中断的概念、中断处理过程,以及定时器/计数器的使用方法。
- 电子秒表原理:阐述电子秒表的计时原理、功能模块及其相互关系。
2. 实践部分:- C51编程实践:指导学生使用C语言编写电子秒表程序,掌握程序结构、函数调用等。
- 硬件搭建与调试:学生动手搭建电子秒表电路,学习电路连接、元件识别等,并进行程序下载和调试。
- 综合应用:结合所学知识,学生独立完成一个具有计时、暂停、清零等功能的电子秒表项目。
3. 教学大纲安排:- 第一课时:C51单片机基础知识学习,介绍教材相关章节内容。
- 第二课时:中断处理和定时器/计数器原理学习,结合教材实例进行讲解。
51单片机课程设计lcd时钟
51单片机课程设计lcd时钟一、课程目标知识目标:1. 让学生掌握51单片机的基本原理,了解LCD显示模块的工作原理及其与单片机的接口技术。
2. 使学生学会编写程序,实现LCD显示时钟功能,理解时钟算法和实时时钟操作。
3. 引导学生掌握利用51单片机进行LCD时钟项目设计的步骤和技巧。
技能目标:1. 培养学生动手实践能力,能够独立完成51单片机与LCD模块的连接和调试。
2. 提高学生编程技能,学会编写和优化LCD显示时钟程序,实现准确的时间显示。
3. 培养学生问题解决能力,能够分析和解决在LCD时钟设计过程中遇到的技术问题。
情感态度价值观目标:1. 培养学生对电子技术及编程的兴趣,激发学习主动性和创新精神。
2. 培养学生的团队合作意识,学会在项目设计中相互协作、共同解决问题。
3. 引导学生认识到科技对社会生活的影响,增强社会责任感和使命感。
本课程针对高中年级学生,具有较强的实践性和应用性。
结合学生特点,课程目标注重理论知识与实践技能的结合,以提高学生的综合运用能力和创新思维能力。
在教学过程中,要求教师注重启发式教学,引导学生主动探究,关注学生个体差异,确保每个学生能够达到课程目标。
课程目标的实现将通过具体的实践活动和学习成果进行评估。
二、教学内容1. 理论知识:- 51单片机基础:原理、结构、编程语言。
- LCD显示模块:工作原理、接口技术、编程控制。
- 实时时钟:时钟算法、时钟芯片应用、时间读取与设置。
2. 实践操作:- 51单片机与LCD模块的连接与调试。
- 编写和优化LCD显示时钟程序,实现时间显示、校准等功能。
- 设计LCD时钟项目,包括硬件选型、程序编写、功能测试。
3. 教学大纲:- 第一阶段(2课时):51单片机基础、LCD显示模块原理学习。
- 第二阶段(2课时):实时时钟知识学习,时钟算法掌握。
- 第三阶段(2课时):实践操作,连接51单片机与LCD模块,编写程序实现时钟功能。
- 第四阶段(2课时):项目设计与优化,团队协作解决问题,完成LCD时钟项目。
基于c51的电子钟设计
电子时钟设计一、设计目的在我们现代日常生活中,电子时钟已得到及其广泛的应用,已成为我们日常生活中的不可或缺的一部分。
本次设计的主要目的即是利用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、总体设计框图图3-1 总体设计框图2、器件选型:主要使用的器件为STC89C51RC型单片机。
该型号的单片机有P1、P2、P3、P4共4个准双向口,且包含3个16位可编程定时/计数器T0、T1、T2。
其定时可由硬件电路与中断方式控制,而定时时间和范围则完全由所编写的代码来确定和改变。
在本次设计中主要实用0号和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。
c51课程设计(电子钟)
基于单片机的电子钟的设计学院:班级:姓名:学号:小组成员:姓名:学号:指导老师:第一章绪论1.1数字电子钟的背景20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
1.2数字电子钟的意义数字钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
基于C51的电子钟设计
基于AT89C51单片机的电子钟设计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单片机的实用电子时钟设计Protel课程设计
设计任务书题目:基于C51单片机的实用电子时钟设计初始条件1.一台装有PROTEL软件或以上版本的电脑及使用PROTEL软件绘制电路原理图和印刷电路板的根本技能;2.模拟、数字、高频、单片机、或者一个具有完备功能的电子电路系统。
要求完成的主要任务:1.绘制具有一定规模、一定复杂程度的电路原理图*.sch〔自选〕。
可以涉及模拟、数字、高频、单片机、或者一个具有完备功能的电子电路系统。
2.绘制相应电路原理图的双面印刷幅员*.pcb,对电路原理图进展仿真,给出仿真结果〔如波形*.sdf、数据〕并说明是否到达设计意图。
参考书目:1. 谢自美.电子线路设计·实验·测试(第三版).武汉:华中科技大学出版社2. 康华光. 电子技术根底模拟局部.高等教育出版社,2005时间安排查阅资料2天Protel设计2天电路仿真2天报告撰写1天指导老师签名:2021年月日系主任〔或责任老师〕签名:2021年月日摘要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; schematic; PCB design; Electronic clock.目录摘要.......................................................................................................................................... I Abstract .................................................................................................................................. II 1 Altium Designer简介 . (1)1.1 Altium Designer特性 (1)1.2 Altium Designer的组成 (1)1.3 Altium Designer改良方面 (2)2 电子时钟系统设计 (3)2.1 MCU控制器简介 (3)2.2 单片机最小系统 (4)2.3 独立键盘 (4)2.4 LCD1602模块 (5)2.5 DS12C887时钟芯片 (7)2.6 电源模块 (8)3 原理图绘制 (9)3.1 创立新的PCB工程文件 (9)3.2 添加新的原理图空文件 (9)3.3 安装元件库 (10)3.4 放置电路元器件并绘制连线 (10)3.5 完善原理图 (11)3.6 检查电路原理图 (11)3.7 输出元件清单 (11)4 PCB幅员设计 (13)4.1 导入原理图设计数据 (13)4.2 PCB板型设计及元件布局 (13)4.3 PCB网络布线 (13)4.4 设计规那么DRC检查 (14)4.5 覆铜编辑及补泪滴处理 (15)4.6 PCB的3D显示 (16)5 仿真分析 (17)6 小结体会 (19)参考文献 (20)附录局部程序 (21)1Altium Designer简介1.1 Altium Designer特性Altium Designer是美国Altium公司开发的设计电路板软件Protel的晋级版本,其沿袭了Protel以前版本方便易学的特点,内部界面与Protel DXP大体一样,为了适应目前高密度和信号高速度的要求新增加了一些功能模块。
单片机C51时钟的设计报告
单片机课程设计报告设计名称:单片机电子时钟的设计班级:电信 08级 1班学号::指导教师:一课程设计的目的单片计算机即单片微型计算机。
(Single-Chip Microcomputer ),是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。
他体积小,成本低,功能强,广泛应用于智能产品和工业自动化上。
而51单片机是各单片机中最为典型和最有代表性的一种。
这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
二、课程设计的具体要求:该课程设计是利用MCS-51单片机部的定时/计数器、中断系统、以及行列键盘和LED显示器等部件,设计一个单片机电子时钟。
设计的电子时钟通过数码管显示,并能通过按键实现设置时间和暂停、启动控制等。
用定时/计数器T0,工作于定时,采用方式1,对12MHZ的系统时钟进行定时计数,初值设为XXYY (自己计算)。
形成定时时间为50ms。
用片RAM的7BH单元对50ms计数,计20次产生秒计数器78H单元加1,秒计数器加到60则分计数器79H单元加1,分计数器加到60则时计数器7AH单元加1,时计数器加到24则时计数器清0。
然后把秒、分、时计数器分成十位和个位放到8个数码管的显示缓冲区,通过数码管显示出来。
显示格式为小时十位、小时个位---分十位、分个位---秒十位、秒个位。
在处理过程中加上了按键判断程序,能对按键处理三. MCS-51单片机系统简介40个引脚按引脚功能大致可分为4个种类:电源、时钟、控制和I/O引脚。
⒈电源:⑴ VCC - 芯片电源,接+5V;⑵ VSS - 接地端;注:用万用表测试单片机引脚电压一般为0v或者5v,这是标准的TTL电平。
但有时候在单片机程序正在工作时候测试结果并不是这个值而是介于0v-5v之间,其实这是万用表的响应速度没这么快而已,在某一个瞬间单片机引脚电压仍保持在0v或者5v。
⒉时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。
51单片机电子时钟课程设计报告
第一部分设计任务和要求1.1单片机课程设计内容 (2)1.2单片机课程设计要求 (2)1.3系统运行流程 (2)第二部分设计方案2.1总体设计方案说明 (2)2.2系统方框图 (3)2.3系统流程图 (3)第三部分主要器材及基本简介3.1主要器材 (4)3.2主要器材简介 (4)第四部分系统硬件设计4.1最小系统 (6)4.2LCD显示电路 (6)4.3键盘输入电路 (7)4.4蜂鸣器和LED灯电路 (7)第五部分仿真电路图与仿真结果 (8)第六部分课程设计总结 (8)第七部分参考文献 (9)附录A 实物图附录B 系统源程序第一部分设计任务和要求1.1单片机课程设计内容利用STC89C51单片机和LCD1602电子显示屏实现电子时钟,可由按键进行调时和12/24小时切换。
1.2单片机课程设计要求1.能实现年、月、日、星期、时、分、秒的显示;2.能实现调时功能;3.能实现12/24小时制切换;4.能实现8 : 00—22 : 00整点报时功能。
1.3系统运行流程程序首先进行初始化,在主程序的循环程序中首先调用数据处理程序,然后调用显示程序,在判断是否有按键按下。
若有按键按下则转到相应的功能程序执行,没有按键按下则调用时间程序。
若没到则循环执行。
计时中断服务程序完成秒的计时及向分钟、小时的进位和星期、年、月、日的进位。
调时闪烁中断服务程序用于被调单元的闪烁显示。
调时程序用于调整分钟、小时、星期、日、月、年,主要由主函数组成通过对相关子程序的调用,如图所示。
实现了对时间的设置和修改、LCD显示数值等主要功能。
相关的调整是靠对功能键的判断来实现的。
第二部分设计方案2.1总体设计方案说明1.程序设计及调试根据单片机课程设计内容和要求,完成Protues仿真电路的设计和用Keil软件编写程序,并进行仿真模拟调试。
2.硬件焊接及调试根据仿真电路图完成电路板的焊接,并进行软、硬件的调试,只到达到预期目的。
3.后期处理对设计过程进行总结,完成设计报告。
基于C51单片机的数字时钟课程设计(C语言带闹钟)
单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用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单片机的原理及其在电子钟设计中的应用。
2. 使学生掌握电子钟的基本组成部分,包括时钟芯片、显示模块、按键等。
3. 帮助学生掌握定时器、中断等单片机技术的使用。
技能目标:1. 培养学生运用51单片机进行电子钟设计的能力,学会编写程序、调试电路。
2. 提高学生动手实践能力,能独立完成电子钟的组装和调试。
3. 培养学生分析问题和解决问题的能力,能够对电子钟进行故障排查和优化。
情感态度价值观目标:1. 培养学生对电子制作的兴趣,激发创新意识。
2. 培养学生团队合作精神,学会在团队中发挥自己的优势,共同完成任务。
3. 培养学生严谨的学习态度,养成良好的学习习惯。
分析课程性质、学生特点和教学要求,本课程目标旨在使学生在掌握51单片机及其周边器件的基础上,运用所学知识完成一个具有实际应用价值的电子钟项目。
通过课程学习,使学生将理论知识与实际操作相结合,提高综合运用知识的能力,培养创新精神和实践能力。
同时,注重培养学生的情感态度价值观,使他们在学习过程中形成良好的学习习惯和团队协作精神。
二、教学内容1. 理论知识学习:- 51单片机基本原理及结构- 定时器、中断等技术的应用- 时钟芯片的原理与使用- 显示模块的工作原理及其与单片机的连接方法- 按键输入原理及电路设计2. 实践操作环节:- 电子钟电路图的绘制- 51单片机程序的编写与调试- 电子钟的组装与调试- 故障分析与优化3. 教学内容安排与进度:- 第一周:51单片机基本原理及结构学习,熟悉开发环境- 第二周:定时器、中断技术学习,时钟芯片原理介绍- 第三周:显示模块及按键输入学习,设计初步电路图- 第四周:编写程序,进行电子钟的组装与调试- 第五周:对电子钟进行故障分析与优化,撰写实验报告教材章节关联:本教学内容与教材中以下章节相关:- 第四章:51单片机原理与结构- 第五章:定时器与中断技术- 第六章:显示与键盘接口技术- 第七章:单片机应用实例三、教学方法为了提高教学效果,激发学生的学习兴趣和主动性,本课程将采用以下多样化的教学方法:1. 讲授法:教师通过生动的语言、丰富的案例,为学生讲解51单片机的基础知识、电子钟的设计原理等理论内容。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机原理课程设计报告题目:LCD时钟设计班级:自动111学号:1104010307姓名:纪尚峰成绩:指导教师:苏维均北京工商大学信息工程学院2014.6一、设计任务要求分析本设计要实现的功能是:实时显示当前的时钟,并且可以设定闹铃,以蜂鸣器鸣响5秒的方式作为闹铃。
1.1设计总体方案及其方案论证按照系统的设计功能所要求的,液晶显示电子时钟原理图如图所示。
液晶显示电子时钟原理图本系统以AT89C51单片机为核心,该单片机可把数据进行处理,从而把数据传输到显示模块LCD1602液晶显示器,实现时间及日期的显示。
以LCD 液晶显示器为显示模块,把单片机传来的数据显示出来,并且显示多样化,还可以对时间和日期进行设置,主要靠按键来实现。
三、组成电路介绍1) 复位电路:复位电路复位电路有两种方式:上电复位和按钮复位,我们主要用按钮复位方式。
如图所示:2)晶振电路:晶振电路如图所示:晶振模块原理图选取原则:电容选取22pF,晶振为12MHz。
3)电源:AT89S51单片机的供电电源是5V的直流电。
4)EA非/Vpp脚:我们没有用外部扩展ROM,因此EA非/Vpp为高电平,即接+5V电源。
3.2、键盘控制系统设计:按键需要4个,分别实现为时间调整、时间的加、时间的减、闹钟调整四个功能。
用单片机的4个I/O口接收控制信号,其电路如图所示:按键调时电路通过控制键来控制所要调节的是时、分、还是秒。
在控制键按下后LCD中会在相应的位置出现光标,这时在通过加数键或减数键来控制时分秒的加或减。
在调闹钟键按下后LCD中也会在相应的位置出现光标,这时也通过加数键或减数键来设置闹钟。
3.3、闹钟部分:闹钟部分主要由蜂鸣器,三极管,电阻组成。
其电路图如图所示:闹钟电路当单片机的P1^5接口输出为高电平时,蜂鸣器响,当输出为低电平时,蜂鸣器停止。
3.4显示电路设计3.4.1 LCD1602简介LCD1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块,它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位之间有一个点距的间隔,每行之间也有也有间隔,起到了字符间距和行间距的作用,正因为如此,所以他不能显示图形(用自定义CGRAM,显示效果也不好)。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
(1)LCD1602的主要技术参数显示容量:16×2个字符;芯片工作电压:4.5—5.5V;工作电流:2.0mA(5.0V);模块最佳工作电压:5.0V;字符尺寸:2.95×4.35(W×H)mm。
(2)LCD1602引脚功能说明1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下:第1脚:VSS为地电源;第2脚:VDD接5V正电源;第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度;第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器;第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS 和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据;第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令;第7~14脚:D0~D7,为8位双向数据线;第15脚:背光源正极;第16脚:背光源负极。
1602液晶模块的读写操作,屏幕和光标的操作都是通过指令编程来实现的。
本显示电路将单片机的P0口作为液晶的数据口,由于P0口没有上拉电阻,所以需额外加一个排阻作为上拉电阻,利用P1口作为其读写控制端,具体电路如图。
显示电路四、软件设计软件设计是本次设计中不可缺少的环节,是本次设计能够完成的最重要的环节之一。
在完成了硬件电路的设计之后,依据系统设计要求和硬件电路开始系统软件部分的设计。
本系统软件设计包括:主程序、系统初始化子程序、延时中断子程序、时间设置子程序。
首先进行模块设计,最后进行各模块的整合以完成整个软件系统。
4.1程序主流程图主流程图4.2初始化流程图系统初始化模块的主要功能是完成系统的初始化以及设定系统的工作状态,初始化部分包括以下方面的内容:(1)单片机定时器0初始化以及各种I/O口定义;(2)1602液晶初始化清屏及设定工作方式;(3)系统进入正常工作状态。
初始化流程图4.3延时中断子程序延时中断子程序4.4时间设置子程序这里仅画出了秒设置流程图,其他时间及日期设置类似。
秒设置流程图五、系统测试5.1测试方法系统单片机代码采用C语言编写,proteus进行原理图的设计,keil软件进行代码的编译,通过keil与proteus软件的充分利用,将编译好的执行代码加载到原理图中的单片机里面进行原理图仿真,通过仿真对系统的代码程序和原理图进行测试,看是否达到系统的设计要求。
5.2测试结果(1)通过按调时健、加减键的调节,我们可以设定出具体的时间1:00:00,观察LCD液晶屏如图所示精确显示出我们所设定的时间时间。
(2)通过按键调节调闹钟健,我们可以五秒听到清晰的蜂鸣声。
5.3 结果分析通过对系统原理图和程序的仿真与调试基本实现了系统的功能要求。
可以通过按键(mode)来设定具体时间、闹钟。
LCD液晶显示屏能够准确而且清晰地显示出时间。
源程序#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit beep=P1^5; //定义蜂鸣器的io口sbit rw=P2^1; //定义读写的io口sbit rs=P2^0;//定义接收与发送指令的io口sbit lcden=P2^2;//定义使能端的io口sbit k1=P3^0; //定义调时键的io口sbit k2=P3^1; //定义加数键的io口sbit k3=P3^2; //定义减数键的io口sbit k4=P3^3; //定义调闹钟键的io口uchar count,count1,num,num1,num2;char h,min,sec,h1,min1,sec1;uchar table[]={" 23:59:57"};uchar table1[]={" 00:00:00"};void delay(uint ms)//延时程序{int i;while(ms--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}delay1(uchar z) //延时程序{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--); return 0;}bit write_busy() //判断是否为繁忙状态{ bit result; rs = 0;rw = 1;lcden = 1; _nop_(); _nop_(); _nop_(); _nop_(); result = (bit)(P0&0x80);lcden= 0; return result; }void write_com(uchar com) //写指令函数{while(write_busy());rs=0;rw=0;lcden=0;P0=com;_nop_();_nop_();_nop_();_nop_();lcden=1;_nop_();_nop_();_nop_();_nop_();lcden=0;}void write_data(uchar date) //写数据函数{while(write_busy());rs=1;rw=0;lcden=0;P0=date;_nop_();_nop_();_nop_();_nop_();lcden=1;_nop_();_nop_();_nop_();_nop_();lcden=0;}void write_pos(uchar pos) //设定地址{write_com(pos | 0x80); //数据指针=80+地址变量}void write_sfm(uchar add,uchar date) //设定时分秒及其显示与地址{uint shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);}void write_sfm1(uchar add,uchar date) //设置闹钟时分秒及其显示与地址{uint shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);}void keyscan() //键盘扫描{if(k1==0){delay1(5);if(k1==0){while(!k1);num++;if(num==1){TR0=0;write_com(0x80+0x40+11); write_com(0x0f);}if(num==2){write_com(0x80+0x40+8);}if(num==3){write_com(0x80+0x40+5);}if(num==4){num=0;write_com(0x0c);TR0=1;}}}if(num!=0){if(k2==0){delay1(5);if(k2==0){while(!k2)if(num==1){sec++;if(sec==60)sec=0;write_sfm(10,sec);write_com(0x80+0x40+0x10);}if(num==2) {min++;if(min==60)min=0;write_sfm(7,min);write_com(0x80+0x40+8);}if(num==3){h++;if(h==24)h=0;write_sfm(4,h);write_com(0x80+0x40+5);}}}if(k3==0){delay1(5);if(k3==0){while(!k3);if(num==1){sec--;if(sec==-1)sec=59;write_sfm(10,sec); write_com(0x80+0x40+0x10);}if(num==2){min--;if(min==-1)min=59;write_sfm(7,min);write_com(0x80+0x40+8);}if(num==3){h--;if(h==-1)h=23;write_sfm(4,h);write_com(0x80+0x40+5);}}}}if(k4==0){delay1(5);if(k4==0){while(!k4);num1++;if(num1==1){write_sfm1(10,sec1);write_sfm1(7,min1);write_sfm1(4,h1);}if(num1==2){write_com(0x80+11); write_com(0x0f); }if(num1==3){write_com(0x80+8);}if(num1==4){write_com(0x80+5);}if(num1==5){num1=0;write_com(0x0c);write_sfm(10,sec);write_sfm(7,min);write_sfm(4,h);}}}if(num1!=0){if(k2==0){delay1(5);if(k2==0){while(!k2)if(num1==2) {sec1++;if(sec1==60)sec1=0;write_sfm1(10,sec1); write_com(0x80+0x10); }if(num1==3) {min1++;if(min1==60)min1=0;write_sfm1(7,min1);write_com(0x80+8);}if(num1==4){h1++;if(h1==24)h1=0;write_sfm1(4,h1);write_com(0x80+5);}}}if(k3==0){delay1(5);if(k3==0){while(!k3);if(num1==2){sec1--;if(sec1==-1)sec1=59;write_sfm1(10,sec1); write_com(0x80+0x10);}if(num1==3){min1--;if(min1==-1)min=59;write_sfm1(7,min1);write_com(0x80+8);}if(num1==4){h1--;if(h1==-1)h1=23;write_sfm1(4,h1);write_com(0x80+5);}}}}}void init() //程序初始化函数{uint i;h=23;min=59;sec=57;h1=00;min1=00;sec1=00;num=0;lcden=0;write_com(0x38);delay(1);write_com(0x0c); //显示开,关光标delay(1);write_com(0x06); //移动光标delay(1);write_com(0x01); //清除LCD的显示内容 delay(1);i=0;while(table1[i] != '\0') //显示闹钟(静态) {write_data(table1[i]);i++;}i=0;write_pos(0x40);while(table[i] != '\0') //显示时间(静态) {write_data(table[i]);i++;}TMOD=0x01; //定时器TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1; //开启定时器ET0=1;TR0=1;}void main(){init();while(1){keyscan();if(min==min1&&h==h1) //闹钟启动条件{while(sec<=5) //响五秒{beep = 1;delay1(2);beep = 0;}}elsebeep=0;}}void timer0() interrupt 1 //定时器时间设定{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==20){count=0;sec++;if(sec==60){sec=0;min++;if(min==60){min=0;h++;if(h==24){h=0;}write_sfm(4,h);}write_sfm(7,min);}write_sfm(10,sec);}}。