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

上传人:精*** 文档编号:849606 上传时间:2023-09-10 格式:DOC 页数:26 大小:2MB
下载 相关 举报
基于单片机的红外解码温度及液晶显示设计.doc_第1页
第1页 / 共26页
基于单片机的红外解码温度及液晶显示设计.doc_第2页
第2页 / 共26页
基于单片机的红外解码温度及液晶显示设计.doc_第3页
第3页 / 共26页
基于单片机的红外解码温度及液晶显示设计.doc_第4页
第4页 / 共26页
基于单片机的红外解码温度及液晶显示设计.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

1、摘要:随着数字时代的推进,单片机的应用正在在不断走向深处。红外和液晶显示技术也被广泛应用在电子领域,本次设计实现的功能是环境温度和红外码值得液晶显示,可以在此基础之上实现更多的控制,设计的内容简单实用,尤其是环境温度显示。关键词:单片机,红外解码,液晶显示,温度显示,时序目录1.概述11.1功能描述21.2单片机资源22.1管脚图23.1. 使用资源22.原理篇32.1红外发送及接收32.1.1红外接收概述32.1.2硬件及原理图52.1.3红外中断接收部分程序52.2温度原理62.2.1 DS18B20 的主要特性62.2.2原理图与硬件72.2.3 DS18B20时序和程序72.2.3.1

2、初始化时序及程序72.2.3.2写/读时序及写/读一字节程序82.3 QC1602A102.3.1 1602外部结构及管脚说明102.3.2 写命令/数据时序与部分程序123.效果图134软件篇144.1程序框图144.1.1 Main函数144.1.2 中断154.1.3 60ms定时中断154.2 完整程序164.2.1 Project.c文件164.2.2 onewire.c 文件235.参考文献251.概述1.1功能描述Lcd液晶显示实时环境温度和接收显示红外遥控器的键值,在收到红外信号时会用蜂鸣器作为反馈,以提醒红外一体接收头有接到信号。1.2单片机资源2.0资源l 与MCS-51单

3、片机产品兼容l 8K字节在系统可编程Flash存储器l 1000次擦写周期l 全静态操作:0Hz33Hzl 三级加密程序存储器l 32个可编程I/O口线l 三个16位定时器/计数器l 八个中断源l 全双工UART串行通道l 低功耗空闲和掉电模式l 掉电后中断可唤醒l 看门狗定时器l 双数据指针l 掉电标识符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 标准:遥控

4、载波的频率为38KHz(占空比为1:3);当某个按键按下时,系统首先发射一个完整的全码,如果键按下超过108ms 仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。一个完整的全码=引导码+用户码+用户码+数据码+数据反码。其中,引导码高电平9ms,低电平4.5ms;系统码8 位,数据码8 位,共32 位;其中前 16 位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。后 16 位为 8 位的操作码和 8 位的操作反码,用于核对数据是否接收准确。收端根据数据码做出应该执行什么动作的判断。连发代码是在持续按键时发送的码。它告知接收端,某键是

5、在被连续地按着。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=0 EX0=0;/禁止中断,以免再次

6、进入中断 delay(15);/延时0.14ms*15=2.1msif(IRIN=1) /如果在这期间有高电平说明 /信号不是来自遥控的,返回主程序 EX0=1; return; while(!IRIN)delay(1); /死循环,等待9ms前导低电平信号的结束/ for(j=0;j4;j+) /一共有4组数据 for(k=0;k=30) /如果超过0.14ms*30=4.2ms /说明是乱码,放弃不要EX0=1;return;IRCOMj=IRCOMj1; /右移1位,xxxx xxxx变成0xxx xxx/我们先认为这一位数据是0,现在已经送入一位数据了/*你肯定知道_cror_(x,1

7、)和x1的区别吧*/if(n=8)IRCOMj=IRCOMj|0x80;/但是如果不是0呢,/0xxx xxxx和0x80相或后变成了1xxx xxxx/这样这一们数据就被记录为1了/*想一下这里为什么是8呢,0.14ms*8=1.12ms,知道了吧*/*这样反复执行8次,8位数据就存在IRCOMj中了*/*外层再循环4次,4*8=32位数据码全都在IRCOM0,IRCOM1,IRCOM2,IRCOM3中了*/n=0; /n计数后一定要记得清0,否则下一次就不能准确计数了 /if(IRCOM2!=IRCOM3) /这里我们判断数据码和数据反码是不是相反 /因为相反才是正确的,否则就放弃EX0=

8、1;return;beep();EX0=1;/记得开中断,你可以去掉这句话试一试2.2温度原理2.2.1 DS18B20 的主要特性(1)适应电压范围更宽,电压范围:3.05.5V,在寄生电源方式下可由数据线供电(2)独特的单线接口方式,DS18B20 在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20 的双向通讯(3)DS18B20 支持多点组网功能,多个DS18B20 可以并联在唯一的三线上,实现组网多点测温(4)DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内(5)温范围55125,在-10+85时精度为0.5(6)可编程的

