简易家电定时控制装置单片机课设_第1页
简易家电定时控制装置单片机课设_第2页
简易家电定时控制装置单片机课设_第3页
简易家电定时控制装置单片机课设_第4页
简易家电定时控制装置单片机课设_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计(论文)任务书信息工程学院计算机科学与技术专业2014-1班一、课程设计(论文)题目简易家电定时控制装置二、课程设计(论文)工作自2017年6月19日起至一2017年6月29日止。三、课程设计(论文)地点:5#402四、课程设计(论文)内容要求:本课程设计的目的使学生掌握系统各功能模块的基本工作原理;培养学生基本掌握电路设计的基本思路和方法;使学生掌握接收系统调试;培养学生分析、解决问题的能力;提高学生的科技论文写作能力。课程设计的任务及要求基本要求:对家电的开启进行预定时控制,能显示并设置预定时间;一对家电的工作时间进行定时控制,能显示并通过键盘设置工作时间的长短;工作时间到了后,并能声音报警;设定时间时,黄色发光二极管点亮,启动定时后,红色发光二极管点亮。创新要求:在基本要求达到后,可进行创新设计,如改善电路性能;对系统进行仿真分析。课程设计论文编写要求要按照书稿的规格打印誉写毕业论文论文包括目录、绪论、正文、小结、参考文献、谢辞、附录等毕业论文装订按学校的统一要求完成答辩与评分标准:完成原理分析:20分;完成设计过程(含翻译):40分;完成调试:20分;回答问题:20分。参考文献:(1)邓胡滨.《单片机原理及应用技术一一基于KeilC和Proteus仿真》人民邮电出版社6)课程设计进度安排内容天数地点构思及收集资料2图书馆组装与调试5实验室撰写论文3图书馆、实验室学生签名:2017年6月19日课程设计(论文)评审意见(1)完成原理分析(20分):优()、良()、中()、一般()、差();(2)设计分析和翻译能力(40分)();:优()、良()、.中()、一般()、差(3)完成调试(20分):优()、良()、中()、一般()、差();(4)回答问题(20分):优()、良()、中()、一般()、差();(5)格式规范性及考勤是否降等级:是()、否()评阅人:职称:_副教授2017年6月29日目录TOC\o"1-5"\h\z\o"CurrentDocument"绪论1\o"CurrentDocument"一、设计任务及要求21.1设计目的2\o"CurrentDocument"1.2基本功能要求2\o"CurrentDocument"1.3拓展功能设计2\o"CurrentDocument"1.4功能详细设计3\o"CurrentDocument"二、硬件电路设计及描述3AT89C52单片机3DS1302数码管显示时钟4\o"CurrentDocument"矩阵按键电路5LCD液晶显示屏电路6LED数码管动态显示774HC138译码器9\o"CurrentDocument"报警电路10\o"CurrentDocument"三、程序设计思想及流程11\o"CurrentDocument"四、电路的安装及调试124.1安装步骤124.2电路的调试12\o"CurrentDocument"五、总结12\o"CurrentDocument"六、参考文献13\o"CurrentDocument"七、附录137.1实物图137.2仿真图137.3部分程序清单14绪论单片微计算机自20世纪70年代问世以来,已对人类社会产生了巨大的影响。尤其是美国Intel公司生产的MCS-51系列单片机,由于其具有集成度高、处理功能强、可靠性高、系统结构简单、价格低廉、易于使用等优点,在世界范围内已经得到广泛的普及和应用。此外,世界各大公司以MCS-51单片机基本内核为核心的各种扩展型、增强型的新型的新型单片机不断推出,所以在今后若干年内,MCS-51系列以及世界其它各大公司生产的与其兼容的各种增强型、扩展型的单片机,仍是我国单片机应用领域的主流型。目前在工业控制、智能仪器仪表、办公自动化、家用电器登诸多领域,到处都可看见单片机的踪影,单片机技术开发和应用水平已成为一个国家工业发展水平的标志之一。此装置硬件使用AT89C52单片机为控制核心,DS1302作为时钟芯片并同时在掉电时储存资料,LCD1602液晶显示屏以及LED数码管作为显示与用户交互,使用5V继电器控制外接电器电源的开启或关闭。软件采用模块化设计、驱动、控制、引脚、变量定义等采用多文件编译,即方便自己设计修改也方便他人理解。这款家电定时器实现了时钟显示,预定时间设置、定时操作便捷设置、报警功能、系统状态提示功能。关键词:单片机;定时控制;AT89S52;一、设计任务及要求1.1设计目的根据本学年所学的单片机及微机接口的理论知识设计装置的电路结构和相应软件程序设计。提高学生实践能力,培养学生发现问题、解决问题的能力,锻炼学生理论联系实际、综合应用的能力。1.2基本功能要求(1)对家电的开启进行预定时控制,能显示并设置预定时间;(2)对家电的工作时间进行定时控制,能显示并通过键盘设置工作时间的长短;(3)工作时间到了后,并能声音报警;(4)设定时间时,黄色发光二极管点亮,启动定时后,红色发光二极管点亮。1.3拓展功能设计(1)使用LCD液晶显示屏显示定时时间,方便使用者的实际操作使用。(2)采用矩阵键盘进行时间设置。以使得装置的时间设置操作更加的人性化。(3)使用8个LED灯提示装置所处于的状态。当LED滚动显示时表示家电处于闲置状态,当流水灯全部显示时表示家电处于工作状态。1.4功能详细设计装置的当前时间显示是用6个数码管实现的,显示格式为“时时:分分:秒秒”。当前日期以及定时时间是在LCD液晶显示屏上显示。家电工作前程序控制LED灯流动点亮,家电工作后程序控制LED灯全部点亮。矩阵键盘的控制功能为:K1、K2、K3、K5、K6、K7、K9、K10、K11、K13分别对应数字1—9以及数字0。用于设置日期时间以及定时时间的数值输入。K4、K8、K12、K16对应光标移动上、左、下、右方向。K14、K15分别对应ESC键和回车键。二、硬件电路设计及描述2.1AT89C52单片机AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。(T2)P1.DC:hvcc140(T2EX}P1.1CZ239□POO(ADO)P1,2匚333nPO.1(AD11)P1.3匚437□PD.2(AD2)P1.4匚53G□PO.3(AD3)(MOSI)P1.5匚635PP0.4(AD4)(MISO}P1.6C734二1PO.5(AD5)(SCK)P1.7匚833bPG.6(ADS)RST「■9叠—321PO.7(AD7)(RXDJP3.O匚1Q"事卷虑咧hEA-A/PPCFX口1P3JC1130口ALE/PROG(INTO)P3.2匚1229□PSENJNT1}P3.3匚132&pP2.7(A15)(TO)P3.4L1427□PS6(T1)P3.5「1526二IP2.5(A13)(WR>PS.6•—IB25口P2.4(A12)(RD)P3-71724P23(A11)XTAL2~ia23P2.2(AW)XTAL1匚1922□P2.1(A9)2021P2.0(AS)图2-12.2DS1302数码管显示时钟DS1302简介DS1302是美国DALLAS公司推出的一款涓流充电时钟芯片。DS1302时钟芯片被广泛应用于电话、传真、便携式仪器等产品领域,它的主要性能指标如下。DS1302是一个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软件自动调整的能力,可以配置AM/PM来决定采用24小时格式还是12小时格式。拥有31字节数据存储RAM。串行I/O通信方式,相对并行来说比较节省IO口的使用。DS1302的工作电压比较宽,在2.0—5.5V的范围内部都可以正常工作。DS1302这种时钟芯片功耗一般都很低,它在工作电压2.0V的时候工作电流小于300nA。DS1302共有8个引脚,有两种封装形式。当工作电压是5V的时候,兼容标准的TTL电平标准。DS1302有两个电源输入,一个是主电源,另一个是备用电源。可以使用电池或者大型电容。以使在系统掉电的情况下,时钟还会继续走。DS1302结构DS1302的引脚排列,其中Vcc2为主电源,VCC1为后备电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送°RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据传送的方法。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK为时钟输入端。下图为DS1302的引脚功能图:VcciSCLKI/ORST图2-2DS1302引脚图2.3矩阵按键电路VcciSCLKI/ORST图2-2DS1302引脚图矩阵按键电路如图2-3所示。图2-3按键电路矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4X4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。工作时先从P1口的高四位输出低电平,低四位输出高电平,从P1口的低四位读取键盘状态。再从P1口的低四位输出低电平,高四位输出高电平,从P1口的高四位读取键盘状态。将两次读取结果组合起来就可以得到当前按键的特征编码。使用上述方法我们得到16个键的特征编码。2.4LCD液晶显示屏电路(1)、LCD1602简介1602液晶显示屏可以显示2行,每行16个字符的液晶。它的工作电压是4.5—5.5V,对于这点在设计电路的时候,直接按照5V系统设计,但是保证5V系统最低不能低于4.5V。在5V工作电压下测量它的工作电流是2mA。这个2mA仅仅是指液晶,而它的黄绿背光都是LED做的,所以功耗不会太小。(2)、LCD1602管脚功能1602采用标准的16脚接口,其中:第1脚:VSS为电源地

