电子综合实践报告_第1页
电子综合实践报告_第2页
电子综合实践报告_第3页
电子综合实践报告_第4页
电子综合实践报告_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

简易密码控制装置的设计目录前言 2第一章设计要求 31.1基本要求: 31.2提高要求: 3第二章系统的组成及工作原理 32.1系统组成框图 32.2系统工作原理 4第三章电路设计 43.1.STC90C51RC/RD+系列单片机简介 43.1.1晶振电路 83.1.2复位电路 93.2LCD显示电路 103.3矩阵键盘电路 123.4蜂鸣器报警电路 123.5DS1302时钟电路 133.6温度控制电路 143.7红外收发: 153.8步进电机 16第四章实验、调试及测试结果与分析 164.1密码锁初始化 164.1.1设置初始密码 174.1.2设置系统时间 184.2休眠模式与温度报警 194.3开锁系统 194.4步进电机调试 20第五章实验结论 20第六章参考文献 207.附录 217.1电路总设计图 217.2元器件清单 227.2源程序清单 23前言随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的喜爱。锁是置于可启闭的器物上,用以关住某个确定的空间范围或某种器具的,必须以钥匙或暗码打开的扣件。锁具发展到现在已有若干年的历史了,人们对它的结构、机理也研究得很透彻,因此,不用钥匙就能打开的方法和工具也层出不穷。致使某些毫无道德观念的盗贼却想方设法利用高科技手段撬门开锁,使广大居民防不胜防。为什么会出现这种情况呢?因为传统锁具都存在致命的弱点:

第一、锁芯采用常见的铜、铝、锌等材料,抵抗不了强力破坏;

第二、锁具制作工艺,技术落后,无法阻止技术手段的开启。

