文档详情

红外遥控数字钟论文

仙***
实名认证
店铺
DOC
520.54KB
约40页
文档ID:145105324
红外遥控数字钟论文_第1页
1/40

编号: 实训(论文)说明书题 目: 红外遥控数字钟 2009 年 12 月 31 日1摘 要本系统设计一个基于单片机红外遥控电子钟,数据处理用MCS-51系列采用89S51单片机作为中央控制器数据采集部分采用集成数字时间的时、分、秒及温度传感器直接转换为二进制代码,并通过总线传送数据和发送控制指令,控制数字时间、温度传感器的读写操作时间、温度传感器和单片机接口只需要一个I/O口,它使用的是美国DALLAS半导体公司生产的18B20温度采集芯片一种红外遥控数字钟,由时钟集成电路、显示屏、蜂鸣器、分时驱动器、电源等组成,其特征是:在现有时钟电路的基础上增设了一个可以接收和处理由红外遥控器发出的指令,由接收头、反相器、振荡器和解码集成电路等组成的,可以控制时钟集成电路、LED128*64显示屏、蜂鸣器工作状态的受控系统关键字:89S51;18B20; MAX232;串行口; LED128*64Abstract The system design of a microcontroller based infrared remote control electronic clock data processing, with the MCS-51 family as the central controller using 89S51 microcontroller. Use of integrated digital data collection part of the time, hours, minutes, seconds, and temperature sensor directly converted into binary code, and transmit data through the bus, and sending control instructions to control the digital time and temperature sensor to read and write operations. Time, temperature sensor and microcontroller interface requires only an I / O port, it uses the U.S. DALLAS Semiconductor chip production 18B20 temperature acquisition. An infrared remote control digital clock from the clock integrated circuits, display, buzzer, time-drive, power supply etc., whose characteristics are: on the basis of the existing clock circuit can be added to receive and process by an infrared remote control the directives issued by the receiving head, inverter, oscillator and decoder integrated circuits etc., and can control the clock IC, LED128 * 64 display, buzzer working status of the controlled system. Key words: 89S51; 18B20; MAX232; serial port; LED128 * 641目 录引言 11 设计思想与总体方案 11.1 主控制器选型 11.2 DS1302实时显示时间的软硬件 21.3 显示方案论证 21.4 报警方案论证 31.5 键盘接口的选择 31.6 红外通信的基本原理 31.6.1 红外通信接口的硬件电路设计 41.6.2 红外发送器及原理 41.6.3 红外遥控电路原理分析 52 主要电路与程序设计 52.1 系统硬件的结构框图 52.2 单片机最小系统设计 52.3 温度电路设计 62.4 显示电路设计 62.5 声光报警电路 72.6 实时时钟模块 72.7 串行通信口与RS232电平转换接口电路 82.8 键盘电路 82.9 红外线接收电路 93 软件设计说明 93.1总模块的流程图 103.2 部分主要模块的流程图 113.3 温度转换核心及其算法 123.3.1 DS18B20的内部结构 123.3.2 DS18B20的内存结构 123.3.3 DS18B20的测温功能 123.3.4 温度转换算法及分析 134 系统调试及结果分析 164.1 LED128*64的测试方法和结果 164.2 DS18B20的测试方法和结果 164.3 键盘程序的测试方法和结果 164.4 RS232模块的测试方法和结果 164.5 产品最终调试 165 结论 17致 谢 18参考文献 19附 录 1 应用程序 20附 录 2 作品图 350引言     随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中红外遥控数字钟就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。

本设计所介绍的红外遥控数字钟与传统的数字钟相比,具有读数方便,也具有测量温度的功能,测温准确,其输出温度采用数字显示该设计控制器使用单片机AT89S51,测温传感器使用DS18B20,通过液晶128*64显示屏读出具体的时间和温度电流充电能力的低功耗实时时钟电路DS1302的结构、工作原理及其在实时显示时间中的应用它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能给出DS1302在读写中的C51程序及流程图,以及在调试过程中的注意事项      一种红外遥控数字钟,由红外遥控数字钟和红外遥控器共同组成,红外遥控数字钟由受控系统以及时钟集成电路,显示屏等组成,红外遥控器由编码集成电路、设定按键等组成,可以在黑暗的环境下随时显示时间,交直流两用,蜂鸣时间一经设定,便可自动运行,可广泛适用于家庭和各类公共场所1 设计思想与总体方案本系统要求完成对时间和环境温度的采集,对时间及温度数据的处理问题,因此,首要解决的采用何种微控制器以及何种传感器来对时间及温暖进行采集处理包括计算,其次是采集到的时间及温暖将通过何种方式去显示或通过何钟方式表达出来让人一目了然,最后要解决的是当检测到的温度超出正常或低于正常值时该做出报警反应或对外部设备作相应的控制。

