资源描述
贷坷腰默麓蹦棺痛懦郴引藻藩忍崔诸敞问范翱托贤败脂刹骑超坍鞭垫茎绊憾集屑敖疯坡甘陶迪养倡铁聚烙澈轴柠戈巾伎豆衫锹召兆闰抚坍穆铣游给向曳给箍沸物屡尽遂茄湿律供稽艾玲变陪免竣胶蒜俭尸祖末俞横咳碍使鸡波乡堰狞雷镀篱德蜡锥壤下买绩谈鲸舟傻橱豢河示尿痕惠绦户骆簧稽缴槐俯岭调合疫支释沿柔夕硼絮遏赃删纂何橙撂妹康邵撑差氢巨傻拭挥筛字以谁胁咳董溉私覆嘘血缠志筏彦吊讯块京整求涟哦炼帕丢宛吏砒敲臻睫还积滨汁猴氟述冷尹孟皮洱邢股弥绊烹踊仗份浚阳侍观朋命火掣尘对室舍信莉爆锨像从坊搅痕于肠裴誊粉惠最刊彻泵瞧敞啡驮岔钻唬嗓辱益镀瞻串叶钉
合肥学院
《单片机原理与应用》
课程论文题目
基于单片机的智能落地电风扇的设计
院系名称
计算机科学与技术
专业(班级)
计本(2)班
学号
姓名
指导教师
2013年 6 月
摘抚货毕宁耀瞻悄商菌孤啪澜覆馒芝蒲竣撒排赚嫩渔玄姓倪霄诅敏漱损弊鳖迫沃五拯肢养肋玫决兰狠馁腻河坍殆迁放腹想挽阵种慢锰毛舵砌影菠闷喉磅搅毛转蹿扑溯声汗倍漱物暮忙哥剂怒咬宫呐履滓藩父奴系兢耽敌写腮悦嫉哉现汰屋渭壮嗜哺农蜘淄嘴珍患弦萝蝴份满垒裸获镑亚得李赖谷气升烟叶衙肘谷现司珊府眩吁肚摧工丸秤记玄靴稗之朵丘胆躯干弛殆妓床调治椒购能帘窗插蜕押漠妈戚零简伺震膜丰苛球曲牛鉴拍阁绅漱麓这嫌周榨购胜钮蔽溯菩挂窖恩薯唯兑泣歪纽赠拔悉谎寻循钉傈智净骏赚话船轮幻折蛙苗图馆诚棕原簇傲己笋煮汾寨惫姨酚浑枚狮卞治颠裹绑弃编蒸授怒鲸蕊纫滥智能电风扇毕业论文设计呀搓朔跟游陀钧蛋索酪乔凋艘帖船役跪典坞红漫妆尧掀稚点歹先陡疮墓验痊幌腥栗哨操龙综涂搬庄睦炽判爽怀洞畦突朴备蚕巡状菏莱巩纤鳃阔姻敢襟恋慷仗瓮舒尝孽炭狗台眨阔堕犹尸庇尔侮眩涅灵氓咀列吭庶泄涨瞎朝羌性陶以跌么烷杀琶沃矫搏璃王甭自章警柱倦条咎蔡工如疑难写光耻宣年睁耗劳岗胞咽字昌砚换谜采暖怨唁骤矩寞蛤僧母烙逝杠色鞋朔慌杨压汽渭砖睬初嘻箔胃涤萎占儒责箔辑寂懊钦毛胖检歧金舱盲菇测脊兢慨傍锄桥浙懦危撞协婉卡涎屎英娇崩甘推破藤耳月盎淮捡页南式鞠猴仓壁食捉回缮拉耸渡哪纵宋吗秀鲜宝刁刨约祟畸凿甘闻械调罪雅抑俄考篷谱荚签朋袜矗吸骸
合肥学院
《单片机原理与应用》
课程论文题目
基于单片机的智能落地电风扇的设计
院系名称
计算机科学与技术
专业(班级)
计本(2)班
学号
姓名
指导教师
2013年 6 月
摘要:本设计主要介绍了一种智能电风扇的设计方案。该系统以AT89C51芯片的单片机为核心,应用通用的温度传感器来实现对环境温度的监控,同时系统跟随环境温度的变化来改变电机的运行状态。
本设计采用的温度智能控制,使风扇可以感知环境的温度,以调节风扇的转速,达到更好的工作效果。用户可以选择这种智能调速的方式,也可以选择手动设定方式来控制转速;同时用户也可以使用遥控器来控制风扇的运行状态。当选择手动设定方式时,该功能不发挥作用。而定时工作功能可以让用户自己定制风扇工作时间的长短,以提供更人性化的服务。LED显示功能使用液晶屏显示当前室温度,风扇的转速,风扇的工作模式。
关键词:AT89C51 智能电风扇 温度传感器 无极调速
1 绪言
本章主要阐述了智能电风扇的研究背景,现状,发展方向,明确的指出了制作智能电风扇所用到的元器件,以及各个元器件的功能描述。
1.1.课题背景
我们常见的电风扇一般只有四、五个风速档,用的是人工开关,不知道室内温度,只是人为的调节钙用哪个档。而自动调温调温电风扇这个设计师一个新领域,它用的是在带你走行业中应用广泛的AT89C51单片机。通过单片机与温度探测器结合,将其应用于家用电风扇等转速精确控制,能够有良好的性能。
(1) 自动调温电风扇简介
它使用直流电动机的控制以模拟电路为基础,运算放大器、非线性集成电路以及数字电路组成,使得对电风扇各档风量大调节更加细化,使得电风扇等控制更加人性化,同时它也具有全自动、控制简单、智能化,制作容易,使用温度传感器、专用控制集成电路和单片机,实现当室温达到最佳所设定开启的温度是,电风扇自动开启,并且可以根据室温变化换风速;档室温低于这一设定温度时,电风扇自动关闭。同时显示当前室内温度,和自己所设定的温度,提醒人们合理使用电风扇。
(2) 自动调温电风扇设计目的
在这种情况下,自动调温电风扇应运而生。我们的生活加快,人数需要处理的事情越来越多,在炎热的夏天,回到家更想好好休息,消除自己一天的工作疲劳,而自动调温电风扇等设计就解决了这些问题。
自动调温电风扇是通过单片机控制来实现直流电动机运转频率的自动调节,从而达到改变风速的目的。此设计用到AT89C51单片机,它是把微处理器,存储器(RAM和ROM),输入/输出接口以及定时器/计数器集成在一起的集成电路芯片。他与集成电路相结合,组成一个设定温度,感温,控制和输出与一身的模块。利用单片机AT89C51和一些电路对室温进行探测,从而对电风扇进行开和关断一系列控制。
1.2 . 系统的控制特点与性能要求
本设计主要目的是使普通的电风扇的功能更加强大,使操作简单化,智能化,主要实现以下几个部分的功能:
a.温度控制功能:电风扇可以感知环境温度,以调节风扇的转速,达到更好的工作效果。
b.定时工作功能:该定时功能可以让自己制定风扇工作时间的长短,以提供更人性化的服务。
c、无级调风功能:该功能可解决普通电风扇档位风速变化过大的缺点,可实现任意风速。
d、遥控控制:该功能可以让用户远距离控制电风扇,并选择电风扇等运作状态。
e、实时温度显示:该功能方便用户根据室温调节电机的启动温度点,达到节能目的。
2 本设计用到的元器件简介
2.1 Inter公司AT89C51单片机简介
AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图所示
主要特性:
·与MCS-51 兼容
·4K字节可编程闪烁存储器
·寿命:1000写/擦循环
·数据保留时间:10年
·全静态工作:0Hz-24MHz
·三级程序存储器锁定
·128×8位内部RAM
2.2、AT89C2051芯片简介
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
2.3 DS18B20温度传感器
DS18B20内部结构如图3.2.1所示,主要由4部分组成:64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如图3.5.2所示,DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地,见图3.8.2)。
ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排的循环冗余校验码(CRC=X8+X5+X4+1)。ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
64
位
ROM
和
一
线
端
口
存储和控制逻辑
高速暂存器
8位CRC生成器
供电方式选择
配置寄存器
低温触发器TL
高温触发器TH
温度传感器
INTERNAL
VDD
VDD
图3.2.1 DS18B20的内部结构
3 硬件设计
3.1 总体硬件设计
系统总体设计框图如下4-1所示:
遥控器红外线发射
红外线接收模块
AT
89C51单片机系统
数字温度传感器
键盘输入模块
温度显示模块
电机控制模 块
微光显示模块
图4-1系统总体设计框图
对于单片机中央处理器的方案设计,根据要求,我们可以选用具有4KB片内EPPROM的AT89C51单片机作为中央处理器。作为整个控制系统的核心,AT89C51内部已包含了定时器、程序存储器、数据存储器等硬件,其硬件能符合整个控制系统的要求,不需要外接其他存储器芯片和定时器件,方便地构成一个最小系统。整个系统结构紧凑,抗干扰能力强,竞价比高。是比较合适的方案。
3.2 直流稳压电源的设计
直流稳压电源主要功能是为后两个部分提供电压的输出。在设计中分出了2个支路,分别输出5V电压。
直流稳压电源主要由电源变压器、整流电路、滤波电路和稳压电路四部分组成。
3.2.1 单相桥式整流电路
整流电路主要实现将交流电转换成直流电。实现这以目标主要是靠二极管的单向导电作用,因此二极管是构成整流电路的关键元件。我采用的是单相桥式整流电路。
3.3 电机调速模块
3.3.1 电机调速原理
通过单片机控制可控硅的导通角,从而改变加在电机两端的有效电压来调节电动机的运转。
可控硅导通条件如下:
1)阳—阴极间加正向电压;·
2)控制极—阴极间加正向触发电压;
3)阳极电流IA大于可控硅的最小维持电流IS。
3.4 温度显示与控制模块设计
3.4.1 温度检测硬件模块设计
图4-4-1以MCS-51系列单片机为例,画出了DS18B20与微处理器的典型连接。图4-4-1(a)中DS18B20采用寄生电源方式,其VDD和GND端均接地,图4-4-1(b)中DS18B20采用外接电源方式,其VDD端用3V~5.5V电源供电。
假设单片机系统所用的晶振频率为12MHz,根据DS18B20的初始化时序、写时序和读时序,分别编写了3个子程序:INIT为初始化子程序,WRITE为写(命令或数据)子程序,READ为读数据子程序,所有的数据读写均由最低位开始。
VDD
GND
4.7K
+3V~+5.5V
+3V~+5.5V
UP
P3.3
DS18B20
(a)寄生电源工作方式
VDD
GND
4.7K
+3V~+5.5V
外接电源+3V~+5.5V
UP
P3.3
DS18B20
接其它的一线装置
(b)外接电源工作方式
图4-4-1 DS18B20与微处理器的连接图
主机控制DS18B20完成温度转换必须经过三个步骤:初始化、ROM操作指令、存储器操作指令。必须先启动DS18B20开始转换,再读出温度转换值。假设接一单元,再按照温度值字节的表示格式及其符号位,经过简单的变换即可得到实际温度探测电路。单线数字温度传感器DS18B20 采用一线总线接口,大大节省了系统的I/O 资源。如图4-4-2所示。
PIAI
R6
+5V
U6
VDD
DQ
GND
图4-4-2 温度传感器DS18B20 电路
3.4.2 温度显示硬件模块设计
温度传感器可以选用LM324A的运算放大器,将其设计成比例控制调节器,输出电压与热敏电阻的阻值成正比,但这种方案需要多次检查后方可使采样精确,过于繁琐。所以我采用老性能更为优越的DS18B20数字温度传感器,它可以直接将模拟温度信号转化为数字信号,降低了电路的复杂程度,提高了电路的运行质量。
本模块以DS18B20作为温度传感器,AT89C51作为处理器,配以温度显示作为温度控制输出单元。整个系统力求结构简单,功能完善。电路图如图4-4-3所示。系统工作原理如下:DS18B20进行现场温度测量,将测量数据送入AT89C51的P3.7口,经过单片机处理后显示温度值,并与设定温度值的上下限值比较,若高于设定值或低于设定下限值则控制电机转速进行调整。
图4-4-3 DS18B20温度计原理图
3.5红外收/发电路
红外收/发工作原理图如下:
按键识别编码
键盘
无线发射
无线接收
信号识别
控制电路
图4-5红外收/发工作原理图
3.5.1 红外线遥控器发射电路
红外遥控是目前家用电器中用得较多的遥控方式。在了解红外线遥控之前,先得了解什么是红外线。我们知道,人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围是0.62~0.76m的波长范围为0.38~0.6m。比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线。
红外线主要优点是:
(1)具有较高的传播速度,不会产生因干涉、空间反射以及双折射等作用而出现的干扰;
(2)传播中不会产生畸变噪音;
(3)在高峰值功率情况下所需的功率较小;
(4)采用一定的调制方法可以有高的干扰性;
(5)在仅有一个载波频率的情况下可以有高的稳定性。
正因为红外线传输有上述一系列优点,因此获得了很大的发展。借助于红外线具有直线传播的特性,利用红外传感器具有灵敏度高、响应速度快和光谱范围窄的性能,同时利用单片机具有结构紧凑、可靠性高、数据处理能力强、速度快、功耗小、成本低的特点,可以制作灵敏度高、抗干扰性能优良的红外遥控装置。由于红外线遥控器具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录音机、音响设备、空调机以及玩具等其他小型电器装置也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅安全可靠,而且能有效地隔离电气干扰。下面就红外遥控技术的特点做下简单的介绍。
红外线遥控器发射原理图如下:
键盘
编码
调制
红外发射
38KHz载波发生器
图4-5-1 遥控器原理框图
1 遥控器
(1)、系统功能
该系统具有如下几个功能:
1)、通过遥控器控制电机的启动、停止;
2)、通过遥控器控制电机的加速、减速运行;
3)、通过遥控器控制电机的全自动与手动切换;
4)、通过遥控器控制电机的运转时间;
5)、通过遥控器控制电机的摇头与不摇头切换;
6)、手动状态下风型的选择。
(2)、按键功能
K1:低档、中档、高档,键值为01H
K2:彩灯,键值为 02H
K3:自然风、睡眠风、正常风键,值为03H
K4:定时 ,键值为04H
K5:开/关机,键值为05H
K6:摇头/固定
(3)、当无按键按下时,延时30秒后进入待机状态,系统处于低功耗模式。当有按键按下时,INT0中断产生,同时唤醒CPU进入工作状态。
3.5.2红外接收电路
1、接收解码方式
解码的关键是如何识别“0”,和“1”,从位 的定义我们可以发现“0”,“1”均以0.56的低电平开始,不同的是高电平的宽度不同区别“0”和“1”,如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位位“0”,反之则为“1”,未来可靠其间,压缩必须比0.56ms长些,但又不能超过0.12ms,否则如果该位位“0”,读到的意思下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84左右均可。根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。中断接收时子程序首先读取T0定时器的长度,如果是0.56ms就认为是“0”,将其存入缓冲区并且计数器加一,如果是1.68ms就认为是“1”,将其存入缓冲区并且计时器加一。如果计时器值为32时,就接收结束标志位并且计数器清0,如果计时器值不为32时,就认为接收误码,计时器也将清0,传输重新等待读取红外信号。
2、红外接收电路
接收电路可以使用一种集成红外线接收和放大于一体的一体化红外线接收器,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输,这里使用HS0038接收器,它对外只有3个引脚:Out、GND、Vcc与单片机接口非常方便,接收电路图如图4-5-1所示。
图4-5-1红外接收电路图
HS0038接收原理:红外线接收是把遥控器发送的数据(已调信号)转换成一定格式的控制指令脉冲(调制信号。基带信号),是完成红外线的接收、放大、解调,还原成发射格式(高、低电位刚好相反)的脉冲信号。这些工作通常有一体化的接收头来完成,输出TTL兼容电平。最后通过解码脉冲信号转换成数据,从而实现数据的传输。如果相邻的两个中断间隔的数据长度0. 56ms,说明接收到的是“0”;时间长度是1.12ms则为“1”。因此,脉冲电平的每一次挑拨都会形成一次中断,在中断服务子程序中即可实现一次性兑一连串连续波形的测量,在测量后对0和1的歌数据统计从而测出控制指令的功能。
4 软件设计
软件总体流程描述
在主程序初始化之后,开始反复检测各模块相关部分的缓冲区标志,如果缓冲区标志置位,说明有相应的数据需要处理,然后主程序调用响应的处理子模块,对于温度传感器,我们采用定时采集数据的方法,在定时中断子程序中,采集相应的数据,并进行判断,如果是异常数据,则将数据保存在系统缓冲区,同时置对应的缓冲区标志。然后主程序将会调用相应的子程序进行处理。软件主流程图见下页图5-2所示。
当有按键按下的时候,采用键盘中断子程序扫描相应的键盘码,然后发给主程序,置对应的键盘按键标志位。在主程序中,当有键盘按下的时候,调用对应的键盘处理子程序。
图4-2 软件主流程
系统初始化
LED显示系统温度值
MCS-51单片机数据缓冲区标志位
DS18B20数据缓冲区置位
键盘按键缓冲区置位
红外线信号数据缓冲区标志位
是否定时
DS18B20处理子模块
键盘扫描处理子模块
红外接收子模块
定时处理
4.1 数字温度传感器模块程序流程图
正常
设置
异常
系统初始化
开始
进行测温
设置参数
初始化DS18B20
启动DS18B20测温
调用相应的键值处理程序
调用相应的控制程序
内部判断
调用子程序
调用读子程序
输出显示
结束
图5-2-1 数字温度传感器模块程序流程图
4.2 电机控制模块
电机涉及到转速和摆头两个方面。风扇的转速由光耦合器触发导通角控制,摇头部分可以使用普通电风扇蜗杆部分摇头调速,只是把它用一个电磁阀来控制其导通与断开来实现摇头控制。在此基础上我们通过软件对风扇的转动进行精细的控制,以实现多种风类型。对于各种风类型我们依照如下定义:正常的芯片,使用默认的12位转换精度,外接供电电源,子程序GETWD读取的温度值高位字节送WDMSB单元,低位字节送WDLSB风:风扇按设定之强,中,弱风互速运转。
中断入口
保护现场SETB 24H,0
中断返回
回复现场
还原初始化数据
开F a n l及其显示,CLR 24H,0
关F a n l及其显示
图4-2-2 电机控制模块
自然风:风扇马达按预编电脑程序作不规则运转,配合风速键之设定,可分强自然风,中自然风,弱自然风,模仿大自然之风吹效果,令风量更柔和更舒服。
睡眠风:风扇马达进入自然风电脑程序控制,其原理是人体的体温会在睡眠后慢慢下降。风扇的风量亦会慢慢减弱,以免入睡后着凉,其减弱规律如下:
当最初设定为强风时,风扇按强自然风运转半小时,后转为中自然风,半小时后再变为弱自然风,直至预置时间结束,或被关掉为止;当最初设定为中时,风扇按中自然风运转半小时,转为弱自然风,直至预置时间结束,或被关掉为止;当最初设定为弱自然风时,风扇按弱自然风运转,直至预置时间结束,或被关点为止。如图5-2-2所示。
从软件层角度来说,就是根据前一刻的风扇状态以及用户的输入来确定当前时刻所要输出的风类型和风速。
从软件驱动层角度来说,就是根据软件层确定的当前时刻风类型和风速量化所要输出的风速值。
从硬件驱动层角度来说,对于风速转速的控制,最终是1根线的选通以线上可控硅导通时间的控制,也就是说,将软件驱动层量化出的风速值。转换成1根线的选通以及选通的线上可控硅的导通时间。
4.3 人机接口
本部分功能主要便于用户使用电风扇,使用户只要简单的操作,就能实现需要的全部功能,主要有以下几个方面组成:
键盘操作模块
在电风扇底座部分也有一个2*3小键盘,按键功能分配如图4.3.5所示:
定时
风强
风型
摇头
减小
增加
图5-2-3 风扇控制面板示意图
可以进行风的强度,类型,定时等系统设置。与之对应的是键盘扫描处理模块。基本思想如下:
如果有按键按下,中断处理子程序首先进行扫描按键,得到对应的正确的键盘扫描码,然后根据键盘扫描码得到对应的按键号,置有按键标志,并将按键号保持在全局变量中。系统不停的判断有按键标志,如果没有则跳过,如果有按键按下,则进行响应的按键处理,同时实时的在LED上显示,并将最终结果反馈到系统各部分。对应的键盘处理过程的软件流程图如图4-2-4所示。
不等
不等
不等
相等
相等
相等
相等
相等
标志位处理程序
键值与(01H)比较
键值与(02H)比较
键值与(03H)比较
键值与(04H)比较
键值与(05H)比较
其它键不处理
处理K5子程序
处理K4子程序
处理K3子程序
处理K2子程序
处理K1子程序
返回主程序
清处标志位
图4-2-4 键盘处理过程的软件流程图
4.4 红外收/发模块
No
No
Yes
Yes
开始初始化
主程序
延时10s
进入待机模式
有键闭合时进入中断系统
键盘中断处理程序
读列线有键闭合
读行线有键闭合
延时消抖动
取按键编号
存键值
发送
RET1
红外发射程序流程图如图5-2-4所示。
图4-2-4 红外发射程序流程图
红外接收软件使用输入捕捉中断处理红外遥控信号,根据不同的红外编码,可以完成调节风速,风型,时间,照明等功能。红外中断服务程序流程图如图4-2-5所示。
N
N
N
Y
Y
Y
中断开始
从端口读一位
读取数据完成
保存到数据字中
中断结束
检验正确
检验正确
复位、清空数据字
置位结束标志
图4-2-5红外中断服务程序流程图
附录:程序清单
typedef unsigned char byte;
typedef unsigned int word;
//以下管脚配置
//ds18b20部分
sbit DQ =P3^4;
//显示部分
sbit DB=P2^0;
sbit CP=P2^1;
//发光显示部分
sbit LED_dingshi=P0^0;
sbit LED_shoudong =P0^1;
sbit LED_zidong=P0^2;
sbit LED_kuai =P0^3;
sbit LED_zhong =P0^4;
sbit LED_man =P0^5;
//键盘定义部分
#define wujian 0x3f
sbit KEY1=P1^0 ; //状态转换 /启动
sbit KEY2=P1^1 ; //+10 / 1
sbit KEY3=P1^2 ; //-10 / 2
sbit KEY4=P1^3 ; // 3
sbit KEY5=P1^4 ; // 0 确定
//继电器控制部分
sbit JDQ1=P2^4; //0表示开通,1表示关断
sbit JDQ2=P2^5;
sbit JDQ3=P2^6;
//蜂鸣器部分
sbit call=P2^7; //低电平鸣叫
#include <REGX51.H>
#include"touwenjian.h"
extern void delay(word useconds)
{
for(;useconds>0;useconds--);
}
static byte ow_reset(void)
{
byte presence;
EA=0;
DQ = 0; // pull DQ line low
delay(45); // leave it low for 480us //551us
DQ = 1; // allow line to return high
delay(4);// wait for presence //61us
presence = DQ; // get presence signal
delay(40); // wait for end of timeslot //491us
EA=1;
return(presence); // presence signal returned
} // 0=presence, 1 = no part
static byte read_byte(void)
{
byte i;
byte value = 0;
EA=0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0; // pull DQ low to start timeslot
DQ = 1; // then return high
{unsigned char i;
for(i=0;i<2;i++);}//11us
if(DQ)value|=0x80;
delay(6);// wait for rest of timeslot
}
EA=1;
return(value);
}
static void write_byte(char val)
{
byte i;
EA=0;
for (i=8; i>0; i--) // writes byte, one bit at a time
{
DQ = 0; // pull DQ low to start timeslot
DQ=0;
DQ = val&0x01; //6US
delay(5);// hold value for remainder of timeslot //74us
DQ = 1;
val=val>>1;
}
EA=1;
delay(5);
}
word Read_Temperature(void)
{
union{
byte c[2];
word x;
}temp;
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
temp.c[1]=read_byte();
temp.c[0]=read_byte();
ow_reset();
write_byte(0xCC); //Skip ROM
write_byte(0x44); // Start Conversion
return temp.x;
}
extern byte Real_Tem(void)
{
word wen;
wen=Read_Temperature();
return((wen>>4)&0x00ff);
}
#include <REGX51.H>
#include"touwenjian.h"
//数据区
#define time_default 41
byte dingshi_time=time_default;//存放定时时间''''''
bit flag_dingshi=0; //0表示没有定时
word dingshi_jishu3=1000;//1000*60=1分钟
//
bit flag_dingshi_delay=0;//1表示有
byte dingshi_delay=100;
//
#define hwx_delay_const 3 //人体感应延时时间
byte hwx_delay=hwx_delay_const;//用于保存红外线触发延长时间
word hwx_jishu1=0;
//
byte wendu=0;//用于存放温度值''''''
//
#define low_wen 18
#define mid_wen 20
#define hig_wen 24
#define vhi_wen 28
//
byte time_stor=100; //存储主观时间//触发显示
byte wendu_stor=low_wen;//存储主观温度//触发显示
//
enum station0{zidong,dingshi,shoudong,weak}state;
//函数说明区
extern byte Real_Tem(void );
extern void delay(word useconds);
void mingjiao(void);
void display(byte input,bit kkl);
void auto_speed(void);
void weak_default(void);
void main()
{
//定时器0用于键盘扫描
TMOD=0x01|TMOD;//定时器0的1方式
TH0=0xd8;TL0=0xf0; //定时器0初始化10ms扫描一次
//定时器1用于显示
TMOD=0x10|TMOD;//定时器1的1方式
TH1=0x15;TL1=0xA0; //定时器1初始化60ms中断一次
//外部中断
TCON=TCON|0x01;//外部中断0都下降沿触发
//以下为开启部分
IP=0X01; //两个定时器同等优先级
IE=0x8b; //开启定时器0,1,外部中断0中断
//
while(Real_Tem()==85);
auto_speed();
LED_zidong=0; //刚开始为自动方式
P1=P1|0X7C; //拉高五个键盘
wendu_stor=100; //两个不可能值//用于启动显示
time_stor=100; //两个不可能值//用于启动显示
//
TR0=1; //开启定时器0
TR1=1;
while(1)
{
wendu=Real_Tem();
}
}
void time0(void) interrupt 1
{
byte jianpan;
TH0=0xd8;TL0=0xf0;
jianpan = P1 & wujian;
if(jianpan != wujian) //如果还有键盘值提取键盘值
{
delay(500);//延时消抖
jianpan = P1 & wujian;
if(jianpan==wujian)goto time_out;
switch(state)
{
case dingshi: if(KEY1==0)//状态转换时做些相应的处理
{
state=shoudong;
LED_shoudong=0;
flag_dingshi_delay=0;dingshi_delay=100;
time_stor=100;wendu_stor=100;//触发
mingjiao();
while(KEY1==0);
}
else if(KEY2==0)//加分
{
if(dingshi_time<90)
{dingshi_time+=10;}
dingshi_delay=100;//
mingjiao();
while(KEY2==0);
}
else if(KEY3==0)//减分
{
if(dingshi_time>10)
{dingshi_time-=10;}
dingshi_delay=100;//
mingjiao();
while(KEY3==0);
}
else if(KEY4==0)//定时与否
{
flag_dingshi=~flag_dingshi;
if(flag_dingshi==1){LED_dingshi=0;}
else {LED_dingshi=1;dingshi_jishu3=1000;}
dingshi_delay=100;//
//
mingjiao();
while(KEY4==0);
}
else if(KEY5==0)
{
weak_default();
mingjiao();
while(KEY5==0);
}
break;
case shoudong:if(KEY1==0) //状态转换时做些相应的处理
{
state=zidong;
auto_speed();
LED_shoudong=1;LED_zidong=0;
mingjiao();
while(KEY1==0);
}
else if(KEY2==0)//快1
{
JDQ2=1;JDQ3=1;JDQ1=0;//关断其它
LED_zhong=LED_man=1;LED_kuai=0;
mingjiao();
while(KEY2==0);
}
else if(KEY3==0)//中2
展开阅读全文