目前,市场上很多国内外的锁具,实际上都不具备真正的防盗功能。在惯偷面前,两根钢丝或几件简单的工具就可以把这些锁打开,有的惯偷甚至公开扬言:“没有我打不开的锁。”其实,不是他们多高明,而是一般锁具技术原理太过简单。面对这一残酷的现状,新时代提出了锁具必须革命的迫切的要求。随着社会科技的进步,锁已发展到了密码锁、磁性锁、电子锁、激光锁、声控锁等等。在传统钥匙的基础上,加了一组或多组密码,不同声音,不同磁场,不同声波,不同光束光波,不同图像。(如指纹、眼底视网膜等)来控制锁的开启。从而大大提高了锁的安全性,使不法之徒无从下手,人们也就能对自身财产安全有了更多的保障。当今安全信息系统应用越来越广泛,特别在保护机密、维护隐私和财产保护方面起到重大作用,而基于电子密码锁的安全系统是其中的组成部分,因此研究它具有重大的现实意义。第一章设计要求1.1基本要求:(1)设置6位密码并确认,密码通过键盘输入,若密码正确,则将锁打开。(2)报警、锁定键盘功能。密码输入错误数码显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。(3)电子密码锁的设计主要4×4矩阵键盘接口电路、密码锁的控制电路。(4)要有显示界面。1.2提高要求:(1)功能扩展:本设计扩展了显示界面功能,增加日历时钟功能,并增加了温控报警电路,显示实时温度,充分利用显示界面,提升设计的实用性。第二章系统的组成及工作原理2.1系统组成框图图2.1系统组成模块图图2.2系统运行流程图2.2系统工作原理以STC90C51单片机为主控制单元,4*4矩阵键盘为主要输入单元,温控采集和A/D转换电路,实时时钟电路,报警器和显示器完成整个系统设计。系统的运行过程大致如下:假设初始状态为闭锁,此时整个系统只等待按键输入,LCD显示”Pressanykeytostart”,此时按下任意键,系统显示“systeminitial”,并设置初始密码。每按下一个数据键(即每输入一个密码),数码管相应的显示一个“*”标志,当6位密码全部输入完成后,此时系统显示要求确认密码,之后设置日期,时钟,设置完成后LCD显示日期,时间,并显示测得的实时温度。系统初始化完成。按休眠键可使系统进入休眠状态。按任意键将系统从休眠状态唤醒,显示“enterpassword”,每按下一个数据键(即每输入一个密码),数码管相应的显示一个“*”标志,当6位密码全部输入完成后,判断密码是否正确,正确则开锁(显示“welcomeHome!”),错误则显示“passworderror!repeat”重新输入密码,若连续3次输错密码,显示“systemshut!”并报警。若按下复位键可见将整个系统复位。本试验采用89C51单片机开发板(得飞莱LY—51S型号),KeiluVision5软件编程实现系统功能,并将程序烧写到开发板实现密码锁系统。第三章电路设计3.1.STC90C51RC/RD+系列单片机简介STC90C51RC/RD+系列单片机是宏晶科技推出的新一代超强抗干扰、高速、低功耗的单片机,指令代码完全兼容传统8051单片机,12时钟机器周期和6时钟机器周期可以任意选择。内部集成MAX810专用复位电路,时钟频率在12MHz以下时,复位脚可直接接地。STC90C51RC/RD+单片机中包含中央处理器(CPU)、程序存储器(FLASH)、数据存储器(SPAM)、定时/计数器、UART串口、I/O接口、EEPROM、看门狗等模块。STC90C51RC/RD+系列单片机几乎包含了数据采集和控制所需要的所有单元模块,可称得上一个片上系统。1、增强型6时钟/机器周期,12时钟/机器周期8051CPU。2、工作电压:5.5V-3.8V(5V单片机)/3.6V-2.0V(3V单片机)。3、工作频率范围:0-40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz。4用户应用程序空4K/6K/7K/8K/10K/12K/13K/16K/32K/40K/48K/56K/61K/字节。5、片上集成1280字节/512/256字节RAM。6、通用I/O口(35/39个),复位后为:P1/P2/P3/P4是准双向口/弱上拉(普通8051传统I/O口)。P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。7、ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器/仿真器,可通过串口(P3.0/P3.1)直接下载用户程序,8K程序3-5秒即可完成一片。8、EEPROM功能。9、看门狗。10、内部集成MAX810专用复位电路,外部晶体12M以下时,可省外部复位电路,复位脚可直接接地。11、共3个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用。12、外部中断4路,下降沿中断或低电平触发中断,PowerDown模式可由外部中断低电平触发中断方式唤醒。13、通用异步串行口(UART),还可用定时器软件实现多个UART。14、工作温度范围:0-75℃/-40-+85℃。15、封装:LQFP-44,PDIP-40,PLCC-44。图3-1STC90C51RC/RD+系列单片机引脚图图3-2STC90C51RC系列单片机封装图1、电源Vcc(引脚号40),芯片电源,接+5V;Gnd(引脚号20),电源接地端。2、时钟XTAL1(引脚号19)内部振荡电路反相放大器的输入端,是外接晶振的一个引脚。当采用外部振荡器时,此引脚接地。XTAL2(引脚号18)内部振荡器的反相放大器输出端,是外接晶振的另一端。当采用外部振荡器时,此引脚接外部振荡源。3、控制总线(1)ALE/(引脚号30):正常操作时为ALE功能(允许地址锁存),用来把地址的低字节锁存到外部锁存器。ALE引脚以不变的频率(振荡器频率的1/6)周期性地发出正脉冲信号。因此,它可用作对外输出的时钟信号或用于定时。但要注意,每当访问外部数据存储器时,将跳过一个ALE脉冲。ALE端可以驱动(吸收或输出电流)8个LSTTL电路。(2)(引脚号29):外部程序存储器读选通信号。在从外部程序存储器取指令(或数据)期间,在每个机器周期内两次有效。可以驱动8个LSTTL电路。(3)RST/VPD(引脚号9):复位信号输入端。振荡器工作时,该引脚上持续2个机器周期的高电平可实现复位操作。此引脚还可接上备用电源。在Vcc掉电期间,由VPD向内部RAM提供电源,以保持内部RAM中的数据。(4)/Vpp(引脚号31):为内部程序存储器和外部程序存储器的选择端。当为高电平时,访问内部程序存储器;当为低电平时,访问外部程序存储器。4、I/O线P0口(引脚号32~39):单片机的双向数据总线和低8位地址总线。在访问外部存储器时实现分时操作,先用作地址总线,在ALE信号的下降沿,地址被锁存;然后用作为数据总线。它也可以用作双向输入/输出口。P0口能驱动8个LSTTL负载。P1口(引脚号1~8):准双向输入/输出口,它能驱动4个LSTTL负载。(3)P2口(引脚号21~28):准双向输入/输出口。在访问外部存储器时,用作高8位地址总线。P2口能驱动4个LSTTL负载。(4)P3口(引脚号10~17):准双向输入/输出口,它能驱动4个LSTTL负载。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.1.1晶振电路单片机工作时,从取指令到译码再进行微操作,必须在时钟信号控制下才能有序地进行,时钟电路就是为单片机工作提供基本时钟的。单片机的时钟信号通常有两种产生方式:内部时钟方式和外部时钟方式。内部时钟方式是在单片机XTAL1和XTAL2引脚上跨接上一个晶振和两个稳频电容,可以与单片机片内的电路构成一个稳定的自激振荡器。晶振的取值范围一般为0~24MHz,常用的晶振频率有6MHz、12MHz、11.0592MHz、24MHz等。一些新型的单片机还可以选择更高的频率。外接电容的作用是对振荡器进行频率微调,使振荡信号频率与晶振频率一致,同时起到稳定频率的作用,一般选用20~30pF的瓷片电容。外部时钟方式则是在单片机XTAL1引脚上外接一个稳定的时钟信号源,它一般适用于多片单片机同时工作的情况,使用同一时钟信号可以保证单片机的工作同步。时序是单片机在执行指令时CPU发出的控制信号在时间上的先后顺序。单片机的时序概念有4个,可用定时单位来说明,包括振荡周期、时钟周期、机器周期和指令周期。振荡周期:是片内振荡电路或片外为单片机提供的脉冲信号的周期。时序中1个振荡周期定义为1个节拍,用P表示。时钟周期:振荡脉冲送入内部时钟电路,由时钟电路对其二分频后输出的时钟脉冲周期称为时钟周期。时钟周期为振荡周期的2倍。时序中1个时钟周期定义为1个状态,用S表示。每个状态包括2个节拍,用P1、P2表示。机器周期:机器周期是单片机完成一个基本操作所需要的时间。一条指令的执行需要一个或几个机器周期。一个机器周期固定的由6个状态S1~S6组成。指令周期:执行一条指令所需要的时间称为指令周期。一般用指令执行所需机器周期数表示。单片机多数指令的执行需要1个或2个机器周期,只有乘除两条指令的执行需要4个机器周期。了解了以上几个时序的概念后,我们就可以很快的计算出执行一条指令所需要的时间。例如:若单片机使用12MHz的晶振频率,则振荡周期=1/(12MHz)=1/12us,时钟周期=1/6us,机器周期=1us,执行一条单周期指令只需要1us,执行一条双周期指令则需要2us。晶振电路如图3-3所示:图3-3系统晶振电路图3.1.2复位电路无论是在单片机刚开始接上电源时,还是运行过程中发生故障都需要复位。复位电路用于将单片机内部各电路的状态恢复到一个确定的初始值,并从这个状态开始工作。单片机的复位条件:必须使其RST引脚上持续出现两个(或以上)机器周期的高电平。单片机的复位形式:上电复位、按键复位,此处采用上电复位。按键复位电路中,当按键没有按下时,电路同上电复位电路。如在单片机运行过程中,按下RESET键,已经充好电的电容会快速通过电阻的回路放电,从而使得RST引脚上的电位快速变为高电平,此高电平会维持到按键释放,从而满足单片机复位的条件实现按键复位。单片机要复位只需要在第9引脚接个高电平持续2μs就可以实现,电容的的大小是10uF,电阻的大小是10k。所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间是10K×10UF=0.1S。单片机最小系统复位电路的极性电容C1的大小直接影响单片机的复位时间,一般采用10~30uF,单片机最小系统容值越大需要的复位时间越短。单片机复位电路如图3-4所示:图3-4系统复位电路3.2LCD显示电路显示电路中的显示器件为LCD1602,其数据端口与单片机的P0口相接,电路连接如图3-5所示:图3-5LCD1602连接图1602采用标准的16脚接口,其中:第1脚:VSS为地电源。第2脚:VCC接5V正电源。第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生重影,使用时可以通过一个1K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。第15~16脚:背光灯电源。LCD1602指令与时序说明如下:数据位命令RSRWDB7DB6DB5DB4DB3DB2DB1DB0清屏0000000001归位000000000*输入方式00000001I/DS显示开关0000001DCB光标、画面000001S/CR/L**功能设置00001DLNF**CGRAM地址0001A5A4A3A2A1A0DDRAM地址001A6A5A4A3A2A1A0读BF及AC01BFAC6AC5AC4AC3AC2AC1AC0写数据10数据读数据11数据表3-1LCD1602指令表LCD1602在工作的过程中,在数据线上传送数据时,需将传送数据在数据线上持续一小段时间,保证单片机的P0口数据传送或接收成功,其基本操作时序如表3-2所示:表STYLEREF1\s32LCD1602基本操作时序操作输入输出读状态RS=L,R/W=H,E=HD0~D7=状态字写指令RS=L,R/W=L,D0~D7=指令码,E=高脉冲无读数据RS=H,R/W=H,E=HD0~D7=数据写数据RS=H,R/W=L,D0~D7=数据,E=高脉冲无3.3矩阵键盘电路在单片机应用系统中,除了复位按键外,还需要其他按键,即键盘按键,以便控制系统的运行状态或向系统输入运行参数。键盘电路一般由键盘接口电路、按键(由控制系统运行状态的功能键和向系统输入数据的数字调节键组合)以及键盘扫描程序等部分组成。本系统键盘电路共有16个按键组成,按4×4的格式布置。键盘的电路连接如图3-6所示:图3-6矩阵键盘电路和封装3.4蜂鸣器报警电路系统中单片机的P3.1脚与蜂鸣器相连,开启蜂鸣器功能。当单片机的管脚输出固定频率电平时蜂鸣器响起。声音是由振动所产生的,一定频率的震动就产生了一定频率的声音,其电路连接图如图2-7所示:图3-7蜂鸣器电路连接图一般情况下,P3.1脚处于高电平,当系统进入报警时间时,单片机控制P3.1脚输出一定频率方波,蜂鸣器振动发声,实现声音报警功能。3.5DS1302时钟电路DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。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的引脚功能图:图3-8DS1302封装图图3-9DS1302时钟电路DS1302与CPU的连接需要三条线,即SCLK(7)、I/O(6)、RST(5)。在调试程序时可以不加电容器,只加一个32.768kHz的晶振即可。只是选择晶振时,不同的晶振,误差也较大。3.6温度控制电路温度控制电路由温度传感器经A/D转换构成,其中A/D转换电路主要由PCF8591芯片实现,PCF8591是一个单片集成、单独供电、低功耗、8-bitCMOS图3-10热敏光敏电阻图3-11温度传感器图3-12A/D转换电路连接图数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。PCF8591的3个地址引脚A0,A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。PCF8591引脚功能如下:AIN0~AIN3:模拟信号输入端。A0~A2:引脚地址端。VDD、VSS:电源端。(2.5~6V)SDA、SCL:I2C总线的数据线、时钟线。OSC:外部时钟输入端,内部时钟输出端。图3-11PCF8951引脚图EXT:内部、外部时钟选择线,使用内部时钟时EXT接地。AGND:模拟信号地。AOUT:D/A转换输出端。VREF:基准电源端。3.7红外收发:红外接收头的工作原理为:内置接受管将红外发射出来的光信号转换为微弱的电信号,此信号经由IC内部放大器进行放大,然后通过自动增益控制、带通滤波、解调、波形整形后还原为遥控器发射出的原始编码,经由接收头的信号输出脚输出到电器的编码识别电路。红外收发电路原理图如下:图3-12红外发信电路原理图图3-13红外接收电路原理图3.8步进电机步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的,多相时序控制器。图3-14步进电机图3-15步进电机电路第四章实验、调试及测试结果与分析4.1密码锁初始化4.1.1设置初始密码将在KeiluVision5软件中所建工程下载到开发板中,根据程序中的电路设计及引脚分牌将开发板中各模块链接,板图如下所示,运行密码锁初始化:图4-1电路板及运行初始界面图(为使连线简单这里去掉了步进电机电路)按任意键,显示如下界面,此时输入初始密码111111,之后弹出确认界面,确认后进入系统时间设置。图4-2初始化界面图4-3密码确认界面4.1.2设置系统时间通过矩阵键盘输入年份,月份和日期,系统保存后出现设置时间的界面,设置当前时间的时,分,秒,设置成功后,界面提升设置成功,显示万年历界面,并将温控系统采集的实时气温显示在LCD液晶显示屏上。图4-4设置年、月、日图4-5设置周(周三)图4-6设置时、分钟图4-7设置完成图4-8显示万年历和实时气温图4-9进入休眠模式4.2休眠模式与温度报警按矩阵键盘的12键即可进入休眠模式。在休眠模式下,系统界面显示进入休眠模式后,就不再显示任何内容,同时温度检测系统监测实时气温,若超过40℃便蜂鸣报警。如图4-10所示。进入休眠模式后,按任意键将系统从休眠模式唤醒,进入开锁系统。图4-10气温升高至30℃4.3开锁系统从休眠模式将系统唤醒,系统提示输入密码,通过矩阵键盘输入六位密码,若密码正确,系统显示“WelcomeHome!”,开锁成功。若密码错误,系统提示密码错误,并提示重新输入密码,若密码错误3次,则系统封锁,并蜂鸣报警,图4-11输入开锁密码图4-12密码正确图4-13密码错误图4-14三次密码错误系统报警4.4步进电机调试使用红外遥控器“前进”、“后退”键进行对步进电机的正转、反转的调试,用来模拟家中窗帘的升降。实验结果证明系统确实可以控制步进电机的正转与反转,并同时测试了红外收发系统的性能。结果证明系统确实具有此功能。第五章实验结论在本设计中,除了实现了电子密码锁的基本设置密码、上锁、密码解锁、错码报警等基本密码锁防盗功能外,还增设了万年历系统和实时温度监测系统等方便日常生活的功能,真正做到了多功能,充分利用电路板和元器件,有很强的实用行。在本次设计中学到很多很多的的东西,不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机C语言掌握得不好,对keil软件也掌握不够熟悉。通过这次课程设计之后,一定把以前所学过的知识重新温故。这次电子综合实践设计终于顺利完成了,在漫长的设计过程中,除了自己的努力外,离不开院方为我们制定的严格的计划,离不开指导老师的严格的督查和耐心的教导指点,离不开班级同学、宿舍友人的帮助与支持,在此,向所有帮助过我的人致以衷心的感谢!第六章参考文献[1]于殿泓,王新年.单片机原理与程序设计实验教程[M].西安:西安电子科技大学出版社,2007,8.[2]赵文博,刘文涛.单片机语言C51程序设计[M].北京:人民邮电出版社,2005,10.[3]陈杰,黄鸿.传感器与检测技术[M].北京:高等教育出版社,2010,8.[4]周航慈.单片机应用程序设计技术[M].北京:北京航空航天大学出版社,2011,2.[5]李朝青.单片机原理及接口技术[M].北京:北京航空航天大学出版社,2005,10.[6]孙育才.MCS-51系列单片微型计算机及其应用[M].东南大学出版社,2004,6.7.附录7.1电路总设计图图7-1电路总设计图图7-2总设计板图7.2元器件清单表7-1元器件清单原件名称备注单片机开发板得飞莱LY—51S型号单片机STC90C51液晶显示屏LCD16021块实时时钟电路DS1302芯片5V蜂鸣器1只晶振12MHZ按健17个PCF89511个ULN2003N1块DS18B202块LEDD1,D2,D3,D4绿,黄,红,蓝各一个发光二极管1只热敏,光敏电阻各1个DS18B202个步进电机1个电阻若干电容若干7.2源程序清单#include<reg52.h>/*LCD1602.c显示子程序*/#include"LCD1602.h"#include"delay.h"#include<intrins.h>sbitRS=P2^4;//定义端口sbitRW=P2^5;sbitEN=P2^6;unsignedcharcodelocation[]={12,13,0x2d,8,9,0x2d,6,7,'','w','e','e','k',0x3a,11,4,5,0x3a,2,3,0x3a,0,1};voidLCD_command_transmit(unsignedchart){while(LCD_Check_Busy());RS=0;RW=0;EN=1;dataport=t;_nop_();EN=0;}voidLCD_initial(){LCD_command_transmit(0x38);/*显示模式*/DelayMs(5);LCD_command_transmit(0x38);DelayMs(5);LCD_command_transmit(0x38);DelayMs(5);LCD_command_transmit(0x38);LCD_command_transmit(0x08);/*显示关闭*/LCD_command_transmit(0x01);/*显示清屏*/LCD_command_transmit(0x06);/*显示光标移动设置*/DelayMs(6);LCD_command_transmit(0x0C);}voidLCD_clear(){LCD_command_transmit(0x01);DelayMs(5);}voidLCD_write_data(unsignedcharstart,unsignedcharline_num,char*p){if(line_num==1){LCD_command_transmit(0x80+start);}else{LCD_command_transmit(0xc0+start);}while(*p!=0){while(LCD_Check_Busy());RS=1;RW=0;EN=1;dataport=*p;_nop_();EN=0;p++;}}bitLCD_Check_Busy(void){dataport=0xFF;RS=0;RW=1;EN=0;_nop_();EN=1;return(bit)(dataport&0x80);}voidLCD_write_data_ASCII(unsignedcharstart,unsignedcharline_num,unsignedcharnum){if(line_num==1){LCD_command_transmit(0x80+start);}else{LCD_command_transmit(0xc0+start);}while(LCD_Check_Busy());RS=1;RW=0;EN=1;dataport=num;_nop_();EN=0;}voidDS1302_LCD_show(){unsignedchari;for(i=0;i<15;i++){if(i==2||i==5||(i>8&&(i<14)))LCD_write_data_ASCII(i+1,1,location[i]);elseif(i!=8)LCD_write_data_ASCII(i+1,1,tempasc[location[i]]);}LCD_write_data_ASCII(4,2,tempasc[4]);LCD_write_data_ASCII(5,2,tempasc[5]);LCD_write_data_ASCII(6,2,0x3a);LCD_write_data_ASCII(7,2,tempasc[2]);LCD_write_data_ASCII(8,2,tempasc[3]);LCD_write_data_ASCII(12,2,tempasc[14]);LCD_write_data_ASCII(13,2,tempasc[15]);LCD_write_data_ASCII(14,2,0xdf);}/*keyhandler.c按键子程序*/unsignedcharkeyhandle(){unsignedchartemp;temp=keyscan();switch(temp){case0x7e:keyvoice();return15;break;//0case0x7d:keyvoice();return14;break;//1case0x7b:keyvoice();return13;break;//2case0x77:keyvoice();return12;break;//3case0xbe:keyvoice();return11;break;//4case0xbd:keyvoice();return10;break;//5case0xbb:keyvoice();return9;break;//6case0xb7:keyvoice();return8;break;//7case0xde:keyvoice();return7;break;//8case0xdd:keyvoice();return6;break;//9case0xdb:keyvoice();return5;break;//acase0xd7:keyvoice();return4;break;//bcase0xee:keyvoice();return3;break;//ccase0xed:keyvoice();return2;break;//dcase0xeb:keyvoice();return1;break;//ecase0xe7:keyvoice();return0;break;//fdefault:return16;break;}}unsignedcharkeyscan(){unsignedcharkeydata;unsignedintcount=20000;P1=0xf0;if(mark==1){while(--count){if(P1!=0xf0){DelayMs(10);if(P1!=0xf0){P1=0xfe;if(P1!=0xfe){keydata=P1;while(P1!=0xfe); DelayMs(10);//去抖 while(P1!=0xfe);returnkeydata;}P1=0xfd;if(P1!=0xfd){keydata=P1;while(P1!=0xfd); DelayMs(10);//去抖 while(P1!=0xfd);returnkeydata;}P1=0xfb;if(P1!=0xfb){keydata=P1;while(P1!=0xfb); DelayMs(10);//去抖 while(P1!=0xfb);returnkeydata;}P1=0xf7;if(P1!=0xf7){keydata=P1;while(P1!=0xf7); DelayMs(10);//去抖 while(P1!=0xf7);returnkeydata;}}}}}else{while(1){if(P1!=0xf0){DelayMs(10);if(P1!=0xf0){P1=0xfe;if(P1!=0xfe){keydata=P1;while(P1!=0xfe); DelayMs(10);//去抖 while(P1!=0xfe);returnkeydata;}P1=0xfd;if(P1!=0xfd){keydata=P1;while(P1!=0xfd); DelayMs(10);//去抖 while(P1!=0xfd);returnkeydata;}P1=0xfb;if(P1!=0xfb){keydata=P1;while(P1!=0xfb); DelayMs(10);//去抖 while(P1!=0xfb);returnkeydata;} P1=0xf7;if(P1!=0xf7){keydata=P1;while(P1!=0xf7); DelayMs(10);//去抖 while(P1!=0xf7);returnkeydata;}}}}}}voidDelayUs2x(unsignedchart)/*delay.c延时子程序*/{while(--t);}voidDelayMs(unsignedintt){while(--t){DelayUs2x(245); DelayUs2x(245);}}voiddelayus(unsignedchart){unsignedchari;for(i=0;i<t;i++)_nop_();}/*DS1302_USE.c万年历子程序*/#include"DS1302_USE.h"#include"delay.h"#include"LCD1602.h"#include"matrix_key.h"#include"NTC.h"#include"control.h"sbitRESET=P2^0;sbitIO=P2^1;sbitSCLK=P2^2;unsignedchartempdata[8];unsignedchartempasc[16];unsignedcharcodetrans[]={'0','1','2','3','4','5','6','7','8','9'};unsignedchartimedata[6]={14,8,20,3,12,0};//unsignedchartimeasc[]={'2','0','1','4','-','0','8','-','2','0','3','1','2',':','0','0'};unsignedcharLCD_temp1;LCD_temp2;unsignedcharcommand[9]={0xBE};//0x00,0x59,0x20,0x19,0x08,0x02,0x14,0x80};//0x8e0x00:turnoffwriteprotect//0xbeburst//secminhourdaymonthweekyearprotect//intialdatavoidDS1302_initial(){unsignedcharbcd1,bcd2;unsignedchari;for(i=0;i<6;i++){bcd1=timedata[i]/10;bcd2=timedata[i]%10;bcd1=bcd1<<4;tempdata[i]=bcd1+bcd2;}command[8]=0x80;command[7]=tempdata[0];//yearcommand[6]=tempdata[3];//weekcommand[5]=tempdata[1];//monthcommand[4]=tempdata[2];//daycommand[3]=tempdata[4];//hourcommand[2]=tempdata[5];//mincommand[1]=0;//secwrite_protect_de();for(i=0;i<9;i++)write_command(command[i]);delayus(5);RESET=0;}voidwrite_command(unsignedchartemp){unsignedchari;for(i=0;i<8;i++){IO=(bit)((temp>>i)&0x01);SCLK=1;delayus(5);SCLK=0;delayus(5);}}voidDS1302_Read(){unsignedchari,j,temp=0;write_protect_de();RESET=0;SCLK=0;DelayMs(1);RESET=1;delayus(5);write_command(0xBF);for(j=0;j<7;j++)//burstread7bytedata{for(i=0;i<8;i++){ temp=temp>>1; if(IO) temp|=0x80; else temp&=0x7F;SCLK=1;delayus(5);SCLK=0;delayus(5);}tempdata[j]=temp;}for(i=0;i<5;i++){SCLK=1;delayus(5);SCLK=0;delayus(5);}RESET=0;tempdata[7]=AD_temperature();if(tempdata[7]>=40)warn_fire(); BCD_process();}voidBCD_process()//bcdtoasc{unsignedchartemp,num1,num2;unsignedchari,j;for(i=0,j=0;j<7;j++,i=i+2){temp=tempdata[j]&0xf0;temp=temp>>4;temp=temp*10+(tempdata[j]&0x0f);num1=temp/10;num2=temp%10;tempasc[i]=trans[num1];tempasc[i+1]=trans[num2];}num1=tempdata[7]/10;num2=tempdata[7]%10;tempasc[14]=trans[num1];tempasc[15]=trans[num2];}voidwrite_protect_de(){RESET=0;SCLK=0;DelayMs(1);RESET=1;write_command(0x8e);write_command(0x00);RESET=0;SCLK=0;DelayMs(1);RESET=1;}voidreadySettime(){unsignedchari,keytemp,keyasc,j,temp;unsignedchartemptime[15];LCD_initial();LCD_clear(); mark=0;LCD_write_data(1,1,"year-month-day"); for(i=0,j=0;i<10;i++){keytemp=keyhandle(); keyasc=trans[keytemp];LCD_write_data_ASCII(i+2,2,keyasc); if((i==3)||(i==6)){LCD_write_data_ASCII(i+3,2,'-'); i++;}temptime[j]=keytemp; j++;}DelayMs(1000);LCD_clear(); LCD_write_data(0,1,"week:"); keytemp=keyhandle(); keyasc=trans[keytemp];LCD_write_data_ASCII(10,1,keyasc); temptime[j]=keytemp; j++; DelayMs(2000);LCD_clear();LCD_write_data(0,1,"hour:min"); for(i=0;i<5;i++){ keytemp=keyhandle(); keyasc=trans[keytemp];LCD_write_data_ASCII(4+i,2,keyasc); temptime[j]=keytemp; if(i==1){LCD_write_data_ASCII(5+i,2,':');i++;}j++; } DelayMs(1000); for(i=0,j=2;i<6;i++) {if(i==3){timedata[i]=temptime[j];j++;}else{timedata[i]=temptime[j]*10+temptime[j+1];j=j+2;}} LCD_clear();LCD_write_data(0,1,"TimeIsSet");LCD_write_data(2,2,"SystemIsOk");temp=keyhandle();DelayMs(2000);LCD_clear(); DS1302_initial();}#include"control.h"/*control.c控制子程序*/#include"LCD1602.h"#include"DS1302_USE.h"#include"matrix_key.h"#include"delay.h"#include"NTC.h"#include"initial.h"bitmark;unsignedcharfrq;voidAT_HOME(){unsignedcharsysoff;mark=1;EX0=1;ET0=1;TR0=1;LCD_clear();while(1){DS1302_Read();DS1302_LCD_show();sysoff=keyhandle();if(sysoff==12)break; elseif(sysoff==11)readySettime();}standby();}voidstandby(){unsignedcharwaitdata,tempe_check;LCD_clear();LCD_write_data(1,2,"SystemDormant!");DelayMs(1000);LCD_command_transmit(0x08);while(1){waitdata=keyhandle();tempe_check=AD_temperature();if(tempe_check>40)warn_fire();if(waitdata!=16)break;}restart_check();}voidrestart_check(){unsignedchartempdata[6],i,count=0;mark=0;LCD_initial();Loop:LCD_clear();LCD_write_data(0,1,"EnterPassword:");for(i=0;i<6;i++){tempdata[i]=keyhandle();LCD_write_data_ASCII(i+3,2,'*');}DelayMs(1000);for(i=0;i<6;i++)

温馨提示

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

评论

0/150

提交评论