1.1 主控制器选型当今单片机厂商琳琅满目,MCU品种繁多、产品性能各异常用的单片机有很多种:Intel8051系列、Motorola和M68HC系列、Atmel的AT89系列、Microchip公司的PIC系列、Atmel的AT90S系列等不同型号的单片机功能各异、开发装置也不兼容我们最终选用了ATMEL公司的AT89S51单片机AT89S51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含8Kbytes的可反复擦写的只读程序存储器(PEROM)和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8051产品引脚兼容,片内置通用8位中央处理器(CPU)和FLASH存储单元,功能强大AT89S51单片机适用于许多较为复杂控制应用场合AT89S51单片机具有低电压供电和体积小等特点,四个端口只需要其中一个或两个口就能满足系统的设计需要,很适合便携手持式产品的设计使用;系统可用二节电池供电尽管AT89S51单片机现在并不是最完善最先进的单片机,但是就其功能及相关资料在市面上非常丰富,编译器已经比较优化我们对其开发环境及开发语言也相当熟悉,对于本设计来说我们完全可以选择AT89s51单片机作为主控制器。

1.2 DS1302实时显示时间的软硬件DS1302与CPU的连接需要三条线,即SCLK(7)、I/O(6)、RST(5)其中,时钟的显示用LCD 虽然DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池可以用老式电脑主板上的3.6V充电电池如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替100 μF就可以保证1小时的正常走时DS1302在第一次加电后,必须进行初始化操作初始化后就可以按正常方法调整时间 DS1302 存在时钟精度不高,易受环境影响,出现时钟混乱等缺点DS1302可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录这种记录对长时间的连续测控系统结果的分析及对异常数据出现的原因的查找具有重要意义传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此,只能记录数据而无法准确记录其出现的时间;若采用单片机计时,一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且,某些测控系统可能不允许但是,如果在系统中采用时钟芯片DS1302,则能很好地解决这个问题。

1.3 显示方案论证方案一:直接要数码管或者7段数码管加MAX7219驱动显示MAX7219驱动7段数码管采用低电压扫描驱动具有:可以节约单片机I/O口,耗电少、使用寿命长、成本低、亮度高、故障少、视角大、可视距离远等特点;但是显示单一,只能显示数字和几个字母就本设计而言需要显示很多的操作提示信息和报警信息,数码管是难以达到的;且本设计需要单片机I/O口并不多,就AT89S51的资源来说不必要考虑单片机I/O不必要考虑I/O口资源不足的问题方案二:LED点阵显示LED点阵可以显示多种字符以及图形,可视距离远,可用软件进行调制,有很强的兼容性以及可操作性但是需要占要很多系统资源来对其控制;而就AT89S51单片机的速度或系统资源来说控制LED点阵的效果并不很理想,而且LED点阵结构比较庞大,不利随身携带方案三:LED液晶显示LCD液晶零辐射、低功耗、散热小、体积小、图像还原精确、字符显示锐利控制简单等与数码管相比显得更为专业、漂亮;液晶显示屏以其微功耗体积小,显示内容丰富、超薄轻巧、使用方便等诸多优点,在通讯、仪器仪表、电子设备、家用电器等低功耗应用系统中得到原来越广泛的应用,使这些电子设备的人机界面变得越来越形象,目前已广泛的饿用于电子表、计算器、IC卡机机,液晶电视机、掌上玩具许多方面;虽然视觉范围较近,不太利于远处观察。

