基于51单片机红外发射与接收C程序

合集下载

红外遥控和C语言51红外遥控解码程序设计实例

红外遥控和C语言51红外遥控解码程序设计实例

红外遥控和C语言51红外遥控解码程序设计实例红外遥控和C语言51红外遥控解码程序设计实例什么是红外线?人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。

其中红光的波长范围为0.62~0.76μm;比红光波长还长的光叫红外线。

红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码协议,但一般都是由引导码,系统码,键码三部分组成.红外线遥控就是利用波长为0.76~1.5μm之间的近红外线来传送控制信号的。

红外发光二极管一般有黑色、深蓝、透明三种颜色。

红外遥控系统一般分发射和接收两个部分。

发射部分的主要元件为红外发光二极管。

目前大量使用的红外发光二极管发出的红外线波长为940mm左右,外形与普通φ5发光二极管相同。

接收部分的红外接收管是一种光敏二极管。

红外发光二极管一般有圆形和方形两种。

由于红外发光二极管的发射功率一般都较小(100mW左右),所以红外接收二极管接收到的信号比较微弱,因此就要增加高增益放大电路。

最近几年大多都采用成品红外接收头。

成品红外接收头的封装大致有两种:一种采用铁皮屏蔽;一种是塑料封装。

均有三只引脚,即电源正(VDD)、电源负(GND)和数据输出(VO或OUT)。

红外接收头的引脚排列因型号不同而不尽相同,可参考厂家的使用说明。

成品红外接收头的优点是不需要复杂的调试和外壳屏蔽,使用起来如同一只三极管,非常方便。

但在使用时注意成品红外接收头的载波频率。

红外遥控常用的载波频率为38kHz,这是由发射端所使用455kHz晶振来决定的。

在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz?12?37.9kHz?38kHz。

也有一些遥控系统采用36 kHz、40kHz、56 kHz等,由发射端晶振的振荡频率来决定。

红外遥控的特点是不影响周边环境的、不干扰其他电器设备。

室内近距离(小于10米)遥控中得到了广泛的应用。

红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码协议,但一般都是由引导码,系统码,键码三部分组成.引导码是告诉接收机准备接收红外遥控码.系统码是识别码,不同的遥控芯片有不同的误别码,以免搞错.遥控器上不同的按键有不同的键码,系统码和键码都是16位码,8位正码,8位反码.如SC6122的系统码是FF00,FF和00互为反码,键码1为EF10也是互为反码.SC6122的引导码为低电平为9000微秒,高电平为4500微秒.当然高电平不可能精确为9000微秒,在8000微秒到10000微秒都看作是正常范围,低电平在4000-5000之间都看作是正常范围.引导码后的32位编码(16位系统码和16位不管高低电平,载波时间都是560微秒,但低电平持续时间是1125微秒,高键码) 电平持续时间是2250微秒,所以低电平除去载波时间大约是560微秒,高电平除低电平也有一个波动范围,在400-700之间都看作去载波时间大约是1680微秒.是正常的,具体多少可以通过示波器测量出来.高电平也有一个波动范围,在400-2000之间都看作是正常的,具体多少也是根据经验.当然范围越宽,捕捉红外线的范围也越宽,越精确.在捕捉到有高低电平之间,在560-1680之间取一个中间值1120微秒,认为小于1120微秒是低电平,大于1120微秒是高电平.////////////////////////////////////////////////////////红外接收后的数据通过UART发出//晶振:12M//author:cole//date:09.6.6//////////////////////////////////////////////////////#include reg52.h void uart_init(void);#define c(x)(x)sbit Ir_Pin=P3^2;unsigned char Ir_Buf[4];//用于保存解码结果 unsigned int Ir_Get_Low() {TL0=0;TH0=0;TR0=1;while(~Ir_Pin&&(TH0&0x80)==0); TR0=0;return TH0*256+TL0;}//===unsigned int Ir_Get_High(){TL0=0;TH0=0;TR0=1;while(Ir_Pin&&(TH0&0x80)==0); TR0=0;return TH0*256+TL0; }//==main(){unsigned int temp; char i,j;P3=0xff;uart_init();do{restart:while(Ir_Pin);temp=Ir_Get_Low(); if(temp c(8500)||temp c(9500))continue;//引导脉冲低电平9000temp=Ir_Get_High();if(temp c(4000)||temp c(5000))continue;//引导脉冲高电平4500for(i=0;i 4;i++)//4个字节 {for(j=0;j 8;j++)//每个字节8位{temp=Ir_Get_Low();if(temp c(200)||temp c(800))goto restart; temp=Ir_Get_High();if(temp c(200)||temp c(2000))goto restart;Ir_Buf[i]=1;if(temp c(1120))Ir_Buf[i]|=0x80; }}for(i=2;i 4;i++){SBUF=Ir_Buf[i];while(TI==0);TI=0;}}while(1);}///////////////////////////////////////////////////////////UART初始化//波特率:9600/////////////////////////////////////////////////////////void uart_init(void) {unsigned char u;ET1=0;TMOD=0x21;//定时器1工作在方式2(自动重装) SCON=0x50;//10位uart,容许串行接受 TH1=0xFD;TL1=0xFD;u=SBUF;TR1=1;}。

基于51单片机的红外遥控智能小车源程序(C语言)

基于51单片机的红外遥控智能小车源程序(C语言)

/*预处理命令*/#include<reg52.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件#define uchar unsigned char#define uint unsigned int#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};sbit IRIN=P3^2; //红外接收器数据线sbit LCD_RS = P0^7;sbit LCD_RW = P0^6;sbit LCD_EN = P0^5;uchar begin[]={"My car!"};uchar cdis1[]={"jiansu!"};uchar cdis2[]={"qianjin!"};uchar cdis3[]={"jiasu!"};uchar cdis4[]={"zuozhuang!"};uchar cdis5[]={"STOP!"};uchar cdis6[]={"youzhuan!"};uchar cdis8[]={"daoche!"};sbit M1 = P1^0;sbit M2 = P1^1;sbit M3 = P1^2;sbit M4 = P1^3;sbit EN12 = P1^4;sbit EN34 = P1^5;uchar IRCOM[7];uchar m,n;uchar t=2;uchar g;uchar code digit[]={"0123456789"};uint v;uchar count;bit flag;void delayxms(uchar t);void delay(unsigned char x) ;void delay1(int ms);void motor();void lcd_display();/*检查LCD忙状态lcd_busy为1时,忙,等待。

自己写的51单片机的红外线遥控接收程序(C语言)

自己写的51单片机的红外线遥控接收程序(C语言)

//51单片机做的红外遥控实验(C语言)#include<reg51.h>#define u8 unsigned char#define u16 unsigned int#define ID 0x00 //本遥控器的ID号sbit ir=P3^3;code u8 seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9的段码code u8 s[]={1,0x40,0x48,0x04,0x02,0x05,0x54,0x0A,0x1E,0x0E}; u8 buf[4];bit ir_f=0;u8 nu;void delay(u16 x){while(x--);}void show(u16 x){u8 i=0,k=0;u8 s[4];kk:s[i]=x%10;if((x/10)>=1){x=x/10;i++;goto kk;}k=i+1;for(i=0;i<k;i++){P0=seg[s[i]];P2=~(8>>i);delay(300);P0=0XFF;P2=0XFF;}}void timer0_init(){TH0=0;TL0=0;TMOD|=0x01;TR0=0;}u16 low_test(){u16 t;TR0=1;while((ir==0)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0; //t=(TH*256+TL0);//机器周期数return t;}u16 high_test(){u16 t;TR0=1;while((ir==1)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0;return t;}/*u16 time_test(bit x){}*/u8 receive_8bit(){u8 d,i;u16 t;for(i=0;i<8;i++){t=low_test();t=high_test();d>>=1;if((t>=2750)&&(t<=3100)){d|=0x80;}}return d;}void ir_decode(){u16 t;u8 i;if(ir==0)//有遥控信号{t=low_test();//8295-9000us,倍频的是16590-18000if((t>=14500)&&(t<=18000))//检查引导码低电平时间{t=high_test();if((t>=8000)&&(t<=9000))//检查高电平{for(i=0;i<4;i++){buf[i]=receive_8bit();}if(buf[0]==(~buf[1]))//检查系统码是否正确{if(buf[0]==ID){if(buf[2]==(~buf[3])){//具体按键处理ir_f=1; //遥控有效}}}}}}}/*void key(){if(buf[2]==0x40){P1^=(1<<0);}if(buf[2]==0x48){P1^=(1<<1);}}*/void ir_execuse(){if(ir_f==1){switch(buf[2]){case 0x40:P1^=(1<<0);break;case 0x48:P1^=(1<<1);break;case 0x04:P1^=(1<<2);break;case 0x02:P1^=(1<<3);break;case 0x05:P1^=(1<<4);break;case 0x54:P1^=(1<<5);break;case 0x0A:P1^=(1<<6);break;case 0x1E:P1^=(1<<7);break;}ir_f=0;}}void show_d(){u8 j;for(j=0;j<10;j++){if(s[j]==buf[2]){nu=j;break;}}show(nu);}void isr_init(){EA=1;EX1=1;//外部中断,一直看3.3有没有下降沿。

