【《基于单片机的打铃系统设计》14000字(论文)】_第1页
【《基于单片机的打铃系统设计》14000字(论文)】_第2页
【《基于单片机的打铃系统设计》14000字(论文)】_第3页
【《基于单片机的打铃系统设计》14000字(论文)】_第4页
【《基于单片机的打铃系统设计》14000字(论文)】_第5页
已阅读5页,还剩49页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

的计时仪器日晷,通过在圆盘上针的影子来判断时间。到了公元1088年宋朝的苏颂和韩工廉发明了水运仪象台,从名字就可以得知它是通过水作为动力源,这个仪器分为上中下三层,上层放置浑仪,中层放置浑象,下层用来计时报时,也是动力的来源,这个仪器在历史中有着很大的价值和研究意义。1581年意大利传教士罗明坚将水钟传入中国,二十年后又一位传教士将自鸣钟送给万历皇帝,明朝皇帝对于时钟的偏爱,世人皆知,后来清朝皇帝对其有过之而无不及,特意设置钟表局来学习和制造时钟。所以清代中国钟表业大发展,在北京,广州等城市形成了三大生产基地,20世纪后中国钟表产业因为战争受到不小的冲击,造成许多公司的倒闭和经济的萧条,直到新中国成立后,中国的钟表行业才又开始蓬勃发展起来了。14世纪,欧洲各国都出现了报时钟,它是通过绳索拉动重锤,通过重力做动力来运作。15世纪末,慢慢铁质发条被开发使用也使得钟表渐渐趋于小型化,1656年伽利略提出了钟摆理论,没多久一位年轻人在他的理论支持下,做出了一个摆钟。1675年,他又精益求精钻研出了一款新型的时钟动力源,通过发条作为动力源,用游丝作为调试器来使用,也为以后时钟的第三个阶段做了铺垫。18世纪英国的年轻人GeorgeGraham在前人的基础上完善了叉式擒纵结构,提高了袋式钟表的精确度。至此之后一些女性将袋表作为一种装饰,在手腕上携带一款小袋表,这也是未来腕表的雏形。20世纪以后,科技开始高速发展,石英钟开始渐渐走进人们的视野中,1969年由瑞士和日本联合设计出人类历史上第一块石英表。到了21世纪,社会发展进入信息时代,液晶数字式手表以及石英手表越来越智能,不仅仅可以显示时间还可以显示天气,语音通话等等。基于单片机的打铃系统在国内外通常被用来作为学校的打铃器,通过设定固定的时间,在所设定的时间定时打铃这就是单片机打铃器的基本功能,研究人员往往通过使用以AT89S51单片机为核心控制器,以时钟芯片为系统提供时间信号,以LCD显示屏作为时间显示的器件,通过一个蜂鸣器来实现打铃来构成单片机打铃器的基本要素,近两年,人们的研究方面已经不仅仅是利用打铃器来作为闹钟来提醒人们什么时候该干什么,而向着更智能,更高效,更精确的方向前进,比如利用高精度的时间信号,通过校对每一个时间段,来实现精确到ms的打铃。还有学者提出一种基于GPS授时与无线通信控制的新型智能电铃控制仪,打铃仪与主机之间使用433M的无线双工通信,主机实时比对作息时间表,控制电铃动作,且能根据季节变化,自动切换夏、冬季作息时间。控制器采用液晶交互界面,具有良好的人机交互接口,操作简单。在不同楼层还设有警报,具有精度高、免调试等特点,可广泛应用于学校、厂矿企业等场合。1.3目的本次课题研究的方向在于基于单片机的打铃系统设计,通过查阅相关的材料,来明确实验中各个元件的原理,明确原理后将理论应用于实践当中,旨在设计出具有基本功能的打铃器,安全可靠而且可以实时控制,修改当前日期,修改打铃时间打铃间隔等等。完成课题研究。本设计主要可分为以下几个部分第一部分:对毕设课题的摘要以及国内外发展现状的阐述。第二部分:通过查阅资料,确定试验方向第三部分:查阅资料,确定硬件的组成部分,引出各硬件的原理及引脚功能,对应打铃系统中的功能。第四部分:编写程序,确定主程序及各功能模块程序,绘制流程图分解程序功能,实现打铃器的仿真运行第五部分:调试第六部分:论文总结第二章方案选择2.1实验方案比较选择方案1:采用51单片机作为系统主芯片,通过时钟芯片实现时钟功能,单片机将时钟信号送入LCD液晶显示屏上显示,同时单片机控制蜂鸣器打铃,组成基本的打铃器功能,这样通过单片机来实现的打铃系统简单,具有精确的时间显示,由于单片机具有智能性,因此可以方便于系统拓展达成不同功能,所以选择方案一。方案2:利用一个函数信号发生装置作为脉冲信号发生器,再与74LS160,74LS90或者74160n的不同级联方式组合而成的电路,对时间的分时秒分别利用两个数码管来实现个位数和十位数的输出,通过对使能端的控制来设置一个定时电路,数码管输出的数据进入存储电路,通过逻辑关系电路,与或门与非门非门同或门组成的电路来驱动打铃器。相较于方案一显得过于复杂,并且逻辑电路并不能整理清楚,相较于方案一实现打铃功能显得有点困难。2.2时钟芯片的选择时钟芯片我选择DS1302,近几年串行时钟电路尤为流行,作为串行时钟电路的核心DS1302也是非常受欢迎,因为其价格低,接口简单,使用相较于其他时钟芯片很方便,可以为本设计提供年月日小时分秒等信息,还可以通过软件来调整时间所以选择DS1302来组成打铃系统设计再好不过。DS1302是DALLAS公司出品的一款具有涓流电力充电能力的一款芯片,它可以通过串行数据传输信号,可以掉电保护电源提供可编程的充电功能,当然也可以关掉这个功能,它采用普通的32.726khz晶振。DS1302最大的特点就是低功耗,高性能,它可以进行精确到秒的计时,同时也可以补偿闰年带来的不同。它常常采用三线接口来与CPU进行同步通信,通过突发方式来一次性传递多个字节的时钟或者RAM信号。2.3液晶显示选择为了使设计可以明显的显示数字运行的效果,可以选用七段数码管来显示时间,而市面上常见的数码管有LED和LCD两种。LED又称发光二极管,是计算机控制系统的最低价的输出设备,它由许多二极管组成,并且由于材质的不同,它可以发出红,黄,蓝等不同的颜色,LED正常工作时的电流为10mA,它可以与8255芯片组成LED动态显示和LED静态显示,不同的功能连接方式也不同,LED虽然是很不错的显示元件,但是其程序电路过于复杂,基于单片机的打铃系统设计需要实时的修改时间,用LED很难达到比较好的效果。LCD的原理是利用液晶材料在加电压和不加电压两种状况下,由于光学特性制成的显示元件,LCD特点是功耗小,抗干扰强,体积较小,LCD不仅仅可以显示一种颜色,它在不同的领域都有广泛使用。LCD1602是被广泛使用的一款数码显示元件,它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。因此在显示元件的选择上我选择LCD1602.2.4设计框图图2-1设计框图第三章硬件电路设计3.1硬件电路原理概述由图1的设计总框图可知,打铃系统的设计包括CPU也就是STC89C52,键盘电路,时钟电路,显示电路,打铃电路这几部分组成,时间信号由DS1302提供,单片机的设定为工作方式1,其三个存储器分别存放时分秒三个信号,单片机的定时器T0每一次中断的时间为10ms,每产生100次中断即为1秒计入秒存储器,当秒存储器的计数到60,即清空秒计数器,并且往分存储器进一位,若是分存储达到60,则向时存储器进一位,且分存储器归零,当时达到24时,对三个存储器的数据均清零。打铃电路通过设定一个实时时间,与程序中设定的打铃时间相比较,若相符,则打铃电路开始打铃,若不相符,则转入主程序。键盘系统通过查询法来实现按键功能,每当按下某一个键则进行按键消抖,通过写入一段100ms的延时程序,然后CPU判断哪个键按下,对按下的键进入相应键处理。3.2单片机电路本设计CPU选择51单片机中的STC89C52,该单片机是一种具低功耗和高性能为一体的CMOS8位微控制器,它具有8K可编程flash存储,与工业上所用的产品指令及引脚完全兼容,片上flash适用于常规的编程器,其单芯片八位CPU和flash具有在线编程功能,因此使用非常灵活,STC89C52具有以下标准功能:它有8Kflash,256字节RAM,32位I/O线,看门狗定时器,2个数据指针,3个16位的定时器,1个6向量2级中断结构,全双工串行口,片内晶振电路及时钟电路,并且它可以降至0HZ静态逻辑操作,可供2种软件选择节能模式。在此模式下,CPU会停止工作,但可以允许RAM,定时器,串口及其他功能继续运行,掉电模式下,RAM的内容被保存振荡器冻结,单片机一次停止运作,直到下一个中断或硬件复位即可继续运行。STC89C52主要功能包括以下几点:可以兼容MCS51指令系统具有32个I/O双向接口具有3个可编程定时/计数器中断具有两个串行中断具有两个读写中断口线低功耗高性能,可以设置为空闲和掉电模式具有8K,且可反复擦写ROM它的时钟频率为0-24MHz可以编程UART串行通道共具有8个中断源软件部分可设置睡眠和唤醒功能图3-1STC89C52引脚图P0口:P0口是8位漏极开路的双向I/O口。作为输入,它的每一位都可以驱动8个TTL逻辑电平。当P0口输入1,引脚作为高阻态。当访问数据寄存器或者外部程序时,P0也可以当做第八位地址或者第八位数据用,在此模式下,单片机内部有上拉电阻的存在,在编程的时候,p0口也可以用来接收程序指令,程序校验的时候,就需要外部具有上拉电阻结构。P1口:P1口与P0相似的点都在于它们是八位双向I/O口,且内部均具有上拉电阻结构,不同的地方在于,它的每一位只能驱动4个TTL逻辑电平,当P1口显示高电平,内部上拉电阻将端口拉高,就可以作为输入使用,在这种情况下,由于内部上拉电阻的存在,因此会输出电流。P1口引脚,不同引脚具有复用功能,下表3-1为P1口不同引脚的不同功能特点表3-1P1口的不同功能引脚号功能特点P1.0T2(定时器/计数器2外部计数输入),时钟输出P1.1T2EX(定时器/计数器2捕获/重装触发或方向控制)P1.5MOSI(在线系统编程)P1.6MISO(在线系统编程)P1.7SCK(在线系统编程)P2口:P2口同P1口均为8位双向I/O口,P2作为输出缓冲也可以驱动4个TTL逻辑电路,当P2口显示为高电平时,内部上拉电阻将端口拉高,就可以作为输入口使用,作为输入使用时由于内部上拉电阻的存在,因此也会输出电流。当P2口访问外部存储器或16位地址数据时,会把高八位地址或者数据输出。如果是使用八位地址访问外存储器,P2口会输出P2锁存器的内容。P3口:依旧是8位双向I/O口,输出时每位会驱动4个TTL逻辑电路,当P3显示为高电平其用法及功能与P1,2口类似。P3口的各个引脚的不同复用功能如下表3-2所示:表3-2引脚复用功能引脚编号复用功能P3.0RXD(串行输入)P3.1TXD(串行输出)P3.2外部中断0P3.3外部中断1P3.4T0(定时器0外部输入)P3.5T1(定时器1外部输入)P3.6外部数据存储器写选通P3.7外部数据存储器读选通引脚VCC接电源5v引脚GND接地XTAL1片内振荡电路输入以及内部时钟电路输入,接外部振荡器一端XTAL2接外部振荡器另一端3.3显示电路LCD1602为32字符液晶显示元件,其引脚功能如下:VSS接地VDD接电源正极RS为寄存器选择位,当RS为“1”时选择数据寄存器,当为“0”时选择指令寄存器。R/W为读写引脚位,当其为“1”的时候视为读操作,当其为“0”的时候视为写操作,当RS和R/W均为“0”时,可以向LCD写入指令,当RS为“1”R/W为“0”即可写入程序,反之即可帮忙读取忙信号。E引脚为使能端,当其为高电平,视为LCD运作。D0~D7为双向数据线。本设计让单片机的P0口来控制LCD的数据端,P1来控制LCD的使能端,单片机读取时间信号,然后通过控制LCD的使能以及读写端,将所读取的数据写入LCD,通过P0口将数据送入LCD,最终在LCD上显示出从单片机传送过来的时间信号。图3-2LCD1602仿真电路3.4时钟电路DS1302是一种常见的时间芯片,它拥有强大计时的功能,可以对年月日时分秒进行精确地计时,它可以通过两种方式读取时间信号,一种是通过单片机读取DS1302的数据得到时间信号,另外一种是单片机向DS1302写入时间信号进行时间设置,这样的好处在于,我们不仅仅可以读取时间也可以修改时间,读取的时间信号通过单片机在LCD得以显示这就是DS1302的基本原理。DS1302的引脚功能如下:DS1302具有两个电源,2为主电源,1位后备电源,DS1302的电源它们两个引脚中的较大者提供。X1,X2接的是一个32.768Hz的晶振复位引脚RST,复位引脚当其为高电平的时候开始进行数据传送,当其为低电平时会停止数据传输,并且I/O变为高阻态。如果VCC远远小于2V,则RET一直处于低电平,只有SCLK为低,RET才能为“1”。SCLK是时钟的输入端口。图3-3DS13052仿真电路3.5键盘电路键盘电路基本有两种形式,一种是独立式键盘,一种是矩阵式键盘,当用到的键比较少的时候,常常使用独立式键盘,因为这样占用的CPU少并且接线不复杂,一旦需要操作多个键独立式键盘就不再适用,因为独立式键盘一个键就需要占用一个I/O口,而且当CPU采取查询法读键盘的时候需要一个键一个键去读,占用CPU较多。因此常常采用矩阵式键盘,矩阵式键盘利用行扫描法,可以极少占用CPU,使得键盘更加灵活。因此本设计使用的是独立式键盘,因为它仅仅需要四个键来实现打铃系统的功能。键盘电路与单片机的P3口连接,每一个按键对应一个功能,设置键按一次进入时间设置,此时在按下选择键可以进入位选,通过加减来修改年月日时分秒,除此之外可以通过手动打铃键使得打铃器响铃。设置键按两次进入时钟设置,可以修改二十六个时钟的打铃时间,同样也是通过其余三个键设置完成。图3-4按键仿真电路3.6打铃电路打铃器系统通过与单片机的P3.7端口连接,利用单片机来控制打铃,当软件或硬件到达打铃条件,P3.7由低变高,实现打铃。图3-5打铃仿真电路3.7仿真结果图3-6仿真结果第四章软件设计4.1软件设计流程图第一步是要定义每个引脚,然后设置初始的26个闹钟,在这里我设置的是学习一天的作息表以及还有未设置的初始闹钟,初始化各个I/O口,初始化定时器T0以及LCD的显示,然后将DS1302通过单片机电路输出到LCD上显示,完成当前时间的显示,然后让设定的时钟与当前的时间比较,若相同则打铃,若不相同则再次进行时间比较。图4-1设计流程图4.2DS1302程序设计DS1302有年,周,月,日,时,分,秒寄存器,以及年份,控制,充电,时钟突发与RAM相关的寄存器共12个寄存器,它的控制字如下表4-1:表4-1DS1302控制字1RAM/CKA4A3A2A1A0RAM/K其中最高字节控制位一定要为1,若为0则不能将时间写入DS1302,次高位为1时表示存储RAM数据,为0存储日历数据。后五位为地址位,最低位为1时进行读操作,反之则进行写操作,控制字总是从最低位到最高位输出。当控制字输入完成后,进入一个CLK时钟上升沿,在此时可以输入数据,CLK下降沿后可以读数据,读数据时从低到高。DS1302的程序第一步还是初始化,让DS1302不具有写保护,当复位端口产生一个高电平时,将DS1302的地址写入,设置一个延时程序,向该地址写入时间数据,每写一位地址增加一位,其后进入判断数据是否已经写完,写完则将写入的数据读出,再次判断数据是否全部读出,若全部读出,则将数据显示出来,若没有写完则继续将数据写入1302的地址中重复上述步骤,直至将所有的时间数据显示出来。流程图如下:图4-2DS1302程序设计流程图4.3LCD1602程序设计设计LCD1602的程序第一步还是先要定义它的端口吗,然后进行初始化设置,当使能端为“1”时控制RS和RW可以让LCD处于不同的工作状态。当RS和RW为“0”或为“1”时,LCD的工作状态如下表4-2:表4-2LCD的工作状态RSRW工作状态00可以写入指令或显示地址01可以帮读忙信号10进入写数据11进入读数据通过设置它的引脚,将时间数据写入LCD中,该打铃系统需要实现年月日,时分秒的设置以及修改功能,因此在程序中编程了一段光标程序来进行按键操作提醒,当按下功能键光标出现在第一个字符端,再次按下后跳入下一个字符段。显示程序有两部分,第一部分将数据拆开显示,区间是2FH~2AH。第二部分为查字型码,由于我选择的是LCD动态显示,当输出每一位段控制和位控制都需要调用一段延时程序,使得LCD稳定显示。LCD有十一条控制指令如表4-3所示:表4-3控制指令指令名称控制信号指令代码功能SR/MD7D6D5D4D3D2D1D0清屏0000000000显示清屏:(1)数据指针清0(2)所有显示清除回车0000000010显示回车,数据指针清0输入模式控制00000001NS设置光标显示画面移动方向显示开关控制000000D/LDCB设置显示,光标,闪烁开关移位控制000001S/CR/LXX使光标或显示画面移位显示模式控制00001D/LNFXX设置数据总线,位数,点阵方式GGRAM地址设置0001ACGDDRAM地址指针设置001ADD忙状态检查01BFAC读数据11数据从RAM中读取数据写数据10数据对RAM进行写数据数据指针设置0080H+地址码(0~27H,40H~47H)设置数据地址指针4.4键盘程序设计单片机读取键盘有两种查询方式,其一为查询法查询,其二为中断法查询,本设计中仅仅用到四个按键来实现打铃系统的功能,因此选用查询法更简单方便,此设计中,按功能键盘可以分为两类,一类为设置按钮,一种为时间修改按钮,设置按钮主要功能是为了实现手动打铃和进入设置时间和时钟界面,对于时间和时钟的修改设置则靠其他三个按键实现。当按键按下后,单片机查询到该按键按下,于是进行译码计算出该键值,接着转入改键值的功能子程序,我们进入程序后可以进行打铃设置程序设计的流程图如下:图4-3键盘程序设计流程图第五章系统调试5.1硬件清单表5-1元件清单元件型号元件名称元件标号数量32.768KHZ晶振A11蜂鸣器蜂鸣器B113V纽扣电池座BT1110uF电容C1120PF电容C2,C32LCD1602液晶LCD119012三极管Q112K电阻R1,R2210K电阻R31SW-PB按键S1,S2,S3,S4,S55sw-灰色电源开关SW11DS1302时钟芯片U11STC89C52单片机U2112M晶振Y115.2调试过程将上表所用到的元件全部准备齐全。依次连接将元件排列放好在硬件电路板上,然后按照电路图连接各个引脚,先将底座焊好,然后在焊接外围电路。图5-1实物图在keil上将编译好的软件程序烧入单片机插入电源,打铃器响铃然后显示当前日期及时间。图5-2时间显示图按下一次设置键进入时间设置,按下两次进入时钟设置,选择键选择不同位修改,加减键按下后可以进行时间日期的加减操作,实现打铃器的功能。第六章总结与展望基于单片机的打铃系统设计到此为止,已经全部完成,我从它的历史发展说起,并对选题的目的和意义做了进一步说明,然后进行方案的选择,方案选定后,查阅文献及资料将系统中用的硬件和软件部分进行详细的阐述,并且将自己的理解写了进去。基于单片机的打铃系统技术虽然已经很成熟,但是其拓展性没有其他单片机系统那么强,虽然可以达到一些功能,但这些功能也被其他的更高级更智能化的设备所代替,比如说手机他完全可以实现我们想要单片机打铃器实现的一切功能,并且可以在其之上拓展更多的功能模块,这也是基于单片机的局限性,并且在商业方面也比不了其他设备。但其高效,简单的操作也是单片机打铃器的一大亮点,通过较少的成本实现完整的功能这个更是其他系统难以做到的。因此基于单片机的打铃系统有一定的局限性但也具备其优势。单片机打铃系统虽然常用于学校,但也可以在工厂,生产车间等发挥其作用,作为一款基于单片机的系统,其稳定性较好,如果应用场合环境十分恶劣,比如电压电源不稳定,强电磁影响,外部环境温度,湿度种种原因都将会导致其稳定性降低,控制误差也大幅增加,要使得单片机长期稳定可靠地工作,在考虑单片机的功能的同时也要考虑其工作环境对于单片机带来的影响,怎样让单片机在不同的环境下持续稳定的工作这也是现在我们思考的问题,可以采取一定的屏蔽措施,隔觉,空气湿度温度影响,降低强电磁影响。尽管单片机打铃器适用性使用场合都存在一定的局限性,但随着社会科学的发展,相信这些问题都会得到有效地解决。致谢通过这次毕业设计我收获颇丰,也得到了很多新的感悟和知识,在此我要感谢我的毕设导师罗老师,罗老师教会了我们很多东西,同时认真地指导我们在毕设中遇到的各种问题,我们能够快速掌握要点,并从要点出突破离不开罗老师的指点。她在百忙之中抽出时间来找出我们开题报告的格式错误以及小漏洞,并拿出自己宝贵的时间来指导我们修改论文中的问题,让我们受益匪浅,可以说没有老师的督促,没有老师的细心教导,没有老师的细致入微的讲解,靠我们自己是很难成功的。回想大学四年,我要感谢所有为我授课的老师,他们是我学术路上的引路人,给我提供了诸多新思想,新知识,感谢他们拓宽我对知识的认识,同时也谢谢他们让我能够在未来,无论是工作还是学习都可以应用学过的知识来解决未来遇到的难题。也要感谢这四年来与我同窗的同学,三人行必有我师焉,在他们身上我也学习到了很多为人处世之道,也得到了很多快乐,感谢他们的帮助和支持,支撑我度过坎坷。毕业设计马上就要结束了,但缘分永远不会因为距离而拉远,毕设是大学的终点,也是我迈向社会的起点,在此再次感谢曾经帮助过我的老师和同学,未来我会带着你们的期望继续走下去,感谢有你们!参考文献[1]王书杰,陈震.基于校园网络的自动打铃系统设计[J].科学技术与工程,2011,11(31):7804-7807.[2]王娟,魏雄.基于单片机的多功能定时打铃钟设计[J].湖南农机,学术版,2011,(5):85-86.[3]张义和.例说51单片机(C语言版)[M],人民邮电出版社,2010.[4]李润荣.一种基于单片机的校园打铃系统的设计与分析[J].黑龙江科技信息,2016,(10):47.[5]邓楠川,胡湘娟,阳泳.基于单片机的智能打铃系统的设计与制作[J].电子世界.2015,(10):127-128.[6]王水富,韩云东,钟超等.基于8051的自动打铃系统设计[J].电脑编程技巧与维护,2009,(17):23-26.[7]佟云峰,李光辉,孙余一.高精度时钟芯片的单片机控制打铃系统设计[J].有色金属设计,2012,(12):63-67.[8]徐运武,李艳.基于单片机无线控制的多功能打铃系统[J].电子测试.2013,(5):21-24.[9]陈茉莉,张会林,张洋洋.一种基于单片机的自动打铃系统的设计方法[J].通信电源技术.2014,(9):19-21.[10]雷道仲.基于单片机的教学打铃控制器设计[J].数字技术与应用.2014,(9):10-11.[11]HenryOhianiOhize,ElizabethNonyeOnwukaandAhmedIbrahimDesignofMicrocontroller-BasedAutomaticSchoolBell[J].DepartmentofElectricalandElectronicsEngineering,FederalUniversityofTechnologyMinna,NigerState,Nigeria2011,(10):121-128.[12]ZhiyongZouYunboBie1ZhengyangZhao1ManZhouDesignofWirelessBellControlSystemBasedonMicrocontroller[J].CollegeofMechanicalandElectronicEngineering,SichuanAgriculturalUniversity2017,(12):1438-1441.附录附录1:程序#include<reg52.h> //调用单片机头文件#defineucharunsignedchar//无符号字符型宏定义 变量范围0~255#defineuintunsignedint //无符号整型宏定义 变量范围0~65535bitflag_200ms;bitflag_100ms;//两个延迟子程序sbitbeep=P3^7; //蜂鸣器定义bitflag_beep_en;//蜂鸣器标志位ucharmenu_1,menu_2;#include"DS1302.h"#include"LCD1602.h"ucharfen1=0x30,shi1=0x06; //第1个打铃的时间 早起ucharfen2=0x30,shi2=0x07; //第2个打铃的时间 早餐ucharfen3=0x10,shi3=0x08; //第3个打铃的时间 晨练ucharfen4=0x20,shi4=0x08; //第4个打铃的时间 第1课时开始ucharfen5=0x00,shi5=0x09; //第5个打铃的时间 第1课时结束ucharfen6=0x10,shi6=0x09; //第6个打铃的时间 第2课时开始ucharfen7=0x50,shi7=0x09; //第7个打铃的时间 第2课时结束ucharfen8=0x00,shi8=0x10; //第8个打铃的时间 第3课时开始ucharfen9=0x40,shi9=0x10; //第9个打铃的时间 第3课时结束ucharfen10=0x50,shi10=0x10; //第10个打铃的时间第4课时开始ucharfen11=0x30,shi11=0x11; //第11个打铃的时间第4课时结束ucharfen12=0x30,shi12=0x13; //第12个打铃的时间午休ucharfen13=0x10,shi13=0x14; //第13个打铃的时间第5课时开始ucharfen14=0x20,shi14=0x14; //第14个打铃的时间第5课时结束ucharfen15=0x00,shi15=0x15; //第15个打铃的时间第6课时开始ucharfen16=0x20,shi16=0x15; //第16个打铃的时间第6课时结束ucharfen17=0x00,shi17=0x16; //第17个打铃的时间第7课时开始ucharfen18=0x10,shi18=0x16; //第18个打铃的时间第7课时结束ucharfen19=0x50,shi19=0x16; //第19个打铃的时间第8课时开始ucharfen20=0x00,shi20=0x19; //第20个打铃的时间第8课时结束ucharfen21=0x30,shi21=0x20; //第21个打铃的时间放学ucharfen22=0x30,shi22=0x22; //第22个打铃的时间ucharfen23=0x00,shi23=0x00; //第23个打铃的时间ucharfen24=0x00,shi24=0x00; //第24个打铃的时间ucharfen25=0x00,shi25=0x00; //第25个打铃的时间ucharfen26=0x00,shi26=0x00; //第26个打铃的时间/******************1ms延时函数*******************/voiddelay_1ms(uintq){ uinti,j; for(i=0;i<q;i++) for(j=0;j<120;j++);}/*************定时器0初始化程序***************/voidinit_1602_DS1302(){ write_sfm2_DS1302(2,3,nian); write_sfm2_DS1302(2,6,yue); write_sfm2_DS1302(2,9,ri); write_sfm2_DS1302(1,2,shi); write_sfm2_DS1302(1,5,fen); write_sfm2_DS1302(1,8,miao); write_sfm1(1,14,week); } /*************定时器0初始化程序***************/voidinit_time0() { EA=1; //开总中断 TMOD=0X01; //定时器0、工作方式1 ET0=1; //开定时器0中断 TR0=1; //允许定时器0定时}/*************打铃函数***************/voidmenu_dis(){ staticucharmm,value; if(flag_100ms==1) //100ms执行一次 { flag_100ms=0; { if(miao==0) if(((fen==fen1)&&(shi==shi1))||//第1个打铃时间判断 ((fen==fen2)&&(shi==shi2))|| //第2个打铃时间判断 ((fen==fen3)&&(shi==shi3))|| //第3个打铃时间判断 ((fen==fen4)&&(shi==shi4))|| //第4个打铃时间判断 ((fen==fen5)&&(shi==shi5))|| //第5个打铃时间判断 ((fen==fen6)&&(shi==shi6))|| //第6个打铃时间判断 ((fen==fen7)&&(shi==shi7))|| //第7个打铃时间判断 ((fen==fen8)&&(shi==shi8))|| //第8个打铃时间判断 ((fen==fen9)&&(shi==shi9))|| //第9个打铃时间判断 ((fen==fen10)&&(shi==shi10))|| //第10个打铃时间判断 ((fen==fen12)&&(shi==shi12))|| //第12个打铃时间判断 ((fen==fen13)&&(shi==shi13))|| //第13个打铃时间判断 ((fen==fen14)&&(shi==shi14))|| //第14个打铃时间判断 ((fen==fen15)&&(shi==shi15))|| //第15个打铃时间判断 ((fen==fen17)&&(shi==shi17))|| //第17个打铃时间判断 ((fen==fen18)&&(shi==shi18))|| //第18个打铃时间判断 ((fen==fen19)&&(shi==shi19))|| //第19个打铃时间判断 ((fen==fen20)&&(shi==shi20))|| //第20个打铃时间判断 ((fen==fen21)&&(shi==shi21))|| //第21个打铃时间判断 ((fen==fen22)&&(shi==shi22))|| //第22个打铃时间判断 ((fen==fen24)&&(shi==shi24))|| //第24个打铃时间判断 ((fen==fen25)&&(shi==shi25))|| //第25个打铃时间判断 ((fen==fen26)&&(shi==shi26)) //第26个打铃时间判断 ) flag_beep_en=1; //蜂鸣器标志位 if(flag_beep_en==1) //打铃以被打开 { //15秒后自动关闭闹钟 value++; if(value>=10) { value=0; mm++; if(mm>=15) { mm=0; flag_beep_en=0; beep=1; } } } } }}/********************独立按键程序*****************/ucharkey_can; //按键值voidkey() //独立按键程序{ if((P3&0x78)!=0x78) //按键按下 { delay_1ms(1); //调用键盘消抖子程序 if((P3&0x78)!=0x78) { //确认是按键按下 switch(P3&0x78) { case0xfe:key_can=4;break; //得到按键值 case0xfd:key_can=3;break; //得到按键值 case0xfb:key_can=2;break; //得到按键值 case0xf7:key_can=1;break; //得到按键值 } } }}/**********************设置函数************************/voidkey_with(){ if(key_can==1) //设置键 { menu_1++; if(menu_1==1) //设置时间 { menu_2=1; write_string(1,0,"--W:"); //第一行从第0个字符开始设置时间 write_string(2,0,"20--");//第二行从第0个字符开始设置年月日 } menu_2=1; if(menu_1>15)//回到正常显示 { menu_1=0; write_guanbiao(1,2,0); //关闭光标 init_1602_dis_csf();//初始化液晶显示 } } if(key_can==2) //选择键 { flag_200ms=1;//调用200ms延时子程序 if(menu_1==1) //设置时间 { menu_2++; if(menu_2>7) menu_2=1; } if(menu_1!=1) //设置 { menu_2++; if(menu_2>4) menu_2=1; } } if(menu_1==1) { if(menu_2==1) //设置时 { if(key_can==3) //加 { shi+=0x01;//时加1 if((shi&0x0f)>=0x0a) shi=(shi&0xf0)+0x10;//时如果大于10则十位进1 if(shi>=0x24) shi=0;//时大于24,将时位重置为0 } if(key_can==4) //减 { if(shi==0x00) shi=0x24;//当时为0默认时=24 if((shi&0x0f)==0x00) shi=(shi|0x0a)-0x10;//时十位减1 shi--; } } if(menu_2==2) //设置分 { if(key_can==3) //加 { fen+=0x01; if((fen&0x0f)>=0x0a) fen=(fen&0xf0)+0x10; if(fen>=0x60) fen=0; } if(key_can==4) //减 { if(fen==0x00) fen=0x5a; if((fen&0x0f)==0x00) fen=(fen|0x0a)-0x10; fen--; } } if(menu_2==3) //设置秒 { if(key_can==3) //加 { miao+=0x01; if((miao&0x0f)>=0x0a) miao=(miao&0xf0)+0x10; if(miao>=0x60) miao=0; } if(key_can==4) //减 { if(miao==0x00) miao=0x5a; if((miao&0x0f)==0x00) miao=(miao|0x0a)-0x10; miao--; } } if(menu_2==4) //设置星期 { if(key_can==3) //加 { week+=0x01; if((week&0x0f)>=0x0a) week=(week&0xf0)+0x10; if(week>=0x08) week=1; } if(key_can==4) //减 { if(week==0x01) week=0x08; if((week&0x0f)==0x00) week=(week|0x0a)-0x10; week--; } } if(menu_2==5) //设置年 { if(key_can==3) //加 { nian+=0x01; if((nian&0x0f)>=0x0a) nian=(nian&0xf0)+0x10; if(nian>=0x9a) nian=1; } if(key_can==4) //减 { if(nian==0x01) nian=0x9a; if((nian&0x0f)==0x00) nian=(nian|0x0a)-0x10; nian--; } } if(menu_2==6) //设置月 { if(key_can==3) //加 { yue+=0x01; if((yue&0x0f)>=0x0a) yue=(yue&0xf0)+0x10; if(yue>=0x13) yue=1; } if(key_can==4) //减 { if(yue==0x01) yue=0x13; if((yue&0x0f)==0x00) yue=(yue|0x0a)-0x10; yue--; } } if(menu_2==7) //设置日 { if(key_can==3) //加 { ri+=0x01; if((ri&0x0f)>=0x0a) ri=(ri&0xf0)+0x10; if(ri>=0x32) ri=0; } if(key_can==4) //减 { if(ri==0x01) ri=0x32; if((ri&0x0f)==0x00) ri=(ri|0x0a)-0x10; ri--; } } write_sfm2_DS1302(1,2,shi); //显示时 write_sfm2_DS1302(1,5,fen); //显示分 write_sfm2_DS1302(1,8,miao); //显示秒 write_sfm1(1,14,week); //显示星期 write_sfm2_DS1302(2,3,nian); //显示年 write_sfm2_DS1302(2,6,yue); //显示月 write_sfm2_DS1302(2,9,ri); //显示日 switch(menu_2) //光标显示 { case1:write_guanbiao(1,2,1);break; case2:write_guanbiao(1,5,1);break; case3:write_guanbiao(1,8,1);break; case4:write_guanbiao(1,14,1);break; case5:write_guanbiao(2,3,1);break; case6:write_guanbiao(2,6,1);break; case7:write_guanbiao(2,9,1);break; } write_time(); //把时间写进去 } /***************设置12打铃时间*********************/ if(menu_1==2) { ///////////////////// 第1个打铃时间 if(menu_2==1) //设置打铃时 { if(key_can==3) //加 set_DS1302time(1,&shi1,0x24); if(key_can==4) //减 set_DS1302time(0,&shi1,0x24); } if(menu_2==2) //设 { if(key_can==3) //加 set_DS1302time(1,&fen1,0x60); if(key_can==4) //减 set_DS1302time(0,&fen1,0x60); } ///////////////////// 第2个打铃时间 if(menu_2==3) //设置打铃分 { if(key_can==3) //加 第2个打铃时间 set_DS1302time(1,&shi2,0x24); if(key_can==4) //减 set_DS1302time(0,&shi2,0x24); } if(menu_2==4) //设 { if(key_can==3) //加 set_DS1302time(1,&fen2,0x60); if(key_can==4) //减 set_DS1302time(0,&fen2,0x60); } write_string(1,0,"set100:00"); write_string(2,0,"set200:00"); write_sfm2_DS1302(1,6,shi1); //显示时 write_sfm2_DS1302(1,9,fen1); //显示分 write_sfm2_DS1302(2,6,shi2); //显示时 write_sfm2_DS1302(2,9,fen2); //显示分 switch(menu_2) //光标显示 { case1:write_guanbiao(1,6,1);break; case2:write_guanbiao(1,9,1);break; case3:write_guanbiao(2,6,1);break; case4:write_guanbiao(2,9,1);break; } } /***************设置34打铃时间*********************/ if(menu_1==3) { ///////////////////// 第1个打铃时间 if(menu_2==1) //设置打铃时 { if(key_can==3) //加 set_DS1302time(1,&shi3,0x24); if(key_can==4) //减 set_DS1302time(0,&shi3,0x24); } if(menu_2==2) //设 { if(key_can==3) //加 set_DS1302time(1,&fen3,0x60); if(key_can==4) //减 set_DS1302time(0,&fen3,0x60); } ///////////////////// 第2个打铃时间 if(menu_2==3) //设置打铃分 { if(key_can==3) //加 第2个打铃时间 set_DS1302time(1,&shi4,0x24); if(key_can==4) //减 set_DS1302time(0,&shi4,0x24); } if(menu_2==4) //设 { if(key_can==3) //加 set_DS1302time(1,&fen4,0x60); if(key_can==4) //减 set_DS1302time(0,&fen4,0x60); } write_string(1,0,"set300:00"); write_string(2,0,"set400:00"); write_sfm2_DS1302(1,6,shi3); //显示时 write_sfm2_DS1302(1,9,fen3); //显示分 write_sfm2_DS1302(2,6,shi4); //显示时 write_sfm2_DS1302(2,9,fen4); //显示分 switch(menu_2) //光标显示 { case1:write_guanbiao(1,6,1);break; case2:write_guanbiao(1,9,1);break; case3:write_guanbiao(2,6,1);break; case4:write_guanbiao(2,9,1);break; } } /***************设置56打铃时间*********************/ if(menu_1==4) { ///////////////////// 第5个打铃时间 if(menu_2==1) //设置打铃时 { if(key_can==3) //加 set_DS1302time(1,&shi5,0x24); if(key_can==4) //减 set_DS1302time(0,&shi5,0x24); } if(menu_2==2) //设 { if(key_can==3) //加 set_DS1302time(1,&fen5,0x60); if(key_can==4) //减 set_DS1302time(0,&fen5,0x60); } ///////////////////// 第6个打铃时间 if(menu_2==3) //设置打铃分 { if(key_can==3) //加 set_DS1302time(1,&shi6,0x24); if(key_can==4) //减 set_DS1302time(0,&shi6,0x24); } if(menu_2==4) //设 { if(key_can==3) //加 set_DS1302time(1,&fen6,0x60); if(key_can==4) //减 set_DS1302time(0,&fen6,0x60); } write_string(1,0,"set500:00"); write_string(2,0,"set600:00"); write_sfm2_DS1302(1,6,shi5); //显示时 write_sfm2_DS1302(1,9,fen5); //显示分 write_sfm2_DS1302(2,6,shi6); //显示时 write_sfm2_DS1302(2,9,fen6); //显示分 switch(menu_2) //光标显示 { case1:write_guanbiao(1,6,1);break; case2:write_guanbiao(1,9,1);break; case3:write_guanbiao(2,6,1);break; case4:write_guanbiao(2,9,1);break; } } /***************设置78打铃时间*********************/ if(menu_1==5) { ///////////////////// 第7个打铃时间 if(menu_2==1) //设置打铃时 { if(key_can==3) //加 set_DS1302time(1,&shi7,0x24); if(key_can==4) //减 set_DS1302time(0,&shi7,0x24); } if(menu_2==2) //设 { if(key_can==3) //加 set_DS1302time(1,&fen7,0x60); if(key_can==4) //减 set_DS1302time(0,&fen7,0x60); } ///////////////////// 第8个打铃时间 if(menu_2==3) //设置打铃分 { if(key_can==3) //加 set_DS1302time(1,&shi8,0x24); if(key_can==4) //减 set_DS1302time(0,&shi8,0x24); } if(menu_2==4) //设 { if(key_can==3) //加 set_DS1302time(1,&fen8,0x60); if(key_can==4) //减 set_DS1302time(0,&fen8,0x60); } write_string(1,0,"set700:00"); write_string(2,0,"set800:00"); write_sfm2_DS1302(1,6,shi7); //显示时 write_sfm2_DS1302(1,9,fen7); //显示分 write_sfm2_DS1302(2,6,shi8); //显示时 write_sfm2_DS1302(2,9,fen8); //显示分 switch(menu_2) //光标显示 { case1:write_guanbiao(1,6,1);break; case2:write_guanbiao(1,9,1);break; case3:write_guanbiao(2,6,1);break; case4:write_guanbiao(2,9,1);break; } } /***************设置910打铃时间*********************/ if(menu_1==6) { ///////////////////// 第9个打铃时间 if(menu_2==1) //设置打铃时 { if(key_can==3) //加 set_DS1302time(1,&shi9,0x24); if(key_can==4) //减 set_DS1302time(0,&shi9,0x24); } if(menu_2==2) //设 { if(key_can==3) //加 set_DS1302time(1,&fen9,0x60); if(key_can==4) //减 set_DS1302time(0,&fen9,0x60); } ///////////////////// 第10个打铃时间 if(menu_2==3) //设置打铃分 { if(key_can==3) //加 set_DS1302time(1,&shi10,0x24); if(key_can==4) //减 set_DS1302time(0,&shi10,0x24); } if(menu_2==4) //设 { if(key_can==3) //加 set_DS1302time(1,&fen10,0x60); if(key_can==4) //减 set_DS1302time(0,&fen10,0x60); } write_string(1,0,"set900:00"); write_string(2,0,"set1000:00"); write_sfm2_DS1302(1,6,shi9); //显示时 write_sfm2_DS1302(1,9,fen9); //显示分 write_sfm2_DS1302(2,6,shi10); //显示时 write_sfm2_DS1302(2,9,fen10); //显示分 switch(menu_2) //光标显示 { case1:write_guanbiao(1,6,1);break; case2:write_guanbiao(1,9,1);break; case3:write_guanbiao(2,6,1);break; case4:write_guanbiao(2,9,1);break; } } /***************设置910打铃时间*********************/ if(menu_1==6) { ///////////////////// 第9个打铃时间 if(menu_2==1) //设置打铃时 { if(key_can==3) //加 set_DS1302time(1,&shi9,0x24); if(key_can==4) //减 set_DS1302time(0,&shi9,0x24); } if(menu_2==2) //设 { if(key_can==3) //加 set_DS1302time(1,&fen9,0x60); if(key_can==4) //减 set_DS1302time(0,&fen9,0x60); } ///////////////////// 第10个打铃时间 if(menu_2==3) //设置打铃分 { if(key_can==3) //加 set_DS1302time(1,&shi10,0x24); if(key_can==4) //减 set_DS1302time(0,&shi10,0x24); } if(menu_2==4) //设 { if(key_can==3) //加 set_DS1302time(1,&fen10,0x60); if(key_can==4) //减 set_DS1302time(0,&fen10,0x60); } write_string(1,0,"set900:00"); write_string(2,0,"set1000:00"); write_sfm2_DS1302(1,6,shi9); //显示时 write_sfm2_DS1302(1,9,fen9); //显示分 write_sfm2_DS1302(2,6,shi10); //显示时 write_sfm2_DS1302(2,9,fen10); //显示分 switch(menu_2) //光标显示 { case1:write_guanbiao(1,6,1);break; case2:write_guanbiao(1,9,1);break; case3:write_guanbiao(2,6,1);break; case4:write_guanbiao(2,9,1);break; } }/***************设置1112打铃时间*********************/ if(menu_1==7) { ///////////////////// 第11个打铃时间 if(menu_2==1) //设置打铃时 { if(key_can==3) //加 set_DS1302time(1,&shi11,0x24); if(key_can==4) //减 set_DS1302time(0,&shi11,0x24); } if(menu_2==2) //设 { if(key_can==3) //加 set_DS1302time(1,&fen11,0x60); if(key_can==4) //减 set_DS1302time(0,&fen11,0x60); } ///////////////////// 第12个打铃时间 if(menu_2==3) //设置打铃分 { if(key_can==3) //加 set_DS1302time(1,&shi12,0x24); if(key_can==4) //减 set_DS1302time(0,&shi12,0x24); } if(menu_2==4) //设 { if(key_can==3) //加 set_DS1302time(1,&fen12,0x60); if(key_can==4) //减 set_DS1302time(0,&fen12,0x60); } write_string(1,0,"set1100:00"); write_string(2,0,"set1200:00"); write_sfm2_DS1302(1,6,shi11); //显示时 write_sfm2_DS1302(1,9,fen11); //显示分 write_sfm2_DS1302(2,6,shi12); //显示时 write_sfm2_DS1302(2,9,fen12); //显示分 switch(menu_2) //光标显示 { case1:write_guanbiao(1,6,1);break; case2:write_guanbiao(1,9,1);break; case3:write_guanbiao(2,6,1);break; case4:write_guanbiao(2,9,1);break; } }/***************设置1314打铃时间*********************/ if(menu_1==8) { ///////////////////// 第13个打铃时间 if(menu_2==1) //设置打铃时 { if(key_can==3) //加 set_DS1302time(1,&shi13,0x24); if(key_can==4) //减 set_DS1302time(0,&shi13,0x24); } if(menu_2==2) //设 { if(key_can==3) //加 set_DS1302time(1,&fen13,0x60); if(key_can==4) //减 set_DS1302time(0,&fen13,0x60); } ///////////////////// 第12个打铃时间 if(menu_2==3) //设置打铃分 { if(key_can==3) //加 set_DS1302time(1,&shi14,0x24); if(key_can==4) //减 set_DS1302time(0,&shi14,0x24); } if(menu_2==4) //设 { if(key_can==3) //加 set_DS1302time(1,&fen14,0x60); if(key_can==4) //减 set_DS1302time(0,&fen14,0x60); } write_string(1,0,"set1300:00"); write_string(2,0,"set1400:00"); write_sfm2_DS1302(1,6,shi13); //显示时 write_sfm2_DS1302(1,9,fen13); //显示分

温馨提示

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

评论

0/150

提交评论