对于本设计来说只是做为红外遥控电子钟的温度显示及人机操作界面提示信息,不需要原距离观察,如果需要远距离观察的的话应该首选LED点阵显示本例结合需要及实际经济情况综合考虑使用液晶LED128*64作为时间、温度及信息显示,同时也利用AT89s51单片机自带的串行通信口与上位机个人电脑进行通信可以将大部分信息显示在电脑上1.4 报警方案论证方案一:采用DS1420语音芯片可分段录放音模块,音质自然、使用方便、单片机存储、反复录音、低功耗、能够给人以直观的提示等诸多特点在本系统中可以要于随时提示时间和温度以及上下限播报不同报警音乐但是价格比较昂贵,本设计的来说可以暂时不考虑方案二:采用单片机产生不同的频率信号来驱动蜂鸣器和发光二极管产生声光提示,不同的温度报警值对应不同的频率,此方案能完成声音提示功能,同时给人以提示可以类似电脑主机的蜂鸣报警,而且易于实现故此红外遥控电子钟的报警方案采用方案二1.5 键盘接口的选择在实际应用中,要求设定的上下限温度温值会随着实际情况的需要变化而变化,因此,就要根据实际的情况来改变系统的温度设定值作为一个系统,一旦做成产品后,就很难通过对程序的修改来完成对各项初值的设定,因而只有用按键的方式来重新对温度值进行设置。

键盘有独立式和行列式两种,独立式键盘适用于简单的键盘设置中,行列式键盘适用于复杂的键盘设置中对于该系统中只需要简单的对温度进行上、下限值设置,因而我们选用独立式键盘,这样的键盘编程简单、可靠1.6 红外通信的基本原理红外通信是利用950nm近红外波段的红外线作为传递信息的媒体,即通信信道发送端采用脉时调制(PPM)方式,将二进制数字信号调制成某一频率的脉冲序列,并驱动红外发射管以光脉冲的形式发送出去;接收端将接收到的光脉转换成电信号,再经过放大滤波等处理后送给解调电路进行解调,还原为二进制数字信号后输出1.6.1 红外通信接口的硬件电路设计单片机本身并不具备红外通信接口,但可以利用单片机的串行接口与片外的红外发射和接收电路,组成一个应用于单片机系统的红外串行通信接口,如图1所示1.6.2 红外发送器及原理简而言之,红外通信的实质就是对二进制数字信号进行调制与解调,以便利用红外信道进行传输;红外通信接口就是针对红外信道的调制解调器红外发送器电路包括脉冲振荡器驱动管T1和T2.红外发射管D1和D2等部分其中脉冲振荡器由NE555定时器电阻(R1.R2)和电容(C1.C2)组成,用以产生38kHz的脉冲序列作为载波信号;红外发射管D1和D2选用Vishay公司生产的TSAL6238,用来向外发射950nm的红外光束。

红外发送器的工作原理为:串行数据由单片机的串行输出端TXD送出并驱动T1管,数位“0”使T1管导通,通过T2管调制成38kHz的载波信号,并利用两个红外发射管D1和D2以光脉冲的形式向外发送数位“1”使T1管截止,红外发射管D1和D2不发射红外光若传送的波特率设为1200bps,则每个数位“0”对应32个载波脉冲调制信号的时序,如图4-1所示图4-1遥控连发信号波形红外接收器红外接收电路选用Vishay公司生产的专用红外接收模块TSOP1738该接收模块是一个三端元件,使用单电源+5V电源,具有功耗低抗干扰能力强输入灵敏度高对其它波长(950nm以外)的红外光不敏感的特点,其内部结构框图如图4-2所示图4-2 红外遥控系统框图用于红外线遥控电子钟的遥控器包括至少一个按键、红外线发射部分以及分别与按键和红外线发射部分相连的遥控器控制电路,其中所述按键分别表示电子钟的各调节功能受红外线遥控的电子钟包括显示面、电子钟控制电路,还包括接收上述遥控器发来的各种发光信号并将发光信号传递给电子钟控制电路的红外线接收部分,而且电子钟控制电路还设有检测来自红外线接收部分的信号并执行信号所表示的电子钟的各调节功能的程序。