9、分辨率为912 位,对应的可分辨温度分别为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 =

10、0; DQ = 1; Delay_OneWire(12); DQ = 0; Delay_OneWire(80); / 延时大于480us DQ = 1; Delay_OneWire(10); / 14 initflag = 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= 1;DQ = 1;if(DQ)da

11、t |= 0x80; Delay_OneWire(5);return dat;/通过单总线向DS18B20写一个字节void Write_DS18B20(unsigned char dat)unsigned char i;for(i=0;i= 1;Delay_OneWire(5);2.3 QC1602A 2.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_l

12、cd(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#include #include onewire.h /单总线函数库#define uchar unsigned char#define uint unsigned intuchar code table=

13、temperature:;/液晶uchar code table1=infrared value:; /液晶unsigned char IRCOM7; /定义数组,用来存储红外接收到的数据sbit lcden=P37; /液晶sbit lcdrs=P35; /液晶sbit IRIN=P32; /定义红外接收头的外部接口,即外部中断0sbit BEEP=P25; /定义蜂鸣器接口,我的在P15uchar num; /液晶char show_clock;/显示周期控制char now_tem;/存得到的温度char shinow,genow;/当前温度的十个位char wendu_show_shi

14、,wendu_show_ge;/温度送入液晶的ASCALL码char hongwai_jian_zhi ;/红外送入液晶的ASCALL码void delay_lcd(uint z) /液晶延时uint x,y;for(x=z;x0;x-)for(y=110;y0;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);

15、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;num12;num+)write_data(tablenum);delay_lcd(5);write_com(0x80+0x40);for(num=0;num15;num+)write_data(table1num);delay_lcd(5)

16、;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.14ms while(x-)/不同遥控器应设置不同的参数for(i=0;i13;i+)/参数的选择咱们先不管,先看这个/*/ / 蜂鸣器/*/void beep() unsigned char i; /蜂鸣器发声子程序for(i=0;i100;i+)delay(4);/这个得看你的蜂鸣器内

17、部是否有振荡源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=0x3

18、4;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 :w

19、endu_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 (IRCOM2)case 0x16 :hongwai_jian_zhi=0x30;break;case 0x0c :hongwai_ji

20、an_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 0x4

21、a :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; /

22、定时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=0 EX0=0;/禁止中断,以免再次进入中断 delay(15);/延时0.14ms*15=2.1msif(IRIN=1) /如果在这期

23、间有高电平说明 /信号不是来自遥控的,返回主程序 EX0=1; return; while(!IRIN)delay(1); /死循环,等待9ms前导低电平信号的结束/ for(j=0;j4;j+) /一共有4组数据 for(k=0;k=30) /如果超过0.14ms*30=4.2ms /说明是乱码,放弃不要EX0=1;return;IRCOMj=IRCOMj1; /右移1位,xxxx xxxx变成0xxx xxx/我们先认为这一位数据是0,现在已经送入一位数据了/*你肯定知道_cror_(x,1)和x1的区别吧*/if(n=8)IRCOMj=IRCOMj|0x80;/但是如果不是0呢,/0xx

24、x xxxx和0x80相或后变成了1xxx xxxx/这样这一们数据就被记录为1了/*想一下这里为什么是8呢,0.14ms*8=1.12ms,知道了吧*/*这样反复执行8次,8位数据就存在IRCOMj中了*/*外层再循环4次,4*8=32位数据码全都在IRCOM0,IRCOM1,IRCOM2,IRCOM3中了*/n=0; /n计数后一定要记得清0,否则下一次就不能准确计数了 /if(IRCOM2!=IRCOM3) /这里我们判断数据码和数据反码是不是相反 /因为相反才是正确的,否则就放弃EX0=1;return;beep();EX0=1;/记得开中断,你可以去掉这句话试一试/*/ / 定时中断

25、服务程序/*/void timer0() interrupt 1 /定时器0TH0=(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.hsbit DQ = P27;/单总线延时函数#if

26、ndef STC12 void Delay_OneWire(unsigned int t) while(t-);#elsevoid Delay_OneWire(unsigned int t) unsigned char i;while(t-)for(i=0;i12;i+);#endif/通过单总线向DS18B20写一个字节void Write_DS18B20(unsigned char dat)unsigned char i;for(i=0;i= 1;Delay_OneWire(5);/从DS18B20读取一个字节unsigned char Read_DS18B20(void)unsigned

27、 char i;unsigned char dat; for(i=0;i= 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); / 延时大于480us DQ = 1; Delay_OneWire(10); / 14 initflag = DQ; / initflag等于1初始化失败 Delay_OneWire(5); retu

28、rn 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 = high4); return temp;5.参考文献【1】Changing 博文 【2】DS18B20 datasheet【3】AT89s52 datasheet【4】QC1602A datasheet【5】郭天祥网络教程26

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 学术论文 > 毕业设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922