您的当前位置:首页正文

基于51单片机智能窗帘的研究与设计

2020-02-23 来源:好走旅游网
目录

摘要 ............................................................................................................................... 1 第1章 绪论 ......................................................................................................................... 2

1.1 系统设计的背景及意义 ........................................................................................... 2 1.2 设计的基本内容 ...................................................................................................... 2 1.3 实现的基本功能 ...................................................................................................... 3 第2章 总体电路设计与原理说明 ........................................................................................ 4

2.1 方案介绍................................................................................................................. 4 2.2总体方案设计 .......................................................................................................... 5

2.2.1 自动控制窗帘基本功能 ................................................................................ 5 2.2.2 总体结构设计 ............................................................................................... 5

第3章 硬件分析与设计 ....................................................................................................... 7

3.1 单片机及相关电路设计 ........................................................................................... 7

3.1.1 89C51单片机概述 ..................................................................................... 7 3.1.2 晶振电路 ...................................................................................................... 8 3.1.3 复位电路 ...................................................................................................... 8 3.1.4 显示电路 ...................................................................................................... 9 3.2 光敏传感器电路 ...................................................................................................... 9 3.3 A/D转换电路......................................................................................................... 11 3.4 步进电机电路 ....................................................................................................... 12

............................................................................................................................. 13 3.5 温度检测电路 ....................................................................................................... 13 3.6 红外控制电路 ....................................................................................................... 15 第4章 程序分析设计 ........................................................................................................ 18

4.1 主程序 .................................................................................................................. 18 4.2 重要子程序设计 .................................................................................................... 18 第5章 总结 ....................................................................................................................... 19 参考文献 ............................................................................................................................. 21 附录1 :原理图 .................................................................................................................... 22 附录 2 :部分子程序 ............................................................................................................ 23

摘要

自动控制技术是20世纪发展最快、影响最大的技术之一,也是21世纪最重要的高技术之一。今天,技术、生产、军事、管理、生活等各个领域,都离不开自动控制技术。就定义而言,自动控制技术是控制论的技术实现应用,是通过具有一定控制功能的自动控制系统,来完成某种控制任务,保证某个过程按照预想进行,或者实现某个预设的目标。随着电子计算机技术和其他高技术的发展,自动控制技术的水平越来越高,应用越来越广泛,作用越来越重要。尤其是在生产过程的自动化、工厂自动化、机器人技术、综合管理工程、航天工程、军事技术等领域,自动控制技术起到了关键作用。当然,在智能家居方面,自动控制技术有较好的发展前景。应用自动控制技术,将是家居环境更加智能化,人性化。

针对家居环境采光及避光问题,自动窗帘控制系统将取代手动控制,更加人性化。本文综述了自动窗帘系统的设计与控制系统,介绍了设计制作一个完整的自动窗帘控制系统所需要做的理论分析,以及各环节功能的实现。自动窗帘控制系统核心是采用单片机AT89C51控制,其次采用感光传感器,红外控制电路,温度检测电路等外围电路。整个系统在各模块的配合下实现半自动控制,自动控制等功能。该设计在理论层面上,以程序语言驱动各模块工作,实现了各模块的内在联系,应用层面上采用软件进行原理图设计和仿真。

该自动窗帘系统硬件电路主要由光敏检测电路,红外控制电路,温度检测电路,步进电机驱动电路构成。该设计则主要讨论了自动窗帘系统的设计过程,硬件电路设计,软件调试过程,以及利用软件实现红外线遥控信号的编码及解码方式。通过本系统可以实现通过光照强度实现窗帘开关自动控制,通过温度检测电路实现窗帘开关自动控制,同时实现红外遥控的半自动控制。

关键词:自动控制,自动窗帘,单片机,步进电机

第1章 绪论

1.1 系统设计的背景及意义

智能家居以住宅为平台,兼备建筑、网络通信、信息家电、设备自动化,集系统、结构、服务、管理为一体的高效、舒适、安全、便利、环保的居住环境,尽显便捷将家中的各种设备(如音视频设备、照明设备、窗帘控制、空调控制、网络家电等)通过家庭网络连接到一起。与普通家居相比,不仅具有传统的居住功能,提供安全舒适的家庭生活空间,还能提供全方位的信息交互功能,优化人们的生活方式。随着社会信息化的加快,人们的工作、生活和通讯、信息的日益紧密。信息化社会在改变人们生活方式与工作习惯的时候,也对传统的住宅提出了挑战,社会、技术以及经济的进步更使人们的观念随之巨变。人们对家居的要求早已不是物理空间,更为关注的是一个安全、方便、舒适的居家环境。