1.6.3 红外遥控电路原理分析当红外遥控器按下时,红外接收头接收到红外信号,单片机产生中断,在中断程序进行红外解码,再按解码值判断哪个按键按下通过按键值对时间进行设置单片机通过读取时钟芯片1302,数据完成时间显示功能,显示部分采用LED128*64显示,可以同时显示年,月,日,时,分,秒,星期及温度2 主要电路与程序设计2.1 系统硬件的结构框图 根据时间和红外遥控电子钟设计的实际要求和设计方案的论证,系统主要由 AT89S51及相关的复位电路组成的单片机最小系统、由DS18B20构成感温测温模块、由液晶显示屏LED128*64显示模块、由蜂鸣器及LED发光二级管组成声光报警单元、独立式键盘输入模块5部分电路组成另外为了不浪费单片机剩余资源,同时显示出采集器采集温度实时性,在此特增加了DS1302实时时钟模块与用于上位机电脑通信的MAX232电平转换驱动模块综上述实际总体方案电路关系框图如图2-1所示:图2-1 总体方案电路关系框图2.2 单片机最小系统设计单片机作为主控制器,主要是处理各个部分重要的数并据协调各个模块正常工作的关键部件AT89S51单片机具有4个8为I/O口;本设计中主要是用了P0口显示模块的数据接口;P2口的P2.5、P2.6、P2.7位作为液晶屏的使能接口;P1口的P1.0、 P1.1、 P1.2位分别接实时钟ds1302的复位、时钟、数据引脚; P1口P1.3位作为集成数字温度传感器ds18b20的数据接口,用来对ds18b20进行读写操作; 在此特别说明虽然P0内部没有上拉电阻,但是在本设计中只是做为液晶显示屏的数据总线或地址总线;可以省去上拉电阻不接。

At89s51单片机接上相应的电源和时钟,组成单片最小系统系统如图2-2所示图2-2 单片最小系统2.3 温度电路设计Ds18b20采用一线传输协议,可以使用外部电源工作方式也可以采用寄生电源工作方式,本设计中采用外部电源工作模式,具体电路如图2-3:图2-3 外部电源工作模式2.4 显示电路设计采用LED128*64液晶显示,其中Rs接p2.5、Rw接P2.6、E接p2.7 ;D0~D7 接p0~P7具体电路如图2-4:图2-4 LED128*64液晶显示2.5 声光报警电路本电路由发光二极管和蜂鸣器构成如图2-5             图2-5声光报警电路2.6 实时时钟模块本模块由ds1302时钟芯片加晶振组成具体电路如图2-6所示图2-6 实时时钟电路2.7 串行通信口与RS232电平转换接口电路本电路的核心器件是美信公司生产MAX232集成IC,配合一些电容构成,如图2-7所示图2-7串行通信口与RS232电平转换接口电路2.8 键盘电路如图2-8所示是电路的功能按键电路           图2-8键盘电路2.9 红外线接收电路如图2-9所示是电路的红外线接收电路。

图2-9红外线接收电路3 软件设计说明本系统的执行方法是循环查询加中断执行来显示和控制时间和温度的键盘扫描程序是用循环查询的办法,与上位机通信采用中断的方法;这样可以进一步节省单片机的CPU资源,也可以保证实时响应外部输入3.1总模块的流程图 图3-1 总模块的流程图3.2 部分主要模块的流程图    读取温度DS18B20模块的流程 图9键盘扫描处理流程 图3-2部分主要模块的流程图3.3 温度转换核心及其算法3.3.1 DS18B20的内部结构DS18B20内部功能模块如图2-3所示,主要由4部分组成:64位光刻R0M(图3)、温度传感器、非易失性的温度报警触发器TH和TL、配置寄存器R0M 中的64位序列号是出厂前被光刻好的,他可以看作是该DSISB20的地址序列码,每个DSI8B20的64位序列号均不相同高低温报警触发器TH 和TL,配置寄存器均由一个字节的E2PROM组成,使用一个存储器功能命令可对 TH,TL或配置寄存器写入配置寄存器中R1,R0决定温度转换的精度位数:R1R0=’00’,9位精度,最大转换时间为93.75 ms;R1R0 = ‘01’,10位精度,最大转换时间为187.5 ms;R1R0 = ‘10’,11位精度,最大转换时间为375 ms;R1R0 =’11’,12位精度,最大转换时间为750 ms;未编程时默认为12位精度。