红外收发模块51单片机程序部分

红外收发模块51单片机程序部分

深圳市技新电子科技有限公司www.jixin.pro红外收发模块51单片机程序部分V1.0.0.0红外收发模块51单片机程序部分1、红外收发原理介绍1.1红外接收头决定了通信的频率是38KHZ红外通信模块发射红外光的频率是38KHZ,这个频率是由红外接收探头决定的,市场上还有其他频率的产品这里不讨论。

技小新的红外收发模块上面用的接收头就是这种38KHZ 的,型号是IRM-3638T。

红外发射的探头没有这个频率限制,所以可以用单片机自由控制。

1.2红外通信的流程单片机A控制红外发光管,发射38KHZ频率的光,同时遵守一定的通信规则,比如电影里常见的“摩斯密码”。

红外接收头连接着单片机B,红外接收头收到红外光后会输出一连串的高低电平到单片机B,单片机B根据“摩斯密码”的规则解码。

这样就完成了一次红外通信。

1.3红外载波调制的约定我们使用的通信方式叫做载波调制。

(1)由于发射频率是38KHZ,很容易得出发射一个信号的周期是26.3uS.(2)对于发射端:“载波发射”一个周期是,发光8.77uS+不发光17.53uS。

“载波不发射”一个周期是,26.3uS不发光。

(3)对于接收端:如果收到了一个“载波发射”信号,输出低电平26.3uS。

如果收到了一个“载波不发射”信号(其实就是没有收到信号),输出高电平26.3uS。

真正使用时候要发送一连串的“载波发射”和“载波不发射”,这样接收端输出的是连续的脉冲。

(注意,仅仅一个“载波发射”并不能让接收端正确输出。

)1.4NEC_upd6121红外通信协议。

这是很多遥控器厂商都在使用的协议。

它的协议约定如下:(1)引导码:342个连续“载波发射”+171个“载波不发射”。

接收端的反应是9mS的低电平+4.5mS的高电平。

(2)数据“0”表示为:21个连续“载波发射”+21个连续“载波不发射”。

接收端的反应是:0.56mS的低电平+0.56mS的高电平。

(3)数据“1”表示为:21个连续“载波发射”+64个连续“载波不发射”。

基于51单片机控制红外通信

基于51单片机控制红外通信

精心整理红外通信原理红外遥控有发送和接收两个组成部分。

发送端采用单片机将待发送的二进制信号编码调制为一系列的脉冲串信号,通过红外发射管发射红外信号。

红外接收完成对红外信号的接收、放大、检波、整形,并解调出遥控编码脉冲。

为了减少干扰,采用的是价格便宜性能可靠的一体化红外接收头(HS0038,它接收红外信号频率为38kHz,(2)PPM编码这种遥控编码具有以下特征:遥控编码脉冲由前导码、16位地址码(8位地址码、8位地址码的反码)和16位操作码(8位操作码、8位操作码的反码)组成。

前导码:是一个遥控码的起始部分,由一个9ms的高电平(起始码)和一个4.5ms的低电平(结果码)组成,作为接受数据的准备脉冲。

16位地址码:能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。

16位操作码:用来执行不同的操作。

采用脉宽调制的串行码,以脉宽为0.56ms、间隔0.56ms、周期为1.12ms的组合表示二进制的“0”;以脉宽为1.68ms、间隔0.56ms、周期为2.24ms的组合表示二进制的“1”。

???{???}?}}一串完整的编码如下图所示前导码地址码地址反码操作码操作反码2.红外接收部分:红外接收完成对红外信号的接收、放大、检波、整形,并解调出遥控编码脉冲。

为形得到HS0038#defineuintunsignedintucharram[4]={0,0,0,0};//存放接受到的4个数据地址码16位+按键码8位+按键码取反的8位voiddelaytime(uinttime)//延迟90uS{uchara,b;for(a=time;a>0;a--){for(b=40;b>0;b--);}}voidrem()interrupt0//中断函数{ucharramc=0;//定义接收了4个字节的变量ucharcount=0;//定义现在接收第几位变量{电平return;//}32位中//第一位数据的0.56MS开始脉冲for(ramc=0;ramc<4;ramc++)//循环4次接收4个字节{for(count=0;count<8;count++)//循环8次接收8位(一个字节){while(prem!=1);//开始判断现在接收到的数据是0或者1,首先在这行本句话时,//保已经进入数据的0.56MS低电平阶段//等待本次接受数据的高电平的到来。

51单片机基于红外线的发射与接收控制机顶盒和电视机一体化遥控方案

51单片机基于红外线的发射与接收控制机顶盒和电视机一体化遥控方案

/****************************************************************************** ******************************************************************************* 51单片机基于红外线的发射与接收控制机顶盒和电视机一体化遥控方案实验平台:51单片机开发板实验目的:通过机顶盒遥控器控制与单片机连接的继电器控制机顶盒的电源切断同时单片机的红外发射管控制电视机关闭。

实验连线:红外线一体接收管IR接P3^2;继电器0,1,2分别接P2^7;P2^6,P2^5,采用低电平触发,红外发射管P1^5;实验要点:注意接收管采用的是NEC协议,而发射使用的是TP9012的协议,且载波不同。

NEC协议的载波占空比为1/2,TP9012的协议载波占空比为1/3,可使用逻辑分析仪对载波进行调节。

******************************************************************************* ******************************************************************************/ #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#define uchar unsigned char#define uint unsigned intsbit IR=P3^2; //红外接口标志bit jdq;sbit jdq0=P2^7;sbit jdq1=P2^6;sbit jdq2=P2^5;sbit out=P1^5;//红外线发射端口/*------------------------------------------------全局变量声明------------------------------------------------*/unsigned char irtime;//红外用全局变量bit irpro_ok,irok;unsigned char IRcord[4];unsigned char irdata[33];//************************************************//// 红外线发射程序部分////************************************************///*------------------------------------------------延时函数1ms------------------------------------------------*/void delay(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=120;j>0;j--);}void delay9us(void) //误差0us{unsigned char a;for(a=1;a>0;a--);}void delay560us(void) //560us延迟函数{unsigned char a,b,c;for(c=1;c>0;c--)for(b=2;b>0;b--)for(a=130;a>0;a--);}void delay4500us(void) //4.5ms延迟函数{unsigned char a,b,c;for(c=3;c>0;c--)for(b=136;b>0;b--)for(a=4;a>0;a--);}void khz_2(uint num) //38KHZ脉冲占空比1:3{for(;num>0;num--){out=1;delay9us();out=0;delay9us();}}void send0_a(void) //发送0{khz_2(21) ;out=1;delay560us();}void send1_a(void) //发送1{khz_2(21) ;out=1;delay560us();delay560us();delay560us();}void leadcode_a(void) //发送引导码{khz_2(150) ;out=1;delay4500us();}void overcode(void){out=0;delay(46);leadcode_a();khz_2(12) ;out=1;delay560us();delay560us();delay560us();khz_2(12) ;out=0;}const uchar TabHL1[4]={0x70,0x70,0x30,0xcf};//电视机客户码+用户码+用户反码void Send8Bit(uchar d) //发送一字节数据{if(d&0x80){ send1_a();}else{ send0_a();}if(d&0x40){ send1_a();}else{ send0_a();}if(d&0x20){ send1_a();}else{ send0_a();}if(d&0x10){ send1_a();}else{ send0_a();}if(d&0x08){ send1_a();}else{ send0_a();}if(d&0x04){ send1_a();}else{ send0_a();}if(d&0x02){ send1_a();}else{ send0_a();}if(d&0x01){ send1_a();}else{ send0_a();}}void usercode() //发送用户码{Send8Bit(TabHL1[0]);Send8Bit(TabHL1[1]);}void fashe(){leadcode_a();usercode();Send8Bit(TabHL1[2]);Send8Bit(TabHL1[3]);khz_2(12) ;out=0;}//************************************************// // 红外线接收程序部分////************************************************///*------------------------------------------------函数声明------------------------------------------------*/void Ir_work(void);void Ircordpro(void);/*------------------------------------------------定时器0中断处理------------------------------------------------*/void tim0_isr (void) interrupt 1 using 1{irtime++; //用于计数2个下降沿之间的时间}/*------------------------------------------------外部中断0中断处理------------------------------------------------*/void EX0_ISR (void) interrupt 0 //外部中断0服务函数{static unsigned char i; //接收红外信号处理static bit startflag; //是否开始处理标志位if(startflag){if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5ms 63 33i=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}/*------------------------------------------------定时器0初始化------------------------------------------------*/void TIM0init(void)//定时器0初始化{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1; //开中断TR0=1;}/*------------------------------------------------外部中断0初始化------------------------------------------------*/void EX0init(void){IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1; //使能外部中断EA = 1; //开总中断}/*------------------------------------------------键值处理------------------------------------------------*/void Ir_work(void)//红外键值散转程序{switch(IRcord[2])//判断第三个数码值{case0x45:jdq=~jdq;if(jdq){delay(100);jdq0=0;jdq1=0;jdq2=0;fashe();delay(100);}break;//1 显示相应的按键值default:break;}irpro_ok=0;//处理完成标志}/*------------------------------------------------红外码值处理------------------------------------------------*/void Ircordpro(void)//红外码值处理函数{unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差value|=0x80;if(j<8){value>>=1;}k++;}IRcord[i]=value;value=0;}irpro_ok=1;//处理完毕标志位置1}/*------------------------------------------------主函数------------------------------------------------*/void main(void){EX0init(); //初始化外部中断TIM0init();//初始化定时器jdq=0;while(1)//主循环{//if(work==1)//{delay(5);if(work==1){if(!jdq){jdq0=1;jdq1=1;jdq2=1;}if(irok) //如果接收好了进行红外处理{Ircordpro();irok=0;}if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{Ir_work();}}}// else//{// jdq0=1;// jdq1=1;// jdq2=1;// ET0=0;// PCON=0x02;//}//}}。