随着技术产业结构的调整,生产工艺的飞速发展,人们的生活水平不断提高,家用电气逐渐普及。高精度、多功能、低功耗是现代科技发展的趋势。在这种趋势下,窗帘的数字化、智能化已经成为现代生产研究的主导设计方向。

单片机在电子产品中的应用已经越来越广泛,在很多电子产品中也用到了红外控制。结合感光系统和红外遥控系统的智能窗帘系统具有较好的发展前景。

1.2 设计的基本内容

本智能家居自动窗帘控制系统以STC89S51单片机为控制核心,由电源模块、光敏感应模块、温度监测模块、红外遥控模块等几个环节组成本系统的主要框架,与此同时可外扩一些其他的控制功能。系统可以实现对外界光线强度的实时监测,从而来控制窗帘的自动开启和关闭,并可对室内的温度进行检测和显示,可由用户随时设定温度阈值,当实际的温度超过或低于设定温度后,通过窗帘的开闭,使室内的光线和温度达到一个较为理想的条件。为了更体现人性化,本设计通过红外线的发送和接收,可根据用户的意愿实现对窗帘开闭的远距离遥控。

该设计主要分为以下几个章节:

(1)绪论:介绍介绍系统设计的背景及意义。

(2)总体方案设计:介绍自动窗帘控制系统总体方案,及总体结构设计。 (3)硬件系统分析:介绍主要硬件系统。 (4)软件分析:介绍软件设计。

(5)总结:对该设计的不足和扩展进行分析。

1.3 实现的基本功能

自动窗帘控制系统具有以下几个基本功能:

(1)光照控制:根据光照强度值,通过感光器采集,自动打开或关闭窗帘。即当早晨光照强度增强到设定值,通过感光器采集,单片机控制步进电机打开窗帘;当夜晚光照强度减弱到设定值,通过感光器采集,单片机控制步进电机关闭窗帘。

(2)温度控制:通过红外遥控器设定给定温度,通过温度监测系统,检测环境温度,当温度高于或低于给定值时,单片机控制步进电机打开或关闭窗帘。

(3)红外控制:当光照强度未达到设定值,手动操作红外遥控器,由红外接收系统接收信号,单片机控制步进电机打开或关闭窗帘。

第2章 总体电路设计与原理说明

2.1 方案介绍

方案:基于光照检测及温度检测的自动控制 原理框图如下:

光控模块温控模块红外遥控模块单片机系统蜂鸣器LCD显示模块键盘 图 2-1 原理框图

2.2总体方案设计

自动窗帘控制系统总体方案的设计是基于满足设计要求的前提下,根据理论上的可实现性和硬件电路的经济实用型,进行设计。本设计从人们对系统设计功能的需求出发,综合考虑各种因素的情况下,设计出自动控制系统的整体框架,并且在整体功能实现的基础上,尽可能考虑系统的可扩展性。

2.2.1 自动控制窗帘基本功能

自动窗帘控制系统具有以下几个模块:

(1)感光控制模块:本模块首先通过光敏电阻在外界光线强度的变化下阻值的改变,使得输出电压发生变化。变化的电压信号传送到PFC8591八位的AD/DA转换芯片,将模拟量转化为数字量,进而输入到单片机处理器。经处理器的运算与处理,控制电机的正反转,达到窗帘开闭的目的。

(2)温度监测模块:模块通过温度传感器DS18B20采集室内的温度值,经过单总线的传输方式将采集到的温度信号传送给单片机,并由LCD显示器显示当前的温度。其中,温度的阈值可由用户通过红外线来遥控设定。当室内温度超过或低于设定值时,伴随着着电机的正反转。

