我无线电不懂,红外写过51单片机的收发程序,可我不会制作遥控器···我怎么不能追问啊
2个回答
展开全部
一、 基本原理
1.1 红外编码原理
常用的红外线信号传输协议有 ITT 协议、 NEC 协议、 Nokia NRC 协议、 Sharp 协议、 Philips RC-5 协议、Philips RC-6协议,Philips RECS-80协议,以及 Sony SIRC 协议等。
1)协议组成 :一般由引导码 ,用户码,数据码,重复码或数据码的反码和结束码构成。
2)载波:常用的有33K,36K,36.6K,38K,40K,56K,无载波
3)占空比:常用的有1/3,1/2,不常用1/4
4)调制方式:脉宽调制,相位调制,脉冲位置调制
1.2 红外解码原理
本次作业选用的是NEC协议编码的,由38K载波调制的红外编码。基于51单片机的编码环境,编程语言为C51。 原理框图如下:
1.3 NEC编码方式
引导码,16bit用户码(地址码),8bit命令码(数据码)及其反码。
1) 引导码由一个9ms的载波波形和4.5ms的关断时间构成
2
2) 地址码共16bit,低8位在前,高8位在后。
3) 8bit命令码及其反码
二、 解码环境
2.1 硬件环境
1、 SST89E58RD单片机开发板
2、 HX1838型红外接收头
1) HX1838型红外接收头外形尺寸及引脚排列:
3
2) 应用电路图
3、 电阻、电容等元件
2.2 软件环境
1) Keil u vision2
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
2) C51
C51是为51系列单片机设计的一种C语言
结构化语言,代码紧凑——效率可与汇编语言媲美
接近真实语言,程序可读性强——易于调试、维护
库函数丰富,编程工作量小——产品开发周期短
机器级控制能力,功能很强——适合于嵌入式系统开发
4
与汇编指令无关,易于掌握——在单片机基础上上手快
三、 解码实现
3.1 程序结构框图
定时器20us发
生
一次中断
是否有信号
(低电平)
YES NO
判断是否为引导
码
低电平时间高
于600us
判断命令码为0
或1
储存命令码
解析命令码
在数码管显示
YES
NO
3.2 程序源代码
//NEC 编码红外遥控器解码程序
5
// // 2011-3-26 #include<stdio.h> #include<intrins.h> #include<reg51.h> #define TIMERH 0xed //宏定义定时器高位为237 #define TIMERL 0xed //宏定义定时器低位为237 unsigned char code seg_code[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段码 unsigned char bcode[32]=0; //定义储存二进制命令码数组 unsigned int count,dcode;//定义变量 // 关键变量说明 //en: 接受命令码使能控制 //flag: 接收完毕符号位 unsigned int i,j,en,k,m,flag; //解码数值和数码管显示段码转换 char code_chg(unsigned char ch) { switch(ch) { case 14:return 0; case 16:return 1; case 17:return 2; case 18:return 3; case 20:return 4; case 21:return 5; case 22:return 6; case 24:return 7; case 25:return 8; case 26:return 9; default :return 0; } } // 显示数字断码 void WriteSegData(unsigned char seg) { if(seg>16) seg = 16;
6
seg = seg_code[seg]; P0 = seg; _nop_(); _nop_(); P2 &= 0x1f; _nop_(); _nop_(); P2 |= 0xe0; } // 显示数字位码 void WriteCsData(unsigned char cs) { cs &= 0x0f; P0 = ~cs; _nop_(); _nop_(); P2 &= 0x3f; _nop_(); _nop_(); P2 |= 0xe0; } //初始化定时器 void InitTimer() { TMOD=0x20; //定时器1,工作方式2 TH1=TIMERH; //定时器高位初始化 TL1=TIMERL; //定时器低位初始化 EA=1; //允许中断 ET1=1; //定时器1开中断 // for(m=0;m<32;m++)//初始化存储二进制命令码数组 { bcode[m]=0; } } //定时器中断函数 void timer() interrupt 3 { if((P1&0x80)==0x00) //判断是否为低电位 { P1=P1&0xfe; //点亮二极管e5
7
if(count<100&&en==1)//判断是否为引导码 { count++; } else if(count>=100) //若是引导码则忽略 { en=0; count=0; } } //命令码高电位开始判断前一低电位持续时间 //若在600——800us之间,则为0 //若在1600——1900us之间,则为1 //此处定义时间段是为了抗干扰 else if(((P1&0x80)==0x80)&&en==1) { P1=P1|0x01; //若为高电位,熄灭LED灯e5 if(i<31) { if(count>30&&count<40) //若在600——800us之间,则为0 { bcode[i]=0; //储存二进制命令码 i++; //储存该位编码后,初始化 en=0; count=0; } else if(count>80&&count<95) //若在1600——1900us之间,则为1 { bcode[i]=1; i++; en=0; count=0; } } } else if(((P1&0x80)==0x80)&&en==0) //命令码之前初始化 { en=1; count=0; } else if(i==31) //接收完毕 { flag=1;
8
1.1 红外编码原理
常用的红外线信号传输协议有 ITT 协议、 NEC 协议、 Nokia NRC 协议、 Sharp 协议、 Philips RC-5 协议、Philips RC-6协议,Philips RECS-80协议,以及 Sony SIRC 协议等。
1)协议组成 :一般由引导码 ,用户码,数据码,重复码或数据码的反码和结束码构成。
2)载波:常用的有33K,36K,36.6K,38K,40K,56K,无载波
3)占空比:常用的有1/3,1/2,不常用1/4
4)调制方式:脉宽调制,相位调制,脉冲位置调制
1.2 红外解码原理
本次作业选用的是NEC协议编码的,由38K载波调制的红外编码。基于51单片机的编码环境,编程语言为C51。 原理框图如下:
1.3 NEC编码方式
引导码,16bit用户码(地址码),8bit命令码(数据码)及其反码。
1) 引导码由一个9ms的载波波形和4.5ms的关断时间构成
2
2) 地址码共16bit,低8位在前,高8位在后。
3) 8bit命令码及其反码
二、 解码环境
2.1 硬件环境
1、 SST89E58RD单片机开发板
2、 HX1838型红外接收头
1) HX1838型红外接收头外形尺寸及引脚排列:
3
2) 应用电路图
3、 电阻、电容等元件
2.2 软件环境
1) Keil u vision2
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
2) C51
C51是为51系列单片机设计的一种C语言
结构化语言,代码紧凑——效率可与汇编语言媲美
接近真实语言,程序可读性强——易于调试、维护
库函数丰富,编程工作量小——产品开发周期短
机器级控制能力,功能很强——适合于嵌入式系统开发
4
与汇编指令无关,易于掌握——在单片机基础上上手快
三、 解码实现
3.1 程序结构框图
定时器20us发
生
一次中断
是否有信号
(低电平)
YES NO
判断是否为引导
码
低电平时间高
于600us
判断命令码为0
或1
储存命令码
解析命令码
在数码管显示
YES
NO
3.2 程序源代码
//NEC 编码红外遥控器解码程序
5
// // 2011-3-26 #include<stdio.h> #include<intrins.h> #include<reg51.h> #define TIMERH 0xed //宏定义定时器高位为237 #define TIMERL 0xed //宏定义定时器低位为237 unsigned char code seg_code[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段码 unsigned char bcode[32]=0; //定义储存二进制命令码数组 unsigned int count,dcode;//定义变量 // 关键变量说明 //en: 接受命令码使能控制 //flag: 接收完毕符号位 unsigned int i,j,en,k,m,flag; //解码数值和数码管显示段码转换 char code_chg(unsigned char ch) { switch(ch) { case 14:return 0; case 16:return 1; case 17:return 2; case 18:return 3; case 20:return 4; case 21:return 5; case 22:return 6; case 24:return 7; case 25:return 8; case 26:return 9; default :return 0; } } // 显示数字断码 void WriteSegData(unsigned char seg) { if(seg>16) seg = 16;
6
seg = seg_code[seg]; P0 = seg; _nop_(); _nop_(); P2 &= 0x1f; _nop_(); _nop_(); P2 |= 0xe0; } // 显示数字位码 void WriteCsData(unsigned char cs) { cs &= 0x0f; P0 = ~cs; _nop_(); _nop_(); P2 &= 0x3f; _nop_(); _nop_(); P2 |= 0xe0; } //初始化定时器 void InitTimer() { TMOD=0x20; //定时器1,工作方式2 TH1=TIMERH; //定时器高位初始化 TL1=TIMERL; //定时器低位初始化 EA=1; //允许中断 ET1=1; //定时器1开中断 // for(m=0;m<32;m++)//初始化存储二进制命令码数组 { bcode[m]=0; } } //定时器中断函数 void timer() interrupt 3 { if((P1&0x80)==0x00) //判断是否为低电位 { P1=P1&0xfe; //点亮二极管e5
7
if(count<100&&en==1)//判断是否为引导码 { count++; } else if(count>=100) //若是引导码则忽略 { en=0; count=0; } } //命令码高电位开始判断前一低电位持续时间 //若在600——800us之间,则为0 //若在1600——1900us之间,则为1 //此处定义时间段是为了抗干扰 else if(((P1&0x80)==0x80)&&en==1) { P1=P1|0x01; //若为高电位,熄灭LED灯e5 if(i<31) { if(count>30&&count<40) //若在600——800us之间,则为0 { bcode[i]=0; //储存二进制命令码 i++; //储存该位编码后,初始化 en=0; count=0; } else if(count>80&&count<95) //若在1600——1900us之间,则为1 { bcode[i]=1; i++; en=0; count=0; } } } else if(((P1&0x80)==0x80)&&en==0) //命令码之前初始化 { en=1; count=0; } else if(i==31) //接收完毕 { flag=1;
8
2016-01-10
展开全部
1mol;1.204×1024;10mol;17g;HCl;水;硝酸盐;含有氢原子的量0.2mol×3=0.6mol;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询