基于单片机的红外解码温度及液晶显示.docx
- 文档编号:14570510
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:35
- 大小:1.87MB
基于单片机的红外解码温度及液晶显示.docx
《基于单片机的红外解码温度及液晶显示.docx》由会员分享,可在线阅读,更多相关《基于单片机的红外解码温度及液晶显示.docx(35页珍藏版)》请在冰点文库上搜索。
基于单片机的红外解码温度及液晶显示
中国矿业大学徐海学院
技能考核培训
姓名:
顾嘉诚学号:
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.1DS18B20的主要特性9
2.2.2原理图与硬件10
2.2.3DS18B20时序和程序10
2.3QC1602A12
2.3.11602外部结构及管脚说明12
2.3.2写命令/数据时序与部分程序13
3.效果图15
4.软件篇15
4.1程序框图15
4.1.1Main函数15
4.1.2中断16
4.1.360ms定时中断16
4.2完整程序16
4.2.1Project.c文件16
4.2.2onewire.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红外中断接收部分程序
voidIR_IN()interrupt0using0//外部中断0程序
{
unsignedcharj,k,n=0;//先定义变量,记住n=0
EX0=0;//禁止中断,以免再次进入中断
delay(15);//延时0.14ms*15=2.1ms
if(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就加1
n++;//用n记录一共有多少个0.14ms
if(n>=30)//如果超过0.14ms*30=4.2ms
{//说明是乱码,放弃不要
EX0=1;
return;
}
}
IRCOM[j]=IRCOM[j]>>1;//右移1位,xxxxxxxx变成0xxxxxx
if(n>=8){IRCOM[j]=IRCOM[j]|0x80;}//但是如果不是0呢,
//0xxxxxxx和0x80相或后变成了1xxxxxxx
//这样这一们数据就被记录为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;//记得开中断,你可以去掉这句话试一试
}
2.2温度原理
2.2.1DS18B20的主要特性
(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.3DS18B20时序和程序
2.2.3.1初始化时序及程序
//DS18B20初始化
bitinit_ds18b20(void)
{
bitinitflag=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);
returninitflag;}
2.2.3.2写/读时序及写/读一字节程序
//从DS18B20读取一个字节
unsignedcharRead_DS18B20(void)
{
unsignedchari;
unsignedchardat;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
{
dat|=0x80;
}
Delay_OneWire(5);
}
returndat;
}
//通过单总线向DS18B20写一个字节
voidWrite_DS18B20(unsignedchardat)
{
unsignedchari;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
Delay_OneWire(5);
DQ=1;
dat>>=1;
}
Delay_OneWire(5);
}
2.3QC1602A
2.3.11602外部结构及管脚说明
RAM地址映射图
控制器内部带有80*8位的RAM缓冲区
2.3.2写命令/数据时序与部分程序
//写命令
voidwrite_com(ucharcom)//液晶写命令
{
lcdrs=0;
P1=com;
delay_lcd(10);
lcden=1;
delay_lcd(10);
lcden=0;
}
//写数据
voidwrite_data(uchardate)//液晶写数据
{
lcdrs=1;
P1=date;
delay_lcd(10);
lcden=1;
delay_lcd(10);
lcden=0;
}
3.效果图
4.软件篇
4.1程序框图
4.1.1Main函数
4.1.2中断
4.1.360ms定时中断
4.2完整程序
4.2.1Project.c文件
#include
#include
#include"onewire.h"//单总线函数库
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]="temperature:
";//液晶
ucharcodetable1[]="infraredvalue:
";//液晶
unsignedcharIRCOM[7];//定义数组,用来存储红外接收到的数据
sbitlcden=P3^7;//液晶
sbitlcdrs=P3^5;//液晶
sbitIRIN=P3^2;//定义红外接收头的外部接口,即外部中断0
sbitBEEP=P2^5;//定义蜂鸣器接口,我的在P1^5
ucharnum;//液晶
charshow_clock;//显示周期控制
charnow_tem;//存得到的温度
charshinow,genow;//当前温度的十个位
charwendu_show_shi,wendu_show_ge;//温度送入液晶的ASCALL码
charhongwai_jian_zhi;//红外送入液晶的ASCALL码
voiddelay_lcd(uintz)//液晶延时
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//写命令
voidwrite_com(ucharcom)//液晶写命令
{
lcdrs=0;
P1=com;
delay_lcd(10);
lcden=1;
delay_lcd(10);
lcden=0;
}
//写数据
voidwrite_data(uchardate)//液晶写数据
{
lcdrs=1;
P1=date;
delay_lcd(10);
lcden=1;
delay_lcd(10);
lcden=0;
}
voidinit_lcd()//液晶初始化
{
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x10);
write_com(0x80+0x00);
}
voidinit_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;
}
/*voidinit_infrared()//红外初始化
{
IE=0x81;
TCON=0X01;
BEEP=1;
IRIN=1;
}*/
/******************************************/
//红外延时
/*****************************************/
voiddelay(unsignedcharx)
{//延时子程序
unsignedchari;//延时约x*0.14ms
while(x--)//不同遥控器应设置不同的参数
{for(i=0;i<13;i++){}}//参数的选择咱们先不管,先看这个
}
/*******************************************************/
//蜂鸣器
/*******************************************************/
voidbeep()
{
unsignedchari;//蜂鸣器发声子程序
for(i=0;i<100;i++)
{
delay(4);//这个得看你的蜂鸣器内部是否有振荡源
BEEP=~BEEP;
}//如果没有振荡源就应该输入脉冲信号
BEEP=1;
}
/****************************************************/
//温度服务程序
/****************************************************/
voiddis_work()//温度显示处理
{
shinow=now_tem/10;
genow=now_tem%10;
//温度
switch(shinow)
{
case0:
wendu_show_shi=0x30;break;
case1:
wendu_show_shi=0x31;break;
case2:
wendu_show_shi=0x32;break;
case3:
wendu_show_shi=0x33;break;
case4:
wendu_show_shi=0x34;break;
case5:
wendu_show_shi=0x35;break;
case6:
wendu_show_shi=0x36;break;
case7:
wendu_show_shi=0x37;break;
case8:
wendu_show_shi=0x38;break;
case9:
wendu_show_shi=0x39;break;
}
switch(genow)
{
case0:
wendu_show_ge=0x30;break;
case1:
wendu_show_ge=0x31;break;
case2:
wendu_show_ge=0x32;break;
case3:
wendu_show_ge=0x33;break;
case4:
wendu_show_ge=0x34;break;
case5:
wendu_show_ge=0x35;break;
case6:
wendu_show_ge=0x36;break;
case7:
wendu_show_ge=0x37;break;
case8:
wendu_show_ge=0x38;break;
case9:
wendu_show_ge=0x39;break;
}
//红外
switch(IRCOM[2])
{
case0x16:
hongwai_jian_zhi=0x30;break;
case0x0c:
hongwai_jian_zhi=0x31;break;
case0x18:
hongwai_jian_zhi=0x32;break;
case0x5e:
hongwai_jian_zhi=0x33;break;
case0x08:
hongwai_jian_zhi=0x34;break;
case0x1c:
hongwai_jian_zhi=0x35;break;
case0x5a:
hongwai_jian_zhi=0x36;break;
case0x42:
hongwai_jian_zhi=0x37;break;
case0x52:
hongwai_jian_zhi=0x38;break;
case0x4a:
hongwai_jian_zhi=0x39;break;
default:
hongwai_jian_zhi=0x21;break;
}
}
/****************************/
//显示函数
/*****************************/
voidshow()
{
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);
}
/*************************************************/
//主函数
/**************************************************/
voidmain()
{
TMOD=0X01;
TH0=(65536-60000)/256;//定时
TL0=(65536-60000)%256;
EA=1;//定时器0
BEEP=1;
IRIN=1;
EA=1;//开总中断
//开外部中断0
IT0=1;//边沿触发方式
TR0=1;
///////
init_lcd();
//init_infrared();
init_show();
while
(1);
}
/***********************************************************/
//外部中断0红外键值获取
/***********************************************************/
voidIR_IN()interrupt0using0//外部中断0程序
{
unsignedcharj,k,n=0;//先定义变量,记住n=0
EX0=0;//禁止中断,以免再次进入中断
delay(15);//延时0.14ms*15=2.1ms
if(IRIN==1)//如果在这期间有高电平说明
{//信号不是来自遥控的,返回主程序
EX0=1;
return;
}
while(!
IRIN){delay
(1);}//死循环,等待9ms前导低电平信号的结束
//////////////////////////////////////////////////////
for(j=0;j<4;j++)//一共有4组数据
{
for(k=0;k<8;k++)//每组数据有8位
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 红外 解码 温度 液晶显示