本系统采用的也是12位的精度3.3.2 DS18B20的内存结构DSI8B20温度传感器的内部存储器包括一个高速暂存RAM (便笺式的内部存储器)和一个非易失性的可电擦除的EEPROM,后者存放高温和低温触发器TH,TL和结构寄存器便笺存储器包含了9个连续字节(0~8),前两个字节是测得的温度信息,字节0的内容是温度的低8位,字节1是温度的高8位,字节2是TH(温度上限报警),字节3是TL(温度下限报警),字节4是配置寄存器,用于确定输出分辨率9到12位第5、6、7个字节是预留寄存器,用于内部计算字节8是冗余检验字节,校验前面所有8个字节的CRC码,可用来保证通信正确3.3.3 DS18B20的测温功能当DSI8B20接收到温度转换命令后,开始启动转换转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的0,1字节单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0.062 5℃/LSB形式表示温度值格式,其中“S”为标志位,对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变换为原码,再计算十进制值DSI8B20完成温度转换后,就把测得的温度值与 TH做比较,若T>TH或T

DSl820工作过程中的协议:初始化 -> RoM操作命令 -> 存储器操作命令-> 处理数据(1) 初始化 单总线上的所有处理均从初始化开始 (2) ROM操作品令 总线主机检测到DSl820的存在便可以发出ROM操作命令之一这些命令如 指令                                       代码 Read ROM(读ROM)                 [33H] Match ROM(匹配ROM)           [55H] Skip ROM(跳过ROM]              [CCH] Search ROM(搜索ROM)           [F0H] Alarm search(告警搜索)            [ECH] (3) 存储器操作命令 指令                                             代码 Write Scratchpad(写暂存存储器)      [4EH] Read Scratchpad(读暂存存储器)      [BEH] Copy Scratchpad(复制暂存存储器)  [48H] Convert Temperature(温度变换)        [44H] Recall EPROM(重新调出)                  [B8H] Read Power supply(读电源)               [B4H]3.3.4 温度转换算法及分析由于DS18B20转换后的代码并不是实际的温度值,所以要进行计算转换。

温度高字节(MS Byte)高5位是用来保存温度的正负(标志为S的bit11~bit15),高字节(MS Byte)低3位和低字节来保存温度值(bit0 ~ bit10)其中低字节(LS Byte)的低4位来保存温度的小数位(bit0 ~ bit 3)由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取小数舍入,保留一位小数即可也就说,本系统的温度精确到了0.1度算法核心:首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LS Byte)取反加一变成原码处理过后把DS18B20的温度Copy到单片机的RAM中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位,百位的BCD码存入RAM中由于百位没有用,默认情况是置为0A,在显示屏上没有任何显示温度算法核心代码//*******************************ds18b20sbit DQ =P1^7; //定义通信端口//延时函数void delay(unsigned int i){while(i--);}//初始化函数Init_DS18B20(void){ unsigned char x=0; DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(20);}//读一个字节ReadOneChar(void){ unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(4); } return(dat);}//写一个字节WriteOneChar(unsigned char dat){ unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; }//delay(4);}//读取温度ReadTemperature(void){ unsigned char a=0; unsigned char b=0; unsigned int t=0;Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); b=ReadOneChar(); t=b; t<<=8; t=t|a; t=t*0.625;//有效位到小数点后1位 return(t);}//ds18b20结束4. 系统调试及结果分析为了提高调试的效率和成功率,我采用先分别调试各单元模块,再进行整机调试的方法来调试。

4.1 LED128*64的测试方法和结果把编写的程序通过单片机仿真软件进行测试,如果在测试过程中,能够通过液晶显示屏正常显示读取时间的信息,那么说明子程序编写正确;如果测试中,显示的结果与我们要求的不一致,那说明程序在编写中出现错误,就应该修改子程序,直到能正确读取时间信息为止 4.2 DS18B20的测试方法和结果利用仿真软件不断修改DS18B20仿真元件的温度实际值,结果显示的与之相同,说明读温度显示程序编写正确4.3 键盘程序的测试方法和结果把编写的键盘程序通过单片机仿真软件进行测试,在测试过程中,能够实现时间的调整(自加、自减)功能,那么说明该子程序编写正确;如果测试的结果与要求的不一致,那么就应该修改该子程序,直到正确为止,在修改过程中,不必去改动其它部分程序4.4 RS232模块的测试方法和结果将RS232的发送与接收端相互短接起来;利用串口调试助手发送一串字符,如果马上在调试助手的接收窗口中接收到刚才发送的字符,说明通信正确可以进行通信4.5 产品最终调试在分别调试成功每一个部分的程序后,我们就可以把整个系统的程序进行调试,还是用单片机仿真软件调试,在调试中,该程序能按照系统预定的步骤运行,那么说明程序编写正确;如果在调试中出现了我们不需要的结果,那么说明程序出现错误,这时就应该检查主程序在调有子程序及子程序与子程序之间有没有出现错误,其次就检查仿真图的硬件连接正确与否。