(3)红外遥控模块:本模块利用HT6221芯片组成的遥控器发射红外信号,接收头接收后先解码,并用液晶显示每个按键对应的用户码值。利用遥控器上的按键,软件中设置可供用户随时控制电机正反转的程序,实现可在任意时刻控制窗帘的打开和关闭。此处,红外遥控另外一个功能是在进入温度设定模式下设置初始的温度值,并可借用红外遥控外扩一些较为实用的家庭简单控制电路,为人们的日常生活带来方便。

2.2.2 总体结构设计

系统设计的总体框图如下:

开始N初始化fzflag2=1NSETT==1Y设定温度YNum++电机反转启动ADADC<100Num==1000YYzzflag1=1清除标志位ADC>100&&zzflag1==1Yzzflag2=1测温度显示温度ADC>100Yfzflag1=1所测温度等于设定温度YADC>100YADC<100&&fzflag1==1电机反转Yfzflag2=1zzflag2=1YNum++电机正传Num=1000Y注:zzflag1 zzflag2 正传标志位fzflag1 fzflag2) 反转标志位 清除标志位

图2-2 总体框图

第3章 硬件分析与设计

3.1 单片机及相关电路设计 3.1.1 89C51单片机概述

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 主要参数:

(1)片内震荡器和时钟电路 (2)4K字节可编程闪烁存储器; (3)128*8位内部RAM (4)32可编程I/O线 (5)两个16位定时器/计数器 (6)5个中断源

(7)全静态工作:0HZ-24MHZ (8)低功耗闲置和掉电模式

3.1.2 晶振电路

图3-1 单片机内部晶振电路连接图

单片机必须在时钟的驱动下才能进行工作。MCS-51系列单片机内部都有一个时钟振荡电路,只需外接晶振源,就能产生一定频率的时钟信号送到单片机的内部的各个单元,决定单片机的工作速度。图4-3就是内部时钟工作方式的电路图,这是一种常用的方式。这种方式是外界振荡源,本设计就采用这种外接晶振的方法。电路中的两个电容的作用有两个:一是帮助振荡器起振(C1 C2的值大,起振的速度慢;反之,速度快。);二是对振荡器的频率起到微调的作用(C1 C2的值大,频率略有减少,反之,频率略有提高)。C1 C2的值采用30pF。

3.1.3 复位电路

图3-2 复位电路

在系统运行的过程中,有时可能对系统需要进行复位,为了避免对硬件系统经常加电和断电造成的损害,设计了手动的复位电路。如图4-2所示。这种电路的设计,在系统的运行过程中需要复位时,只需使开关闭合,在RST端就会出现一定时间的高电平信号,从而使单片机实现复位。

3.1.4 显示电路

按照电路图链接电路即可,需要说明的是在这个电路图中,LCD的第三脚VEE没有接,这个脚是控制屏幕对比度的。可以将电位器的两端分别接VCC和GND,中间端接LCD的第三脚。

图3-3 1602液晶电路

3.2 光敏传感器电路

光敏传感器是最常见的传感器之一,它的种类繁多,主要有:光电管、光电

倍增管、光敏电阻等。

光敏电阻又称光导管,常用的制作材料为硫化镉,另外还有硒、硫化铝、硫化铅和硫化铋等材料。这些制作材料具有在特定波长的光照射下,其阻值迅速减小的特性。这是由于光照产生的载流子都参与导电,在外加电场的作用下作漂移运动,电子奔向电源的正极,空穴奔向电源的负极,从而使光敏电阻器的阻值迅速下降。

VCCR141KD4PHOTO光采样电路VCC8R1510KVCCU2A312LM3584R191KAD0C447pR164.7KR1710KR1810K图3-4 光敏传感器

当光敏电阻受到脉冲光照射时,光电流要经过一段时间才能达到稳定值,而在停止光照后,光电流也不立刻为零,这就是光敏电阻的时延特性。由于不同材料的光敏,电阻时延特性不同,所以它们的频率特性也不同,硫化铅的使用频率比硫化镉高得多,但多数光敏电阻的时延都比较大,所以,它不能用在要求快速响应的场合。

3.3 A/D转换电路

PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。PCF8591

的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I²C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的址、控制和数据信号都是通过双线向I²C总线以串行的方式进行传输。

PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。PCF8591的最大转化速率由I²C总线的最大速率决定。

图3-5 A/D转换电路