STC单片机51简单的红外遥控发射程序C语言

STC单片机51简单的红外遥控发射程序C语言
for (j=0;j<43;j++) {s1=1;s1=1;Delay13us();} //高电平0.565ms无载波
}
void H(){ //红外1; 以低电平0.565ms,高电平1685表示1
uchar j;
for (j=0;j<43;j++) {s1=~s1;Delay13us();} //低电平0.565ms载波,模拟38KHZ
{
uint j;
while(1){
Delay3000ms();
//以下开始发送
for (j=0;j<692;j++) {s1=~s1;Delay13us();}//载波发送9ms的起始码
for (j=0;j<346;j++) {s1=1;Delay13us();} //无载波发送4.5ms的结果码
for (j=0;j<173;j++) {s1=1;Delay13us();} //2.25ms
for (j=0;j<44;j++) {s1=~s1;Delay13us();}//结束位
for (j=0;j<7400;j++) {s1=1;Delay13us();} //在延时96.2ms到108ms,在发送连发码
for (j=0;j<692;j++) {s1=~s1;Delay13us();}//载波发送9ms的起始码
for (j=0;j<173;j++) {s1=1;Delay13us();} //2.25ms
for (j=0;j<44;j++) {s1=~s1;Delay13us();}//结束位

51单片机红外数据收发程序(NEC标准)

51单片机红外数据收发程序(NEC标准)

发射部分程序:/********************************************************* FUNCTION: 红外数据发送 * DESCRIPTION: * HARDWAER: * PROGRAMMER: XXC * DATE: 2010-9-6 * COPYRIGHT: no * **********************************************************/;---------------------------------------------------------- ;存储空间定义DSEG AT 30HSend BIT P2.0LedSend BIT P2.1;---------------------------------------------------------- ;主程序CSEG AT 0000HORG 0000HAJMP L_MainORG 0030HL_Main: MOV SP,#60HMOV DPTR,#T_SendBufferMOV R1,#08H ;发送1字节数据(先低位后高位)MOV R2,#00H;发送4字节L_Loop1:CLR LedSend ;开LED指示NOPNOPSETB SendLCALL F_Delay4500us ;引导码LCALL F_Delay4500usCLR SendLCALL F_Delay4500usL_Loop2:MOV A,R2MOVC A,@A+DPTRL_Loop3:SETB SendLCALL F_Delay560us ;560usCLR SendRRC AJC L_Next1LCALL F_Delay560usLJMP L_Next2L_Next1:LCALL F_Delay1680usL_Next2:DJNZ R1,L_Loop3INC R2CJNE R2,#04H,L_Loop2SETB Send ;560us高电平结束LCALL F_Delay560usCLR SendSETB LedSend ;关LED指示LJMP $/*INT_Int0:PUSH ACCPUSH PSWCPL LED1POP PSWPOP ACCRETI*/;---------------------------------------------------------- ;延时约4500usF_Delay4500us:MOV R7,#20L_Delay4500:MOV R6,#225DJNZ R6,$DJNZ R7,L_Delay4500RET;---------------------------------------------------------- ;延时约560usF_Delay560us:MOV R7,#2L_Delay560:MOV R6,#140DJNZ R6,$DJNZ R7,L_Delay560RET;---------------------------------------------------------- ;延时约1680usF_Delay1680us:LCALL F_Delay560usLCALL F_Delay560usLCALL F_Delay560usRET;---------------------------------------------------------- ;延时约1sF_Delay1s:MOV R7,#5L_Delay1s1:MOV R6,#200L_Delay1s2:MOV R5,#250DJNZ R5,$DJNZ R6,L_Delay1s2DJNZ R7,L_Delay1s1RET;-----------------------------------------------;红外发送区数据T_SendBuffer:DB 0FH,0F0H ;用户码及反码DB 56H,0A9H ;操作码及反码END ;结束接收部分程序:/********************************************************* FUNCTION: 红外数据接收程序 * DESCRIPTION: * HARDWAER: * PROGRAMMER: XXC * DATE: 2010-9-7 *COPYRIGHT: no * **********************************************************/;---------------------------------------------------------- ;存储空间定义DSEG AT 30HF_Re BIT P3.2LED1 BIT P2.6R_Receive: DS 4 ;红外数据接收空间;---------------------------------------------------------- ;主程序CSEG AT 0000HORG 0000HAJMP L_MainORG 0003H ;INT0入口LJMP INT_Int0ORG 0030HL_Main: MOV SP,#60HSETB EASETB EX0SETB IE0 ;下降沿触发MOV DPTR,#T_CodeL_LoopMain:;------------------------MOV R1,#R_Receive+2MOV A,@R1ANL A,#0FH ;屏蔽高4位MOVC A,@A+DPTRMOV P1,A;------------------------;CPL P2.5;LCALL F_Delay300msLJMP L_LoopMain;---------------------------------------------------------- ;外部中断0;Function: NEC红外解码.黑色遥控器用户码FFH,00H;P3.2接外部中断INT_Int0:PUSH ACCPUSH PSWMOV R0,#R_ReceiveMOV R3,#08HMOV R4,#04HLCALL F_Delay8000usJB F_Re,L_ExitINT0 ;非引导码退出JNB F_Re,$LCALL F_Delay2500usJNB F_Re,L_ExitINT0 ;遇简码退出JB F_Re,$CLR LED1 ;open LED1L_NextBit:JNB F_Re,$LCALL F_Delay840usJB F_Re,L_Next1MOV C,F_ReLJMP L_Next2L_Next1:MOV C,F_ReLCALL F_Delay1100usL_Next2:RRC A ;先收低位DJNZ R3,L_NextBitMOV @R0,AINC R0MOV R3,#08HDJNZ R4,L_NextBitL_ExitINT0:SETB LED1 ;close LED1POP PSWPOP ACCRETI;---------------------------------------------------------- ;延时约8000usF_Delay8000us:MOV R7,#20L_Delay8000:MOV R6,#200DJNZ R6,$DJNZ R7,L_Delay8000RET;---------------------------------------------------------- ;延时约840us。

51单片机红外遥控程序

51单片机红外遥控程序
;=================================================
;遥控执行部份
IR_GOTO
;这里还要判断1AH和1BH两个系统码或用户码,用于识别不同的遥控

;MOV A,1AH
;CJNE A,#xxH,IR_ERROR ;用户码1不对则退出
;MOV A,1BH
单片机采用外部中断INTI管脚和红外接收头的信号线相连,中断方式为边沿触发方式。并用定时器0计算中断的间隔时间,来区分前导码、二进制的“1”、“0”码。并将8位操作码提取出来在数码管上显示。
// 解码值在Im[2]中,当IrOK=1时解码有效。
/* 51单片机红外遥控解码程序 */
//用遥控器对准红外接收头,按下遥控器按键,在数码管前两位上就会显示对应按键的编码
MOV R7,#202
DELAY882_A
NOP
NOP
DJNZ R7,DELAY882_A
RET
;=============================1000
DELAY1000 ;1.085x ((229x4)+5)=999.285
MOV R7,#229
DELAY1000_A
NOP
NOP
DJNZ R7,DELAY1000_A
上述“0”和“1”组成的
32位二进制码经
38kHz的载频进行二次调制以提高发
射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空
间发射,如图
3所示。

3遥控信号编码波形图
UPD6121G产生的遥控编码是连续的
32位二进制码组,其中前
16位为用
户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。该芯片的用

基于51单片机红外发射程序

基于51单片机红外发射程序

基于51单片机红外发射程序#include "reg52.h"sbit ir=P2^0;//红外发射管控制脚,使用24M晶振sbit led = P2^1;sbit ka=P1^0;sbit kb=P1^1;sbit kc=P1^2;sbit kd=P1^3;unsigned int count, set_count; //中断计数,设定中断次数bit irflag,keyflag; //红外发送标志位,按键标志位unsigned char irsys[]={0x00,0xff};//16位用户码unsigned char irdata,ircode; //发送的红外数据//---------------------------------------------------------------------------void delay(unsigned int a)//延时约1ms,晶振24M ,此处延时不需很精确{unsigned char i;while(--a!=0)for(i=300;i>0;i--); //若是12M晶振i=125}//---------------------------------------------------------------------------void keyscan() // 按键扫描{if(ka==0){ delay(5);while(!ka);keyflag=1;irdata=0x0a;} //a键按下,则发射数据0x0aif(kb==0){ delay(5);while(!kb);keyflag=1;irdata=0x0b;} //a键按下,则发射数据0x0aif(kc==0){ delay(5);while(!kc);keyflag=1;irdata=0x0c;} //a键按下,则发射数据0x0aif(kd==0){ delay(5);while(!kd);keyflag=1;irdata=0x0d;} //a键按下,则发射数据0x0a}//---------------------------------------------------------------------------void ir_sendbyte() //红外发送一个字节数据{unsigned char i;for(i=0;i<8;i++) //发送8位数据{set_count=43;//35; //发送编码中的0.56ms高电平(//后为12M 晶振下的数值)irflag=1; //启动红外发射二极管发射count=0; //中断计数先清0TR0=1; //开启定时器0while(count<="">TR0=0; //关闭定时器0if(ircode&0x01) set_count=130;//130; //判断红外编码最低位,若为1则1.69ms的低电平(//后为12M晶振下的数值)else set_count=43;//35; //为0则0.565ms的低电平(//后为12M 晶振下的数值) irflag=0; //低电平则不发射count=0; //中断计数清0TR0=1; //开启定时器0while(count<="">TR0=0; //关闭定时器0ircode=ircode>>1; //将数据右移,即从低位到高位发送}}//---------------------------------------------------------------------------void ir_send() //发送红外数据{set_count=692;//672; //发送编码中的引导码(9ms高电平+4.5ms低电平) (//后为12M晶振下的数值) tc9012irflag=1; //启动红外发射二极管发射count=0; //中断计数清0TR0=1;while(count<set_count);< p="">TR0=0;set_count=346;//336; //发送编码中的4.5ms低电平(//后为12M晶振下的数值)irflag=0; //低电平则不发射count=0;TR0=1;while(count<="">TR0=0;ircode=irsys[0]; //发送16位用户码的前1-8位ir_sendbyte();ircode=irsys[1]; //发送16位用户码的前9-16位ir_sendbyte();ircode=irdata; //发送8位数据码ir_sendbyte();ircode=~irdata; //发送8位数据反码ir_sendbyte();set_count=43;//35; //发送编码中的0.56ms高电平(//后为12M 晶振下的数值)irflag=1;count=0;TR0=1;while(count<set_count);< p="">TR0=0;ir=1;delay(23); //延时23ms(编码中的23ms低电平)set_count=692;//670; //发送编码中的引导码(9ms高电平+4.5ms低电平) (//后为12M晶振下的数值)irflag=1;count=0;TR0=1;while(count<set_count);< p="">TR0=0;set_count=346;//336; //发送编码中的4.5ms低电平(//后为12M晶振下的数值)irflag=0;count=0;TR0=1;while(count<set_count);< p="">TR0=0;set_count=43;//35; //发送编码中的0.56ms高电平(//后为12M 晶振下的数值) irflag=1;count=0;TR0=1;while(count<set_count);< p="">TR0=0;ir=1; //发射完了关闭红外发射二极管}//---------------------------------------------------------------------------void timer0_init() //定时器初始化{EA=1;TMOD=0x02; //定时0 8位自动重装模式ET0=1;TH0=0xe6;//0xf3; //定时13us,38K红外矩形波,晶振24M (//后为12M晶振下的数值) TL0=0xe6;}//---------------------------------------------------------------------------void main(){timer0_init(); //定时0初始化count=0; //中断计数先清0irflag=0; //红外发射标志先置0while(1){keyscan(); //键值扫描if(keyflag) //若有按键按下{led = 0;delay(10);ir_send(); //发送红外编码delay(500);keyflag=0; //按键标志清零delay(100);}else{led = 1;}}}//---------------------------------------------------------------------------void timer0() interrupt 1 //定时器0中断{count++;if(irflag==1) ir=~ir; //有发射标志,则发射38khz的矩形波else ir=1; //否则不发射,即相当于发射编码中的低电平}</set_count);<></set_count);<></set_count);<></set_count);<></set_count);<>。

51单片机的红外收发C程序

51单片机的红外收发C程序
void delay(unsigned int tt) //
{
while(--tt);
}
void main(void)
{
signalBit=0;
P2_2= 0;
设定定时器 TMOD=0x12;// 1 和 0 工作方式为 1 和 2
EX1=1;
定时器 中断允许 IT1=1;
ET0 =1; //
0
ET1 =1;
1
}
}
a[i]=temp; //将解码出的字节值储存在 a[i]
temp=0;
}
解码正确,返回 if(a[2]==~a[3])
return 1; //
1
else return 0;
}
/************************************************************
case 0x7d: SendIRdata(irData); break;
case 0xeb: SendIRdata(irData); break;
case 0xdb: SendIRdata(irData); break;
case 0xbb: SendIRdata(mazhi); break;
case 0x7b: SendIRdata(mazhi); break;
保存高电平宽度 HighTime=TH0*256+TL0; //
if((LowTime<300)||(LowTime>620))
if((HigrheTtuirmne0>;3/0/如0)果&&低(H电ig平hT长im度e<不6在20合)) /理/如范果围高,电则平认时为间出在错5,60停微止秒解左码右, 即计数 / = 560 1.085 516 次

51单片机的红外收发C程序_带仿真图

51单片机的红外收发C程序_带仿真图

发射部分#include <reg52.h>sbit P2_2=P2^2;sbit signalBit=P2^1; //发送信号标志位sbit LED=P3^7; //使能信号位,将E位定义为P2.2引脚unsigned char irData[]={0x14,0xeb,0xf0,0x0f}; //存放所有的控制码unsigned char mazhi[]={0x33,0x22,0xeb,0x14};unsigned char key,send_flag=0;void SendIRdata(unsigned char irdata[4]); //红外发射函数void anjian_send(unsigned char flag);void delay(unsigned int tt) //延时函数{while(--tt);}void main(void){signalBit=0;P2_2= 0;TMOD=0x12;//设定定时器1和0工作方式为1和2EX1=1;IT1=1;ET0 =1; //定时器0中断允许ET1 =1;TH0= 0xf4;TL0= 0xf4; //设定时值0为38K 也就是每隔13us中断一次周期为26us TR0= 0;//先关闭定时器0TR1= 0;IP=0X01;EA=1; //允许CPU中断LED=0;while(1){P1=0XF0;if(send_flag==1){anjian_send(key);send_flag=0;}}}void anjian_send(unsigned char flag){unsigned char zhi=flag;switch(zhi){case 0xee: SendIRdata(irData); break;case 0xbe: SendIRdata(irData); break;case 0xde: SendIRdata(irData); break;case 0x7e: SendIRdata(irData); break;case 0xed: SendIRdata(irData); break;case 0xdd: SendIRdata(irData); break;case 0xbd: SendIRdata(irData); break;case 0x7d: SendIRdata(irData); break;case 0xeb: SendIRdata(irData); break;case 0xdb: SendIRdata(irData); break;case 0xbb: SendIRdata(mazhi); break;case 0x7b: SendIRdata(mazhi); break;case 0xe7: SendIRdata(mazhi); break;case 0xd7: SendIRdata(mazhi); break;case 0xb7: SendIRdata(mazhi); break;case 0x77: SendIRdata(mazhi); break;}}/******* 定时器1中断处理***********/void isr_T1(void) interrupt 3{}/******* 定时器0中断处理38K载波发生器***********/ void timeint(void) interrupt 1{P2_2=~P2_2; //产生38k的载波信号}/**************** 中断1 键盘的扫描********************/ void Int1(void) interrupt 2{unsigned char l,h;P1=0XF0;l=P1;l=l&0xf0;if(l!=0xf0){delay(10);if(l!=0xf0){l=P1&0xf0;l=l|0x0f;P1=l;h=P1;h=h&0x0f;l=l&0xf0;key=h+l;send_flag=1;LED=~LED;}}}/********* 红外发射函数************/void SendIRdata(unsigned char *mData){unsigned char i,j;unsigned char test[4];for(i=0;i<4;i++)test[i]=mData[i];TR0=1; //开定时器T0 输出38K载波/********* 发送9ms的高电平************/TH1=0XDF; //装入初值设置波延时为9msTL1=0XE3;TR1=1; //启动T1工作定时所需时间signalBit=1; //发送信号while(!TF1);TF1=0;/********* 发送4.5ms的低电平*************/TH1=0xef;TL1=0xf0;signalBit=0;while(!TF1);TF1=0;/********* 发送用户码控制码控制反码***********/for(j=0;j<4;j++)//发送十六位地址的前八位{for(i=0;i<8;i++){//先发送0.565ms的38KHZ红外波(即编码中0.565ms的高电平)TH1=0XFE;TL1=0X70;signalBit=1;while(!TF1);TF1=0;//停止发送红外信号(即编码中的高电平)if(test[j]&0x01) //判断二进制数个位为1还是0{TH1=0XFA; // //1为宽的低电平,持续时间1.685msTL1=0X30;}else{TH1=0XFE; //0为窄的低电平,持续时间0.56msTL1=0x50;}signalBit=0;while(!TF1);TF1=0;test[j]=test[j]>>1;}}TR1=0; //发送停止位关闭定时器T0signalBit=1;delay(100);signalBit=0;TR0=0; //关闭定时器T1}检测部分#include<reg52.h> //包含单片机寄存器的头文件#define uchar unsigned char#define uint unsigned intsbit IR=P3^2; //将IR位定义为P3.2引脚sbit rs=P2^4; //寄存器选择位,将RS位定义为P2.0引脚sbit rw=P2^5; //读写选择位,将RW位定义为P2.1引脚sbit e=P2^6; //使能信号位,将E位定义为P2.2引脚sbit LED=P2^0; //使能信号位,将E位定义为P2.2引脚unsigned char code string[ ]= "1602IR-CODE TEST";unsigned char code smg[]="code:";unsigned char code MA[]="0123456789ABCDEF";unsigned char a[4]; //储存用户码、用户反码与键数据码、键数据反码unsigned int LowTime,HighTime; //储存高、低电平的宽度0-65535void delay(unsigned int tt){while(--tt);}void w_cmd(unsigned char dd){rs=0;rw=0;e=0;P0=dd;delay(50);e=1;delay(50);e=0;}void w_dat(unsigned char dd){rs=1;rw=0;e=0;P0=dd;delay(50);e=1;delay(50);e=0;}void disp_ma(uchar *p,uchar hang,uchar wei){if(hang==1)w_cmd(0x80+wei);if(hang==2)w_cmd(0xc0+wei);while(*p!='\0'){w_dat(*p);p++;}}void init_LCD(void){w_cmd(0x38);delay(1000);w_cmd(0x38);delay(300);w_cmd(0x38);//注意顺序,设置工作方式,显示模式设置delay(300);w_cmd(0x08);//注意顺序,关闭显示w_cmd(0x01);//清屏w_cmd(0x06);//光标·画面滚动模式设置w_cmd(0x0c);//显示及光标模式设}/************************************************************函数功能:对4个字节的用户码和键数据码进行解码说明:解码正确,返回1,否则返回0出口参数:dat*************************************************************/bit DeCode(void){unsigned char i,j;unsigned char temp=0; //储存解码出的数据for(i=0;i<4;i++) //连续读取4个用户码和键数据码{for(j=0;j<8;j++) //每个码有8位数字{temp=temp>>1; //temp中的各数据位右移一位,因为先读出的是低位数据TH0=0; //定时器清0TL0=0; //定时器清0TR0=1; //开启定时器T0while(IR==0) ;//如果是低电平就等待低电平计时TR0=0; //关闭定时器T0LowTime=TH0*256+TL0; //保存低电平宽度TH0=0; //定时器清0TL0=0; //定时器清0TR0=1; //开启定时器T0while(IR==1); //如果是高电平就等待TR0=0; //关闭定时器T0HighTime=TH0*256+TL0; //保存高电平宽度if((LowTime<300)||(LowTime>620))return 0; //如果低电平长度不在合理范围,则认为出错,停止解码if((HighTime>300)&&(HighTime<620)) //如果高电平时间在560微秒左右,即计数560/1.085=516次{temp=temp&0x7f; //(520-100=420, 520+100=620),则该位是0}if((HighTime>1300)&&(HighTime<1850)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次{temp=temp|0x80; //(1550-250=1300,1550+250=1800),则该位是1}}a[i]=temp; //将解码出的字节值储存在a[i]temp=0;}if(a[2]==~a[3])return 1; //解码正确,返回1else return 0;}/************************************************************函数功能:1602LCD显示*************************************************************/void Disp(void){w_cmd(0xc5); // 设置显示位置为第二行的第6个字w_dat(MA[(a[0]>>4)]);w_dat(MA[(a[0]&0x0f)]);w_dat(0x20);w_dat(MA[(a[1]>>4)]);w_dat(MA[(a[1]&0x0f)]);w_dat(0x20);w_dat(MA[(a[2]>>4)]);w_dat(MA[(a[2]&0x0f)]);w_dat(0x20);w_dat(MA[(a[3]>>4)]);w_dat(MA[(a[3]&0x0f)]);}/************************************************************函数功能:主函数*************************************************************/void main(){init_LCD(); //调用LCD初始化函数disp_ma(string,1,0);disp_ma(smg,2,0);EX0=1; //开外中断0ET0=1; //定时器T0中断允许IT0=1; //外中断的下降沿触发TMOD=0x01; //使用定时器T0的模式1TR0=0; //定时器T0关闭EA=1; //开启总中断while(1); //等待红外信号产生的中断}/************************************************************函数功能:红外线触发的外中断处理函数*************************************************************/void Int0(void) interrupt 0{EX0=0; //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号TH0=0; //定时器T0的高8位清0TL0=0; //定时器T0的低8位清0TR0=1; //开启定时器T0while(IR==0); //如果是低电平就等待,给引导码低电平计时TR0=0; //关闭定时器T0LowTime=TH0*256+TL0; //保存低电平时间TH0=0; //定时器T0的高8位清0TL0=0; //定时器T0的低8位清0TR0=1; //开启定时器T0while(IR==1); //如果是高电平就等待,给引导码高电平计时TR0=0; //关闭定时器T0HighTime=TH0*256+TL0; //保存引导码的高电平长度if((LowTime>7500&&LowTime<10000)&&(HighTime>3500&&HighTime<5000)){//次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.if(DeCode()==1) // 执行遥控解码功能Disp();//调用1602LCD显示函数}EX0=1; //开启外中断EX0}。

红外线发射与接收C51用C语言解决方案

红外线发射与接收C51用C语言解决方案

//红外线延时函数,延时 0.56 毫秒
//红外线延时函数,延时 0.5 毫秒
delay_ms(9); rfot=1; delay_ms(4); delay_50(); } void a_key() { uint i; bit_boot(); for(i=0;i<8;i++) { rfot=0; delay_56(); rfot=1; delay_56(); } for(i=0;i<8;i++) { rfot=0; delay_56(); rfot=1; delay_112(); } rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_56(); rfot=0; delay_56(); rfot=1; delay_112(); rfot=0; //A 键编码
现在大家已经知道了每个键的编码,在写程序之前,先要说一下有关红外线发射的知识,我 想大家对这些知识应该是很了解的了,在这里补充说一下是为了在下一步写程序是大家能明白我 的思路是对还是错? 再不考虑发射芯片的型号,就用大家常用的编码方式: 首先先来说说引导区,如下图:
图 二 每个按键在被按下之后首先会有像上图所的信号发出,称为引导区,实际生活中,用遥控器 发出的信号与上面的信号是相反的,经过红外线接收头解码以后就和上图一样了,值得大家注意 的是发射模块的芯片不同,引导区的时间和数据都有所不同,但解决的方法都是一样的。 在写程序是就按照上面的图来写: P1^6=0; Delay(); //延时 9mS P1^6=1; Delay(); //延时 4.5mS

基于51单片机红外发射与接收C程序(word文档良心出品)

基于51单片机红外发射与接收C程序(word文档良心出品)
}
}
//khz(116);//3.028ms精确的时间
//khz(64);//2.006ms
//khz(40); //1.052ms
//delayms(125);//2.012ms这里是一些时间的介绍
//delayms(65);//1.054ms
//delayms(93);//1.5ms
void fashu(uchar num)
}
}
void main()
{
init();
//delayms(45);//0.642ms
//delayms(35);//0.502ms
//delayms(115);//1.623ms
//delayms(72);//1.02ms
//delayms(84);//1.188ms
//delayms(31);//0.446ms
sbit key1=P3^3;
sbit key2=P3^4;
sbit key3=P3^5;
sbit LED=P1^0; //发射指示灯
sbit out=P3^7;
uchar i,a,num1;
void init()//初始化作用
{
key1=1;
key2=1;
key3=1;
}
void delay(uchar aa)
tishi();
}
}
}
void main()
{
init();
while(1)
{
keyscan();
}
}
红外接收程序
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char

