51单片机红外遥控格力空调程序
基于51单片机的红外遥控程序(新)
P1=table[shuma];
/* delay_ms(3);
P2=0xb8;
P1=table[bai];
delay_ms(3);
P2=0xd8;
P1=table[shi];
delay_ms(3);
P2=0xe8;
P1=table[ge];
}
///////////////////////////////////////////////////////////////////////
void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
{
static unsigned char i;
//使用12M晶振 适用于TC9012芯片,其他芯片请自行更改解码时序
#include <REGX52.h>
#include<stdio.h>
#include<intrins.h>
////////////////////////////////////////////////
#define TURE 1
break;//2
case 2:
display(3);
fengming();
SBUF=3;
TI=0;
delay_ms(10);
break;//3
case 3:
display(4);
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//处理完毕标志位置1
}
/******************************************************************/
基于51单片机的红外遥控编码解码的C语言程序和电路[1]
请勿转载!!!作品功能简介:当学习键按下后,红外接收头便可将接受到的信号存储到单片机中。
在接受到通用遥控器发出的信号后,如果按下发射键,单片机将调出刚刚储存的信息,通过红外发射头发射出和遥控器一样的信号来达到控制的作用。
#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单片机设计的红外线遥控器电路图及工作原理
51单片机设计的红外线遥控器电路图及工作原理你家里是否有一个电视机遥控器或者空调机遥控器呢?你是否也想让它遥控其他的电器甚至让它遥控您的电脑呢?那好,跟我一起做这个“红外遥控解码器”。
该小制作所需要的元件很少:单片机TA89C2051一只,RS232接口电平与TTL电平转换心片MAX232CPE 一只,红外接收管一只,晶振11.0592MHz,电解电容10uF4只,10uF 一只,电阻1K1个,300欧姆左右1个,瓷片电容30P2个。
发光二极管8个。
价钱不足20元。
电路图及原理:主控制单元是单片机AT89C2051,中断口INT0跟红外接受管U1相连,接收红外信号的脉冲,8个发光二极管作为显示解码输出(也可以用来扩展接其他控制电路),U3是跟电脑串行口RS232相连时的电平转换心片,9、10脚分别与单片机的1、2脚相连,(1脚为串行接收,2脚为串行发送),MAX232CPE的7、8脚分别接电脑串行口的2(接收)脚、3(发送脚)。
晶振采用11.0592MHz,这样才能使得通讯的波特率达到9600b/s,电脑一般默认值是9600b/s、8位数据位、1位停止位、无校验位。
电路就这么简单了,现在分析具体的编程过程吧。
如图所示,panasonic遥控器的波形是这样的(经过反复测试的结果)。
开始位是以3.6ms低电平然后是3.6ms高电平,然后数据表示形式是0.9ms低电平0.9ms 高电平周期为1.8ms表示“0”,0.9ms低电平2.4ms高电平周期为3.3ms表示“1”,编写程序时,以大于3.4ms小于3.8ms高电平为起始位,以大于2.2ms小于2.7ms高电平表示“1”,大于0.84ms小于1.11ms高电平表示“0”。
因此,我们主要用单片机测量高电平的长短来确定是“1”还是“0”即可。
定时器0的工作方式设置为方式1:mov tmod,#09h,这样设置定时器0即是把GATE置1,16位计数器,最大计数值为2的16次方个机器周期,此方式由外中断INT0控制,即INT0为高时才允许计数器计数。
51单片机红外遥控解码程序
51单片机红外遥控解码程序类别:单片机/DSP 阅读:2975编者按:以下是网友编写的遥控解码程序!一种用延时等待的解码方法,比较容易理解,但缺点是占用CPU运行时间,第二种方法用定时器和外中断的解码方法,初学不易理解,但优点也很明显,第二种方法如果能解决连发解码就比较完美,更完善的红外遥控解码程序,请参考本站TOPA V-2008,TOP51-2005所配程序。
解码方法一;//单片机接收红外解读程序\\;硬件结构:8951,P0口数码管段码,P2.0-P2.3为位,P1为8个LED;P3.2为红外接收头,P2.7蜂鸣器,晶振12M;适用UPD6121 6122芯片接收;---------------------------------------------------------ORG 0000HAJMP MAIN ;转入主程序ORG 0003H ;外部中断P3.2脚INT0入口地址AJMP INT ;转入外部中断服务子程序(解码程序);以下为主程序进行CPU中断方式设置MAIN: SETB EA ;打开CPU总中断请求SETB IT0 ;设定INT0的触发方式为脉冲下降沿触发SETB EX0 ;打开INT0中断请求AJMP $;以下为进入P3.2脚外部中断子程序,也就是解码程序INT: CLR EA ;暂时关闭CPU的所有中断请求MOV R6,#10SB: ACALL YS1 ;调用882微秒延时子程序JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高; 电平如果有就退出解码程序DJNZ R6, SB ;重复10次,目的是检测在8820微秒内;如果出现高电平就退出解码程序;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码MOV R1,#1AH ;设定1AH为起始RAM区MOV R2,#4;PP: MOV R3,#8JJJJ: JNB P3.2,$ ;等待地址码第一位的高电平信号LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信;号此时的高低电平状态MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中JNC UUU ;如果为0就跳转到UUULCALL YS3;UUU: MOV A,@R1 ;将R1中地址的给ARRC A ;将C中的值0或1移入A中的最低位MOV @R1,A ;将A中的数暂时存放在R1中DJNZ R3,JJJJ ;接收地址码的高8位INC R1 ;对R1中的值加1,换下一个RAMDJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据反; 码,存放在1AH/1BH/1CH/1DH的RAM中MOV A,1CH ;比较数据码和数据反码是否正确?CPL AXRL A,1DH ;将1CH的值取反后和1DH比较不同则无效丢弃,核对数据是否准确JNZ EXITMOV DPTR,#TAB ;表头地址送指针MOV A,1DHANL A,#0FH ;相与,得到低四位码MOVC A,@A+DPTRMOV 1EH,A ;查表得表码存入1EHMOV A,1DHSWAP AANL A,#0FHMOVC A,@A+DPTRMOV 1FH,A ;查表得高四位码存入1FMOV R7,#20HDISP:MOV P0,1FH ;送数码管显示CLR P2.1ACALL YS2SETB P2.1MOV P0,1EHCLR P2.2ACALL YS2SETB P2.2MOV P1,1DH ;将按键的键值通过P1口的8个LED显示出来!CLR P2.7 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功LCALL YS2SETB P2.7 ;蜂鸣器停止DJNZ R7,DISPEXIT: SETB EA ;允许中断RETI ;退出解码子程序YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒D1: MOV R5,#20DJNZ R5,$DJNZ R4,D1RETYS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒D2: MOV R5,#235DJNZ R5,$DJNZ R4,D2RETYS3: MOV R4,#2 ;延时程序3,精确延时1000微秒D3:MOV R5,#248DJNZ R5,$DJNZ R4,D3RETTAB: DB 0C0H,0DEH,0A2H,8AH,9CH,89H,81H,0DAH,80H,88H,90H,85H,0E1H,86H,0A1H,0B1H;数据表,0-9-A-FEND解码方法二你的解码程序和我现在用的解码程序大体是一样的,我自己实际做了一下,发现按下遥控器,接收到红外信号后,数码管闪的厉害。
自己写的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单片机红外遥控解码,很详细(汇编语言,C语言等)
//i++;
if(TH0<3)
b=1;
else b=0;
TH0=0;
TL0=0;
}
uchar hw_key()
{
uchar j,m;
//i=0;
hw_start(); //等待低电平到来
hw_pulse();
for(j=0;j<24;j++) //测试用户码脉冲宽度
{
hw_pulse();
}
for(j=0;j<8;j++) //测试键码脉冲宽度
{
hw_pulse();
if(b==1)
m=(m<<1)|1;
else
m<<=1;
}
return m; //键码
}
while(in==0); //高电平到了,
TR0=0; //关闭定+;
TH0=0;
TL0=0;
TR0=1; //高电平到了,启动定时器1,测试高电平宽度
while(in==1); //低电平到了,
TR0=0; //关闭定时器1,高电平宽度测试完
请注意甄别内容中的联系方式诱导购买等信息谨防诈骗
51单片机红外遥控解码,很详细(汇编语言,C语言等)
单片机源程序如下:
#include
#define hw_hs0038_ENTITY
#include "hw_hs0038.h"
sbit in=P3^2;
//uchar i=0;
//uchar k[2];
bit bdata b=0;
/*
void timer0(void) interrupt 1 using 1
51单片机格力空调遥控器
1.//51单片机格力空调遥控器2.3.#include <reg52.h>4.#include <intrins.h>5.#define uchar unsigned char6.#define uint unsigned int7.#define enTransmitt flag=18.#define disTransmitt flag=09.sfr T2MOD = 0XC9;10.bit flag=0;11.sbit IR38k =P2^3; //红外发射管12.sbit key1=P1^1;13.sbit key2=P1^3;14.sbit key3=P1^5;15.sbit key4=P1^7;16.sbit key5=P1^0;17.sbit key6=P1^4;18.uchar KeyScan();19.uint count=0,set_count=0;20.uchar fengliang_value=0;21.uchar key_value=0;22.uchar wendu_value=0;23.uchar mode_value=0;24.uchar switch_value=0;25.uchar zhuanye_value=0;26.uchar codezhuanye[][5]={{0x39,0x04,0x00,0x50,0x02},{0x79,0x04,0x00,0x50,0x02}};// 手动,自动转页(20度,冷气)27.ucharcode fengliang[][5]={{0x28,0x08,0x00,0x50,0x02},{0x19,0x08,0x00,0x50,0 x02},28. {0x09,0x08,0x00,0x50,0x02}29. }; //自动模式风量小,中,大 (20度)30.uchar code mode[][5]={31. {0x58,0x00,0x00,0x50,0x02},{0x59,0x04,0x00,0x50,0x02},32. {0x5a,0x04,0x00,0x50,0x02},{0x5b,0x04,0x00,0x50,0x02}33. }; //自动,冷气,除湿,送风34./*ucharcode on_or_off[][5]={ {0x40,0x00,0x00,0x50,0x02},{0x48,0x00,0x00,0x50, 0x02} }; */35.uchar code on_or_off[][5]={36. {0x39,0x08,0x00,0x50,0x02},{0x31,0x08,0x00,0x50,0x02},37. {0x59,0x08,0x00,0x50,0x02},{0x51,0x08,0x00,0x50,0x02},38. {0x79,0x08,0x00,0x50,0x02},{0x71,0x08,0x00,0x50,0x02},39. }; //开机,关机40.uchar code wendu[][5]={41. {0x59,0x00,0x00,0x50,0x02},{0x59,0x01,0x00,0x50,0x02},42. {0x59,0x02,0x00,0x50,0x02},{0x59,0x03,0x00,0x50,0x02},43. {0x59,0x04,0x00,0x50,0x02},{0x59,0x05,0x00,0x50,0x02},44. {0x59,0x06,0x00,0x50,0x02},{0x59,0x07,0x00,0x50,0x02},45. {0x59,0x08,0x00,0x50,0x02},{0x59,0x09,0x00,0x50,0x02},46. {0x59,0x0a,0x00,0x50,0x02},{0x59,0x0b,0x00,0x50,0x02},47. {0x59,0x0c,0x00,0x50,0x02},{0x59,0x0d,0x00,0x50,0x02},48. {0x59,0x0e,0x00,0x50,0x02}49. }; //温度值50.51.void send_precode(unsigned int s_cnt_1,unsigned int s_cnt_2);52.void send_8bit_code(uchar value);53.void send_4bit_code(uchar value);54.void send_final_code();55.void ir_out1() //启动和关闭56.{57.send_precode(180,90);58.send_8bit_code(on_or_off[switch_value][0]);59.send_8bit_code(on_or_off[switch_value][1]);60.send_8bit_code(on_or_off[switch_value][2]);61.send_8bit_code(on_or_off[switch_value][3]);62.send_4bit_code(on_or_off[switch_value][4]);63.//send_final_code();64.// key_value=0;65. switch_value++;66.if(switch_value==6){ switch_value=0; }67.68.}69.void ir_out2() //wendu--70.{71.72.send_precode(180,90);73.send_8bit_code(wendu[wendu_value][0]);74.send_8bit_code(wendu[wendu_value][1]);75.send_8bit_code(wendu[wendu_value][2]);76.send_8bit_code(wendu[wendu_value][3]);77.send_4bit_code(wendu[wendu_value][4]);78.send_final_code();79.wendu_value--;80.if(wendu_value==0) {wendu_value=15;}81.82.}83.void ir_out3() //wendu++84.{85.send_precode(180,90);86.send_8bit_code(wendu[wendu_value][0]);87.send_8bit_code(wendu[wendu_value][1]);88.send_8bit_code(wendu[wendu_value][2]);89.send_8bit_code(wendu[wendu_value][3]);90.send_4bit_code(wendu[wendu_value][4]);91.send_final_code();92.wendu_value++;93.if(wendu_value==15) { wendu_value=0;}94.}95.void ir_out4()//mode choose96.{97.send_precode(180,90);98.send_8bit_code(mode[mode_value][0]);99.send_8bit_code(mode[mode_value][1]);100.send_8bit_code(mode[mode_value][2]); 101.send_8bit_code(mode[mode_value][3]); 102.send_4bit_code(mode[mode_value][4]); 103.send_final_code();104.mode_value++;105.if(mode_value==4)106.{ mode_value=0;}107.108.}109.void ir_out5() //转叶110.{111.send_precode(180,90);112.send_8bit_code(zhuanye[zhuanye_value][0]); 113.send_8bit_code(zhuanye[zhuanye_value][1]); 114.send_8bit_code(zhuanye[zhuanye_value][2]); 115.send_8bit_code(zhuanye[zhuanye_value][3]); 116.send_4bit_code(zhuanye[zhuanye_value][4]); 117.send_final_code();118. zhuanye_value++;119.if(zhuanye_value==2) {zhuanye_value=0;}120.}121.void ir_out6() //风量122.{123.send_precode(180,90);124.send_8bit_code(fengliang[fengliang_value][0]); 125.send_8bit_code(fengliang[fengliang_value][1]); 126.send_8bit_code(fengliang[fengliang_value][2]); 127.send_8bit_code(fengliang[fengliang_value][3]); 128.send_4bit_code(fengliang[fengliang_value][4]); 129.send_final_code();130. fengliang_value++;131.if(fengliang_value==3) {fengliang_value=0;} 132.}133.//============================================ 134.135.void delayms(unsigned char ms)136.{137.unsigned char i;138.while(ms--)139.{140. for(i=0;i<120;i++){};141.}142.}143.void TimerInit()144.{145.EA=1;146.ET0=1;147.TMOD=0X01;148.TH0=0XfF;149.TL0=221; //50US150.151.T2CON=0x00;152. T2MOD=0x02; //enable T2's wave output through T2 pin(P10) 153. RCAP2H=(65536-11059/38/4)>>8; //output frequency is 38KHz 154. RCAP2L=(65536-11059/38/4)&0xff;155.}156.void TransmittPulse()157.{158. enTransmitt;159.// ir=0;160.TR0=1;161.TR2=1;162.}163.void TransmittLow()164.{165.//ir=1;166.TR0=1;167.disTransmitt;168.TR2=0;169.IR38k=1;170.}171.void endTransmitt()172.{173.//ir=0;174.TR0=0;175.TR2=0;176.IR38k=1; //JIEZHI177.}178.void send_logic0(unsigned int s_cnt_1,unsigned int s_cnt_2) 179.{180.set_count=s_cnt_1;//181.TransmittPulse();182.count =0;183.184.while(count<set_count)185.;186.endTransmitt();187.//ir=1;188.set_count=s_cnt_2;//11;//189.//ir=1;190.count =0;191.TransmittLow();192.193.while(count<set_count)194.;195.endTransmitt();196.}197.void send_logic1(unsigned int s_cnt_1,unsigned int s_cnt_2) 198.{199.set_count=s_cnt_1;//200.TransmittPulse();201.202.count =0;203.204.while(count<set_count)205.;206.endTransmitt();207.//ir=1;208.//=========================209.set_count=s_cnt_2;//32;//210.//ir=1;211.count =0;212.213.TransmittLow();214.215.while(count<set_count)217.endTransmitt();218.}219.void send_precode(unsigned int s_cnt_1,unsigned int s_cnt_2) 220.{221.set_count =s_cnt_1;//180;// 9MS222.TransmittPulse(); //start send pulse223.count =0;224.225.while(count<set_count)226.{;}227.endTransmitt();228.set_count =s_cnt_2;//90;//4.5MS229.230.count =0;231.TransmittLow();232.while(count<set_count)233.{;}234.endTransmitt();235.236.}237.void send_final_code()238.{239.set_count=28;//240.241.count =0;242.TransmittPulse();243.while(count<set_count)244.;245.endTransmitt();246.}247.void send_8bit_code(uchar value)249.uchar i,temp;250.temp=value;251.for(i=0;i<8;i++)252.{253. if(temp&0x01) send_logic1(11,32); //1.68ms254. else send_logic0(11,11); //600US255. temp=temp>>1;256.}257.}258.void send_4bit_code(uchar value)259.{260.uchar i,temp;261.temp=value;262.for(i=0;i<4;i++)263.{264.if(temp&0x01) send_logic1(11,32); //1.68ms265. else send_logic0(11,11); //600US266.267. temp=temp>>1;268.}269.}270.//============================主函数======================== 271.void main()272.{273. TimerInit();274. while(1)275.{276. key_value=KeyScan();277. switch(key_value)278. {279. case 1:ir_out1();delayms(200);break; // 开和关280. case 2:ir_out2();delayms(200);break; // 温度- 281. case 3:ir_out3();delayms(200);break; // 温度+. 282. case 4:ir_out4();delayms(200);break; // 模式选择283. case 5:ir_out5();delayms(200);break; //转叶设置284. case 6:ir_out6();delayms(200);break;285. //default:ir=1;break;286. }287.}288.}289.void timer0(void) interrupt 1290.{291.TH0=0XfF;292.TL0=221; //50us293.count++;294.if(flag)295. TR2=1; //IR38k=0;296.else TR2=0;//IR38k=1;297.298.}299.unsigned char KeyScan()300.{301.302./*-------------第一列扫描-----------------*/303.304.305. if(key1==0)306.{307. delayms(20);308. if(key1==0)309. {310. return 1;311. }312. while(!key1); 313.}314.if(key2==0) 315.{316. delayms(20); 317. if(key2==0) 318. {319. return 2; 320. }321. while(!key2); 322.}323.324.if(key3==0) 325.{326. delayms(20); 327. if(key3==0) 328. {329. return 3; 330. }331. while(!key3); 332.}333.if(key4==0) 334.{335. delayms(20); 336. if(key4==0) 337. {338. return 4; 339. }340. while(!key4); 341.}342. if(key5==0) 343.{344. delayms(20); 345. if(key5==0) 346. {347. return 5; 348. }349. while(!key5); 350.}351. if(key6==0) 352.{353. delayms(20); 354. if(key6==0) 355. {356. return 6; 357. }358. while(!key6); 359.}360. return 0 ; 361.}。
51单片机格力空调遥控器word文档良心出品
1.//51单片机格力空调遥控器2.#include <reg52.h> 3.#include <intrins.h> 4.#define uchar unsigned char 5.#define uint unsigned int 6.#define enTransmitt flag=1 7.#define disTransmitt flag=0 8.sfr T2MOD = 0XC9; 9.bit flag=0;10.红外发射管11.sbit IR38k =P2^3; //sbit key1=P1^1; 12.sbit key2=P1^3; 13.sbit key3=P1^5;14.sbit key4=P1^7; 15.sbit key5=P1^0; 16.sbit key6=P1^4; 17.uchar KeyScan();18.uint count=0,set_count=0; 19.uchar fengliang_value=0; 20.uchar key_value=0; 21.uchar wendu_value=0; 22.uchar mode_value=0; 23.uchar switch_value=0; 24.uchar zhuanye_value=0; 25.uchar code26.79,0x04,0x00,0x50,0x02}};) 度,冷气手动,自动转页// (20uchar27.19,0x08,0x00,0x50,0x02},{0x09,0x08,0x00,0x50,0x02}28.) 29. }; //自动模式风量小,中,大 (20度uchar code mode[][5]={30.59,0x04,0x00,0x5031.,0x02},5b,0x04,0x00,0x50,0x02} 32.33. }; //自动,冷气,除湿,送风/*uchar34.48,0x00,0x00,0x50,0x02} }; */uchar code on_or_off[][5]={35.31,0x08,0x00,0x50,0x02},36.51,0x08,0x00,037.x50,0x02},71,0x08,0x00,0x50,0x02}, 38.39. }; //开机,关机uchar code wendu[][5]={40.59,0x01,0x00,0x50,0x041.2},59,0x03,0x00,0x50,0x02}, 42.59,0x05,0x00,0x50,0x02}, 43.59,0x07,0x00,0x50,0x02}, 44.59,0x09,0x00,0x50,0x02}, 45.59,0x0b,0x00,0x50,0x02}, 46. 59,0x0d,0x00,0x50,0x02}, 47.48. {0x59,0x0e,0x00,0x50,0x02}49. }; //温度值50.51.void send_precode(unsigned int s_cnt_1,unsigned int s_cnt_2);52.void send_8bit_code(uchar value);53.void send_4bit_code(uchar value);54.void send_final_code();启动和关闭void ir_out1() //55.56.{57.send_precode(180,90);58.send_8bit_code(on_or_off[switch_value][0]);59.send_8bit_code(on_or_off[switch_value][1]);60.send_8bit_code(on_or_off[switch_value][2]);61.send_8bit_code(on_or_off[switch_value][3]);62.send_4bit_code(on_or_off[switch_value][4]);63.//send_final_code();64.// key_value=0;65. switch_value++;66.if(switch_value==6){ switch_value=0; }67.68.}69.void ir_out2() //wendu--70.{71.72.send_precode(180,90);73.send_8bit_code(wendu[wendu_value][0]);74.send_8bit_code(wendu[wendu_value][1]);75.send_8bit_code(wendu[wendu_value][2]);76.send_8bit_code(wendu[wendu_value][3]);77.send_4bit_code(wendu[wendu_value][4]);78.send_final_code();79.wendu_value--;80.if(wendu_value==0) {wendu_value=15;}81.82.}83.void ir_out3() //wendu++84.{85.send_precode(180,90);86.send_8bit_code(wendu[wendu_value][0]);send_8bit_code(wendu[wendu_value][1]);87.88.send_8bit_code(wendu[wendu_value][2]);89.send_8bit_code(wendu[wendu_value][3]);90.send_4bit_code(wendu[wendu_value][4]);91.send_final_code();92.wendu_value++;93.if(wendu_value==15) { wendu_value=0;}94.}95.void ir_out4()//mode choose96.{97.send_precode(180,90);98.send_8bit_code(mode[mode_value][0]);99.send_8bit_code(mode[mode_value][1]);100.send_8bit_code(mode[mode_value][2]);101.send_8bit_code(mode[mode_value][3]);102.send_4bit_code(mode[mode_value][4]);103.send_final_code();104.mode_value++;105.if(mode_value==4)106.{ mode_value=0;}107.108.}109.void ir_out5() //转叶110.{111.send_precode(180,90);112.send_8bit_code(zhuanye[zhuanye_value][0]);113.send_8bit_code(zhuanye[zhuanye_value][1]);114.send_8bit_code(zhuanye[zhuanye_value][2]);115.send_8bit_code(zhuanye[zhuanye_value][3]);116.send_4bit_code(zhuanye[zhuanye_value][4]);117.send_final_code();118. zhuanye_value++;if(zhuanye_value==2) {zhuanye_value=0;} 119.120.}121.void ir_out6() //风量122.{123.send_precode(180,90);124.send_8bit_code(fengliang[fengliang_value][0]);125.send_8bit_code(fengliang[fengliang_value][1]);126.send_8bit_code(fengliang[fengliang_value][2]);127.send_8bit_code(fengliang[fengliang_value][3]);128.send_4bit_code(fengliang[fengliang_value][4]);129.send_final_code();130. fengliang_value++;131.if(fengliang_value==3) {fengliang_value=0;}132.}133.//============================================134.135.void delayms(unsigned char ms)136.{137.unsigned char i;138.while(ms--)139.{140. for(i=0;i<120;i++){};141.}142.}143.void TimerInit()144.{145.EA=1;146.ET0=1;147.TMOD=0X01;148.TH0=0XfF;149.TL0=221; //50US150.T2CON=0x00;151.152. T2MOD=0x02; //enable T2's wave output through T2 pin(P10) 153. RCAP2H=(65536-11059/38/4)>>8; //output frequency is 38KHz 154. RCAP2L=(65536-11059/38/4)&0xff;155.}156.void TransmittPulse()157.{158. enTransmitt;159.// ir=0;160.TR0=1;161.TR2=1;162.}163.void TransmittLow()164.{165.//ir=1;166.TR0=1;167.disTransmitt;168.TR2=0;169.IR38k=1;170.}171.void endTransmitt()173.//ir=0;174.TR0=0;175.TR2=0;176.IR38k=1; //JIEZHI177.}178.void send_logic0(unsigned int s_cnt_1,unsigned int s_cnt_2) 179.{180.set_count=s_cnt_1;//181.TransmittPulse();182.count =0;183.184.while(count<set_count)185.;186.endTransmitt();187.//ir=1;188.set_count=s_cnt_2;//11;//189.//ir=1;190.count =0;191.TransmittLow();192.193.while(count<set_count)194.;195.endTransmitt();196.}197.void send_logic1(unsigned int s_cnt_1,unsigned int s_cnt_2) 198.{199.set_count=s_cnt_1;//200.TransmittPulse();201.202.count =0;203.204.while(count<set_count)205.;206.endTransmitt();207.//ir=1;208.//=========================209.set_count=s_cnt_2;//32;//210.//ir=1;211.count =0;212.213.TransmittLow();214.while(count<set_count)216.;217.endTransmitt();218.}219.void send_precode(unsigned int s_cnt_1,unsigned int s_cnt_2) 220.{221.set_count =s_cnt_1;//180;// 9MS222.TransmittPulse(); //start send pulse223.count =0;224.225.while(count<set_count)226.{;}227.endTransmitt();228.set_count =s_cnt_2;//90;//4.5MS229.230.count =0;231.TransmittLow();232.while(count<set_count)233.{;}234.endTransmitt();235.236.}237.void send_final_code()238.{239.set_count=28;//240.241.count =0;242.TransmittPulse();243.while(count<set_count)244.;245.endTransmitt();246.}void send_8bit_code(uchar value) 247.248.{249.uchar i,temp;250.temp=value;251.for(i=0;i<8;i++)252.{253. if(temp&0x01) send_logic1(11,32); //1.68ms254. else send_logic0(11,11); //600US255. temp=temp>>1;256.}257.}258.void send_4bit_code(uchar value)259.{260.uchar i,temp;261.temp=value;262.for(i=0;i<4;i++)263.{264.if(temp&0x01) send_logic1(11,32); //1.68ms265. else send_logic0(11,11); //600US266.267. temp=temp>>1;268.}269.}270.//============================主函数======================== 271.void main()272.{273. TimerInit();274. while(1)275.{276. key_value=KeyScan();277. switch(key_value)278. {开和关 case 1:ir_out1();delayms(200);break; // 279.280. case 2:ir_out2();delayms(200);break; // 温度-281. case 3:ir_out3();delayms(200);break; // 温度+.282. case 4:ir_out4();delayms(200);break; // 模式选择283. case 5:ir_out5();delayms(200);break; //转叶设置284. case 6:ir_out6();delayms(200);break;285. //default:ir=1;break;286. }287.}288.}289.void timer0(void) interrupt 1290.{291.TH0=0XfF;292.TL0=221; //50us293.count++;294.if(flag)295. TR2=1; //IR38k=0;296.else TR2=0;//IR38k=1;297.298.}299.unsigned char KeyScan()300.{301.302./*-------------第一列扫描-----------------*/ 303.304.305. if(key1==0)306.{307. delayms(20);308. if(key1==0)309. {310. return 1;}311.312. while(!key1);313.}314.if(key2==0)315.{316. delayms(20);317. if(key2==0)318. {319. return 2;320. }321. while(!key2);322.}323.324.if(key3==0)325.{326. delayms(20);327. if(key3==0)328. {329. return 3;330. }331. while(!key3);332.}333.if(key4==0)334.{335. delayms(20);336. if(key4==0)337. {338. return 4;339. }340. while(!key4);341.}342. if(key5==0){343.344. delayms(20); 345. if(key5==0) 346. {347. return 5; 348. }349. while(!key5); 350.}351. if(key6==0) 352.{353. delayms(20); 354. if(key6==0) 355. {356. return 6; 357. }358. while(!key6); 359.}360. return 0 ; 361.}。
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单片机,设计一个简单的红外遥控器。
首先,我们需要了解红外遥控器的工作原理。
红外遥控器使用红外线来传输指令。
当用户按下遥控器上的按键时,红外发射器发射一个特定的红外信号。
接收器接收到这个信号后,将其转换成电信号,并将其发送到电子设备中,实现对设备的控制。
接下来,我们需要选择合适的红外发射器和接收器。
常见的红外发射器有红外LED,常见的红外接收器有红外接收头。
在选择红外发射器和接收器时,要根据其工作频率、传输距离、灵敏度等因素进行选择。
在本设计中,我们选择了工作频率为38kHz的红外发射器和接收器。
接下来,我们需要设计电路,并进行程序开发。
首先,我们需要连接红外发射器和接收器到51单片机上。
红外发射器的一个引脚连接到51单片机的I/O口,另一个引脚连接到正极电源,第三个引脚连接到电源的接地端。
红外接收器的输出引脚连接到51单片机的I/O口,电源和接地端分别连接到正负电源。
接下来,我们需要编写程序。
首先,我们需要设置51单片机的I/O 口为输入或输出。
然后,我们需要编写程序来发送红外信号。
我们可以使用PWM技术来模拟红外信号的脉冲。
当用户按下遥控器上的按键时,我们可以发送一个特定的脉冲序列,来控制电子设备。
同时,我们还需要编写程序来接收红外信号。
当红外接收器接收到红外信号时,会输出一个特定的电平信号。
我们可以使用外部中断来检测这个信号,并进行相应的处理。
在程序开发过程中,我们需要注意红外信号的协议。
常见的红外信号协议有NEC、SONY等。
我们需要根据所使用的红外接收器的协议来编写相应的程序。
最后,我们需要测试代码的功能和稳定性。
可以通过连接电子设备,按下遥控器上的按键,来测试红外信号的发送和接收功能。
如果一切正常,我们的红外遥控器设计就完成了。
总结起来,基于51单片机的红外遥控器设计是一个简单而有趣的项目。
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单片机的红外遥控本讲内容:介绍红外遥控的知识,通过例程展示红外遥控程序的编写方法。
红外线简介:在光谱中波长自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单片机红外遥控
红外遥控解解码程序#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,不再接受红外信号,只解码当前的红外信号。
最简51单片机红外遥控解码程序(转载
最简51单片机红外遥控解码程序(转载)2009-09-07 23:03/* 51单片机红外遥控解码程序 *//* 适用uPD6121系列 *//* 周正华 2008.4.11编 *//* /52_diy */#include <reg52.h>#define DIGPORT P2#define WORDPORT P0unsigned char code LED_num[]={0x3f,0x18,0x76,0x7c,0x59,0x6d,0x6f,0x38,0x7f,0x7d};#define Imax 14000 //此处为晶振为11.0592时的取值,#define Imin 8000 //如用其它频率的晶振时,#define Inum 1450 //要改变相应的取值。
unsigned char Im[]={0x00,0x00,0x00,0x00};unsigned long m,Tc;unsigned char i,IrOK;void DelayMy(unsigned int t){while(--t);}void Display_LED(unsigned long num){unsigned int ii;unsigned int jj=0;unsigned long aa,bb;unsigned int xx[8]={0,0,0,0,0,0,0,0};do{bb=num/10;aa=num-bb*10;xx[jj]=aa;num=bb;jj++;}while(num>0);DIGPORT=0x80;for(ii=0;ii<8;ii++){WORDPORT=LED_num[xx[ii]];DelayMy(60);DIGPORT=DIGPORT>>1;};WORDPORT=0;}//外部中断解码程序void intersvr1(void) interrupt 2 using 1{Tc=TH0*256+TL0; //提取中断时间间隔时长TH0=0; TL0=0; //定时中断重新置零if((Tc>Imin)&&(Tc<Imax)) m=0; //找到启始码if(Tc>Inum) Im[m/8]=Im[m/8]>>1|0x80; else Im[m/8]=Im[m/8]>>1; //取码if(m==32) if((Im[2]|0x01)==~Im[3]) IrOK=1; else IrOK=0; //取码完成后判断读码是否正确m++; //准备读下一码}/*演示主程序*/void main(void){m=0;EA=1;IT1=1;EX1=1;TMOD=0x11;TH0=0;TL0=0;TR0=1;ET0=1;for(;;){DelayMy(100);if(IrOK==1) for(i=0;i<400;i++) Display_LED(Im[2]);IrOK=0;}}。
基于51单片机格力空调遥控
uchar irsys2[9]={0x09,0x09,0x60,0x50,0X02,0X00,0X20,0X00,0XE0};
//开/25度/制冷、风速=自动/健康/照明开/自动扫风/第五个只有三位
send_8bit();
ircode = array[4]; //发送前33-35位
send_3bit();
endcount = low; //发送0.56ms 38k红外波
flag = 1; //红外发送标志=1
count = 0; //中断计数=0
flag = 1; //红外发送标志=1
send_8bit();
ircode = array[1]; //发送前9-16位
send_8bit();
ircode = array[2]; //发送前17-24位
send_8bit();
ircode = array[3]; //发送前25-32位
flag = 0; //红外发送标志
flag1 = 0; //按键key1标记位
irout = 0; //红外管状态=1
ir = 0; // 初始化红外不工作
tem = 10; // 25度开
sweep = 1; //扫风位
speed = 1; //风速控制位
TR0 = 1; //启动定时器0
while(count<endcount);
TR0 = 0; //关闭定时器0
ir = 0; //红外发射管控制脚低
}
/*******************************发送遥控控制码***********************/
单片机对不同品牌空调红外遥控代码
单片机对不同品牌空调红外遥控代码摘要:1.单片机与红外遥控器的基本原理2.不同品牌空调红外遥控器的代码差异3.如何使用单片机解码红外遥控器代码4.实例:基于51 单片机的红外遥控解码器5.建议与资源正文:一、单片机与红外遥控器的基本原理红外遥控器是一种利用红外线进行遥控的设备。
它通常由发射器和接收器两部分组成。
发射器将用户的操作转换为红外光信号,而接收器则接收这些信号并转换为电信号,进而实现对设备的控制。
单片机是一种集成了CPU、存储器、外设接口等多种功能于一体的微型计算机。
在某些应用场景中,单片机可以充当红外遥控器的解码芯片,实现对红外遥控信号的接收和解码。
二、不同品牌空调红外遥控器的代码差异不同品牌的空调设备所使用的红外遥控器代码可能存在差异。
这些代码通常由品牌和型号信息、用户码、数据码等组成。
因此,在实现单片机对红外遥控器的解码时,需要考虑到这些代码差异。
三、如何使用单片机解码红外遥控器代码使用单片机解码红外遥控器代码的过程主要包括以下几个步骤:1.搭建硬件电路:首先,需要搭建一个包含红外接收头、单片机以及相关电子元件的硬件电路。
2.编写程序:编写一个能够接收并解析红外遥控器信号的程序。
该程序需要根据不同的品牌和型号,对红外遥控器信号进行解码。
3.测试与调试:将编写好的程序下载到单片机中,并使用红外遥控器进行测试。
根据测试结果对程序进行调试,以确保其能够正确解码红外遥控器信号。
四、实例:基于51 单片机的红外遥控解码器基于51 单片机的红外遥控解码器是一个典型的应用实例。
该解码器可以接收并解码不同品牌空调设备的红外遥控信号。
其硬件电路包括红外接收头、51 单片机以及相关电子元件。
程序方面,可以使用C 语言编写接收并解析红外遥控器信号的程序。
五、建议与资源对于想要深入了解单片机红外遥控解码的朋友,可以参考以下资源:1.霖锋的教学视频:该视频详细介绍了单片机红外遥控解码的原理和实现方法。
2.51 单片机实现遥控解码的程序:该程序可以作为参考,实现对红外遥控器信号的解码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机红外遥控格力空调程序#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit key1=P3^4;//按键控制开机sbit key2=P3^5;//按键控制关机sbit key3=P3^6;//按键控制温度+sbit key4=P3^7;//按键控制温度-sbit out=P1^5;//发送IO口uchar wd1[15]={0x00,0x08,0x04,0x0c,0x02,0x0a,0x06,0x0e,0x01,0x09,0x05,0x0d,0x03,0x0b,0x07};uchar wd2[15]={0x0a,0x06,0x0e,0x01,0x09,0x05,0x0d,0x03,0x0b,0x07,0x0f,0x00,0x08,0x04,0x0c};uchar x=12;//开机28度/************晶振11.0592MHz**************/ void delay(uint xms){uint i,j;for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=112;j>0;j--);}void delay560us(void) //560us延迟函数{uint j;for(j=63;j>0;j--);}void delay4500us(void) //4.5ms延迟函数{uint j;for(j=516;j>0;j--);}void khz_2(uint num) //38KHZ脉冲占空比1:2{for(;num>0;num--){out=~out;}}void send0_a(void) //发送0{khz_2(42) ;//khz_3(21) ;out=1;delay560us();}void send1_a(void) //发送1 {khz_2(42) ;out=1;delay560us();delay560us();delay560us();}void leadcode_a(void) //发送引导码{khz_2(690) ;out=1;delay4500us();}/***************************关机****************************/void close( uchar a,uchar b,uchar c,uchar d) {uint i;leadcode_a();send1_a();for(i=0;i<7;i++)send0_a();if(a)send1_a();elsesend0_a();if(b)send1_a();elsesend0_a();if(c)send1_a();elsesend0_a();if(d)send1_a();elsesend0_a();send0_a();send0_a();send0_a();for(i=0;i<5;i++)send0_a();send1_a();for(i=0;i<6;i++)send0_a();send1_a();send0_a();send1_a();send0_a();send0_a();send1_a();send0_a();khz_2(42) ;out=1;delay(20);}void close1(uchar e,uchar f,uchar g,uchar h ) {uchar i;for(i=0;i<13;i++)send1_a();send0_a();send0_a();for(i=0;i<12;i++)send0_a();if(e)send1_a();elsesend0_a();if(f)send1_a();elsesend0_a();if(g)send1_a();elsesend0_a();if(h)send0_a();elsesend1_a();khz_2(42) ;out=1;delay(1000);/*******************************************//****************开机************************/}void open(uchar a,uchar b,uchar c,uchar d ){uint i;leadcode_a();send1_a();send0_a();send0_a();send1_a();for(i=0;i<4;i++)send0_a();if(a)send1_a();elsesend0_a();if(b)send1_a();elsesend0_a();if(c)send1_a();elsesend0_a();if(d)send1_a();elsesend0_a();send0_a();send0_a();send0_a();send0_a();for(i=0;i<5;i++)send0_a();send1_a();for(i=0;i<6;i++)send0_a();send1_a();send0_a();send1_a();send0_a();send0_a();send1_a();send0_a();khz_2(42) ;out=1;delay(20);}void open1(uchar e,uchar f,uchar g,uchar h) {uchar i;for(i=0;i<13;i++)send0_a();send1_a();send0_a();send0_a();for(i=0;i<12;i++)send0_a();if(e)send1_a();elsesend0_a();if(f)send1_a();elsesend0_a();if(g)send1_a();elsesend0_a();if(h)send1_a();elsesend0_a();khz_2(42) ;out=1;delay(1000);}void keyscan(){uchar a,b,c,d,e,f,g,h;if(key1==0){delay(10);if(key1==0){while(!key1);if(wd1[x] & 0x08)a=1;elsea=0;if(wd1[x] & 0x04)b=1;elseb=0;if(wd1[x] & 0x02)c=1;elsec=0;if(wd1[x] & 0x01)d=1;elsed=0;if(wd2[x] & 0x08) e=1;elsee=0;if(wd2[x] & 0x04)f=1;elsef=0;if(wd2[x] & 0x02)g=1;elseg=0;if(wd2[x] & 0x01)h=1;elseh=0;open(a,b,c,d);open1(e,f,g,h);}}if(key2==0){delay(10);if(key2==0){while(!key2);if((wd1[x] & 0x08)) a=1;elsea=0;if((wd1[x] & 0x04))b=1;elseb=0;if((wd1[x] & 0x02))c=1;elsec=0;if((wd1[x] & 0x01))d=1;elsed=0;if((wd2[x] & 0x08))e=1;elsee=0;if((wd2[x] & 0x04))elsef=0;if((wd2[x] & 0x02))g=1;elseg=0;if((wd2[x] & 0x01))h=1;elseh=0;close(a,b,c,d);close1(e,f,g,h);}}if(key3==0){delay(10);if(key3==0){while(!key1);x++;if((wd1[x] & 0x08)) a=1;elseif((wd1[x] & 0x04))b=1;elseb=0;if((wd1[x] & 0x02))c=1;elsec=0;if((wd1[x] & 0x01))d=1;elsed=0;if((wd2[x] & 0x08)) e=1;elsee=0;if((wd2[x] & 0x04))f=1;elsef=0;if((wd2[x] & 0x02))g=1;elseg=0;if((wd2[x] & 0x01))h=1;elseh=0;open(a,b,c,d);open1(e,f,g,h);}}if(key4==0){delay(10);if(key4==0){while(!key1);x--;if((wd1[x] & 0x08))a=1;elsea=0;if((wd1[x] & 0x04))b=1;elseb=0;if((wd1[x] & 0x02))c=1;elsec=0;if((wd1[x] & 0x01))d=1;elsed=0;if((wd2[x] & 0x08)) e=1;elsee=0;if((wd2[x] & 0x04))f=1;elsef=0;if((wd2[x] & 0x02))g=1;elseg=0;if((wd2[x] & 0x01))h=1;elseh=0;open(a,b,c,d);open1(e,f,g,h);}}}void init(){key1=1;key2=1;key3=1;key4=1;out=1;}void main(){init();while(1){keyscan();}}。