最后将整个项目的程序写入单片机中进行产品环境测试将通信线与电电脑的串行通信口连接起来,在电脑运行上位机程序,将时间设置 为10年1月1日12时30分0秒;设置成功后单片机这边立即显示刚才所设置的正确三时间进一步调试闹铃的功能,通过上位机、遥控或按键设置,结果都令人非常满意最后调试温度传感器测量温度的准确性能;要电热管加热一杯水,将数字温度传感器放入水中测量;同插入普通温度计并读出温度值作为温度测量参照测量数据如下表1-1所示:表1-1温度测量数据时间 煤油温度计显示 温度(度) 红外遥控电子钟显示温度(度) 误差第5s17.5 17.4 -0.1第10s 24.0 23.8-0.2第20s 38.5 38.6 +0.1第40s 53.8 53.8 0第 1分 68.0 68.1 +0.1第 3分 97.3 97.2 -0.1第 5分 97.3 97.2 -0.1第8分97.497.3 -0.1第 10分 97.3 97.2-0.15 结论本系统以AT89S51为核心控制部件,利用软件编程从ds18b20读取温度信息、从DS1302中读取时间信息,然后通过LED128*64液晶显示屏上从读取的时间信息、温度信息通过发光二极管的亮灭来模拟相应的外部控制过程、通过键盘操作来校对系统运行中所产生的误差及在实际运用中调整时间的设定,经实验测试证明用本系统用AT89S51单片机能完成温度的采集及一般控制过程。