基于51单片机的红外遥控编码解码的C语言程序和电路

基于51单片机的红外遥控编码解码的C语言程序和电路

请勿转载!!!作品功能简介:当学习键按下后,红外接收头便可将接受到的信号存储到单片机中。

在接受到通用遥控器发出的信号后,如果按下发射键,单片机将调出刚刚储存的信息,通过红外发射头发射出和遥控器一样的信号来达到控制的作用。

#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit studylamp=P2^7;sbit lamp=P2^6;sbit studykey=P3^2;sbit remotein=P1^1;sbit remoteout=P1^0;sbit txkey=P2^0;uint i,j,m=255,n,k,s;uchar idata remotedata[206];uint head;uint remdata;//一毫秒延时程序delay1ms(uint t){for(i=0;i<t;i++)for(i=0;j<120;j++);}//初始化函数clearmen(){studylamp=1;lamp=1;remoteout=0;remotein=1;for(i=0;i<206;i++){remotedata[i]=0x00;}IE=0x00;IP=0x01;TMOD=0x22;PCON=0X00;TH1=0xf3;TL1=0xf3;IT0=1;EX0=1;EA=1;}//键功能函数void key_tx(){if(txkey==0){delay1ms(1);if(txkey==0){while(txkey==0);ET1=1;TR1=1;for(i=head;i>0;i--);remoteout=0;ET1=0;TR1=0;n=0;while(1){lamp=0;studylamp=1;if(remotedata[n]==0x00){delay1ms(10);break;}for(i=remotedata[n];i>0;i--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}n++;ET1=1;TR1=1;for(i=remotedata[n];i>0;i--);remoteout=0;ET1=0;TR1=0;n++;}}}}//主函数void main(){clearmen(); //初始化while(1){key_tx(); //按键扫描}}//40KHz发生器void time_intt1(void) interrupt 3{remoteout=~remoteout;}//外中断0void intt0(void) interrupt 0{ET1=0;TR1=0;EX0=0;EA=0;head=0;while(studykey==0);studylamp=0;lamp=1;while(remotein==1);head=0;while(remotein==0){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();head++;}n=0;remdata=0x0000;while(1){while(remotein==1){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();remdata++;}if(remdata>m) //高电平>5毫秒退出{remotedata[n]=0x00;EX0=1;EA=1;goto end;}remotedata[n]=remdata;n++;remdata=0x0000;while(remotein==0){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();remdata++;}remotedata[n]=remdata;n++;remdata=0x00;}end: lamp=0;studylamp=0;}电路:实物:2009-06-25 12:39。

