stc15w红外遥控发射解码程序

合集下载

基于51单片机的红外遥控+液晶LCD1602显示程序源代码

基于51单片机的红外遥控+液晶LCD1602显示程序源代码

基于51单片机的红外遥控+液晶LCD1602显示程序源代码/*******************红外遥控+液晶LCD1602测试程序源代码******************** 单片机型号:STC15W4K56S4,内部晶振:22.1184M。

功能:红外遥控+液晶LCD1602显示功能测试。

操作说明:按下红外遥控器上的“CH-”键,液晶LCD1602上显示“CH-”。

按下红外遥控器上的“CH”键,液晶LCD1602上显示“CH”。

按下红外遥控器上的“CH+”键,液晶LCD1602上显示“CH+”。

按下红外遥控器上的“|<<”键,液晶LCD1602上显示“|<<”。

按下红外遥控器上的“>>|”键,液晶LCD1602上显示“>>|”。

按下红外遥控器上的“>||”键,液晶LCD1602上显示“>||”。

按下红外遥控器上的“-”键,液晶LCD1602上显示“-”。

按下红外遥控器上的“+”键,液晶LCD1602上显示“+”。

按下红外遥控器上的“EQ”键,液晶LCD1602上显示“EQ”。

按下红外遥控器上的“0”键,液晶LCD1602上显示“0”。

按下红外遥控器上的“100+”键,液晶LCD1602上显示“100+”。

按下红外遥控器上的“200+”键,液晶LCD1602上显示“200+”。

按下红外遥控器上的“1”键,液晶LCD1602上显示“1”。

按下红外遥控器上的“2”键,液晶LCD1602上显示“2”。

按下红外遥控器上的“3”键,液晶LCD1602上显示“3”。

按下红外遥控器上的“4”键,液晶LCD1602上显示“4”。

按下红外遥控器上的“5”键,液晶LCD1602上显示“5”。

按下红外遥控器上的“6”键,液晶LCD1602上显示“6”。

按下红外遥控器上的“7”键,液晶LCD1602上显示“7”。

按下红外遥控器上的“8”键,液晶LCD1602上显示“8”。

最简单详细的红外解码程序

最简单详细的红外解码程序

#include<reg52.h> //包含头文件名sbit IRIN=P3^2; //定义红外接收头的外部接口,即外部中断0sbit BEEP=P1^5; //定义蜂鸣器接口,我的在P1^5unsigned char IRCOM[7]; //定义数组,用来存储红外接收到的数据void delay(unsigned char x){ //延时子程序unsigned char i; //延时约x*0.14mswhile(x--) //不同遥控器应设置不同的参数{for(i=0;i<13;i++){}} //参数的选择咱们先不管,先看这个}void beep(){unsigned char i; //蜂鸣器发声子程序for(i=0;i<100;i++){delay(4); //这个得看你的蜂鸣器内部是否有振荡源BEEP=~BEEP;} //如果没有振荡源就应该输入脉冲信号BEEP=1;}void IR_IN() interrupt 0 using 0 //外部中断0程序{unsigned char j,k,n=0; //先定义变量,记住n=0EX0=0; //禁止中断,以免再次进入中断delay(15); //延时0.14ms*15=2.1msif(IRIN==1) //如果在这期间有高电平说明{ //信号不是来自遥控的,返回主程序EX0=1;return;}while(!IRIN){delay(1);} //死循环,等待9ms前导低电平信号的结束for(j=0;j<4;j++) //一共有4组数据{for(k=0;k<8;k++) //每组数据有8位{while(IRIN){delay(1);} //死循环,等待4.5ms前导高电平的结束while(!IRIN){delay(1);} //等待0.56ms低电平的结束,准备采集数据,while(IRIN) //开始采集数据{delay(1); //延时0.14ms,每过0.14ms时n就加1n++; //用n记录一共有多少个0.14msif(n>=30) //如果超过0.14ms*30=4.2ms{ //说明是乱码,放弃不要EX0=1;return;}}IRCOM[j]=IRCOM[j]>>1; //右移1位,xxxx xxxx变成0xxx xxx//我们先认为这一位数据是0,现在已经送入一位数据了/*你肯定知道_cror_(x,1)和x>>1的区别吧*/if(n>=8){IRCOM[j]=IRCOM[j]|0x80;}//但是如果不是0呢,//0xxx xxxx和0x80相或后变成了1xxx xxxx//这样这一们数据就被记录为1了/*想一下这里为什么是8呢,0.14ms*8=1.12ms,知道了吧*//*这样反复执行8次,8位数据就存在IRCOM[j]中了*//*外层再循环4次,4*8=32位数据码全都在IRCOM[0],IRCOM[1],IRCOM[2],IRCO M[3]中了*/n=0; //n计数后一定要记得清0,否则下一次就不能准确计数了}}if(IRCOM[2]!=~IRCOM[3]) //这里我们判断数据码和数据反码是不是相反{ //因为相反才是正确的,否则就放弃EX0=1;return;}beep();EX0=1; //记得开中断,你可以去掉这句话试一试}void main(){IE=0x81;TCON=0X01;BEEP=1;IRIN=1;while(1);}怎么样,你看懂了吗?作者:任杰。

红外遥控器按键编码