为了减小电磁干扰和恶劣环境下该系统能正常工作,对硬件电路做到简单能用,充分发挥软件的优点,避免因电路和软件而引起必要的误差通过两个星期的实训,我的综合能力有了很大的提高,我制作电路板的经验将更为熟练,编程水平更上了一个新的台阶,特别是深入了解了单片机原理的应用,感觉它的功能非常的强大本系统虽然能实现题目的要求;但是还有待以进一步完善,增加更强大功能,但是由于时间和本身知识水平的有限其它的附加工能将会在未来的时间内一并完成致 谢在两个星期的实训中,经过查找资料、收集资料、电路的设计、作品的调试及写论文,论文的完成也意味着我们的作品已完成在设计时间的时、分、秒及温度采集设计过程中我们得到了指导老师的悉心指导,他渊博的知识以及对我的严格要求和他严谨的作风都给我留下了很深的印象,这将使我终身受益,在此,对指导老师表示衷心的感谢!在此次设计中,感谢百度网站为我提供的大量网上资料学校的实验室也为我们的设计提供了大部分的电子元件及耗材,在此也向我院实验室表示感谢!另外还要感谢我的同学所给予的帮助参考文献[1] 刘勇.数字电路 .电子工业出版社,2005;[2] 王法能.单片机原理及应用.科学出版社,2006;[3] 赛组委会.全国大学生电子设计竞赛获奖作品选编.北京理工大学出版社;2007[4] 赵伟军.PROTEL99 SE教程.人民邮电出版社,2005.[5] 单片机典型模块设计实例导航.人民邮电出版社,2006.[6] 李光飞.楼苗然主编.51系列单片机.北京:北京航空航天大学出版社,2007附 录 1 相关程序代码 /**********带字库液晶显示模块LCM12864ZK**********************/#include #include //#include "DS1302.H"#include "18b20.H"/**************************************************************/#define uchar unsigned char#define uint unsigned int#define ulong unsigned longunsigned char uckey2r;//**********************红外线接收***************************//bit mode; bit code_end_flag ;//校验接收成功标志bit shiwei=1;sbit speak=P0^0;uchar xuanzhe;uint code_t; //遥控临时代码uint code_tt; //遥控成功码uint code_Data1; //校验临时变量uint code_Data2; //校验临时变量uchar keyzhi=16;/********************按键管脚定义*****************************/sbit key1= P3^3;sbit key2= P3^4;sbit key3= P3^5;sbit BELL=P0^0;//蜂鸣器/**************128*64管脚定义**********************************/sbit E=P0^5; //对应第8脚sbit RW=P0^4; //对应第7脚sbit RS=P0^3; //对应第6脚sbit LCD_RST=P0^6;sbit PSB=P0^7;uchar BUSY,hang,lie; //显示函数专用/*********************定义函数原型*****************************/void Write_command(uchar CMD,uchar bb); //液晶函数void Display( uchar *ptr,uchar ddram); //**显字符串函数**//void key(void);unsigned char button(unsigned char n,unsigned char x,unsigned char y) ; //时钟调整子程序void DelayNms(int j);//Nms//定义字符串数组 *//********************************/unsigned char ucCurtime[12];unsigned char ucCurtimecop[12];unsigned char str16[9]={0,0};unsigned char naolin[2]={0,0};idata char STR1[]="桂林电子科技大学";idata char STR2[]="日期 年 月 日";idata char STR3[]="时间 时 分 秒";idata char STR4[]="当前温度: . ℃";code char STR5[]=" !时间设置! ";code char STR6[]=" !闹铃设置! ";code char empty[]=" ";idata char STR7[]="闹铃时间__时__分";/***************延时程序***********************/void Delayus(ulong t)//Nus{int i,j;for (i=0;i0; i--){T_IO = ACC0; /*相当于汇编中的 RRC */T_CLK = 1;T_CLK = 0;ACC = ACC >> 1; } }unsigned char uc_RTOutputByte(void) { unsigned char i;for(i=8; i>0; i--){ACC = ACC >>1; /*相当于汇编中的 RRC */ACC7 = T_IO;T_CLK = 1;T_CLK = 0;} return(ACC); }void v_W1302(unsigned char uckey2r, unsigned char ucDa){T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(uckey2r); /* 地址,命令 */v_RTInputByte(ucDa); /* 写1Byte数据*/T_CLK = 1;T_RST =0;} unsigned char uc_R1302(unsigned char uckey2r){unsigned char ucDa;T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(uckey2r); /* 地址,命令 */ucDa = uc_RTOutputByte(); /* 读1Byte数据 */T_CLK = 1;T_RST =0;return(ucDa);}void v_setd1302(unsigned char *pSecDa) {unsigned char i;unsigned char ucAddr = 0x80; v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/for(i =7;i>0;i--){ v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */pSecDa++;ucAddr +=2;}v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/}void Initial_DS1302(void){ unsigned char Second=uc_R1302(0x81); if(Second&0x80) {v_W1302(0x8e,0x00); v_W1302(0x80,0); v_W1302(0x8e,0x80); }}/**********************ds1302end****************************///*********************判忙函数************************//void BUSYLOOP(){ P2=0x0ff;//RS=0;RW=1;do {E=1;BUSY=P2;//E=0;}while(BUSY>0x7F);}//*********************写控制字函数****************************//void Write_command(uchar CMD,uchar bb){ if(bb){BUSYLOOP();}RS=0;RW=0;E=1;P2=CMD;//Delayus(1);E=0;}//*********************写数据函数****************************//void Write_data(uchar CMD){ BUSYLOOP();RS=1;RW=0;E=1;P2=CMD;//Delayus(1);E=0;}//*****************液晶初始化***************************//void CHUSHIHUA(){Delayus(38);Write_command(0x30,0);Delayus(1);Write_command(0x30,0);Delayus(1);Write_command(0x0C,1);Delayus(1); Write_command(0x01,1);Delayus(20);Write_command(0x06,1);}/*******************清 屏**************************/void CLEAR(){ RS=0;RW=0;E=1;P2=0x01;//Delayus(1);E=0;}/****************显示函数专用*****************************/void Display(uchar *ptr,uchar ddram){ uchar l,i1,x; l=0; if(ddram<0x88) { hang=0; } //定位行地址:第一行 else if(ddram<0x90) { hang=2; } //定位行地址:第三行 else if(ddram<0x98) { hang=1; } //定位行地址:第二行 else { hang=3; } //定位行地址:第四行 lie=0x0f&ddram; //定位列地址 if(lie>0x07) { lie=lie-0x08;} x=lie*2; Write_command(ddram,0); // 定位显示起始地址 while ((ptr[l])!='\0') {l++;} for (i1=0;i13) { Write_command(0x80,0); hang=0; } } }}/********************显示函数结束*******************************//********************判断代码子程序************************** /unsigned char d_code(unsigned int t) { if(1500

下载提示
相关文档
正为您匹配相似的精品文档