51单片机红外接收解码程序C51

51单片机红外接收解码程序C51

51单片机红外接收解码程序(C51)接收以S52单片机作为接收系统。

以S52的P3.3口作为接收端口,该端口是外部中断1。

这个接受程序是以XC866作为红外发送控制系统,接收程序如下:#include; //头文件#include;#define uchar unsigned char //宏定义#define uint unsigned intsbit HWRx=P3^3; //位声明code uchar Table[]= //共阴数码管 0-9 a-f - 表{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6 f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};uchar Table_Data[8]={0,0,0,0,0,0,0,0};//用于显示的数组uchar Table_Rx[67];//用于存储判断接收是1或0的参数void Delay();//延时子函数void Display(uchar *lp,uchar lc)//显示{uchar i; //定义变量P2=0; //端口2为输出,关闭P1=P1&0xF8; //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管for(i=0;i;0x7f)P2+=0x80;Delay(); //延时P2=0; //清0端口,准备显示下位if(i==7) //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据break;P1++; //点亮下一位数码管}}void main() //主函数{EA=1; //首先开启总中断EX1=1; //开启外部中断 1IT1=1; //设置成下降沿触发方式while(1) //一直显示,其它由中断处理{Display(Table_Data,8);}}void Delay() //延时时间大约为31us,晶振12M {uchar i=13;while(i)i--;}void Delay_ms(uint z) //延时时间约为 1ms*X 晶振为12M{uint x=0,y=0;for(x=z;x>;0;x--)for(y=54;y>;0;y--);}void hongwai() interrupt 2 //外部中断 1 ,INT1(P3^3)连接红外线接收IC数据脚{uchar i,j,tmp;EX1=0; //关闭中断j=33; //传送一组数包括引导码1位,4个八位数据,总共33位i=0; //从第一维数组开始Delay_ms(10);if(HWRx){ //然后再检测红线接收脚是有数据招收,有继续,没有则退出EX1=1;return;}while(j--){ //循环接收33位数据,为何我们用到66位数组,我们可以不接收高电平时间常数,只接低电平常数就//可以判断1或0了,在这里我们都接收,还有一点要知道,接收波形是反向,在没有接收时端口为高电平tmp=0;Table_Rx[i]=1; //时间量从1开始while(!HWRx) //检测高低电平的变化,这里检测的是高电平{Table_Rx[i]++; //没变继续加1Delay(); //家一个延时防止,计数值一下子就加满了tmp++; //加1if(tmp==250)break;}i++;tmp=0;Table_Rx[i]=1; //时间量从1开始while(HWRx) //检测高低电平的变化,这里检测的是低电平{Table_Rx[i]++; //没变继续加1Delay(); //同上tmp++; //加1,用于判断是1还是0的,低电平来了if(tmp==250)break;}i++;}P1=0xf8;i=200; //加入循环延时,抗干扰while(i) //在有接收数据的时候显示一个H{tmp=255;while(tmp){tmp--;P2=0x76;}i--;}tmp=0;for(i=3;i;>;=1; //右移一位,接收低位在前if(Table_Rx[i]>;30) //检测低电平时间超过30就确认为1tmp+=0x80;}Table_Data[0]=tmp/16; //分开2位以16进制显示,用显示发送的数据Table_Data[1]=tmp%16;tmp=0;for(i=19;i;>;=1;if(Table_Rx[i]>;30)tmp+=0x80;}Table_Data[2]=tmp/16;Table_Data[3]=tmp%16;tmp=0;for(i=35;i;>;=1;if(Table_Rx[i]>;30)tmp+=0x80;}Table_Data[4]=tmp/16;Table_Data[5]=tmp%16;tmp=0;for(i=51;i;>;=1;if(Table_Rx[i]>;30)tmp+=0x80;}Table_Data[6]=tmp/16;Table_Data[7]=tmp%16;EX1=1; //刚进中断时关闭了分控,现在要打开}。