红外遥控器按键编码
P4M1 = 0X00; P4M0 = 0XFF; P44 = 0; P50=0;
EA = 1;
//允许全局中断
EX0 = 1;
//允许 INT0 中断
PX0 = 0;
//INT0 的中断级别为低
IT0 = 0;
//设定 INT0 上升沿和下降沿都可以中断
/*初始化 T0:16 位自动重装填模式*/
{LED1=ON;LED2=OFF;LED3=OFF;LED4=OFF;LED5=OFF;}
if(temp==IR_2)
{LED1=OFF;LED2=ON;LED3=OFF;LED4=OFF;LED5=OFF;}
if(temp==IR_3)
{LED1=OFF;LED2=OFF;LED3=ON;LED4=OFF;LED5=OFF;}
break;
}
case IR_WordA: {
if((IR_Num%2)==0&&InfraredRayPin==1) {
TH0 = 0x00; TL0 = 0x00; TimeStart; break; } if((IR_Num%2)==1&&InfraredRayPin==0) { TimeStop; IR_Time=TH0; IR_Time<<=8; IR_Time|=TL0; IR_DataA<<=1; if(IR_Time<800) {
1
#define IR_WordB
2
#define IR_End
3
#define TimeStart (TR0=1)
#define TimeStop (TR0=0)
void InfraredRay_Init(void);

一文教会你红外线遥控器软件解码程序

一文教会你红外线遥控器软件解码程序

一文教会你红外线遥控器软件解码程序
红外线一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2.25ms的低电平,跟着是一个短脉冲。

#includeat89x52.h
#defineNULL0x00//数据无效
#defineRESET0X01//程序复位
#defineREQUEST0X02//请求信号
#defineACK0x03//应答信号,在接收数据后发送ACK信号表示数据接收正确,
也位请求信号的应答信号
#defineNACK0x04//应答信号,表示接收数据错误
#defineBUSY0x05//忙信号,表示正在忙
#defineFREE0x06//空闲信号,表示处于空闲状态
#defineREAD_IR0x0b//读取红外
#defineSTORE_IR0x0c//保存数据
#defineREAD_KEY0x0d//读取键值
#defineRECEIVE0Xf400//接收缓冲开始地址
#defineSEND0xfa00//发送缓冲开始地址
#defineIR0x50//红外接收缓冲开始地址
#defineHEAD0xaa//数据帧头
#defineTAIL0x55//数据帧尾
#defineSDAP1_7
#defineSCLP1_6
unsigned char xdata *buf1;//接受数据缓冲。

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();}//结束位

STC15单片机红外遥控编码采集在LCD1602上显示程序

STC15单片机红外遥控编码采集在LCD1602上显示程序

敬告:没有51单片机基础的人请慎重下载高质量实用性51单片机STC15W系列程序(5),STC8A系列可参考STC15单片机红外遥控编码采集在LCD1602上显示程序注:此程序比较复杂,但非常有助于提高编程水平,程序中有些小技巧希望大家能够学会用法/*******************************************///main.c#include "Library.h"void ValToStr(unsigned char *str,unsigned char *tmp);void main(){unsigned char rec_buf[4];unsigned char tmpbuf[4];unsigned char strbuf[8];bit fra;P5M1 &= 0xDF; P5M0 &= 0xDF;P2M1 &= 0xE5; P2M0 &= 0xE5;P0M1 = 0x00; P0M0 = 0x00;Timer0_config();LCD1602_init();LCD1602_wBytes(0,0,"usercode:",sizeof("usercode:")-1);LCD1602_wBytes(0,1,"key code:",sizeof("keycode:")-1);EA = 1;while(1){fra = Rep_pro(rec_buf);if(fra){fra = 0;tmpbuf[0] = rec_buf[0];tmpbuf[1] = rec_buf[2];tmpbuf[2] = rec_buf[3];tmpbuf[3] = rec_buf[1];if((~tmpbuf[2])==tmpbuf[1]){ValToStr(strbuf,tmpbuf);LCD1602_wBytes(10,0,strbuf,2);LCD1602_wBytes(13,0,strbuf+6,2);LCD1602_wBytes(10,1,strbuf+2,2);LCD1602_wBytes(13,1,strbuf+4,2);}}}}//void ValToStr(unsigned char *str,unsigned char *tmp)//{// str[0] = tmp[0]/10 + '0';// str[1] = tmp[0]%10 + '0';// str[2] = tmp[1]/10 + '0';// str[3] = tmp[1]%10 + '0';// str[4] = tmp[2]/10 + '0';// str[5] = tmp[2]%10 + '0';// str[6] = tmp[3]/10 + '0';// str[7] = tmp[3]%10 + '0';////}void ValToStr(unsigned char *str,unsigned char *tmp) {if(((tmp[0]>>4)&0x0F)<=9){str[0] = ((tmp[0]>>4)&0x0F)+ '0';}else{str[0] = ((tmp[0]>>4)&0x0F) - 10 + 'A';}if((tmp[0]&0x0F)<=9){str[1] = (tmp[0]&0x0F) + '0';}else{str[1] = (tmp[0]&0x0F) - 10 + 'A';}if(((tmp[1]>>4)&0x0F)<=9){str[2] = ((tmp[1]>>4)&0x0F) + '0';}else{str[2] = ((tmp[1]>>4)&0x0F) - 10 + 'A'; }if((tmp[1]&0x0F)<=9){str[3] = (tmp[1]&0x0F) + '0';}else{str[3] = (tmp[1]&0x0F) - 10 + 'A';}if(((tmp[2]>>4)&0x0F)<=9){str[4] = ((tmp[2]>>4)&0x0F)+ '0';}else{str[4] = ((tmp[2]>>4)&0x0F) - 10 + 'A'; }if((tmp[2]&0x0F)<=9){str[5] = (tmp[2]&0x0F)+ '0';}else{str[5] = (tmp[2]&0x0F) - 10 + 'A';}if(((tmp[3]>>4)&0x0F)<=9){str[6] = ((tmp[3]>>4)&0x0F)+ '0';}else{str[6] = ((tmp[3]>>4)&0x0F) - 10 + 'A'; }if((tmp[3]&0x0F)<=9){str[7] = (tmp[3]&0x0F) + '0';}else{str[7] = (tmp[3]&0x0F) - 10 + 'A';}}/*******************************************///红外程序//Infrared.c/**********************************guide code: 9ms low +4.5ms highbit 0 : 560us low + 560us highbit 1 : 560us low + 1.68ms highguide code,user code,user inverse code,key code,key inverse code,stop bit**********************************/#include "Library.h"bit guideflag = 1;bit bitHH;bit bitH;bit bitM;bit bitL;bit flagH1;//bit flagH2;bit IR1;bit IR2;bit rep;unsigned int cnt;unsigned char tmpbuf[32];bit frameflag;bit bitval;bit win;bit rep_back;unsigned char recbuf[4];bit Infrared_monitor(){bit ack;cnt++;IR2 = IR1;IR1 = inf;if(IR2&&(!IR1)){if(cnt>280){IR2 = 0;IR1 = 0;cnt = 0;ack = 0;return 0;}}else if((!IR2)&&IR1){if((cnt>=170)&&(cnt<=190)){flagH1 = 1;}else{return 0;}}if(flagH1){if(IR2&&(!IR1)){if((cnt>=260)&&(cnt<=280)){guideflag = 0;flagH1 = 0;IR2 = 0;IR1 = 0;cnt = 0;ack = 1;}}}return ack;}void Rec_bit(){cnt++;IR2 = IR1;IR1 = inf;if(IR2&&(!IR1)){if(cnt>50){IR2 = 0;IR1 = 0;cnt = 0;return;}}if((!IR2)&&IR1){if((cnt>=10)&&(cnt<=14)){bitH = 1;}{return;}}if(bitH){if(IR2&&(!IR1)){if((cnt>=40)&&(cnt<=50))//2240{bitH = 0;IR2 = 0;IR1 = 0;cnt = 0;win = 1;bitval = 1;}elseif((cnt>=20)&&(cnt<=25))//1120{bitH = 0;IR2 = 0;IR1 = 0;cnt = 0;win = 1;bitval = 0;}}}// else if(!bitH)// {//// }// if(inf&&bitH)// {// }// else if((cnt>=40)&&(cnt<=50))//2240// {// bitH = 0;// cnt = 0;// win = 1;// bitval = 1;// }// else if((cnt>=20)&&(cnt<=25))//1120 // {// bitH = 0;// cnt = 0;// win = 1;// bitval = 0;// }}unsigned char Rec_dat(){// bit 0 : 560us low + 560us high// bit 1 : 560us low + 1680ms high unsigned char codeval;unsigned char mask;static unsigned char j=0;for(mask=0x80;mask!=0;mask>>=1){if(tmpbuf[j]){codeval |= mask;}else{codeval &= ~mask; }j++;if(j>=32){j = 0;}}return codeval;}bit Rep_pro(unsigned char *rbuf)bit fram;static unsigned char i = 0;if(win){win = 0;tmpbuf[i] = bitval;i++;if(i>=32){i = 0;frameflag = 1;rep_back = 0 ;rbuf[0] = Rec_dat();rbuf[1] = Rec_dat();rbuf[2] = Rec_dat();rbuf[3] = Rec_dat();frameflag = 0;guideflag = 1;fram = 1;}}return fram;//void Infrared_receive(unsigned char *buf) //{// buf[0] = Rec_dat();// buf[1] = Rec_dat();// buf[2] = Rec_dat();// buf[3] = Rec_dat();// rep = 1;//}void Timer0_config(){// unsigned long tmp;// tmp = (MAIN_Fosc*us)/1000;// tmp = tmp /1000;// tmp = 65536 - tmp;// TH0 = (unsigned char)(tmp>>8);// TL0 = (unsigned char)tmp;TH0 = 0xFD;TL0 = 0xD7;TMOD &= 0xF0;TMOD |= 0x01;AUXR |= 0x80;ET0 = 1;TR0 = 1;}void Timer0_interrupt() interrupt 1{TH0 = 0xFD;TL0 = 0xD7;if(guideflag){rep_back = Infrared_monitor();// if(rep_back==0)// {// cnt = 0;// flagH1 = 0;// flagH2 = 0;// }}if((!guideflag)&&(!frameflag)){Rec_bit();}}/********************************************* //LCD1602.c#include "Library.h"void LCD1602_rsta(){unsigned char tmp;P0 = 0xFF;//this is a mustrs = 0;rw = 1;do{en = 1;//Delay1us();tmp = P0;//Delay1us();en = 0;}while(tmp&0x80);}void LCD1602_wdat(unsigned char dat) {LCD1602_rsta();rs=1;rw=0;P0 = dat;en = 1;//Delay1us();en = 0;}void LCD1602_wcmd(unsigned char cmd){LCD1602_rsta();rs=0;rw=0;P0 = cmd;en = 1;//Delay1us();en = 0;}void Setcursor(unsigned char x,unsigned char y) {if(y==0)x = x + 0x00;else if(y==1)x = x + 0x40;LCD1602_wcmd(x|0x80);}void LCD1602_wBytes(unsigned char x,unsigned char y,unsigned char *buf,unsigned char buf_len){Setcursor(x,y);while(buf_len>0){LCD1602_wdat(*buf++); buf_len--;}}void OnCursor(){LCD1602_wcmd(0x0F);}void OffCursor(){LCD1602_wcmd(0x0C);}void LCD1602_init(){// Delay15ms();// LCD1602_wcmd(0x38);// Delay5ms();LCD1602_wcmd(0x38);// LCD1602_wcmd(0x08);LCD1602_wcmd(0x06);LCD1602_wcmd(0x0C);LCD1602_wcmd(0x01);}/****************************************///Library.h#ifndef _Library_H#define _Library_H#include <STC15.h>#include <intrins.h>#define MAIN_Fosc 11059200Lsbit inf = P5^5;void Timer0_config();bit Infrared_monitor();//void Infrared_monitor();bit Rep_pro(unsigned char *rbuf);sbit rs = P2^4;sbit rw = P2^3;sbit en = P2^1;void LCD1602_init();void LCD1602_wBytes(unsigned char x,unsigned char y,unsigned char *buf,unsigned char buf_len);#endif。

单片机的红外线解码程序

单片机的红外线解码程序
{
switch(inf_shuju)
{
case inf_code_0: inf_array[1]=30;
break;
case inf_code_1: inf_array[1]=1;
break;
case inf_code_2: infe inf_code_3: inf_array[1]=3;
TR1 = 1; //定时器1开始计数,由于晶振是24M
inf_shunxu++;
}
//#############################################################################
//函数名称:void inf_gongcuowu()
//功能:红外线错误子程序
break;
case inf_code_12: inf_array[1]=12;
break;
case inf_code_13: inf_array[1]=13;
break;
case inf_code_14: inf_array[1]=14;
break;
case inf_code_15: inf_array[1]=15;
//入口参数:无
//出口参数:无
//#############################################################################
void inf_gongcuowu(void)
{
inf_mode_cuowu = 1; //红外线接收出现错误
void T_1(void) interrupt 3 //参与红外线接收
{
TR1 = 0;

红外遥控器解码程序

红外遥控器解码程序

//===================================================================== //// 红外遥控器解码程序演示//// 本程序主要将现在比较常用TX1300遥控器进行解码,将解码后的数据通过P2端////口的数码管显示出来,为了更好的看到运行过程,特加了三个指示灯用来指示当////前运行状态.P10主要用来闪亮,表示程序正在运行,P11则用来表示接收到数据, ////P12表示触发内部的定时器操作.P13的闪亮表示正确接收完一个数据. //// 程序运行效果: 打开本机电源开关,可以看到P10不停的闪动,按下遥控器的数////字键,数码管则显示相应的数字键(1-9).可以看到P11,P12在显示后呈亮状态.则////可以接收下一个数据,在上面过程中可以看到P13闪亮了一下.表明上次正确接收////到数据. ////---------------------------------------------------------------------//// 开发日期: 2009/01/30 研发单位:上海腾芯实业有限公司//#include <reg52.h> //包含51单片机相关的头文件#define uint unsigned int //重定义无符号整数类型#define uchar unsigned char //重定义无符号字符类型uchar code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //定义数码管显示数据0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9uchar code RecvData[]={0x07,0x0A,0x1B,0x1F,0x0C,0x0D,0x0E,0x00,0x0F,0x19};uchar IRCOM[7];static unsigned int LedFlash; //定义闪动频率计数变量unsigned char RunFlag=0; //定义运行标志位bit EnableLight=0; //定义指示灯使能位/***********完成基本数据变量定义**************/sbit S1State=P1^0; //定义S1状态标志位sbit S2State=P1^1; //定义S2状态标志位sbit B1State=P1^2; //定义B1状态标志位sbit IRState=P1^3; //定义IR状态标志位sbit RunStopState=P1^4; //定义运行停止标志位sbit FontIRState=P1^5; //定义FontIR状态标志位sbit LeftIRState=P1^6; //定义LeftIR状态标志位sbit RightIRState=P1^7; //定义RightIRState状态标志位/*************完成状态指示灯定义*************/sbit S1=P3^2; //定义S1按键端口sbit S2=P3^4; //定义S2按键端口/*************完成按键端口的定义*************/sbit LeftLed=P2^0; //定义前方左侧指示灯端口sbit RightLed=P0^7; //定义前方右侧指示灯端口/*************完成前方指示灯端口定义*********/sbit LeftIR=P3^5; //定义前方左侧红外探头sbit RightIR=P3^6; //定义前主右侧红外探头sbit FontIR=P3^7; //定义正前方红外探头/*************完成红外探头端口定义***********/sbit M1A=P0^0; //定义电机1正向端口sbit M1B=P0^1; //定义电机1反向端口sbit M2A=P0^2; //定义电机2正向端口sbit M2B=P0^3; //定义电机2反向端口/*************完成电机端口定义***************/sbit B1=P0^4; //定义话筒传感器端口sbit RL1=P0^5; //定义光敏电阻端口sbit SB1=P0^6; //定义蜂鸣端口/*********完成话筒,光敏电阻,蜂鸣器.端口定义**/sbit IRIN=P3^3; //定义红外接收端口/*********完成红外接收端口的定义*************/#define ShowPort P2 //定义数码管显示端口extern void ControlCar(uchar CarType); //声明小车控制子程序void delayms(unsigned char x) //0.14mS延时程序{unsigned char i; //定义临时变量while(x--) //延时时间循环{for (i = 0; i<13; i++) {} //14mS延时}}void Delay() //定义延时子程序{ uint DelayTime=30000; //定义延时时间变量while(DelayTime--); //开始进行延时循环return; //子程序返回}void IR_IN() interrupt 2 using 0 //定义INT2外部中断函数{unsigned char j,k,N=0; //定义临时接收变量EX1 = 0; //关闭外部中断,防止再有信号到达delayms(15); //延时时间,进行红外消抖if (IRIN==1) //判断红外信号是否消失{EX1 =1; //外部中断开return; //返回}while (!IRIN) //等IR变为高电平,跳过9ms 的前导低电平信号。

红外遥控解码程序

红外遥控解码程序

1./*************************************************************************2.** 红外遥控器解码程序(采用中断)----基于SM0038接收芯片3.**说明:采用P2.0口中断,可通过修改IR_IN和P2来切换中断口的选择.4.**使用方法: 当IR_FLAG==1时,表示有键按下,全局变量IR_KeyValue是键号.5.** IR_KeyValueN--按键非码;IR_KeyValueSB--遥控器识别码6.** IR_UK--用户自定义的键号7.** 使用此模块时应先执行 IR_Init()8.**使用示例: if(IR_FLAG==1)9.** {10.** IR_FLAG=0;//每次使用时须将标志位清零.11.** Display_Int(IR_KeyValue,0x90);12.** }13.*************************************************************************/14.15.16.#include "ir_key.h"17.#include "delay.h"18./**********************以下是本程序中使用到的全局变量********************/19.unsigned char IR_BitCnt=0;20.unsigned char IR_KeyValue=10; //按键码(始值不能为按键号中包含的值)21.unsigned char IR_UK=0; //用户定义的键号22.unsigned char IR_KeyValueN=0; //按键非码;按键码+按键非码=0xff23.long int IR_KeyValueSB=0; //遥控器识别码.24.unsigned char IR_FLAG = 0; //有键按下时此标志为125.26./*****************************************************************************27.**此结构休是为键号转换用,IR_KV为遥控器本身的键号,IR_UK为用户自定义的按键号28.*****************************************************************************/29. struct IR_KEY30.{31. unsigned char IR_KV;//遥控器自身键码32. unsigned char IR_UV;//user's value33.};34./*****************************************************************************35.**通过修改结构体数组中的值来设定遥控器的键号.36.*******************************************************************************/37.struct IR_KEY IR_UserKEY[IR_NUM]=38.{39. {68,1},{71,2},{14,3},{72,4},{73,5},{81,6},{10,7},{80,8},{74,9},{83,10},40. {18,11},{84,12},{78,13},{75,14},{3,15},{21,16},{86,17},{67,18},{2,19},{76,20},41. {82,21},{79,22},{70,23},{77,24},{69,25},{6,26},{66,27},{65,28},{64,29},{22,30},42. {85,31},{23,32},{9,33},{13,34},{87,35},{15,36},{8,37},{25,38},{24,39},{11,40},43. {0,41},{4,42},{16,43},{19,44},{5,45},{1,46},{17,47},{95,48},{94,49},{30,50},{26,51}44.};45.46.47./*************************************************************************48.**函数名称: IR_DELAY49.**功能描述: 用于延时.50.**调用模块: delay.h51.**全局变量: 无52.****************************************************************************/53.void IR_DELAY(unsigned int delayTime)54.{55. DELAY(delayTime);//延时8MS56.}57.58.59./*************************************************************************60.**函数名称: IR_Init61.**功能描述: 端口初始化设置,在main函数里面应先执行此函数62.**输入变量:无63.**返回值:无64.**调用模块:无65.**全局变量: IR_IN66.****************************************************************************/67.void IR_Init(void)68.{69. P2DIR &=~IR_IN; //端口设置为输入方向70. P2IE |= IR_IN; //使能中断71. P2IES |= IR_IN; //下降沿中断72. P2IFG &=~IR_IN; //为避免程序运行后直接进中断,此处需先将中断标志位清零73. _EINT();74.}75.76.77./*************************************************************************78.**函数名称: IR_getkey79.**功能描述: 读取遥控器键值,包括识别码,非码80.**输入变量: 无81.**返回值: 无82.**调用模块: IR_DELAY();83.**全局变量: IR_Delay_8MS,IR_Delay8MS,IR_IN84.****************************************************************************/85.void IR_getkey(void)86.{87. P2IFG &=~IR_IN;88. P2IE &=~IR_IN;89. /**********以下是判断中断是由按键引起的***************/90. IR_DELAY(IR_Delay_8MS); //延时0.8MS91. if(P2IN & IR_IN) goto IR_NXT;92. IR_DELAY(IR_Delay8MS); //延时8MS93. if(!(P2IN & BIT0)) goto IR_NXT;94. while(!(P2IN & IR_IN));//等待变高95. IR_DELAY(8900); //延时5MS左右96. if(P2IN & IR_IN) goto IR_NXT;97. IR_FLAG = 0;98. /********以下是读取16位识别码*******************/99. IR_KeyValueSB=0;100. for(IR_BitCnt=0;IR_BitCnt<16;IR_BitCnt++)101. {102. while(!(P2IN & IR_IN));//WAIT HIGH103. IR_KeyValueSB >>=1;104. IR_DELAY(IR_Delay_8MS);105. if(P2IN & IR_IN)106. IR_KeyValueSB |=0x80;107. else108. IR_KeyValueSB &=0x7f;109. while(P2IN & IR_IN);//WAIT LOW110. }111. /***********以下是读取8位的键码*******************/ 112. IR_KeyValue=0;113. for(IR_BitCnt=0;IR_BitCnt<8;IR_BitCnt++)114. {115. while(!(P2IN & IR_IN));//WAIT HIGH116. IR_KeyValue >>=1;117. IR_DELAY(IR_Delay_8MS);118. if(P2IN & IR_IN)119. IR_KeyValue |=0x80;120. else121. IR_KeyValue &=0x7f;122. while(P2IN & IR_IN);//WAIT LOW123.124. }125. /************以下是读取8位的非码****************/ 126. IR_KeyValueN=0;127. for(IR_BitCnt=0;IR_BitCnt<8;IR_BitCnt++)128. {129. while(!(P2IN & IR_IN));//WAIT HIGH130. IR_KeyValueN >>=1;131. IR_DELAY(IR_Delay_8MS);132. if(P2IN & IR_IN)133. IR_KeyValueN |=0x80;134. else135. IR_KeyValueN &=0x7f;136. while(P2IN & IR_IN);//WAIT LOW137.138. }139. for(unsigned char i=0;i<20;i++)140. IR_DELAY(IR_Delay8MS);141.IR_NXT:P2IFG &=~IR_IN;142.P2IE |=IR_IN;143.144.IR_FLAG=1;145.}146.147.148./********************************************************* ****************149.**函数名称: IR_getUK150.**功能描述: 根据得到的IR_KeyValue从IR_UserKEY表中查出对应的用户自定义的键值151.**输入变量: 无152.**返回值: 无153.**调用模块: 无154.**全局变量: IR_BitCnt,IR_NUM,IR_UserKEY,IR_KeyValue,IR_UK155.********************************************************** ******************/156.void IR_getUK(void)157.{158.159. for(IR_BitCnt=0;IR_BitCnt<IR_NUM;IR_BITCNT++) pre < **** *************************************************************** ********** **以下是SM0038输入信号引脚的中断函数. *********************************************************** ***************** } IR_UK="IR_UserKEY[IR_BitCnt].IR_UV;" if(IR_ BitCnt="=IR_NUM)" return; { if(IR_KeyValue="=IR_UserKEY[IR_BitC nt].IR_KV)">160.<SCRIPT src="/inc/gg_read2.js"></SCRIPT>。

红外遥控器解码程序

红外遥控器解码程序

红外线遥控器在家用电器和工业控制系统中已得到广泛应用,了解他们的工作原理和性能、进一步自制红外遥控系统,也并非难事。

1.红外线的特点人的眼睛能看到的可见光,若按波长排列,依次(从长到短)为红、橙、黄、绿、青、蓝、紫,如图1所示。

由图可见,红光的波长范围为0.62μm~0.76μm,比红光波长还长的光叫红外线。

红外线遥控器就是利用波长0.76μm~1.5μm之间的近红外线来传送控制信号的。

红外线的特点是不干扰其他电器设备工作,也不会影响周边环境。

电路调试简单,若对发射信号进行编码,可实现多路红外遥控功能。

2.红外线发射和接收人们见到的红外遥控系统分为发射和接收两部分。

发射部分的发射元件为红外发光二极管,它发出的是红外线而不是可见光,如图2所示。

常用的红外发光二极管发出的红外线波长为940nm左右,外形与普通φ5mm发光二极管相同,只是颜色不同。

一般有透明、黑色和深蓝色等三种。

判断红外发光二极管的好坏与判断普通二极管一样的方法。

单只红外发光二极管的发射功率约100mW。

红外发光二极管的发光效率需用专用仪器测定,而业余条件下,只能凭经验用拉距法进行粗略判定。

接收电路的红外接收管是一种光敏二极管,使用时要给红外接收二极管加反向偏压,它才能正常工作而获得高的灵敏度。

红外接收二极管一般有圆形和方形两种。

由于红外发光二极管的发射功率较小,红外接收二极管收到的信号较弱,所以接收端就要增加高增益放大电路。

然而现在不论是业余制作或正式的产品,大都采用成品的一体化接收头,如图3所示。

红外线一体化接收头是集红外接收、放大、滤波和比较器输出等的模块,性能稳定、可靠。

所以,有了一体化接收头,人们不再制作接收放大电路,这样红外接收电路不仅简单而且可靠性大大提高。

图3是常用两种红外接收头的外形,均有三只引脚,即电源正VDD、电源负(GND)和数据输出(Out)。

接收头的引脚排列因型号不同而不尽相同,图3列出了因接收头的外形不同而引脚的区别。

基于STC15单片机的多功能红外遥控小鼓手的设计

基于STC15单片机的多功能红外遥控小鼓手的设计

2018年第4期【摘要】本文介绍了一款采用STC15W204S 单片机作为主控制核心,结合红外线在无线信号传输方面的特点设计并制作的红外线遥控小鼓手玩具。

通过遥控发射器按下不同的发射键,对红外光发射不同频率的控制信号来区别不同的操作;当红外接收头接受到遥控发射器发出的信号后,对红外光接收频率进行识别,判断出具体的控制操作,同时利用单片机的中断系统功能、定时器/计数器功能等,调出预先储存的信息,进行解码,输出执行命令。

最终实现由单片机采用红外遥控的方式对玩具小鼓手的各项功能进行控制。

本设计既可以为教师开展翻转课堂提供素材,也可以为学生开展课程设计或课外制作提供技术参考。

【关键词】单片机;翻转课堂;红外遥控;玩具一、引言随着现代科技的高速发展和人民生活水平的日益提高,利用单片机技术设计的电子产品可谓是日新月异,种类繁多,用途广泛。

单片机已渗透到各个领域,如导航装置,智能仪表,网络通讯与数据传输,工业自动化实时控制和数据处理,智能IC 卡,轿车安全保障系统,录像机,摄像机,全自动洗衣机,机器人,医疗器械,以及程控玩具、电子宠物等等,其中设计和生产现代化、智能化,趣味生动,且易于操作的儿童玩具,已然成为一个课题。

通过调查研究,如今集成电路飞速发展,使得基于各类芯片的新型遥控技术和核心控制器件层出不穷。

遥控装置的核心控制部件早已从以前的分立元件、集成电路逐步发展到现在的单片微型计算机,智能化和便捷化程度大大提高。

目前常用的遥控技术主要有超声波遥控、红外线遥控、无线电遥控等等。

由于红外线的自身技术特点使得它可以在很大区域和空间内实现,并在儿童玩具市场具备广泛的应用价值。

无论是普通红外遥控器,还是多功能红外遥控器,都能根据需要控制不同种类的玩具,并且操作方便,深受孩子们的喜爱。

掌握和巧用单片机技术和红外遥控技术,可以为未来儿童玩具的设计和生产注入新的生命力。

因此,笔者探索出一种基于单片机控制的可编程红外线遥控技术,并设计出一款多功能红外遥控小鼓手。

STC-15f104e程序-红外线程序

STC-15f104e程序-红外线程序

STC-15F104E红外线解码程序+仿真文件(可定义任意I/O作接收脚,支持长/短按,自适应主...红外线NEC解码程序+仿真文件(可定义任意I/O作接收脚,支持长/短按,自适应主频6MHz~40MHz)//*********************【NEC解码头文件】*******************//// 简介:本程序适用于NCE解码:(9ms+4.5ms)引导码+32位编码。

// 兼容STC所有型号(包括1T 和12T 系列),可以定义任意I/O作红外接收脚,// 自适应解码主频:6MHz ~ 40MHz。

//// 使用条件:占用系统定时器0,开启定时器0中断(如使用其它定时器请自改IR_Init();初始化函数)//// 使用说明:填相关宏定义:USER_H、USER_L、Check_EN、CPU_Fosc、IR,// 上电初始化函数IR_Init(),// 在定时器0中断中调用IR_NEC()解码函数,// 解码有效时,IR_BT=2即短按,IR_BT=3即长按,由用户清0,// 解码存放:用户码高8位NEC[0],用户码低8位NEC[1],操作码NEC[2],操作码反码NEC[3]。

////【供用户调用的函数】// IR_Init(); //接收初始化,开启定时器0中断400us// IR_NEC(); //红外线解码(解NEC编码)////***************************************************************/#ifndef __IR_NEC_H__#define __IR_NEC_H__//【用户必填项:USER_H、USER_L、Check_EN、CPU_Fosc、IR】#define USER_H 0x80 //用户码高8位#define USER_L 0x7F //用户码低8位#define Check_EN 0 //是否要校验16位用户码:不校验填0,校验则填1#define CPU_Fosc 12000000L //输入主频,自适应解码(单位:Hz,范围:6MHz ~ 40MHz)#define CA_S 8 //长按时间设置,单位:108mS(即108mS整数倍,10倍以上为宜)sbit IR = P3^6; //红外线接口(任意引脚)#define Step 400 //红外采样步长:400us#define TH_H ((65536-Step*(CPU_Fosc/300)/40000)/256) //定时器高8位基准赋值#define TH_L ((65536-Step*(CPU_Fosc/300)/40000)%256) //定时器低8位基准赋值uint8 IR_BT; //解码效果返回:0无效,1有效,2短按,3长按uint8 NEC[4]; //解码存放:16位用户码、操作码正反码uint8 cntCA; //长按计数uint16 cntStep; //步数计bit IRa,IRb; //接收脚电位状态保存bit IRsync; //同步标志uint8 BitN; //位码装载数/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:红外线解码初始化┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void IR_Init(){TMOD &= 0xF0; //清定时器0TMOD |= 0x01; //定时器0:16位定时器TL0 = TH_L; //每步时间TH0 = TH_H;ET0 = 1;EA = 1;TR0 = 1;}/*┈┈┈┈┈┈┈┈┈┈基准┈┈┈┈┈┈┈┈┈┈┈*/#define Boot_Limit ((9000+4500 +1000)/Step) //引导码周期上限#define Boot_Lower ((9000+4500 -1000)/Step) //引导码周期下限#define Bit1_Limit ((2250 +800)/Step) //“1”周期上限#define Bit0_Limit ((1125 +400)/Step) //“0”周期上限/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:红外线NEC周期采样解码法(定时中断,下降沿查询周期时间)全局变量:IR_BT = 0无效1有效,待继续判断长、短按(如不需要判断长、短按,则直接使用)2短按3长按┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void IR_NEC(){TL0 = TH_L; //重赋值TH0 = TH_H;IRb = IRa; //保存上次电位状态IRa = IR; //保存当前电位状态cntStep++; //步数累加if(IR_BT==1)if(cntStep>300)IR_BT=2; //解码有效后,如果无长按,120ms(400us×300)后默认短按if(IRb && !IRa) //是否下降沿(上次高,当前低){if(cntStep > Boot_Limit) //超过同步时间?{if(IR_BT==1)if(++cntCA>CA_S)IR_BT=3; //解码有效后,继续按住遥控>CA_S即长按IRsync=0; //同步位清0}else if(cntStep > Boot_Lower){ IRsync=1; BitN=32; } //同步位置1,装载位码数32else if(IRsync) //如果已同步{if(cntStep > Bit1_Limit)IRsync=0;else{NEC[3] >>= 1;if(cntStep > Bit0_Limit)NEC[3] |= 0x80; //“0”与“1”if(--BitN == 0){IRsync = 0; //同步位清0#if (Check_EN == 1)if((NEC[0]==USER_H)&&(NEC[1]==USER_L)&&(NEC[2]==~NEC[3])) //校验16位用户码、操作码正反码{ IR_BT=1; cntCA=0; } //解码有效,接下来判断:短按?长按?#elseif(NEC[2]==~NEC[3]){ IR_BT=1; cntCA=0; } //只校验操作码正反码#endif}else if((BitN & 0x07)== 0) //NEC[3]每装满8位,移动保存一次(即BitN%8 == 0){ NEC[0]=NEC[1]; NEC[1]=NEC[2]; NEC[2]=NEC[3]; }}}cntStep = 0; //步数计清0}}//取消相关宏定义#undef CPU_Fosc#endif主程序#include "INC\STC89C52RC.H"#include "INC\MY_SET.H"#include "INC\IR_NEC.H" //调用NEC解码头文件sfr SE = 0x80; //数码管段选P0:0x80 P1:0x90sbit WX1 = P2^0; //数码管位显sbit WX2 = P2^1;sbit WX3 = P2^2;sbit WX4 = P2^3;sbit WX5 = P2^4;sbit WX6 = P2^5;sbit WX7 = P2^6;sbit WX8 = P2^7;uint8c tab[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8 E,0xFF};uint8 Xn,X1,X2,X3,X4,X5,X6;void KZ0(); //短按处理void KZ1(); //长按处理/***************** 主函数********************/void main(void){IR_Init(); //红外线解码初始化while(1){//遥控检测if((IR_BT==2)||(IR_BT==3)){if(IR_BT==2)KZ0(); //短按处理else KZ1(); //长按处理IR_BT =0; //清有效标志X1 = NEC[0]/16; //更新显示X2 = NEC[0]%16;X3 = NEC[1]/16;X4 = NEC[1]%16;X5 = NEC[2]/16;X6 = NEC[2]%16;}}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:遥控短按处理┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/ void KZ0(){switch(NEC[2]){case 0x12: P10 = !P10; break;case 0x05: break;case 0x1E: break;case 0x55: break;case 0x01: break;case 0x1B: break;case 0x03: break;case 0x6B: break;case 0x07: break;case 0x08: break;case 0x09: break;case 0x68: break;case 0x22: break;case 0xE6: break;case 0x33: break;case 0xE2: break;default:break;}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:遥控长按处理┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/ void KZ1(){switch(NEC[2]){case 0x12: P14 = !P14; break;case 0x05: break;case 0x1E: break;case 0x55: break;case 0x01: break;case 0x1B: break;case 0x03: break;case 0x6B: break;case 0x07: break;case 0x08: break;case 0x09: break;case 0x68: break;case 0x22: break;case 0xE6: break;case 0x33: break;case 0xE2: break;default:break;}}/*********************数码管扫描*************************/void XS(void){if(++Xn > 7)Xn=0;switch(Xn){case 0: WX8=1; NOP; //屏蔽上个位显SE=tab[X1]; //送段码WX1=0; //开位显break;case 1: WX1=1; NOP; SE=tab[X2]; WX2=0; break;case 2: WX2=1; NOP; SE=tab[X3]; WX3=0; break;case 3: WX3=1; NOP; SE=tab[X4]; WX4=0; break;case 4: WX4=1; NOP; SE=tab[16]; WX5=0; break;case 5: WX5=1; NOP; SE=tab[16]; WX6=0; break;case 6: WX6=1; NOP; SE=tab[X5]; WX7=0; break;case 7: WX7=1; NOP; SE=tab[X6]; WX8=0; break; default:break;}}/********************** 定时器0中断函数************************/ void time0(void) interrupt 1{IR_NEC(); XS();}。

红外遥控解码程序

红外遥控解码程序

本文是对与以前发表的程序做个适当更改,因为在使用的过程中出现了一个问题,也就是在外部中断的处理函数里面处理欠妥。

在执行外部中断函数的时候,本意以定时器中断来代表解码超时,可实际情况是,即使解码超时,定时器产生溢出,但是程序却不能按照正常程序跳进定时器中断,执行定时中断函数,本以为是中断优先级的原因,但是在设置了定时器中断优先级为最高,也还是不能正常进入。

随后本人想到了解决办法,利用定时器0溢出标志TF0作为判断超时的依据,因为当TF0为1时,定时器向CUP申请中断,我们可以通过查询的方式,当TF0为1,则解码超时,退出解码。

此时不需要定时器中断函数,也可判断解码是否超时。

有人就说了,那我判断超时是否我可以定义变量,当变量超过一定数值时代表超时。

我想说,何必呢,本身定时器0溢出标志就是TF0,红外解码用到定时器,那不就刚好么,何必再去定义变量呢。

按照了解,通用的红外信号电平持续最长的时间是起始电平,一个9ms的低电平时间,定时器从0开始计时到溢出,如果是52单片机12M晶振速度,按照12分频,一个定时器脉冲时间是1us,溢出所需要的时间是65ms左右。

所以当定时器溢出,我们就不必等待,TF0作为停止解码的标志也只能用在这种速度比较低的单片机上,对于高速单片机,假如定时器溢出只需要2ms,那要是再使用TF0做判断,也就无意义了。

好了,废话不多说了。

注:主函数由读者自己编写,本程序只用于解码,最终得出的按键码存于变量Key_Temp 中。

本人习惯写某个器件的程序的时候,习惯创建.c和.h文件,因为这样方便移植,在新建的程序中只需添加.C文件和include .h文件就行了,很方便。

本人用芯片是STC15W4K32S4。

自己用这块芯片做有开发板,平时写程序都用它。

也可用一般的51单片机,但要注意定时器的时间和外部中断的端口。

本程序只适用NEC编码的解码,RC5编码请绕道。

以下是头文件信息:#ifndef __IR_H__#define __IR_H__sbit IR = P3^6;extern unsigned char Long_Press,Long_Press1; //长按计数,用作长按判断extern unsigned char Key_Temp; //保存按键变量void Init_IR(); //初始化红外有关参数#endif以下是.c文件:#include <STC15W.h>//也可以用reg52.h ,一般的编译器没有<STC15W.h>这个头文件,因为这是我个人添加进编译器里面的 #include "IR.h"#include "IR.h"/*******************************************************************时间计算:时间由定时器计的定时值来决定,本程序设定工作频率是24MHz,但定时器是12T模式。

STC15系列只用一个定时器的红外接收程序

STC15系列只用一个定时器的红外接收程序

#define User_code 0xFD02 //定义红外接收用户码
/************* 以下宏定义用户请勿修改 **************/
#include "reg51.H"
#define uchar unsigned char
#define uint unsigned int
sbit P_TXD1 = P3^1; //定义模拟串口发送脚,打印信息用
sbit P_IR_RX = P0^1; //定义红外接收输入端口
bit P_IR_RX_temp; //Last sample
bit B_IR_Sync; //已收到同步标志
uchar IR_SampleCnt; //采样计数
对于用户码与User_code定义不同的遥控器,程序会将用户码一起从串口输出。
使用模拟串口发送监控显示编码,显示内容为ASCII码和中文。
本接收程序基于状态机的方式,占用CPU的时间非常少。
HEX文件在本目录的/list里面。
******************************************/
/*------------------------------------------------------------------*/
/************* 功能说明 **************
红外接收程序。适用于市场上用量最大的HT6121/6122及其兼容IC的编码。
//*******************************************************************************************

红外遥控编码原理及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,不再接受红外信号,只解码当前的红外信号。

C语言写的红外遥控解码程序

C语言写的红外遥控解码程序

C语言写的红外遥控解码程序#include “STC89C51RC.H”sbit DQ = P4;sb it SPK = P1;#include absacc.h#define seg1 XBYTE[0xffec]#define seg2 XBYTE[0xffed]#define seg3 XBYTE[0xffee]#define seg4 XBYTE[0xffef]unsigned char IRMcode[4];unsigned char code ledmap[]=//共阴LED 数码管译码表{0x3f,0x06,0x5b,0x4f,0x66,//0,1,2,3,4,0x6d,0x7d,0x07,0x7f,0x6f,//5,6,7,8,9,0x77,0x 7C,0x39,0x5E,0x79,//A,b,C,d,E,0x71,//F,};void delay(unsigned int);void main(){EA = 1;EX2 = 1; while(1){if (IRMcode[2]==~IRMcode[3]){seg1 = ~ledmap[IRMcode[2]/100];seg2 = ~ledmap[IRMcode[2]/10%10];seg3 = ~ledmap[IRMcode[2]%10];seg4 = 0xff;//熄灭}}}void Sound(void){SPK = 0;delay(10000);SPK = 1;}void IRMint(void) interrupt 6 using 2{unsigned char count;unsigned int count1;unsigned char i,j;EA = 0;count = 9;while(-- count){delay(100);//440usif(DQ){EA = 1;return;}}while(DQ==0);//通过引导码余下的低电平//以上完成引导码4.5ms 的低电平检测count = 9;count1 = 0;while(-- count){delay(100);//440usif(DQ==0){EA = 1;return;}}while(DQ==1)//通过引导码余下的高电平{ if(count1++1000) {P1=0x55;EA = 1;return;}}//以上完成引导码4.5ms 的高电平检测count1 = 0;for(j=0;j4;j++)//有效字节数设定{for(i=0;i8;i++)//字节bit 数{while(DQ==0);//通过编码低电平delay(200);//延时判断编码高电平维持长度IRMcode[j]=1;if(DQ)IRMcode[j]|=0x01;while(DQ==1){//通过编码余下的。

stc15w红外遥控发射解码程序

stc15w红外遥控发射解码程序

stc15w红外遥控发射解码程序#include#include#define u8 unsigned char#define u16 unsigned int#define FOSC 11059200L#define F36_0KHz (65536-FOSC/2/36000) //1T模式//#define F38_4KHz (65536-FOSC/2/12/38400) //12T模式sbit K0=P0^0;sbit K1=P0^1;sbit K2=P0^2;sbit K3=P0^3;sbit IR_Sout =P3^7;sbit T1CLKO = P3^4; //定时器1的时钟输出脚sfr P0M1 = 0x93;sfr P0M0 = 0x94;sfr P1M1 = 0x91;sfr P1M0 = 0x92;sfr P2M1 = 0x95;sfr P2M0 = 0x96;sfr P3M1 = 0xb1;sfr P3M0 = 0xb2;sfr P4M1 = 0xb3;sfr P4M0 = 0xb4;sfr P5M1 = 0xC9;sfr P5M0 = 0xCA;sfr P6M1 = 0xCB;sfr P6M0 = 0xCC;sfr P7M1 = 0xE1;sfr P7M0 = 0xE2;sfr AUXR = 0x8e; //辅助特殊功能寄存器sfr INT_CLKO = 0x8f; //唤醒和时钟输出功能寄存器//u8 Date;void IR_Send38khz( )//是发射38KHZ的程序 //P34脚{AUXR |= 0x40; //定时器1为1T模式// AUXR &= ~0x40; //定时器1为12T模式TMOD = 0x00; //设置定时器为模式1(16位自动重装载)TMOD &= ~0x40; //C/T1=0, 对内部时钟进行时钟输出// TMOD |= 0x40; //C/T1=1, 对T1引脚的外部时钟进行时钟输出TL1 = F36_0KHz; //初始化计时值TH1 = F36_0KHz >> 8;TR1 = 1;INT_CLKO = 0x02; //使能定时器1的时钟输出功能}void Delay10us(u16 M) //@11.0592MHz{u8 n; u16 m;for (m=0;m<m;m++){_nop_();n = 25;while (--n);}}void IR_Send_Startcode( ){IR_Sout=1;Delay10us(900);IR_Sout=0;Delay10us(450);}void IR_Send_Bit0( ){IR_Sout=1;Delay10us(56);IR_Sout=0;Delay10us(56);}void IR_Send_Bit1( ){IR_Sout=1;Delay10us(56);IR_Sout=0;Delay10us(169);}void IR_Send_8Bitdate(u8 num)//发射8位数据位{u8 i;for(i=8;i>0;i--){if(num&0x01) IR_Send_Bit1( );//发高else IR_Send_Bit0( );//发低num=num>>1;//接着下一位数据&0x01}}/********void IR_Send_32Bitdate(u8 Address_Date, u8 Date)//发射引导加32BIT(即一帧数据){IR_Send_Startcode( );IR_Send_8Bitdate(Address_Date);//addressIR_Send_8Bitdate(~Address_Date);//~addressIR_Send_8Bitdate(Date); //IR_Send_8Bitdate(~Date);//~dat}******/void IR_Send_32Bitdate(u8 Date)//发射引导加32BIT(即一帧数据){IR_Send_Startcode( );IR_Send_8Bitdate(0x02);//addressIR_Send_8Bitdate(0xfd);//~addressIR_Send_8Bitdate(Date); //IR_Send_8Bitdate(~Date);//~dat}Keyscan( )//按键扫描 //可移植4x4按键程序代替{u8 value;if (K0==0) {value=0x26;}if (K1==0) {value=0xe2;}if (K2==0) {value=0x7f;}if (K3==0) {value=0x5e;}return(value);}void main( ){extern u8 Date;P0M0 = 0x00;P0M1 = 0x00;P1M0 = 0x00;P1M1 = 0x00;P2M0 = 0x00;P2M1 = 0x00;P4M0 = 0x00;P4M1 = 0x00;P5M0 = 0x00;P5M1 = 0x00;P3M0 =0x00;P3M1 =0x00;//输出IR_Send38khz( );while(1){while(K0==0||K1==0||K2==0||K3==0){Dat</m;m++)e=Keyscan( );IR_Send_32Bitdate(Date);//P3M0 =0x00;P3M1 =0x80;//关闭IO口}}}///接收代码部分#include#include#define u8 unsigned char#define u16 unsigned int#define FOSC 11059200Lsfr AUXR = 0x8e; //辅助特殊功能寄存器sfr INT_CLKO = 0x8f; //唤醒和时钟输出功能寄存器sbit LED=P0^0;u8 IRdate[33];u8 IRtime;u8 IRcode[4];bit IRrecve_ok;bit Recve32bit_ok;//bit startflag; u8 Num;void Timer0_Init( ) //150微秒@11.0592MHz{AUXR |= 0x80; //定时器时钟1T模式TMOD &= 0xF0; //设置定时器模式TL0 = 0x85; //设置定时初值TH0 = 0xF9; //设置定时初值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时ET0=1;EA=1;}void EXInt0_Init( ){IT0 = 1; //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿) EX0 = 1; //使能INT0中断EA = 1;}void IRpros( ){u8 i,j,k=1,valve;for(j=0;j<4;j++){for(i=0;i<8;i++){valve=valve>>1;if((IRdate[k]>10)&&(IRdate[k]<18)){valve=valve|0x80;} //1.12MS~2.25MS 150usxIRdatek++;}IRcode[j]=valve;}Recve32bit_ok=1;}void main(){LED=0;EXInt0_Init( );Timer0_Init( );while(1){if(IRrecve_ok) IRpros( );if(Recve32bit_ok) P2=IRcode[3];}}void Time0() interrupt 1{IRtime++;}void Exint0() interrupt 0 //INT0中断入口{static bit startflag; static u8 Num;if(startflag){if ((IRtime>60)&&(IRtime<120)) Num=0; //90X150 IRdate[Num]=IRtime;IRtime=0;Num++;if(33==Num){Num=0;IRrecve_ok=1;}}else{startflag=1;IRtime=0;}}。

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

sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
IR_Send_8Bitdate(Date); //
IR_Send_8Bitdate(~Date);//~dat
}
Keyscan( )//按键扫描 //可移植4x4按键程序代替
{
u8 value;
if (K0==0) {value=0x26;}
if (K1==0) {value=0xe2;}
//#define F38_4KHz (65536-FOSC/2/12/38400) //12T模式
sbit K0=P0^0;
sbit K1=P0^1;
sbit K2=P0^2;
sbit K3=P0^3;
sbit IR_Sout =P3^7;
sbit T1CLKO = P3^4; //定时器1的时钟输出脚
TL1 = F36_0KHz; //初始化计时值
TH1 = F36_0KHz >> 8;
TR1 = 1;
INT_CLKO = 0x02; //使能定时器1的时钟输出功能
}
void Delay10us(u16 M) //@11.0592MHz
sfr INT_CLKO = 0x8f; //唤醒和时钟输出功能寄存器
//u8 Date;
void IR_Send38khz( )//是发射38KHZ的程序 //P34脚
{
AUXR |= 0x40; //定时器1为1T模式// AUXR &= ~0x40; //定时器1为12T模式
if (K2==0) {value=0x7f;}
if (K3==0) {value=0x5e;}
return(value);
}
void main( )
{
extern u8 Date;
P0M0 = 0x00;P0M1 = 0x00;P1M0 = 0x00;P1M1 = 0x00;P2M0 = 0x00;
{
u8 i;
for(i=8;i>0;i--)
{
if(num&0x01) IR_Send_Bit1( );//发高
else IR_Send_Bit0( );//发低
num=num>>1;//接着下一位数据&0x01
}
}
/********
void IR_Send_32Bitdate(u8 Address_Date, u8 Date)//发射引导加32BIT(即一帧数据)
TMOD = 0x00; //设置定时器为模式1(16位自动重装载)
TMOD &= ~0x40; //C/T1=0, 对内部时钟进行时钟输出// TMOD |= 0x40; //C/T1=1, 对T1引脚的外部时钟进行时钟输出
}
******/
void IR_Send_32Bitdate(u8 Date)//发射引导加32BIT(即一帧数据)
{
IR_Send_Startcode( );
IR_Send_8Bitdate(0x02);//address
IR_Send_8Bitdate(0xfd);//~address
{
u8 n; u16 m;
for (m=0;m<M;m++)
{_nop_();n = 25;while (--n);}
}
void IR_Send_Startcode( )
{IR_Sout=1;Delay10us(900);IR_Sout=0;Delay10us(450);}
void IR_Send_Bit0( )
{IR_Sout=1;Delay10us(56);IR_Sout=0;Delay10us(56);}
void IR_Send_Bit1( )
{IR_Sout=1;Delay10us(56);IR_Sout=0;Delay10us(169);}
void IR_Send_8Bitdate(u8 num)//发射8位数据位
P2M1 = 0x00;P4M0 = 0x00;P4M1 = 0x00;P5M0 = 0x00;P5M1 = 0x00;
P3M0 =0x00;P3M1 =0x00;//输出
IR_Send38khz( );
{
IR_Send_Startcode( );
IR_Send_8Bitdate(Address_Date);//address
IR_Send_8Bitdate(~Address_Date);//~add(Date); //
IR_Send_8Bitdate(~Date);//~dat
#include<reg51.h>
#include<intrins.h>
#define u8 unsigned char
#define u16 unsigned int
#define FOSC 11059200L
#define F36_0KHz (65536-FOSC/2/36000) //1T模式
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr AUXR = 0x8e; //辅助特殊功能寄存器
相关文档
最新文档