基于单片机的红外解码.温度及液晶显示

合集下载

基于51单片机的红外遥控+液晶LCD1602显示程序源代码

基于51单片机的红外遥控+液晶LCD1602显示程序源代码

基于51单片机的红外遥控+液晶LCD1602显示程序源代码/*******************红外遥控+液晶LCD1602测试程序源代码******************** 单片机型号:STC15W4K56S4,内部晶振:22.1184M。

功能:红外遥控+液晶LCD1602显示功能测试。

操作说明:按下红外遥控器上的“CH-”键,液晶LCD1602上显示“CH-”。

按下红外遥控器上的“CH”键,液晶LCD1602上显示“CH”。

按下红外遥控器上的“CH+”键,液晶LCD1602上显示“CH+”。

按下红外遥控器上的“|<<”键,液晶LCD1602上显示“|<<”。

按下红外遥控器上的“>>|”键,液晶LCD1602上显示“>>|”。

按下红外遥控器上的“>||”键,液晶LCD1602上显示“>||”。

按下红外遥控器上的“-”键,液晶LCD1602上显示“-”。

按下红外遥控器上的“+”键,液晶LCD1602上显示“+”。

按下红外遥控器上的“EQ”键,液晶LCD1602上显示“EQ”。

按下红外遥控器上的“0”键,液晶LCD1602上显示“0”。

按下红外遥控器上的“100+”键,液晶LCD1602上显示“100+”。

按下红外遥控器上的“200+”键,液晶LCD1602上显示“200+”。

按下红外遥控器上的“1”键,液晶LCD1602上显示“1”。

按下红外遥控器上的“2”键,液晶LCD1602上显示“2”。

按下红外遥控器上的“3”键,液晶LCD1602上显示“3”。

按下红外遥控器上的“4”键,液晶LCD1602上显示“4”。

按下红外遥控器上的“5”键,液晶LCD1602上显示“5”。

按下红外遥控器上的“6”键,液晶LCD1602上显示“6”。

按下红外遥控器上的“7”键,液晶LCD1602上显示“7”。

按下红外遥控器上的“8”键,液晶LCD1602上显示“8”。

基于单片机的智能家居控制系统设计

基于单片机的智能家居控制系统设计

基于单片机的智能家居控制系统设计
智能家居控制系统是利用现代信息技术和通信技术对家居生活环境进行监测、控制和
管理的系统。

随着科技的不断发展,智能家居控制系统成为了未来家居生活的重要组成部分。

在智能家居控制系统中,单片机作为控制中心,负责控制各个设备的运行和协调不同
设备之间的互通。

该智能家居控制系统由单片机(STC12C5A60S2)、温湿度传感器、红外遥控模块、液
晶显示屏、继电器和直流电机等组成。

它可以通过自动控制和手动控制两种方式来完成智
能家居的管理。

自动控制是该系统的一项重要功能。

系统中的温湿度传感器可以实时监测居室内的温
度和湿度,并在这些数据达到设定阈值时自动控制空调开启或关闭。

系统中还设置了热水
管的自动控制,当系统检测到水温低于设定值时,自动控制加热器开启。

手动控制则是在自动控制的基础上增加的一种控制方式。

通过液晶显示屏,用户可以
手动控制灯光的开关、窗帘的升降、风扇的状态等。

此外,该系统还增加了红外遥控功能,用户可以通过遥控器控制系统中的多个设备。

在该系统中,单片机起到了至关重要的作用。

它负责控制各个设备的运行和协调不同
设备之间的互通。

具体来说,单片机采取轮询方式查询不同设备的状态,这样可以确保系
统中各个设备正常运行。

此外,单片机还可以通过通信模块实现远程控制,用户可以通过APP或者网络远程控制智能家居。

总的来说,该基于单片机的智能家居控制系统设计实现了智能家居的自动化管理,提
高了家居生活的便捷程度和舒适度,对未来的智能家居生活有很大的推进作用。

基于单片机的温度检测系统硬件设计

基于单片机的温度检测系统硬件设计

基于单片机的温度检测系统硬件设计温度是工业生产和日常生活中常见的重要参数之一。

准确的温度检测对于许多应用场景至关重要,如医疗、化工、电力、食品等行业。

随着科技的不断发展,单片机作为一种集成了CPU、内存、I/O接口等多种功能于一体的微型计算机,被广泛应用于各种温度检测系统中。

本文将介绍一种基于单片机的温度检测系统硬件设计方法。

温度检测系统的主要原理是热电偶定律。

热电偶是一种测量温度的传感器,它基于塞贝克效应,将温度变化转化为电信号。

热电偶与放大器、滤波器等电路元件一起构成温度检测电路。

放大器将微弱的电信号放大,滤波器则消除噪声,提高信号质量。

将处理后的电信号输入到单片机中进行处理和显示。

在原理图设计中,我们选用了一种常见的温度检测芯片——DT-6101。

该芯片内置热电偶放大器和A/D转换器,可直接与单片机连接。

我们还选择了滤波电容、电阻等元件来优化信号质量。

原理图设计如图1所示。

软件设计是温度检测系统的核心部分。

我们采用C语言编写程序,实现温度的实时检测和显示。

程序主要分为初始化、输入处理、算法处理和输出显示四个模块。

初始化模块:主要用于初始化单片机、DT-6101等硬件设备。

输入处理模块:从DT-6101芯片读取温度电信号,并进行预处理,如滤波、放大等。

算法处理模块:实现温度计算算法,将电信号转化为温度值。

常用的算法有线性插值法、多项式拟合法等。

输出显示模块:将计算得到的温度值显示到液晶屏或LED数码管上。

硬件调试是确保温度检测系统可靠性和稳定性的关键步骤。

在组装过程中,需注意检查元件的质量和连接的正确性。

调试时,首先对硬件进行初步调试,确保各电路模块的基本功能正常;然后对软件进行调试,检查程序运行是否正确;最后进行综合调试,确保软硬件协调工作。

通过实验,我们验证了基于单片机的温度检测系统的准确性和稳定性。

实验结果表明,系统在-50℃~50℃范围内的误差小于±5℃,满足大多数应用场景的需求。

单片机STM32F103C8T6的红外遥控器解码系统设计

单片机STM32F103C8T6的红外遥控器解码系统设计

单片机STM32F103C8T6的红外遥控器解码系统设计一、本文概述本文旨在详细阐述基于STM32F103C8T6单片机的红外遥控器解码系统的设计和实现过程。

随着科技的不断进步和智能化设备的普及,红外遥控器作为一种常见的遥控设备,已经广泛应用于家电、安防、玩具等多个领域。

然而,红外遥控器发出的红外信号往往需要通过解码器才能被设备正确识别和执行,因此,设计一款高效、稳定、可靠的红外遥控器解码系统具有重要意义。

本文将首先介绍红外遥控器的基本原理和信号特点,然后详细阐述STM32F103C8T6单片机的性能特点和在红外遥控器解码系统中的应用优势。

接着,将详细介绍红外遥控器解码系统的硬件设计,包括红外接收头的选择、电路设计和PCB制作等。

在软件设计部分,将详细阐述如何通过STM32F103C8T6单片机的编程实现红外信号的接收、解码和处理,以及如何将解码后的数据通过串口或其他通信方式发送给主控制器。

本文还将对红外遥控器解码系统的性能进行测试和分析,包括信号接收距离、解码速度和稳定性等方面的测试。

将总结本文的主要工作和创新点,并对未来的研究方向进行展望。

通过本文的研究和实现,旨在为红外遥控器解码系统的设计提供一种新的思路和方法,同时也为相关领域的研究人员提供有益的参考和借鉴。

二、红外遥控器基础知识红外遥控器是一种常见的无线遥控设备,它利用红外光作为信息载体,通过发射和接收红外光信号实现对设备的远程控制。

这种遥控方式因其简单、低成本和无需视线连接等优点,在各类消费电子产品中得到了广泛应用,如电视机、空调、音响等。

红外遥控器的工作原理主要基于红外辐射和光电器件的检测。

遥控器内部通常包含一个或多个红外发射管,当按下按键时,发射管会发射出特定频率和编码的红外光信号。

接收端则配备有红外接收头,该接收头内部有一个光敏元件(如硅光敏三极管或光敏二极管),用于检测红外光信号并将其转换为电信号。

为了区分不同的按键操作,红外遥控器通常采用特定的编码方式对按键信号进行编码。

一种基于单片机的红外遥控信号解码新方法

一种基于单片机的红外遥控信号解码新方法

控 方 式 时 不 会 干 扰 其 他 电器 的正 常 使 用 , 不 会 影 响 临 近 也
的无 线 电设 备 。 另 外 , 外 遥 控 器 件 具 有 体 积 小 、 耗 ] 红 功 低 、 价 比高 的优 点 , 理 想 的人 机 输 入设 备 , 常 适 合 电 性 是 非 子 工 程 师 和 电子 爱 好 者 DI 开 发 与 制 作 。红 外 遥 控 系 统 Y
主 要 由发 射 和 接 收 两 大部 分 组 成 , 于 发 射 部 分 使 用 的是 由
I e Rr s
购 买 来 的遥 控 器 成 品 , 以本 文 的 重 点 是 红 外 接 收 、 码 所 解 部 分 。下 面 将 从 硬 件 结 构 和 软件 编 程 两 个 方 面 出发 , 绍 介
Absr c ta t:I f a e e ot o r lr r dey u e n us ho d e e t ia ppl nc s I f a e i na c di e hod r a i s i n r r d r m ec ntole s a e wi l s d i ho e l l c rc la i e . n r r d sg lde o ng m t a s a e v rou n
功 能 寄存 器单 元 进行 定 义 , 时 对 相 关 工 作 单 元 进 行 初 始 同
化 。初 始 化 代 码 如 下 :
; 定 义 , 存 器 定 义 位 寄 I Ke Re d B T R y ay I I oe RC d I i R: nt I Oh O ; 义 “ 得 到键 值 ” 志 位 定 已 标 ; 义 4字 节 红 外 码 寄 存 器 定 ; 开 外 部 中断 1 打 ; 降 沿 触 发 下

基于51单片机的红外线控制系统 2

基于51单片机的红外线控制系统 2

单片机原理结课项目项目题目基于51单片机的红外线控制系统基于51单片机的红外线控制系统一、概述:红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。

由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以在设计红外线遥控器时,不必要像无线电遥控器那样,每套( 发射器和接收器) 要有不同的遥控频率或编码( 否则,就会隔墙控制或干扰邻居的家用电器) ,所以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。

这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面。

由于红外线为不可见光,因此对环境影响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备。

基于51单片机的红外线控制系统。

要求通过单片机发送和接红外信号程序,根据接收的信号,执行有关动作的系统,能够实现近距离的无线通。

二、硬件设计1. 系统框图2. 电路原理图电路由五个模块构成(最小系统模块、红外接收模块、数码管显示模块、编程下载模块、电源模块)1) 最小系统STC12C5410AD 单片机红外接收头红外遥控器复位电路时钟振荡电路数码光显示最小系统由stc12c5410ad单片机,按键复位电路,时钟振荡电路构成。

a.电源电源采用5V直流电供电。

b.时钟、复位电路本电路选用12MHz晶振。

2)红外接收模块3)显示模块三、软件设计1.红外编解码原理红外线发射编码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制‘0’;以脉宽为0.565ms、间隔1.658ms、周期为2.25ms的组合表示二进制‘1’;红外接收头接收的信号和发射编码相反;一组编码由一个引导码,四个字节数据组成;引导码由9ms的高电位和4.5ms的地电位组成。

基于单片机的红外通信系统设计

基于单片机的红外通信系统设计

基于单片机的红外通信系统设计1 简介红外通信是指利用红外线进行信息传输的一种无线通讯方式。

其传输距离在10米以内,速度较快,常用于遥控器、智能家居、安防监控等领域。

本文将介绍基于单片机的红外通信系统设计。

2 系统原理红外通信系统需包含红外发射器、红外接收器和处理器三个部分。

通信原理是将信息编码成红外信号,通过红外发射器发出,再由红外接收器接收,经过解码后传输到处理器中处理。

3 系统设计步骤3.1 红外接收器电路设计红外接收器采用红外管接收器,其特点是灵敏度高,在不同角度能接收到较远的红外信号。

红外管接收器与电路板焊接,电路板再选用较长的电线接到处理器的端口上。

3.2 红外发射器电路设计红外发射器采用红外二极管,其工作电压一般为1.2-1.4V。

通过接通1kHz以上的方波信号控制二极管的导通,使其发出红外光。

为保证其稳定性和较远的有效距离,需在电路中添加反向电流保护二极管。

3.3 处理器设计处理器选用常用的单片机,如AT89C51等。

单片机内置了红外通信模块,可用来发送和接收红外信号。

同时,还需通过编程实现对红外信号的解码和编码,实现信息传输与处理。

4 系统测试测试时,可用遥控器模拟发送红外信号,系统接收并解码后显示在液晶屏幕上。

测试距离一般在10米以内,且需保持天空无其它遮挡物。

5 总结基于单片机的红外通信系统设计,具有灵敏度高、速度快、传输距离短等特点。

其应用广泛,在智能家居、安防监控、车载通信等领域均有应用。

但需注意遮挡物的影响,以及信号干扰等问题。

基于单片机的温度采集与液晶显示

基于单片机的温度采集与液晶显示

1 绪论1.1 本课题研究的背景和意义温度,一个在日常生活和生产过程甚至科学实验中普遍而且重要的物理参数。

近年来,随着社会的发展和科技的进步,温度控制系统以及测温仪器已经广泛应用于社会生活的各个领域,尤其是在工业自动化控制中占有非常重要的地位。

人们通过温度计来采集温度,经过人工操作进行加热、通风和降温。

从而来控制温度,但是对于这些控制对象惯性大,滞后性严重,而且还存在有许多不定的因素,从而根本难以建立精确的数学模型。

这样不仅控制精度低、实时性差,而且操作人员的劳动强度大,并且有许多工业生产环节是人们不能直接介入的。

因此智能化已然成为现代温度控制系统发展的主流方向。

针对这一种实际情况,设计个温度控制系统,具有非常广泛的应用前景和实际意义[1]。

随着电子信息技术和微型计算机技术的飞速发展。

单片机技术也得到了飞速的发展。

尤其是在高集成度、高速度、低功耗还有高性能方面取得了巨大的进展。

使得单片机在电子产品当中的应用越来越广泛。

使用单片机对温度进行控制的技术也油然而生。

它不仅可以克服温度控制系统中存在的严重的滞后现象,同时还可以在提高采样频率的基础上很大程度的提高控制的效果和控制的精度。

并且随着技术日益发展和完善,相信越来越能显现出它的优越性。

1.2 目前国内外研究现状在国内外温度控制成了一门广泛应用于很多领域的技术。

像电力、化工、石油、冶金、航空航天、机械制造、粮食存储、酒类生产等。

温度控制系统虽然在国内各行各业的应用已十分广泛,但是从温度控制器的生产角度来看,总体的发展水平仍不高。

跟美德日等先进国家相比,仍有着较大的差距。

“点位”控制和常规的PID控制器占领了成熟产品的主体份额。

但它只可以适用于一般的温度系统控制,而难于控制复杂、滞后、时变的温度控制系统。

此外,适于较高控制场合的智能化、自适应控制仪表,目前在国内还没有取得较好的研究成果。

并且,在形成商品化和仪表控制参数的自整定方面,一些先进国家虽已经有一批成熟的产品。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中国矿业大学徐海学院技能考核培训姓名:顾嘉诚学号: 22110818专业:信息11-2班题目:基于单片机的红外解码.温度及液晶显示专题:红外解码指导教师:宥鹏老师翟晓东老师设计地点:电工电子实验室时间: 2014 年 4 月通信系统综合设计训练任务书学生姓名顾嘉诚专业年级信息11-2班学号22110818设计日期:2014年4 月5日至2014 年4 月10 日同组成员:姜怀修,刘剑桥,顾嘉诚,彭传锁,何子豪,王业飞设计题目:基于单片机的红外无线控制设计专题题目:红外解码设计主要内容和要求:1.主要内容:2.单片机内部结构红外遥控解码C语言程序设Ds18b20的使用Lcd1602的使用2. 功能扩展要求环境温度液晶显示指导教师签字:目录正文 (5)1.概述 (5)1.1功能描述 (5)1.2单片机资源 (5)2.1管脚图 (5)3.1. 使用资源 (5)2.原理篇 (6)2.1红外发送及接收 (6)2.1.1红外接收概述 (6)2.1.2硬件及原理图 (7)2.1.3红外中断接收部分程序 (8)2.2温度原理 (9)2.2.1 DS18B20 的主要特性 (9)2.2.2原理图与硬件 (10)2.2.3 DS18B20时序和程序 (10)2.3 QC1602A (12)2.3.1 1602外部结构及管脚说明 (12)2.3.2 写命令/数据时序与部分程序 (13)3.效果图 (15)4.软件篇 (15)4.1程序框图 (15)4.1.1 Main函数 (15)4.1.2 中断 (16)4.1.3 60ms定时中断 (16)4.2 完整程序 (16)4.2.1 Project.c文件 (16)4.2.2 onewire.c 文件 (23)5.参考文献 (26)技能考核培训摘要:利用单片机所学内容进行拓展,我们实现了基于单片机的红外解码.温度及液晶显示。

Lcd液晶显示实时环境温度和接收显示红外遥控器的键值,在收到红外信号时会用蜂鸣器作为反馈,以提醒红外一体接收头有接到信号。

关键词:单片机液晶显示红外解码正文1.概述1.1功能描述Lcd液晶显示实时环境温度和接收显示红外遥控器的键值,在收到红外信号时会用蜂鸣器作为反馈,以提醒红外一体接收头有接到信号。

1.2单片机资源2.0资源与MCS-51单片机产品兼容8K字节在系统可编程Flash存储器1000次擦写周期全静态操作:0Hz~33Hz三级加密程序存储器32个可编程I/O口线三个16位定时器/计数器八个中断源全双工UART串行通道低功耗空闲和掉电模式掉电后中断可唤醒看门狗定时器双数据指针掉电标识符2.1管脚图3.1. 使用资源P1:用于连接LCD1602的数据线P3.5,P3.7:分别连接LCD1602的RS,R/W控制脚P3.2:使用第二功能,用于接收红外信号P2.7:DS18B20数据脚P2.5:用于控制蜂鸣器2.原理篇2.1红外发送及接收2.1.1红外接收概述NEC 标准:遥控载波的频率为38KHz(占空比为1:3);当某个按键按下时,系统首先发射一个完整的全码,如果键按下超过108ms 仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。

一个完整的全码=引导码+用户码+用户码+数据码+数据反码。

其中,引导码高电平9ms,低电平4.5ms;系统码8 位,数据码8 位,共32 位;其中前16 位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。

后 16 位为 8 位的操作码和 8 位的操作反码,用于核对数据是否接收准确。

收端根据数据码做出应该执行什么动作的判断。

连发代码是在持续按键时发送的码。

它告知接收端,某键是在被连续地按着。

NEC 标准下的发射码表示发射数据时0 用“0.56ms 高电平+0.565ms 低电平=1.125ms”表示;数据1 用“高电平0.56ms+低电平1.69ms=2.25ms”表示。

遥控器发射的信号:一体化接收头接收到的信号:需要注意的是;一体化接收头输了的波形是与发射波形是反向的。

我的遥控器使用的是NEC标准的WD6122芯片,遥控器编码如下:2.1.2硬件及原理图2.1.3红外中断接收部分程序void IR_IN() interrupt 0 using 0 //外部中断0程序{unsigned char j,k,n=0; //先定义变量,记住n=0EX0=0; //禁止中断,以免再次进入中断delay(15); //延时0.14ms*15=2.1msif(IRIN==1) //如果在这期间有高电平说明{ //信号不是来自遥控的,返回主程序EX0=1;return;}while(!IRIN){delay(1);} //死循环,等待9ms前导低电平信号的结束//////////////////////////////////////////////////////for(j=0;j<4;j++) //一共有4组数据{for(k=0;k<8;k++) //每组数据有8位{while(IRIN) {delay(1);} //死循环,等待4.5ms前导高电平的结束while(!IRIN) {delay(1);} //等待0.56ms低电平的结束,准备采集数据,while(IRIN) //开始采集数据{delay(1); //延时0.14ms,每过0.14ms时n就加1n++; //用n记录一共有多少个0.14msif(n>=30) //如果超过0.14ms*30=4.2ms{ //说明是乱码,放弃不要EX0=1;return;}}IRCOM[j]=IRCOM[j]>>1; //右移1位,xxxx xxxx变成0xxx xxx if(n>=8){IRCOM[j]=IRCOM[j]|0x80;}//但是如果不是0呢,//0xxx xxxx和0x80相或后变成了1xxx xxxx//这样这一们数据就被记录为1了/*想一下这里为什么是8呢,0.14ms*8=1.12ms,知道了吧*//*这样反复执行8次,8位数据就存在IRCOM[j]中了*/中了*/n=0; //n计数后一定要记得清0,否则下一次就不能准确计数了}}////////////////////////////////////////////////////if(IRCOM[2]!=~IRCOM[3]) //这里我们判断数据码和数据反码是不是相反{ //因为相反才是正确的,否则就放弃EX0=1;return;}beep();EX0=1; //记得开中断,你可以去掉这句话试一试}2.2温度原理2.2.1 DS18B20 的主要特性(1)适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电。