基于51单片机的红外遥控

基于51单片机的红外遥控

基于51单片机的红外遥控本讲内容:介绍红外遥控的知识,通过例程展示红外遥控程序的编写方法。

红外线简介:在光谱中波长自760nm至400um的电磁波称为红外线,它是一种不可见光。

目前几乎所有的视频和音频设备都可以通过红外遥控的方式进行遥控,比如电视机、空调、影碟机等,都可以见到红外遥控的影子。

这种技术应用广泛,相应的应用器件都十分廉价,因此红外遥控是我们日常设备控制的理想方式。

接收头输出的波形正好和遥控芯片输出的相反。

在这里红外通信采用NEC协议,它的特征如下:信号调制红外遥控信号接收管接口电路:红外信号发射电路 红外信号接收电路例程:红外遥控信号发射:/*****************红外通信——发射*******************单片机型号:STC89C52RC*开发环境:KEIL*名称:红外通信发射*功能:按下按键S4,S5,S6,S8,S9,S10,S11,S13,S14发射对应键值,可以与红外通信——接收程序配套使用***************************************************/#include <REG51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define SBM 0x80 //识别码#define m9 (65536-8294) //约9mS#define m4_5 (65536-4147) //约4.5mS#define m1_6 (65536-1521) //约1.65mS#define m_65 (65536-599) //约0.65mS#define m_56 (65536-516) //约0.56mS#define m40 (65536-36864) //约40mS#define m56 (65536-51610) //56mS#define m2_25 (65536-2074) //约2.25mSconst uchar TabHL1[9]={0x0c,0x18,0x5e,0x08,0x1c,0x5a,0x42,0x52,0x4a};sbit IR=P1^5; //定义发射引脚sbit BEEP=P2^3;void keyscan();void ZZ(uchar x);void Z0(uchar temp);void TT0(bit BT,uint x);void delay(int In,int Out);/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数功能:主函数┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈/ void main(void){TMOD=0x01; //T0 16位工作方式IR=1; //发射端口常态为高电平while(1){keyscan();}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数功能:发送主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈/ void ZZ(uchar x){TT0(1,m9); //高电平9mSTT0(0,m4_5); //低电平4.5mS/*┈发送4帧数据┈*/Z0(SBM);Z0(~SBM);Z0(x);Z0(~x);/*┈┈结束码┈┈*/TT0(1,m_65);TT0(0,m40);}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数功能:单帧发送程序入口参数:1帧数据┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈/ void Z0(uchar temp){uchar v;for (v=0;v<8;v++) //循环8次移位{TT0(1,m_65); //高电平0.65mSif(temp&0x01) TT0(0,m1_6); //发送最低位else TT0(0,m_56);temp >>= 1; //右移一位}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数功能:38KHz脉冲发射 + 延时程序入口参数:(是否发射脉冲,延时约 x (uS))┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈/void TT0(bit BT,uint x){TH0=x>>8; //输入T0初始值TL0=x;TF0=0; //清0TR0=1; //启动定时器0if(BT==0)while(!TF0);//BT=0时不发射38KHz脉冲只延时;BT=1发射38KHz脉冲且延时;else while(1) //38KHz脉冲,占空比5:26{IR = 0;if(TF0)break;if(TF0)break;IR=1;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;}TR0=0; //关闭定时器0TF0=0; //标志位溢出则清0IR =1; //脉冲停止后,发射端口常态为高电平}void keyscan() //按键扫描函数{uchar buffer;/***************************************************/P3=0xfe; //扫描S3,S4,S5,S6;buffer=P3;buffer=buffer & 0xf0;if(buffer!=0xf0){delay(5,10);if(buffer!=0xf0){buffer=P3;switch(buffer){case 0xee:{;}break;case 0xde:{ZZ(TabHL1[0]);}break;case 0xbe:{ZZ(TabHL1[1]);}break;case 0x7e:{ZZ(TabHL1[2]);}break;}while(buffer != 0xf0){buffer=P3;buffer=buffer&0xf0;BEEP=0;}BEEP=1;}}/****************************************************/ P3=0xfd; //扫描S8,S9,S10,S11buffer=P3;buffer=buffer & 0xf0;if(buffer!=0xf0){delay(5,10);if(buffer!=0xf0){buffer=P3;switch(buffer){case 0xed:{ZZ(TabHL1[3]);}break;case 0xdd:{ZZ(TabHL1[4]);}break;case 0xbd:{ZZ(TabHL1[5]);}break;case 0x7d:{ZZ(TabHL1[6]);}break;}while(buffer!=0xf0){buffer=P3;buffer=buffer&0xf0;BEEP=0;}BEEP=1;}}/****************************************************/ P3=0xfb; //扫描S13,S14,S15,S16buffer=P3;buffer=buffer&0xf0;if(buffer!=0xf0){delay(5,10);if(buffer!=0xf0){buffer=P3;switch(buffer){case 0xeb:{ZZ(TabHL1[7]);}break;case 0xdb:{ZZ(TabHL1[8]);}break;}while(buffer!=0xf0){buffer=P3;buffer=buffer&0xf0;BEEP=0;}BEEP=1;}}}void delay(int In,int Out) //定义延时函数{int i,j;for(i=0;i<In;i++){for(j=0;j<Out;j++){;}}}红外遥控信号接收:/*****************红外通信--接收*******************单片机型号:STC89C52RC*开发环境:KEIL*功能:在液晶LCD1602上显示接收到的数值*************************************************/#include<reg52.h>#define LCD_Data P0#define Busy 0x80sbit IR=P3^2;sbit LCD_RS=P1^0;sbit LCD_RW=P1^1;sbit LCD_E=P2^5;void TIM0init(void);void EX0init(void);void SYSinit(void);void delay(int In,int Out);void Delay5Ms(void);void Ir_work(void);void Ircordpro(void);void WriteDataLCD(unsigned char WDLCD);void WriteCommandLCD(unsigned char WCLCD,BuysC);unsigned char ReadDataLCD(void);unsigned char ReadStatusLCD(void);void LCDInit(void);void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData); void Info_display(void);bit IRpro_ok;bit IR_ok;unsigned char IRcord[4];unsigned char IRdata[33];unsigned char codedofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char irtime;unsigned char speed_num=0;unsigned char codemb_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char code welcome[]={"YOU ARE WELCOME"};unsigned char code ir_reve[]={"IR_RECEIVE: "};/*******************5ms延时函数*********************/void Delay5Ms(void){unsigned int TempCyc=3552;while(TempCyc--);}void delay(int In,int Out){int i,j;for(i=0;i<In;i++){for(j=0;j<Out;j++){;}}}/***********************写数据函数***********************/ void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD();LCD_Data=WDLCD;LCD_RS=1;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}/**********************写指令函数************************/ void WriteCommandLCD(unsigned char WCLCD,BuysC){if(BuysC)ReadStatusLCD();LCD_Data=WCLCD;LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}/***********************读状态函数************************/ unsigned char ReadStatusLCD(void){LCD_Data=0xFF;LCD_RS=0;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;while(LCD_Data & Busy);return(LCD_Data);}/************************LCD初始化************************/ void LCDInit(void){LCD_Data=0;WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1);WriteCommandLCD(0x08,1);WriteCommandLCD(0x01,1);WriteCommandLCD(0x06,1);WriteCommandLCD(0x0C,1);}/*******************按指定位置显示一个字符******************/void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData){Y&=0x1;X&=0xF;if(Y)X|=0x40;X|=0x80;WriteCommandLCD(X,0);WriteDataLCD(DData);}/*******************按指定位置显示一串字符******************/void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData) {unsigned char ListLength;ListLength=0;Y&=0x1;X&=0xF;while(DData[ListLength]>=0x20){if(X<=0xF){DisplayOneChar(X,Y,DData[ListLength]);ListLength++;X++;}}}/***********************定时器0初始化***********************/void TIM0init(void){TMOD=0x02;TH0=0x00;TL0=0x00;ET0=1;TR0=1;}/**********************外部中断0初始化**********************/void EX0init(void){IT0=1;EX0=1;EA=1;}/*************************系统初始化*************************/void SYSinit(void){TIM0init();EX0init();LCDInit();}/********************红外信号接收相关函数********************/void Ir_work(void){switch(IRcord[2]){case 0x0C:{DisplayOneChar(12,1,0x31);}break;case 0x18:{DisplayOneChar(12,1,0x32);}break;case 0x5e:{DisplayOneChar(12,1,0x33);}break;case 0x08:{DisplayOneChar(12,1,0x34);}break;case 0x1c:{DisplayOneChar(12,1,0x35);}break;case 0x5a:{DisplayOneChar(12,1,0x36);}break;case 0x42:{DisplayOneChar(12,1,0x37);}break;case 0x52:{DisplayOneChar(12,1,0x38);}break;case 0x4a:{DisplayOneChar(12,1,0x39);}break;default:break;}}void Ircordpro(void){unsigned char i,j,k;unsigned char cord,value;k=1;for(i=0;i<4;i++){for(j=1;j<=8;j++){cord=IRdata[k];if(cord>7)value|=0x80;if(j<8){value>>=1;}k++;}IRcord[i]=value;value=0;}IRpro_ok=1;}/********************红外信号接收相关函数********************/ void main(void){SYSinit();delay(5,100);DisplayListChar(0,0,welcome);DisplayListChar(0,1,ir_reve);while(1){if(IR_ok){Ircordpro();IR_ok=0;}if(IRpro_ok){Ir_work();}}}/********************定时器0中断处理函数********************/ void tim0_isr (void) interrupt 1 using 1{irtime++;}/*******************外部中断0中断处理函数*******************/ void EX0_ISR (void) interrupt 0{static unsigned char i;static bit startflag;if(startflag){if(irtime<63&&irtime>=33)i=0;IRdata[i]=irtime;irtime=0;i++;if(i==33){IR_ok=1;i=0;}}else{irtime=0;startflag=1;}}。