第2脚:VCC接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端。第7〜14脚:D0〜D7为8位双向数据端。第15〜16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。LQO-J寸〔?【;<•-DBti图2-5中断触发电路LQO-J寸〔?【;<•-DBti2.5LED数码管动态显示(1)LED结构原理LED数码管(LEDSegmentDisplays)是由多个发光二极管封装在一起组成“8”字型的器件,引线已在接完成,只需引出它们的各个笔划,公共电极。随着信息时代的突飞猛进,越来越多的照明及工程应用需要要求更高的显示方案,同样,作为单片机的驱动显示也离不开LED数码管驱动显示方案。LED数码管显示主要分为静态显示和动态显示。对于人机交互式单片机系统来说,不仅需要响应用户输入,同时也需要将一些测控信息输出显示。这些显示信息可以提供实时的数据或图形结果,以便于掌握系统的状态并进行分析处理。目前,在单片机中最常用的是LED数码管显示。其成本低廉、使用简便,可以显示数字或几个特定的字符。(2)动态显示原理动态显示是指每隔一段时间循环点亮每个LED数码管,每次只有一个LED被点亮。根据人眼的视觉暂留效应,当循环点亮的速度很快的时候,可以认为各个LED是稳定显示的。动态显示的硬件连接比较简单,这里使用了8个LED数码管,将所有LED的8段引脚并联在一起,连接到8位的I/O数据总线上。而各个LED的共阳极引脚或共阴极引脚分别由另一组I/O线控制,从图中可以看出,使用两个8位的I/O端口便可以动态显示8位LED数码管。其中一个并口作为LED数码管的控制引脚,另一个并口作为公共的数据总线。程序中采用扫描显示的方式,即在同一时刻,只使用一个LED显示数据。通过为共阴极LED(或共阳极LED)的公共引脚赋低电平(或高电平),从而选择某个LED显示。如此循环,使每个LED显示该LED应显示的数据,并进行适当的延时,形成视觉暂留效果。这样便可以达到动态显示的目的。图2-6LED电路图2.674HC138译码器74HC138译码器作用是把3种输入状态翻译为8种输出状态。74HC138一共是6个输入引脚,但是其中4,5,6这三个引脚是使能引脚。这三个引脚如果不符合规定的输入要求Y0到Y7不管输入的1,2,3引脚是什么电平状态,总是高电平。CD74HC13S.CDMHCT13&CG74HC23A,CDHHCTZ18(PD1P,SOIC)TCPVIEW图2-574HC138图2-574HC138译码器C㈣(TTJS:阿商网函吃册Y1Y2Y3viY5VE其真值表为:74HC138集成译码器功能表输入输出E3E2ElAwAiAoVOYiY2Y3Y4Y5Y6Y7XHXXXXBiHHHHHHHXXHXXXffHMHHHHHLXXXXXHHHHHHHHHLLLLLLHHHHHHHHLLLLHHLHHHHHHLLLEfLHHLHHHHHHL1LHHHHHLHHHHHLLHLLHHHHLHHHLLHLHHHHHHLHHHLLHHLHHHHHHLHHLLHHHHHHHHHHL承口一高由平L一低电平*一任意电平E3,F2>El为输入使能端AlAi'Ac为二进制教据输入端为8个输出信号字母上面的J号说明该输入或输出是低电平有效2.7报警电路报警电路如图2-6所示。利用了三极管作为开关管驱动蜂鸣器发声。图2-6报警电路三、程序设计思想及流程图3-1流程图四、电路的安装及调试4.1安装步骤检查元件的好坏按电路图买好元件后首先检查买回元件的好坏,按各元件的检测方法分别进行检测,一定要仔细认真。而且要认真核对原理图是否一致,在检查好后才可上件、焊件,防止出现错误焊件后不便改正。放置、焊接各元件按原理图的位置放置各元件,在放置过程中要先放置、焊接较低的元件,后焊较高的和要求较高的元件。特别是容易损坏的元件要后焊,在焊集成芯片时连续焊接时间不要超过10s,注意芯片的安装方向。4.2电路的调试首先烧入显示程序,看显示正不正常。在调试程序时,发现有的指令用的不正确,导致电路功能不能完全实现,另外软件程序中的延时有的过长、有的过短等等。五、总结这一学年所学的单片机及微机接口知识在这次的课程设计中得到了充分的体验,在完成这个毕业设计的过程中,也遇到了不少问题,但在老师和同学的帮助下,问题很快就得到了解决。在此过程中,我也学到了不少的新知识,自己的动手能力里得到了大大的提高,分析问题和总结问题也积累了不少的经验,在此我衷心的感谢老师。感谢

老师对我完成这个课题的支持与帮助,在设计过程中给了我宝贵的建议和意见,同时也感谢我的同组同学,为我提供了很多的资料和帮助。六、参考文献(1)邓胡滨.《单片机原理及应用技术一一基于KeilC和Proteus仿真》人民邮电出版社七、附录7.1实物图mH1*4—01一01广菖at07"307.2仿真图7.3部分程序清单#ifndef_CONFIG_H#define_CONFIG_H/*通用头文件*/#include<reg52.h>#include<intrins.h>/*数据类型定义*/typedefsignedcharint8;//8位有符号整型数typedefsignedintint16;//16位有符号整型数typedefsignedlongint32;//32位有符号整型数typedefunsignedcharuint8;//8位无符号整型数typedefunsignedintuint16;//16位无符号整型数typedefunsignedlonguint32;//32位无符号整型数/*全局运行参数定义*/#defineSYS_MCLK(11059200/12)〃系统主时钟频率,即振荡器频率4-12/*IO引脚分配定义*/sbitKEY_IN_1=P2A4;//矩阵按键的扫描输入引脚1sbitKEY_IN_2=P2A5;//矩阵按键的扫描输入引脚2sbitKEY_IN_3=P2A6;//矩阵按键的扫描输入引脚3sbitKEY_IN_4=P2A7;//矩阵按键的扫描输入引脚4sbitKEY_OUT_1=P2A3;〃矩阵按键的扫描输出引脚1sbitKEY_OUT_2=P2A2;〃矩阵按键的扫描输出引脚2sbitKEY_OUT_3=P2A1;//矩阵按键的扫描输出引脚3sbitKEY_OUT_4=P2A0;〃矩阵按键的扫描输出引脚4sbitADDR0=P1A0;//LED位选译码地址引脚0sbitADDR1=P1A1;//LED位选译码地址引脚1sbitADDR2=P1A2;//LED位选译码地址引脚2sbitADDR3=P1A3;//LED位选译码地址引脚3sbitENLED=P1A4;//LED显示部件的总使能引脚#defineLCD1602_DBP0//1602液晶数据端口sbitLCD1602_RS=P1A0;//1602液晶指令/数据选择引脚sbitLCD1602_RW=P1A1;//1602液晶读写引脚sbitLCD1602_E=P1A5;//1602液晶使能引脚sbitDS1302_CE=P1A7;//DS1302片选引脚sbitDS1302_CK=P3A5;//DS1302通信时钟引脚sbitDS1302_IO=P3A4;//DS1302通信数据引脚sbitI2C_SCL=P3A7;//I2C总线时钟引脚sbitI2C_SDA=P3A6;//I2C总线数据引脚sbitBUZZER=P1A6;//蜂鸣器控制引脚#endif#ifndef_DS1302_H#define_DS1302_HstructsTime(〃日期时间结构uint16year;//年uint8mon;//月uint8day;//日uint8hour;〃时uint8min;//分uint8sec;//秒uint8week;〃星期};#ifndef_DS1302_C#endifvoidInitDS1302();voidGetRealTime(structsTime*time);voidSetRealTime(structsTime*time);#endif#ifndef_KEY_BOARD_H#define_KEY_BOARD_H#ifndef_KEY_BOARD_C#endifvoidKeyScan();voidKeyDriver();#endif#ifndef_LCD1602_H#define_LCD1602_H#ifndef_LCD1602_C#endifvoidInitLcd1602();voidLcdClearScreen();voidLcdOpenCursor();voidLcdCloseCursor();voidLcdSetCursor(uint8x,uint8y);voidLcdShowStr(uint8x,uint8y,uint8*str);voidLcdShowChar(uint8x,uint8y,uint8chr);#endif#define_MAIN_C#include"config.h"#include"Lcd1602.h"#include"LedBuzzer.h"#include"keyboard.h"#include"DS1302.h"#include"Time.h"#include"main.h"bitflag2s=0;//2s定时标志位bitflag200ms=0;//200ms定时标志uint8T0RH=0;//T0重载值的高字节uint8T0RL=0;//T0重载值的低字节staticint*alarm=0;〃闹钟标志位enumeStaSystemstaSystem=E_NORMAL;〃系统运行状态voidmain(){EA=1;〃开总中断ConfigTimer0(1);//配置T0定时1msInitLed();//初始化LED模块InitDS1302();//初始化实时时钟模块InitLcd1602();//初始化液晶模while(!flag2s);〃上电后延时2秒flag2s=0;RefreshTime();//刷新当前时间RefreshAlarm();〃闹钟设定值显示while(1)〃进入主循环{KeyDriver();〃执行按键驱动if(flag200ms)〃每隔200ms执行以下分支{flag200ms=0;FlowingLight(alarm);//流水灯效果实现RefreshTime();//刷新当前时间AlarmMonitor(alarm);〃监控闹钟if(staSystem==E_NORMAL)〃正常运行时刷新日期显示{RefreshDate(0);}}}}/*配置并启动T0,ms-T0定时时间*/voidConfigTimer0(uint16ms)//定时1ms{uint32tmp;tmp=(SYS_MCLK*ms)/1000;〃计算所需的计数值tmp=65536-tmp;〃计算定时器重载值tmp=tmp+33;〃补偿中断响应延时造成的误差T0RH=(uint8)(tmp>>8);〃定时器重载值拆分为高低字节T0RL=(uint8)tmp;TMOD&=0xF0;〃清零T0的控制位11110000TMOD|=0x01;//配置T0为模式1xxxxxxx1TH0=T0RH;//加载T0重载值TL0=T0RL;ET0=1;//使能T0中断TR0=1;〃启动T0}/*T0中断服务函数,实现系统定时和按键扫描*/voidInterruptTimer0()interrupt1〃每次1ms{staticuint8tmr2s=0;staticuint8tmr200ms=0;TH0=T0RH;//重新加载重载值TL0=T0RL;tmr200ms++;//定时200msif(tmr200ms>=200)//200ms{tmr200ms=0;flag200ms=1;tmr2s++;//定时2sif(tmr2s>=10)//200ms*10=2S{tmr2s=0;flag2s=1;}}KeyScan();〃执行按键扫描}#define_DS1302_C#include"config.h"#include"DS1302.h"/*发送一个字节到DS1302通信总线上*/voidDS1302ByteWrite(uint8dat){uint8mask;for(mask=0x01;mask!=0;mask<<=1)//低位在前,逐位移出{if((mask&dat)!=0)//首先输出该位数据DS1302_IO=1;elseDS1302_IO=0;DS1302_CK=1;//然后拉高时钟DS1302_CK=0;〃再拉低时钟,完成一个位的操作}DS1302_IO=1;//最后确保释放IO引脚}/*由DS1302通信总线上读取一个字节*/uint8DS1302ByteRead(){uint8mask;uint8dat=0;for(mask=0x01;mask!=0;mask<<=1)//低位在前,逐位读取{if(DS1302_IO!=0)〃首先读取此时的IO引脚,并设置dat中的对应位{dat|=mask;}DS1302_CK=1;//然后拉高时钟DS1302_CK=0;〃再拉低时钟,完成一个位的操作}returndat;〃最后返回读到的字节数据}/*用单次写操作向某一寄存器写入一个字节,reg-寄存器地址,dat-待写入字节*/voidDS1302SingleWrite(uint8reg,uint8dat){DS1302_CE=1;〃使能片选信号DS1302ByteWrite((reg<<1)|0x80);〃发送写寄存器指令DS1302ByteWrite(dat);〃写入字节数据DS1302_CE=0;〃除能片选信号}/*用单次读操作从某一寄存器读取一个字节,reg-寄存器地址,返回值-读到的字节*/uint8DS1302SingleRead(uint8reg){uint8dat;DS1302_CE=1;〃使能片选信号DS1302ByteWrite((reg<<1)|0x81);〃发送读寄存器指令dat=DS1302ByteRead();〃读取字节数据DS1302_CE=0;〃除能片选信号returndat;}/*DS1302初始化,如发生掉电则重新设置初始时间*/voidInitDS1302(){uint8dat;structsTimecodeInitTime[]={〃默认初始值:2014-01-0112:30:00星期30x2014,0x01,0x01,0x12,0x30,0x00,0x03};DS1302_CE=0;//初始化DS1302通信引脚DS1302_CK=0;dat=DS1302SingleRead(0);〃读取秒寄存器if((dat&0x80)!=0)〃由秒寄存器最高位CH的值判断DS1302是否已停止{DS1302SingleWrite(7,0x00);//撤销写保护以允许写入数据SetRealTime(&InitTime);〃设置DS1302为默认的初始时间}}#define_KEY_BOARD_C#include"config.h"#include"keyboard.h"#include"Time.h"constuint8codeKeyCodeMap[4][4]={//矩阵按键到标准键码的映射表{'1','2','3',0x26},〃数字键1、数字键2、数字键3、向上键{'4','5','6',0x25},〃数字键4、数字键5、数字键6、向左键{'7','8','9',0x28},〃数字键7、数字键8、数字键9、向下键{'0',0x1B,0x0D,0x27}〃数字键0、ESC键、回车键、向右键};uint8pdataKeySta[4][4]={//全部矩阵按键的当前状态{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};/*按键驱动函数,检测按键动作,调度相应动作函数,需在主循环中调用*/voidKeyDriver(){uint8i,j;staticuint8pdatabackup[4][4]={//按键值备份,保存前一次的值{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};for(i=0;i<4;i++)//循环检测4*4的矩阵按键{for(j=0;j<4;j++){if(backup[i][j]!=KeySta[i][j])〃检测按键动作{if(backup[i][j]!=0)//按键按下时执行动作{KeyAction(KeyCodeMap[i][j]);〃调用按键动作函数}backup[i][j]=KeySta[i][j];//刷新前一次的备份值}}}/*按键扫描函数,需在定时中断中调用,推荐调用间隔1ms*/voidKeyScan(){uint8i;staticuint8keyout=0;//矩阵按键扫描输出索引staticuint8keybuf[4][4]={//矩阵按键扫描缓冲区{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}};//将一行的4个按键值移入缓冲区keybuf[keyout][0]=(keybuf[keyout][0]<<1)|KEY_IN_1;keybuf[keyout][1]=(keybuf[keyout][1]<<1)|KEY_IN_2;keybuf[keyout]⑵=(keybuf[keyout]⑵<<1)|KEY_IN_3;keybuf[keyout][3]=(keybuf[keyout][3]<<1)|KEY_IN_4;〃消抖后更新按键状态for(i=0;i<4;i++)〃每行4个按键,所以循环4次{if((keybuf[keyout][i]&0x0F)==0x00){〃连续4次扫描值为0,即4*4ms内都是按下状态时,可认为按键已稳定的按下KeySta[keyout][i]=0;}elseif((keybuf[keyout][i]&0x0F)==0x0F){〃连续4次扫描值为1,即4*4ms内都是弹起状态时,可认为按键已稳定的弹起KeySta[keyout][i]=1;}}〃执行下一次的扫描输出keyout++;〃输出索引递增keyout&=0x03;〃索引值加到4即归零switch(keyout)//根据索引值,释放当前输出引脚,拉低下次的输出引脚{case0:KEY_OUT_4=1;KEY_OUT_1=0;break;case1:KEY_OUT_1=1;KEY_OUT_2=0;break;case2:KEY_OUT_2=1;KEY_OUT_3=0;break;case3:KEY_OUT_3=1;KEY_OUT_4=0;break;default:break;}}#define_LCD1602_C#include"config.h"#include"Lcd1602.h"uint8tmpP0;〃暂存P0口的值bittmpADDR0;〃暂存LED位选译码地址0的值bittmpADDR1;〃暂存LED位选译码地址1的值/*暂停LED动态扫描,暂存相关引脚的值*/voidLedScanPause(){ENLED=1;tmpP0=P0;tmpADDR0=ADDR0;tmpADDR1=ADDR1;}/*恢复LED动态扫描,恢复相关引脚的值*/voidLedScanContinue(){ADDR0=tmpADDR0;ADDR1=tmpADDR1;P0=tmpP0;ENLED=0;}/*等待液晶准备好*/voidLcdWaitReady(){uint8sta;LCD1602_DB=0xFF;LCD1602_RS=0;LCD1602_RW=1;do{LCD1602_E=1;sta=LCD1602_DB;〃读取状态字LCD1602_E=0;}while(sta&0x80);//bit7等于1表示液晶正忙,重复检测直到其等于0为止}/*向LCD1602液晶写入一字节命令,cmd-待写入命令值*/voidLcdWriteCmd(uint8cmd){LedScanPause();LcdWaitReady();LCD1602_RS=0;LCD1602_RW=0;LCD1602_DB=cmd;LCD1602_E=1;LCD1602_E=0;LedScanContinue();}/*向LCD1602液晶写入一字节数据,dat-待写入数据值*/voidLcdWriteDat(uint8dat){LedScanPause();LcdWaitReady();LCD1602_RS=1;LCD1602_RW=0;LCD1602_DB=dat;LCD1602_E=1;LCD1602_E=0;LedScanContinue();}/*清屏*/voidLcdClearScreen(){LcdWriteCmd(0x01);}/*打开光标的闪烁效果*/voidLcdOpenCursor(){LcdWriteCmd(0x0F);}/*关闭光标显示*/voidLcdCloseCursor(){LcdWriteCmd(0x0C);}#define_TIME_C#include"config.h"#include"DS1302.h"#include"LedBuzzer.h"#include"Lcd1602.h"#include"Time.h"#include"main.h"uint8codeWeekMod[]={〃星期X字符图片表0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7,//星期日(红心)0xEF,0xE7,0xE3,0xE7,0xE7,0xE7,0xE7,0xC3,〃星期10xC3,0x81,0x9D,0x87,0xC3,0xF9,0xC1,0x81,〃星期20xC3,0x81,0x9D,0xC7,0xC7,0x9D,0x81,0xC3,〃星期30xCF,0xC7,0xC3,0xC9,0xC9,0x81,0xCF,0xCF,〃星期40x81,0xC1,0xF9,0xC3,0x87,0x9D,0x81,0xC3,〃星期50xC3,0x81,0xF9,0xC3,0x81,0x99,0x81,0xC3,〃星期6};bitstaMute=0;〃静音标志位uint8AlarmHour=0x07;〃闹钟时间的小时数uint8AlarmMin=0x30;〃闹钟时间的分钟数structsTimeCurTime;〃当前日期时间uint8SetIndex=0;〃设置位索引uint8pdataSetAlarmHour;〃闹钟小时数设置缓冲uint8pdataSetAlarmMin;〃闹钟分钟数设置缓冲structsTimepdataSetTime;//日期时间设置缓冲区/*获取当前日期时间,并刷新时间和星期的显示*/voidRe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论