(2)独特的单线接口方式,DS18B20 在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20 的双向通讯。

(3)DS18B20 支持多点组网功能,多个DS18B20 可以并联在唯一的三线上,实现组网多点测温。

(4)DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。

(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃。

(6)可编程的分辨率为9~12 位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。

(7)在9 位分辨率时最多在93.75ms 内把温度转换为数字,12 位分辨率时最多在750ms 内把温度值转换为数字,速度更快。

(8)测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC 校验码,具有极强的抗干扰纠错能力。

(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

2.2.2原理图与硬件2.2.3 DS18B20时序和程序2.2.3.1初始化时序及程序//DS18B20初始化bit init_ds18b20(void){bit initflag = 0;DQ = 1;Delay_OneWire(12);DQ = 0;Delay_OneWire(80); // 延时大于480usDQ = 1;Delay_OneWire(10); // 14initflag = DQ; // initflag等于1初始化失败Delay_OneWire(5);return initflag;}2.2.3.2写/读时序及写/读一字节程序//从DS18B20读取一个字节unsigned char Read_DS18B20(void) {unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;if(DQ){dat |= 0x80;}Delay_OneWire(5);}return dat;}//通过单总线向DS18B20写一个字节void Write_DS18B20(unsigned char dat) {unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(5);DQ = 1;dat >>= 1;}Delay_OneWire(5);}2.3 QC1602A2.3.1 1602外部结构及管脚说明RAM 地址映射图控制器内部带有80*8位的RAM缓冲区2.3.2 写命令/数据时序与部分程序//写命令void write_com(uchar com) //液晶写命令{lcdrs=0;P1=com;delay_lcd(10);lcden=1;delay_lcd(10);lcden=0;}//写数据void write_data(uchar date) //液晶写数据{lcdrs=1;P1=date;delay_lcd(10);lcden=1;delay_lcd(10);lcden=0;}3.效果图4.软件篇4.1程序框图4.1.1 Main函数4.1.2 中断4.1.3 60ms定时中断4.2 完整程序4.2.1 Project.c文件#include<reg52.h>#include <absacc.h>#include "onewire.h" //单总线函数库#define uchar unsigned char#define uint unsigned intuchar code table[]="temperature:"; //液晶uchar code table1[]="infrared value:"; //液晶unsigned char IRCOM[7]; //定义数组,用来存储红外接收到的数据sbit lcden=P3^7; //液晶sbit lcdrs=P3^5; //液晶sbit IRIN=P3^2; //定义红外接收头的外部接口,即外部中断0 sbit BEEP=P2^5; //定义蜂鸣器接口,我的在P1^5uchar num; //液晶char show_clock; //显示周期控制char now_tem; //存得到的温度char shinow,genow; //当前温度的十个位char wendu_show_shi,wendu_show_ge; //温度送入液晶的ASCALL码 char hongwai_jian_zhi ; //红外送入液晶的ASCALL码void delay_lcd(uint z) //液晶延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//写命令void write_com(uchar com) //液晶写命令{lcdrs=0;P1=com;delay_lcd(10);lcden=1;delay_lcd(10);lcden=0;}//写数据void write_data(uchar date) //液晶写数据{lcdrs=1;P1=date;delay_lcd(10);lcden=1;delay_lcd(10);lcden=0;}void init_lcd() //液晶初始化{lcden=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x10);write_com(0x80+0x00);}void init_show() //液晶初始显示{for(num=0;num<12;num++){write_data(table[num]);delay_lcd(5);}write_com(0x80+0x40);for(num=0;num<15;num++){write_data(table1[num]);delay_lcd(5);}ET0=1; //开定时中断EX0=1;}/*void init_infrared() // 红外初始化{IE=0x81;TCON=0X01;BEEP=1;IRIN=1;} *//******************************************/// 红外延时/*****************************************/void delay(unsigned char x){ //延时子程序unsigned char i; //延时约x*0.14mswhile(x--) //不同遥控器应设置不同的参数{for(i=0;i<13;i++){}} //参数的选择咱们先不管,先看这个}/*******************************************************/// 蜂鸣器/*******************************************************/void beep(){unsigned char i; //蜂鸣器发声子程序for(i=0;i<100;i++){delay(4); //这个得看你的蜂鸣器内部是否有振荡源BEEP=~BEEP;} //如果没有振荡源就应该输入脉冲信号BEEP=1;}/****************************************************/// 温度服务程序/****************************************************/void dis_work() // 温度显示处理{shinow=now_tem/10;genow= now_tem%10;//温度switch (shinow){case 0 :wendu_show_shi=0x30;break;case 1 :wendu_show_shi=0x31;break;case 2 :wendu_show_shi=0x32;break;case 3 :wendu_show_shi=0x33;break;case 4 :wendu_show_shi=0x34;break;case 5 :wendu_show_shi=0x35;break;case 6 :wendu_show_shi=0x36;break;case 7 :wendu_show_shi=0x37;break;case 8 :wendu_show_shi=0x38;break;case 9 :wendu_show_shi=0x39;break;}switch (genow){case 0 :wendu_show_ge=0x30;break;case 1 :wendu_show_ge=0x31;break;case 2 :wendu_show_ge=0x32;break;case 3 :wendu_show_ge=0x33;break;case 4 :wendu_show_ge=0x34;break;case 5 :wendu_show_ge=0x35;break;case 6 :wendu_show_ge=0x36;break;case 7 :wendu_show_ge=0x37;break;case 8 :wendu_show_ge=0x38;break;case 9 :wendu_show_ge=0x39;break;}//红外switch (IRCOM[2]){case 0x16 :hongwai_jian_zhi=0x30;break;case 0x0c :hongwai_jian_zhi=0x31;break;case 0x18 :hongwai_jian_zhi=0x32;break;case 0x5e :hongwai_jian_zhi=0x33;break;case 0x08 :hongwai_jian_zhi=0x34;break;case 0x1c :hongwai_jian_zhi=0x35;break;case 0x5a :hongwai_jian_zhi=0x36;break;case 0x42 :hongwai_jian_zhi=0x37;break;case 0x52 :hongwai_jian_zhi=0x38;break;case 0x4a :hongwai_jian_zhi=0x39;break;default:hongwai_jian_zhi= 0x21;break;}}/****************************/// 显示函数/*****************************/void show (){write_com(0x80+0x0d);write_data(wendu_show_shi);write_com(0x80+0x0e);write_data(wendu_show_ge);write_com(0x80+0x4F);write_data(hongwai_jian_zhi);}/*************************************************/// 主函数/**************************************************/void main(){TMOD=0X01;TH0=(65536-60000)/256; //定时TL0=(65536-60000)%256;EA=1; //定时器0BEEP=1;IRIN=1;EA=1;//开总中断//开外部中断0IT0=1;//边沿触发方式TR0=1;///////init_lcd();// init_infrared();init_show();while(1);}/***********************************************************/// 外部中断0 红外键值获取/***********************************************************/void IR_IN() interrupt 0 using 0 //外部中断0程序{unsigned char j,k,n=0; //先定义变量,记住n=0EX0=0; //禁止中断,以免再次进入中断delay(15); //延时0.14ms*15=2.1msif(IRIN==1) //如果在这期间有高电平说明{ //信号不是来自遥控的,返回主程序EX0=1;return;}while(!IRIN){delay(1);} //死循环,等待9ms前导低电平信号的结束for(j=0;j<4;j++) //一共有4组数据{for(k=0;k<8;k++) //每组数据有8位{while(IRIN) {delay(1);} //死循环,等待4.5ms前导高电平的结束while(!IRIN) {delay(1);} //等待0.56ms低电平的结束,准备采集数据,while(IRIN) //开始采集数据{delay(1); //延时0.14ms,每过0.14ms时n就加1n++; //用n记录一共有多少个0.14msif(n>=30) //如果超过0.14ms*30=4.2ms{ //说明是乱码,放弃不要EX0=1;return;}}IRCOM[j]=IRCOM[j]>>1; //右移1位,xxxx xxxx变成0xxx xxx//我们先认为这一位数据是0,现在已经送入一位数据了/*你肯定知道_cror_(x,1)和x>>1的区别吧*/if(n>=8){IRCOM[j]=IRCOM[j]|0x80;}//但是如果不是0呢,//0xxx xxxx和0x80相或后变成了1xxx xxxx//这样这一们数据就被记录为1了/*想一下这里为什么是8呢,0.14ms*8=1.12ms,知道了吧*//*这样反复执行8次,8位数据就存在IRCOM[j]中了*//*外层再循环4次,4*8=32位数据码全都在IRCOM[0],IRCOM[1],IRCOM[2],IRCOM[3]中了*/n=0; //n计数后一定要记得清0,否则下一次就不能准确计数了}}////////////////////////////////////////////////////if(IRCOM[2]!=~IRCOM[3]) //这里我们判断数据码和数据反码是不是相反{ //因为相反才是正确的,否则就放弃EX0=1;return;}beep();EX0=1; //记得开中断,你可以去掉这句话试一试}/**********************************************************/ // 定时中断服务程序/**************************************************************/void timer0() interrupt 1 //定时器0{TH0=(65536-60000)/256;TL0=(65536-60000)%256;show_clock++;//第一个周期 //获得温度if(show_clock==1)now_tem= rd_temperature(); //得到当前温度//第二个周期 //显示处理if(show_clock==2)dis_work();//第三个周期 //显示if(show_clock==3){show();show_clock=0;}}4.2.2 onewire.c 文件#include "reg52.h"sbit DQ = P2^7;//单总线延时函数#ifndef STC12void Delay_OneWire(unsigned int t){}#elsevoid Delay_OneWire(unsigned int t) {unsigned char i;while(t--){for(i=0;i<12;i++);}}#endif//通过单总线向DS18B20写一个字节void Write_DS18B20(unsigned char dat) {unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(5);DQ = 1;dat >>= 1;}Delay_OneWire(5);}//从DS18B20读取一个字节unsigned char Read_DS18B20(void){unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;if(DQ){dat |= 0x80;}Delay_OneWire(5);}return dat;}//DS18B20初始化bit init_ds18b20(void){bit initflag = 0;DQ = 1;Delay_OneWire(12);DQ = 0;Delay_OneWire(80); // 延时大于480usDQ = 1;Delay_OneWire(10); // 14initflag = DQ; // initflag等于1初始化失败Delay_OneWire(5);return initflag;}//DS18B20温度采集程序:整数unsigned char rd_temperature(void){unsigned char low,high;char temp;init_ds18b20();Write_DS18B20(0xCC);Write_DS18B20(0x44); //启动温度转换Delay_OneWire(200);init_ds18b20();Write_DS18B20(0xCC);Write_DS18B20 (0xBE); //读取寄存器low = Read_DS18B20(); //低字节high = Read_DS18B20(); //高字节temp = high<<4;temp |= (low>>4);return temp;}5.参考文献【1】Changing 博文/content/13/0629/23/10906019_296460021.shtml 【2】DS18B20 datasheet【3】AT89s52 datasheet【4】QC1602A datasheet【5】郭天祥网络教程。

相关文档
最新文档