红外遥控编码原理及C程序,51单片机红外遥控

红外遥控编码原理及C程序,51单片机红外遥控

红外遥控解解码程序#include <reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit lcden=P1^0;sbit rs=P1^2;sbit ir=P3^2;sbit led=P1^3;sbit led2=P3^7;unsigned int LowTime,HighTime,x;unsigned char a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;unsigned char flag;//中断进入标志位uchar z[4];uchar code table[]={"husidonghahahah"};uchar code table1[]={"User Code:"};void delay(uint x){uint i,j;for(i=x;i>0;i--) //i=xms即延时约xms毫秒for(j=100;j>0;j--);}void write_com(uchar com){//写液晶命令函数rs=0;lcden=0;P2=com;delay(3);lcden=1;delay(3);lcden=0;}void write_date(uchar date){//写液晶数据函数rs=1;lcden=0;P2=date;delay(3);lcden=1;delay(3);lcden=0;}void init_anjian() //初始化按键{a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;j=0;k=0;l=0;m=0;n=0;o=0;p=0;q=0;r=0;s=0;t=0;u=0;}void init_1602(){//初始化函数uchar num;lcden=0;rs=0;write_com(0x38);//1602液晶初始化write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<14;num++)//写入液晶固定部分显示{write_date(table[num]);delay(3);}write_com(0x80+0x40);for(num=0;num<9;num++){write_date(table1[num]);delay(3);}}void write_dianya(uchar add,char date){//1602液晶刷新时分秒函数4为时,7为分,10为秒char shi,ge;shi=date%100/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void dingshiqi() //定时器记高低电平时间{TH0=0; //定时器高八位置0TL0=0; //定时器低八位置0TR0=1; //开启定时器0while(ir==0); //如果是低电平就等待,给低电平计时TR0=0; //关闭定时器T0LowTime=TH0*256+TL0; //保存低电平时间TH0=0; //定时器高八位置0TL0=0; //定时器低八位置0TR0=1; //开启定时器0while(ir==1); //如果是高电平就等待,给引导码高电平计时TR0=0; //关闭定时器T0HighTime=TH0*256+TL0; //保存高电平长度}void main(){char i=0;TMOD=0x01; //定时器T0作为定时模式ET0=1; //开T0中断IT0=0; //外部中断,下降沿触发EX0=1; //开外部中断EA=1; //开总中断init_1602();while(1){}}void inter0() interrupt 0 //开始解码{EX0=0; //关闭外部中断0,不再接受红外信号,只解码当前的红外信号。

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