PCF8591 特性:单独供电;PCF8591的操作电压范围2.5V-6V;低待机电流;通过I2C总线串行输入/输出;PCF8591通过3个硬件地址引脚寻址;PCF8591的采样率由I2C总线速率决定;4个模拟输入可编程为单端型或差分输入;自动增量频道选择;PCF8591的模拟电压范围从VSS到VDD;PCF8591内置跟踪保持电路;8-bit逐次逼近A/D转换器;通过1路模拟输出实现DAC增益。

3.4 步进电机电路

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目

的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

图3-6 步进电机电路

3.5 温度检测电路

DS18B20外形及引脚说明:

图3-7 温度传感器

引脚说明:GND:地;

DQ:单线运用的数据输入/输出引脚;

VD:可选的电源引脚。

单总线通常要求接一个约4.7K左右的上拉电阻,这样,当总线空闲时,其状态为高电平。

图3-8 DS18B20接线原理图

DS18B20时序图:主机使用时间隙来读写DS18B20的数据位和写命令字的位。

初始化时序如下图:

图3-9 DS18B20初始化时序

DS18B20读写时序:

图3-10 DS18B20读写时序

3.6 红外控制电路

红外通信基本原理:

红外通信是利用950nm近红外波段作为传递信息的媒体,即通信信道。发送端将基带二进制信号调制为一系列的脉冲串信号,通过红外发射管发射信号。接收端将接收到的信号装成电信号,再经过放大、滤波等处理后送给解调电路进行解调,还原为二进制信号后输出。常用的有通过脉冲宽度来实现信号调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。

简而言之,红外通信的实质就是对二进制数字信号进行调制与解调,以便利用红外信道进行传输;红外通信接口就是针对红外信道的调制解调。

红外遥控系统主要由遥控发射器、一体化接收头、单片机、接口电路组成。遥控器用来产生遥控编码脉冲,驱动红外发射管输出红外遥控信号,遥控接收头来完成对遥控信号的放大、检波、整形、解调出遥控编码脉冲。遥控编码脉冲是一组串行二进制码,对于一般的红外遥控系统,此串行码输入到微控制器,由其内部CPU完成对遥控指令解码,并执行相应的遥控功能。

红外遥控控制过程:本系统以89C51单片机为核心,由发射和接受两部分组成,发射部分主要完成编码和调制,接收部分完成调解和解码。其发射部分主要由89C51单片机完成编码,然后由红外发射管发射红外线,接收部分主要由光电转换,放大,解调,解码组成。其中光电转换,放大调解由红外线一体化接头来完成,接收单片机主要完成解码功能。

遥控器发射及其编码:红外线遥控采用自定义编码方式,由发送单片机来完成。遥控发射器专用芯片很多,根据编码格式可以分为脉冲宽度调制和香味调制两大类。当发射器案件按下后,即有遥控码发出,所按的键不同遥控编码也不同,这码具有以下特征:

采用脉宽调制的串行码,以脉宽为0.26ms、间隔0.26ms、周期为0.52ms的组合表示二进制的“1”(如图3-11A),其特征是脉冲中高电平的宽度等于0.26ms,相当于10个26μs的宽度;以脉宽为0.26ms、间隔为0.52ms、周期为0.78ms的组合表示二进制的“0”(如图3-11B),其特征是脉冲中而低电平的宽度是高电平的二倍,等于0.52ms,相当于20个26μs的宽度。可以根据传输数据的不同来调节脉冲的宽度。

表示1 表示0

0.26mm 0.26mm 0.52mm 0.26mm A B

图3-11 二进制信号

二进制信号的调制:二进制信号的调制由发送单片机来完成,它把编码后的二进制信号调制成频率为38KHz的间断脉冲串,相当于用二进制信号的编码乘以频率为38KHz的脉冲信号得到的间断脉冲串,即是调制后用于红外发射二极管发送的信号。如图3所示,A是二进制信号的编码波形,B是频率为38KHz(周期为26μs)的连续脉冲串,C是经调制后的间断脉冲串(相当于C=A×B),用于红外发射二极管发送的波形。

1 0 A 编码后的二进制信号

10个脉冲 20个脉冲

B 单个脉冲 26us 10个脉冲 C=A*B 调制后的二进制信号(发送)

图3-12 二进制信号的调制

