资源描述
扬州大学水利与能源动力工程学院
课程设计报告
题 目: 定时闹钟
课 程: 单片机原理及应用课程设计
专 业: 电气工程及其自动化
班 级: 电气1201
姓 名: 陈明飞
学 号: 121704102
第 一 部 分
任
务
书
《单片机原理及应用》课程设计任务书
一、课题名称
详见《单片机课程设计题目(一)》:主要是软件仿真,利用Proteus软件进行仿真设计并调试;
《单片机课程设计题目(二)》:主要是硬件设计,利用单片机周立功实验箱进行设计并调试。
二、课程设计目的
课程设计是课程教学中的一项重要内容,是达到教学目标的重要环节,是综合性较强的实践教学环节,它对帮助学生全面牢固地掌握课堂教学内容、培养学生的实践和实际动手能力、提高学生全面素质具有很重要的意义。
《单片机原理及应用》是一门理论性、实用性和实践性都很强的课程,课程设计环节应占有更加重要的地位。单片机原理及应用课程设计的目的是让学生在理论学习的基础上,通过完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用,使学生不但能将课堂上学到的理论知识与实际应用结合起来,而且能进一步加深对电子电路、电子元器件等知识的认识与理解,同时在软件编程、排错调试、相关软件和仪器设备的使用技能等方面得到较全面的锻炼和提高。为今后能够独立进行某些单片机应用系统的开发设计工作打下一定的基础。通过单片机硬件和软件设计、调试、整理资料等环节的培训,使学生初步掌握工程设计方法和组织实践的基本技能,逐步熟悉开展科学实践的程序和方法。
三、课程设计内容
设计以89C51单片机和外围元器件构成的单片机应用系统,并完成相应的软硬件调试。
1. 系统方案设计:综合运用单片机课程中所学到的理论知识,学生根据所选课题的任务、要求和条件进行总体方案的设计。
2. 硬件电路设计:对方案中以单片机为核心的电路进行设计计算,包括元器件的选择和电路参数的计算,并画出总体电路图。
3. 软件设计:根据已设计出的软件系统框图,用汇编语言或C51编制出各功能模块的子程序和整机软件系统的主程序。
4. 调试:在单片机EDA仿真软件环境Proteus下进行仿真设计并调试;或在单片机周立功实验箱上进行相关设计并调试。
四、课程设计要求
详见《单片机课程设计题目(一)》
《单片机课程设计题目(二)》
五、进度安排
序号
内容
天数
1
布置任务,熟悉课题要求
0.5
2
总体方案确定,硬件电路设计
1.5
3
软件编程
1.5
4
Proteus仿真,或在周立功实验箱上调试
2
5
总结,撰写课程设计报告
1.5
七、课程设计报告内容:
总结设计过程,写出设计报告,设计报告具体内容要求如下:
1.课程设计的目和设计的内容。
2.课程设计的要求。
3.控制系统总框图及系统工作原理。
4.控制系统的硬件电路连接图,电路的原理。
5.软件设计流程图及其说明。
6.电路设计,软件编程、调试中遇到的问题及分析解决方法。
7.实验结果及其分析。
8.体会。
第 二 部 分
课
程
设
计
报
告
目 录
一:第一部分任务书……………………………………………………………………………………2
二:第二部分课程设计报告……………………………………………………………………………5
1.课题简介………………………………………………………………………………7
1.1本次课程设计的目的………………………………………………………7
1.2课程设计的要求……………………………………………………………7
2.定时闹钟的方案设计…………………………………………………………………7
2.1系统总体框图………………………………………………………………7
2.2工作原理及过程分析………………………………………………………7
3.定时闹钟的硬件电路设计……………………………………………………………8
3.1主控芯片AT89C51的介绍…………………………………………………8
3.1.1芯片引脚图介绍………………………………………………9
3.2按键电路的介绍……………………………………………………………10
3.3时钟电路的介绍……………………………………………………………11
3.4LCD液晶显示器的介绍……………………………………………………11
3.5电磁继电器的介绍…………………………………………………………12
4.软件编程设计…………………………………………………………………………12
4.1系统流程图…………………………………………………………………12
4.2LCD初始化编程……………………………………………………………12
4.3AT89C51初始化编程………………………………………………………13
5.实验与结果分析………………………………………………………………………13
5.1Protues仿真总电路图………………………………………………………13
5.2实验结果分析………………………………………………………………14
6.小结与体会……………………………………………………………………………14
7参考文献…………………………………………………………………………………15
8附录………………………………………………………………………………………16
1 课题简介
1.1 本次课程设计的目的:
了解AT89C51单片机的工作原理和工作方式,使用该芯片设计一个定时闹钟,完成一些按键调时、时间显示和定时闹钟的功能,定时时间到发出声响和控制继电器的起动和暂停;熟练的掌握Keil c51集成开发环境的使用方法和Protues软件仿真器的应用;学会使用c语言编写程序,掌握常用指令的功能运用。
1.2 课程设计的要求:
1.使用AT89C51单片机结合字符型LCD显示器设计一个简易的定时闹钟LCD时钟,若LCD选择有背光显示的模块,在夜晚或黑暗的场合中也可使用。
2.定时闹钟的基本功能如下:
(1)显示格式为“时时:分分”。
(2)由LED闪动来做秒计数表示。
(3)一旦时间到则发出声响,同时继电器启动,可以扩充控制家电开启和关闭。
3.程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00”,按下操作键K1~K4动作如下:
(1)K1—设置现在的时间。
(2)K2—显示闹钟设置的时间。
(3)K3—设置闹铃的时间。
(4)K4—闹铃ON/OFF的状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的一声。
4.设置当前时间或闹铃时间如下。
(1)K1—时调整。
(2)K2—分调整。
(3)K3—设置完成。
(4)K4—闹铃时间到时,发出一阵声响,按下本键可以停止声响。
2定时闹钟的方案设计
AT89C51
震荡
电路
按键调时电路
喇叭
LCD
片选
代码
2.1 系统总体框图:
2.2 工作原理及过程介绍:
本LCD定时闹钟,是以单片机及外围接口电路为核心硬件,辅以其他外围硬件电路,用汇编语言设计的程序来实现的。根据C51单片机的外围接口特点扩展相应的硬件电路,然后根据单片机的指令设计出数字钟相应的软件,再利用软件执行一定的程序来实现数字钟的功能。由于采用集成芯片性的单片机来制作电子钟,这样设计制作简单而且功能多、精确度高,也可方便扩充其他功能,实现也十分简单。本设计是利用AT89C51单片机为主控芯片,由LCD、晶振、电阻、电容、发光二极管、开关、喇叭等元件组成硬件电路,通过编写软件程序来实现和控制的数字定时闹钟。
(1)定时闹钟的基本功能如下:
(a)启动仿真软件,使用LCD液晶显示器来显示时间。
(b)程序执行之后显示“Time:00:00:00”; 时间显示的秒开始变化,并且LED闪烁,表示开始已经计时。
(c)由LED闪动来做秒计数表示。
(d)当设定的闹钟时间到达后,闹铃开始发出“哒哒哒……”的声音。
(2)按键功能如下:
按键K1设置现在的时间和时调整,按键K1设置时钟,按键K2设置分钟;按键K2显示闹钟设置的时间和分调整;按键K3设置闹铃的时间和设置完成;按键K4闹铃ON/OFF的状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的一声和闹钟时间到时,发出一阵声响,按下本键可以停止声响。
(3)调整计时器时间如下:
按下K1键,然后按K1调整小时,K2调整分钟,按下K3表示时间设置完成。
(4)调整闹钟时间设置如下:
按下K3开始闹钟设置,LCD下一行显示“Alarm:00:00”按下K1设置小时,按一下K2设置分钟,再次按下K3设置完成,并且设置时间消失,当再次按一下K2时“Alarm:00:00再次显示并马上消失。按一下K4关闭闹钟,再次按下打开闹钟。
3定时闹钟的硬件电路设计
3.1主控芯片AT89C51 的介绍:
在本LCD电子闹钟设计中就是采用利用我们熟悉的AT89C51单片机为主控芯片。AT89C51 是美国ATMEL 公司生产的8 位Flash ROM 单片机。其最突出的优点是片内ROM 为Flash ROM,可擦写1000 次以上,应用并不复杂的通用ROM 写入器就能方便的擦写,读取也很方便,价格低廉,具有片程序ROM 二级保密系统。因此可灵活应用于各种控制领域。
AT89C51单片机主要包含:
(1)8位微处理器;
(2)数据存储器(128B RAM);
(3)程序存储器(4KB Flash ROM);
(4)4个8位可编程并行I/O口;
(5)1个全双工的异步串行口;
(6)2个可编程的16位定时器/计数器;
(7)1个看门狗定时器;
(8)中断系统具有5个中断源、5个中断向量;
(9)特殊功能寄存器(SFR)26个;
(10)低功耗节电模式有空闲模式和掉电模式,且具有掉电模式下的中断恢复模式。
3.1.1 芯片引脚图介绍:
40个引脚及其功能可分为如下3类:
(1)电源及时钟引脚:Vcc、Vss;XTAL1、XTAL2。
(2)控制引脚:、ALE/、/Vpp、RST(即RESET)。
(3)I/O引脚:P0、P1、P2、P3,为4个8位I/O口的外部引脚。
分别介绍:
(1) Vcc(40脚):接+5V电源。
(2) Vss(20脚):接数字地。
(3) XTAL1(19脚):片内振荡器反相放大器和时钟发生器电路的输入段。当使用片内振荡器时,该引脚连接外部石英晶体和微调电容;当采用外接时钟源时,该引脚接外部时钟振荡器的信号。
(4) XTAL2(18脚):片内振荡器反相放大器的输出端。当使用片内振荡器时,该引脚连接外部石英晶体和微调电容;当采用外接时钟源时,该引脚悬空。
(5) RST(即RESET,9脚):复位信号输入端,高电平有效。
(6) /Vpp(31脚):即外部程序存储器访问允许控制端。Vpp即对片内Flash进行编程时,Vpp引脚接入编程电压。
(7) ALE/(30脚):ALE为CPU访问外部程序存储器或外部数据程序存储器提供一个地址锁存信号,将低8位地址锁存器存在片外的地址锁存器中。即在对片内Flash存储器编程时,此引脚作为编程脉冲输入端。
(8) (29脚):片外程序存储器的读选通信号,低电平有效。
(9) P0口:P0口为一个8位漏级开路双 向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
(10) P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
(11) P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。当P2口用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
(12) P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口的第二功能定义:
P3.0(RXD):串行数据输入口;
P3.1(TXD):串行数据输出口;
P3.2():外部中断0输入;
P3.3():外部中断1输入;
P3.4(T0):定时器0外部计数输入;
P3.5(T1):定时器1外部计数输入;
P3.6():外部数据存储器写选通输出;
P3.7():外部数据存储器读选通输出。
3.2 时钟电路的介绍:
AT89C51系列的单片机的时钟方式分为内部方式和外部方式。内部方式就是在单片机的XTAL1和XTAL2的两引脚外接晶振,就够成了自激振荡器在单片机内部产生时钟脉冲信号。外部时钟方式是把外部已经有的时钟信号引入到单片机内部。时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间。
本LCD电子闹钟设计是采用内部时钟方式,用一个12MHz晶振和两个30Pf瓷片电容组成,为单片机提供标准时钟,其中两个瓷片电容起微调作用。其电路图如上图。
之所以采用高性能的振荡电路,因为:
(1)单片机电子钟的计时脉冲基准是由外部晶振的频率经过12分频后提供,采用内部的定时/计数器来实现计时功能。所以外接晶振频率精确度直接影响电子钟计时的准确性。
(2)单片机电子钟利用内部定时/计数器溢出产生中断(12M晶振一般为50ms)再乘以相应的倍率来实现秒、分、时的转换。大家都知道从定时/计数器产生中断请求到响应中断需要3-8个机器周期,定时中断子程序中的数据入栈和重装定时/计数器的初值还需要占用数个机器周期,还有从中断入口转到中断子程序也要占用一定的机器周期。
3.3 按键电路的介绍:
4个独立的按键开关分别控制,其电路接线如上图所示。在单片机应用系统中,有时只需要几个简单的按键向系统输入信息。这时,可将每个按键接在一根I/O接口线上,这种方式的连接称为独立式键盘。每个独立式按键单独占有一根 I/O接口线,每根I/O接口线的工作状态不 会影响到其他 I/O接口线 。这种按键接口电路配置灵活,硬件结构简单,但每个按键必须占用一根I/O接口线,I/O接口线浪费较大。故只在按键数量不多时采用这种按键电路。在此电路中,按键输入都采用低电平有效。上拉电阻保证了按键断开时,I/O接口线有确定的高电平。
3.4 LCD液晶显示器的介绍:
(1) 第1脚:VSS为地电源;
(2) 第2脚:VDD接5V正电源;
(3) 第3脚:VEE为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度;
(4) 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器;
(5) 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据;
(6) 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令;
(7) 第7~14脚:D0~D7为8位双向数据线;
(8) 第15脚:背光源正极;
(9) 第16脚:背光源负极。
3.5 电磁继电器的介绍:
电磁继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合,触点通过外接白炽灯,从而控制白炽灯的亮与暗。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。这样吸合、释放,从而达到了在电路中的导通、切断的目的。具有动作快、工作稳定、使用寿命长、体积小等优点。广泛应用于电力保护、自动化、运动、遥控、测量和通信等装置中。
4软件编程设计
4.1 系统流程图
4.2 LCD初始化编程
void lcd_init() //LCD初始化
{
lcden=0;
lcdrw=0;
write_com(0x38); //设置8位格式,2行,5×7
write_com(0x0c); //整体显示,关光标,不闪烁
write_com(0x06); //设定输入方式,增量不转移
write_com(0x01); //清除屏幕显示
delay(2);
write_com(0x80);
for(i=0;i<16;i++)
{
write_data(table2[i]); //写入显示时间数据
delay(1);
}
}
4.3 AT89C51初始化编程
void init() //C51初始化函数
{
key1=1;key2=1;key3=1;key4=1;sec=0;a=0;sound=1;amin=0;
TMOD=0x10; //定时计数器T1工作在方式1
TL1=0xB0;
TH1=0x3C; //计数初值为15536
EA=1; //中断允许总开关
ET1=1; //T1允许中断
TR1=1; //中断启动
}
5 实验与结果分析
5.1 Protues仿真总电路图:
5.2 实验结果分析:
在仿真电路中,通过给AT89C51单片机加载.hex文件使电路运作,发光二极管发光频率与LCD上秒表一致,当闹钟设定时间与现在时间一致时,发出闹钟响声,此时给P2.3引脚一个低电平,使继电器工作,开关翻转,外围扩展电路接通,灯泡发光,当按键key4按下时,打断闹铃,此时P2.3引脚一个高电平,继电器不工作,外围扩展电路断开,灯泡熄灭。
6 小结与体会
为期十天的单片机课程设计圆满结束了。这一次的单片机课程设计,使我学到了很多东西,通过这几天的学习与动手实践,使我对以前所学的知识进行了复习与巩固,在以前的学习中不够清晰的概念得到了更好地理解;对Keil C51软件和Protues仿真软件的运用提高了很多。同时,通过课设,锻炼了我的动手能力和分析能力,这一点非常重要;不仅对我以后的学习有很大的帮助,还可以为以后的工作打下一定的基础。这段时间的学习,使我了解到了理论和实际之间的差别,第一次真正接触到了实际中的问题,并通过和老师,同学交流,加强了自身的分析问题、解决问题的能力。同时,我也发现了自己在某些方面的不足,这是我以后要加以改进的方面。
参 考 文 献
[1] 张毅刚主编,单片机原理及应用,北京:高等教育出版社,2004
[2] 陈涛编著,单片机应用及C51程序设计,北京:机械工业出版社,2008
[3] 周润景主编,PROTEUS入门实用教程,北京:机械工业出版社,2007
[4] 皮大能主编,单片机课程设计指导书,北京:北京理工大学出版社,2010
[5] 楼然苗主编, 单片机实验与课程设计(Proteus仿真版),浙江:浙江大学出版社, 2010
[7] 控制、电子技术类杂志、报刊
附录
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit lcden=P2^2;
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit led=P2^4;
sbit sound=P2^5;
sbit jidianqi=P2^3;
int a,b,i,min,hour,minge,minshi,hourge,hourshi,amin,ahour,aminge,aminshi,ahourge,ahourshi,sec,secge,secshi;
uchar code table1[]={'0','1','2','3','4','5','6','7','8','9'};
uchar code table2[]="Time:00:00 " ;
uchar code Alarm_1[]="Alarm:00:00 ";
uchar code kong[]=" ";
uchar num1,num2;
bit flag=0;
void delay(unsigned int xms) //延时x毫秒程序
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com) //LCD命令控制,写指令函数
{
delay(5) ;
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) //LCD数据控制,写数据函数
{
delay(5);
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void time() //设置时间函数
{
while(1)
{
if(key1==0)
{
delay(10);
if(key1==0)
{
if(hour==23) //"时"设置
hour=0;
else
hour++;
hourge=hour%10;
hourshi=hour/10;
write_com(0x0f);
delay(2);
write_com(0x80+6);
write_data(table1[hourge]); //"时"个位写入LCD第1行第6位
delay(5);
write_com(0x80+5);
delay(2);
write_data(table1[hourshi]); //"时"十位写入LCD第1行第5位
while(!key1);
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
if(min==59) //"分"设置
min=0;
else
min++;
minge=min%10;
minshi=min/10;
write_com(0x0f);
write_com(0x80+9);
write_data(table1[minge]); //"分"个位写入LCD第二行第9位
delay(1);
write_com(0x80+8);
write_data(table1[minshi]); //"分"十位写入LCD第二行第8位
delay(1);
while(!key2);
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
write_com(0x0c); //整体显示,关光标,不闪烁
TR1=1; //定时计数器1启动
while(!key3);
break; //key3松开时,显示时间"时""分"位均已设置完毕
}
}
}
}
void alarm() //设置闹钟时间函数
{
while(1)
{
if(key1==0)
{
delay(10);
if(key1==0)
{
if(ahour==23) //闹钟"时"设置
ahour=0;
else
ahour++;
ahourge=ahour%10;
ahourshi=ahour/10;
write_com(0x0f);
write_com(0x80+0x40+8);
write_data(':');
write_com(0x80+0x40+7);
write_data(table1[ahourge]);
delay(1);
write_com(0x80+0x40+6);
write_data(table1[ahourshi]);
delay(1);
while(!key1);
}
}
if(key2==0) //闹钟"分"设置
{
delay(10);
if(key2==0)
{
if(amin==59)
amin=0;
else
amin++;
aminge=amin%10;
aminshi=amin/10;
write_com(0x0f);
write_com(0x80+0x40+10);
write_data(table1[aminge]);
delay(1);
write_com(0x80+0x40+9);
write_data(table1[aminshi]);
delay(1);
while(!key2);
}
}
if(key3==0)
{
flag=~flag;
delay(10);
if(key3==0)
{
write_com(0x0c);
write_com(0x80+0x40);
for(i=0;i<11;i++)
write_data(kong[i]);
while(!key3);
break; //设置结束,此时LCD第二行无数据显示,只有第一行有时间显示
}
}
}
}
void keyscan() //键盘扫描
{
if(key1==0)
{
delay(10);
if(key1==0)
{
while(!key1); //key1键松开后执行下一行程序
time(); //调用time()函数,即时间设置
}
}
else if(key2==0)
{
if(key2==0)
{ delay(2);
while(!key2)
{
ahourge=ahour%10;
ahourshi=ahour/10;
write_com(0x80+0x40+7);
write_data(table1[ahourge]);
delay(5);
write_com(0x80+0x40+6);
delay(2);
write_data(table1[ahourshi]);
aminge=amin%10;
aminshi=amin/10;
write_com(0x80+0x40+10);
write_data(table1[aminge]);
delay(2);
write_com(0x80+0x40+9);
write_data(table1[aminshi]);
write_com(0x80+0x40);
for(i=0;i<11;++i)
write_data(Alarm_1[i]); //显示闹钟设置的时间
}
write_com(0x80+0x40);
for(i=0;i<11;i++)
write_data(kong[i]); //key2松开后,LCD只有第一行显示时间,闹钟设置时间不显示
}
}
else if(key3==0)
{
delay(10);
if(key3==0)
{
while(!key3); //表示闹钟时间设置退出
ahourge=ahour%10;
ahourshi=ahour/10;
write_com(0x80+0x40+7);
write_data(table1[ahourge]);
delay(5);
write_com(0x80+0x40+6);
delay(2);
write_data(table1[ahourshi]);
aminge=amin%10;
aminshi=amin/10;
write_com(0x80+0x40+10);
write_data(table1[aminge]);
delay(5);
write_com(0x80+0x40+9);
delay(2);
write_data(table1[aminshi]);
write_com(0x80+0x40);
for(i=0;i<11;++i)
write_data(Alarm_1[i]);
alarm();
}
}
else if(key4==0) //以下进行闹铃开关的设置
delay(5);
if(key4==0)
{
while(!key4);
a++;
if(a%2==0) //闹钟"on"
{
for(b=0;b<3;b++)
{
sound=~sound; //蜂鸣器发出3次"哗"的响声
delay(200);
}
}
else if(a%2==1) //闹钟"off"
{
sound=0; //蜂鸣器发出1次"哗"的响声
delay(300);
}
}
}
void lcd_init() //LCD初始化
{
lcden=0;
lcdrw=0;
write_com(0x38); //设置8位格式,2行,5×7
write_com(0x0c); //整体显示,关光标,不闪烁
write_com(0x06); //设定输入方式,增量不转移
write_com(0x01); //清除屏幕显示
delay(2);
write_com(0x80);
for(i=0;i<16;i++)
{
write_data(table2[i]); //写入显示时间数据
delay(1);
}
}
void judge()
{
if(sec==60)
{
sec=0;
min++;
}
if(min==60)
{
hour++;
min=0;
}
if(hour==24)
hour=0;
}
void init() //C51初始化函数
{
key1=1;key2=1;key3=1;key4=1;sec=0;a=0;sound=1;amin=0;
TMOD=0x10; //定时计数器T1工作在方式1
TL1=0xB0;
TH1=0x3C; //计数初值为15536
EA=1;
ET1=1;
展开阅读全文