基于51单片机红外发射与接收程序实验证明,效果非常好。

红外发射程序
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char #define uint unsigned int
sbit key1=P3^3;
sbit key2=P3^4;
sbit key3=P3^5;
sbit LED=P1^0; //发射指示灯sbit out=P3^7;
uchar i,a,num1;
void init()//初始化作用
{
key1=1;
key2=1;
key3=1;
}
void delay(uchar aa)
{
uchar bb,cc;
for(bb=aa;bb>0;bb--)
for(cc=200;cc>0;cc--);
}
void delayms(uchar aa)//延时程序
{
for(a=aa;a>0;a--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void khz(uchar aa)//是发射38KHZ的程序
{
for(a=aa;a>0;a--) //这个for语句可以得到准确的26.3波特率{
out=0;
i=7; //低了17us
while(i>0)i--; // 38kHZ
out=1;
//高了9us 17+9=26us 比26.3快一点点}
}
//khz(116);//3.028ms 精确的时间
//khz(64);//2.006ms
//khz(40); //1.052ms
//delayms(125);//2.012ms 这里是一些时间的介绍
//delayms(65);//1.054ms
//delayms(93);//1.5ms
void fashu(uchar num)
{
khz(116);//发射3ms 38khz
delayms(125);
for(num1=8;num1>0;num1--) //原来用的是a 后来出错,肯定在这里!{
khz(40);
if(num&0x01)
delayms(93);//delay 1.5ms
else
delayms(65);//delay 1ms
num=num>>1;
}
khz(20);
}
void tishi()
{
LED=0;
delay(50);
LED=1;
delay(50);
LED=0;
delay(50);
LED=1;
}
void keyscan()//按键扫描
{
if(key1==0)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
if(key1==0)
{
while(!key1);
fashu(0xf3);
tishi();
}
}
if(key2==0)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
if(key2==0)
{
while(!key2);
fashu(0x3f);
tishi();
}
}
if(key3==0)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
if(key3==0)
{
while(!key3);
fashu(0xf5);
tishi();
}
}
}
void main()
{
init();
while(1)
{
keyscan();
}
}
红外接收程序
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit in=P3^2;
uchar i,a,num;
bit fleg;
void init()
{
fleg=1;
in=1;
EA=1;
EX0=1;
IT0=1;
}
void delayms(uchar aa)
{
for(i=aa;i>0;i--)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
void main()
{
init();
//delayms(45);//0.642ms
//delayms(35);//0.502ms
//delayms(115);//1.623ms
//delayms(72);//1.02ms
//delayms(84);//1.188ms
//delayms(31);//0.446ms
while(1);
}
void sieasdf() interrupt 0
{
EX0=0;
for(a=5;a>0;a--)
{
delayms(35);//延时0.5ms 判断5次5*0.5=2.5ms
if(in)fleg=0;
}
if(fleg)
{
delayms(72);//延时1ms 判断是不是高电平了
if(in)
{
delayms(115);//延时让它超过2ms; 2.5+1+1.623=5.123ms 开始读数据
delayms(118);//若偏移一位,可以去掉。

for(a=8;a>0;a--)
{
while(!in);
delayms(86);//延时1.188ms 判断IO高低,从而得0或1
num=num>>1;
if(in)
{
num=num|0x80;
delayms(31);//延时0.6ms 因为上面延时1.2ms+0.6 刚好跳过1.5ms }
}
P2=num;
}
}
fleg=1;
EX0=1;
}。

相关文档
最新文档