二进制信号的解调:二进制信号的调制仍由发送单片机来完成,它把编码后的二进制信号调制成频率为38KHz的间断脉冲串,相当于用二进制信号的编码乘以频率为38KHz的脉冲信号得到的间断脉冲串,即是调制后用于红外发射二极管发送的信号。如图3.3所示,是二进制信号的编码波形,B是频率为38KHz(周期为26μs)的连续脉冲串,C是经调制后的间断脉冲串(相当于C=A×B),用于红外发射二极管发送的波形。

二进制信号的解码:二进制信号的解码由接收单片机来完成,它把红外接收头送来的二进制编码波形通过解码,还原出发送端发送的数据。

D 红外接收头接收的波形(输入)

表示1 表示0 表示1

E 红外接收头调解后输出的波形

图3-13 HS0038的输入输出波形

基于字节传输的红外遥控数据格式:在发送字节的开始先通过单片机发送

20个脉冲宽度(每个脉冲周期26μs)的高电平作为传输开始,接着发送8位数据(字节高位在前,低位在后),最后发送10个脉冲宽度的低电平作为传输结束,如图3-14所示。

传输开始 8位数据 传输结束

20个脉冲 高位在前,低位在后 10个脉冲

图3-14 基于字节传输的红外遥控数据格式

第4章 程序分析设计

4.1 主程序

程序流程为:当清晨是阳光较强,此时光敏二极管呈现低电阻,相当于接入单片机为低电平,可以通过程序控制步进电机正转,来打开窗帘,单片机输出停止,电动机M停转。当傍晚时光线比较弱,此时光敏电阻呈现高电阻,相当于接入单片机为高电平,可以通过程序输出负相脉冲控制步进电机反转,来关闭窗。帘单片机输出停止,电动机M停转。

4.2 重要子程序设计

主要包括:光敏传感程序,红外控制程序,温度检测程序,步进电机程序,液晶显示程序等,参照附录二。

第5章 总结

该设计通过分析自动窗帘系统的现状和人们对自动窗帘系统功能的需求,对自动窗帘系统控制器进行总体设计。总体设计采用步进电机为单片机控制元件,执行窗帘开闭的主要任务;以光敏电阻为检测元件,提供单片机外界光照变化;以红外检测电路,实现手动控制;以89C51单片机为主控制芯片,控制整个系统运行;此外辅助以按键和显示电路,在各模块的配合下,最终实现自动窗帘控制系统的智能化要求。

自动窗帘控制系统具有以下几个基本功能:

光照控制:根据光照强度值,通过感光器采集,自动打开或关闭窗帘。即当早晨光照强度增强到设定值,通过感光器采集,单片机控制步进电机打开窗帘;当夜晚光照强度减弱到设定值,通过感光器采集,单片机控制步进电机关闭窗帘。

温度控制:通过红外遥控器设定给定温度,通过温度监测系统,检测环境温度,当温度高于或低于给定值时,单片机控制步进电机打开或关闭窗帘。

红外控制:当光照强度未达到设定值,手动操作红外遥控器,由红外接收系统接收信号,单片机控制步进电机打开或关闭窗帘。

参考文献

[1]阎石.《数字电子技术基础(第五版)》 北京:高等教育出版社,2006 [2]李哲英.《电子技术及其应用基础》(数字部分)北京:高等教育出版社,2003 [3]郭天祥.《十天学会单片机和C语言编程》 北京;电子工业出版社,2009

附录1 :原理图

VCC1234U2ULN2003_DIP1612345679IN1IN2IN3IN4IN5IN6IN7COMGND8OUT1OUT2OUT3OUT4OUT5OUT6OUT7161514131211101234567891011121314151617181920U1P1B0T2P1B1T2EXP1B2P1B3P1B4P1B5MOSIP1B6MISOP1B7SCKRSTP3B0RXDP3B1TXDP3B2INT0P3B3INT1P3B4T0P3B5T1P3B6WRP3B7RDXTAL2XTAL1GNDVCCP0B0AD0P0B1AD1P0B2AD2P0B3AD3P0B4AD4P0B5AD5P0B6AD6P0B7AD7EAVPPALEPROGPSENP2B7A15P2B6A14P2B5A13P2B4A12P2B3A11P2B2A10P2B1A9P2B0A8VCC5VVCC stepmotorVCC011VCC5VVCCQ110BC109BP8U45VVCCC310uF54038393736353433323130292827262524232221VCC5VVCCR65VVCC200kΩ50%Key=A15R410kΩ50%Key=AR5AIN0AIN1AIN2AIN3A0A1VDDVCC5VPCF8591AOUTVREFAGNDEXTOSCSCLSDAP3.0P3.108052U3761410kΩ50%A2Key=A0VSSDS18B20R31kΩR110kΩ0C1C2CRYSTAL_VIRTUAL30pF30pF0VCCVCCIRDGNDP3.2VCC5VGNDI/O5VP3.39R2SONALERT100Ω200 Hz 0

附录 2 :部分子程序

unsigned int LowTime,HighTime; {

unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; }

void delay(unsigned char n) {

unsigned char i; for(i=0;ivoid DelayDelay(unsigned int num) {

while( --num ) ; }

void delay11(unsigned char x) //x*0.14MS {

unsigned char i; while(x--) {

for (i = 0; i<13; i++) {} } }

void beep() //蜂鸣器响一声函数 {

unsigned char i; BEEP=1; for (i=0;i<100;i++) {

delay1ms();

//BEEP取反 }

BEEP=0; //关闭蜂鸣器 delay(250); //延时 }

void motor_ffw(unsigned char ii) //unsigned char num, {

unsigned char i; unsigned int j;

//while(num--) //{

for (j=0; j<64; j++) //转1*n圈 {

for (i=0; i<8; i++) //一个周期转30度 {

if(ii==1) P1 = ~FFF[i]; //取数据 ii控制电机的正反转ii=0 或者 ii=1 if(ii==2) P1 = ~FFZ[i];

delay(1); //调节转速 } } //} }

void iic_start(void)

{ //时钟保持高,数据线从高到低一次跳变,I2C通信开始 SDA = 1; SCL = 1;

delayNOP(); // 延时5us SDA = 0; delayNOP(); SCL = 0; }

void iic_stop(void) {

SDA = 0; //时钟保持高,数据线从低到高一次跳变,I2C通信停止 SCL = 1; delayNOP(); SDA = 1; delayNOP(); SCL = 0; }

void iicInit(void) {

SCL = 0; iic_stop(); }

void slave_ACK(void) {

SDA = 0; SCL = 1; delayNOP(); SCL = 0;

}

void slave_NOACK(void) {

SDA = 1; SCL = 1; delayNOP(); SDA = 0; SCL = 0; }

void check_ACK(void) {

SDA = 1; // 将p1.1设置成输入,必须先向端口写1 SCL = 1; askflag = 0; delayNOP();

if(SDA == 1) // 若SDA=1表明非应答,置位非应答标志askflag askflag = 1; SCL = 0; }

void IICSendByte(unsigned char ch) {

unsigned char idata n=8; // 向SDA上发送一位数据字节,共八位

while(n--) {

if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1 { SDA = 1; // 传送位1 SCL = 1; delayNOP(); // SDA = 0; SCL = 0; } else { SDA = 0; // 否则传送位0 SCL = 1; delayNOP(); SCL = 0; } ch = ch<<1; // 数据左移一位 } }

uchar IICreceiveByte(void) {

uchar idata n=8; // 从SDA线上读取一上数据字节,共八位 uchar tdata=0; while(n--) {

SDA = 1; SCL = 1;

tdata =tdata<<1; //左移一位 if(SDA == 1) tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1 else tdata = tdata&0xfe; // 否则数据的最后一位置0 SCL = 0; }

return(tdata); }

void ADC_PCF8591(uchar controlbyte) {

uchar i=0; //idata: 单片机间接访问的片内RAM区,允许访问全部片内RAM iic_start();

IICSendByte(PCF8591_WRITE); //控制字 check_ACK(); if(askflag == 1) { SystemError = 1; return; }

IICSendByte(controlbyte); //控制字 check_ACK(); if(askflag == 1) { SystemError = 1; return; }

iic_start(); //重新发送开始命令 IICSendByte(PCF8591_READ); //控制字 check_ACK(); if(askflag == 1) { SystemError = 1;

return; }

IICreceiveByte(); //空读一次,调整读顺序

slave_ACK(); //收到一个字节后发送一个应答位

//读四次,如果只启动一个通道,读一次就行读出值是16进制的 /* while(i<4) {

receive_da=IICreceiveByte(); receivebuf[i++]=receive_da;

slave_ACK(); //收到一个字节后发送一个应答位 } */

//读一次写法

receivebuf=IICreceiveByte();

slave_NOACK(); //收到最后一个字节后发送一个非应答位 iic_stop(); }

unsigned char BusyTest(void) {

bit result;

RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1;

E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_(); _nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间 result=BF; //将忙碌标志电平赋给result E=0;

return result; }

void WriteInstruction (unsigned char dictate) {

while(BusyTest()==1); //如果忙就等待

RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;

E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲, // 就是让E从0到1发生正跳变,所以应先置\"0\"

_nop_();

_nop_(); //空操作两个机器周期,给硬件反应时间

P0=dictate; //将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 }

void WriteAddress(unsigned char x) {

WriteInstruction(x|0x80); //显示位置的确定方法规定为\"80H+地址码x\" }

void WriteData(unsigned char y) {

while(BusyTest()==1);

RS=1; //RS为高电平,RW为低电平时,可以写入数据 RW=0;

E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲, // 就是让E从0到1发生正跳变,所以应先置\"0\" P0=y; //将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 }

void LcdInitiate(void) {

delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间

WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口

delay(5); //延时5ms WriteInstruction(0x38); delay(5);

WriteInstruction(0x38); delay(5);

WriteInstruction(0x0c); delay(5);

WriteInstruction(0x06); delay(5);

WriteInstruction(0x01); delay(5); }

Init_DS18B20(void) {

DQ = 1 ;

DelayDelay(8) ;

DQ = 0 ;

DelayDelay(90) ;

DQ = 1 ;

DelayDelay(8) ;

presence = DQ ; //如果=0则初始化成功 =1则初始化失败 DelayDelay(100) ; DQ = 1 ;

return(presence) ; //返回信号,0=presence,1= no presence }

Disp_Temperature() {

display[4]=temp_data[0]&0x0f ;

display[0]=ditab[display[4]]+0x30 ;//查表得小数位的值

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ; display[3]=display[4]/100+0x30 ; display[1]=display[4]%100 ; display[2]=display[1]/10+0x30 ; display[1]=display[1]%10+0x30 ;

if(display[3]==0x30) //高位为0,不显示 {

display[3]=0x20 ;

if(display[2]==0x30) //次高位为0,不显示 display[2]=0x20 ;

}

WriteAddress(0x48) ;

WriteData(display[3]) ; //百位数显示 WriteAddress(0x49) ;

WriteData(display[2]) ; //十位数显示 WriteAddress(0x4a) ;

WriteData(display[1]) ; //个位数显示 WriteAddress(0x4c) ;

WriteData(display[0]) ; //小数位数显示 }

void Compare() {

// bit tempflag1; // bit tempflag2; uint temp=0;

display[4]=temp_data[0]&0x0f ;

display[0]=ditab[display[4]];//查表得小数位的值

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ; display[3]=display[4]/100 ; display[1]=display[4]%100 ; display[2]=display[1]/10 ; display[1]=display[1]%10 ;

temp=display[0]+display[1]*10+display[2]*100; if(settemp>temp) {

// tempflag1=1; fzflag2=1; }

//if((settemp// tempflag2=1; // fzflag2=1; //// tempflag1=0; //} }

void Int0(void) interrupt 0 {

unsigned char j,k,N=0;

EX0 = 0; delay11(15); if (IR==1) { EX0 =1;

return; }

while (!IR) {delay11(1);}

for (j=0;j<4;j++) {

for (k=0;k<8;k++) {

while (IR) {delay11(1);}

while (!IR) {delay11(1);}

while (IR) {

delay11(1);

N++; if (N>=30) { EX0=1;

return;}

} a[j]=a[j] >> 1; if (N>=8) {a[j] = a[j] | 0x80;} N=0; } }

if (a[2]!=~a[3]) { EX0=1; return; } beep(); HWPD();

EX0 = 1; }

因篇幅问题不能全部显示,请点此查看更多更全内容