编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

红外遥控发射程序,stc红外遥控c51程序,智能家居控制

wxchong 2025-08-02 22:23:29 开源技术 5 ℃ 0 评论

用一个8脚芯片,通过l/O口直接驱动红外发射二极管+加串口通信可以控制家电,实现智能家居,发送组合码,一键直达,省去繁锁操作。下面设计一款红外遥控发射基础程序,其实发射程序比接收程序更简单,关键载波频率要求接近38k,半周期13.1微秒,有些电器红外接收频宽很窄,频率稍偏一点就无法接收,或遥控距离短,所以用stc单片机RC高频,能更好调制到接近38K,又保证串口正常通信。


//编程发送红外遥控码 擎育

//注意 IRC频率 22.1184MHZ *********************************************

#include "STC8.h"

#include "intrins.h" //使用nop()函数需引用此文件

#define uchar unsigned char

#define uint unsigned char


//引脚定义

sbit LED=P5^4; //指示灯

sbit IRO=P5^5; //红外发射

sbit KEY1=P3^3; //按键

//数据定义

uchar IR_time=0; //下降沿之间的时间计数值

uchar IR_data[9]; //引导码+8个位数据各自占用的时间

bit IRF; //红外发射延时到标志

uchar count; //280us

uchar IR_bit; //变量IR_bit用于指示红外数据的位数

uchar Rm; //串口接收字节

uchar data IRom[4]; //定义一个4字节的数组用来存储代码

uchar KN=0;


//-------------------------红外发送高电平
----------------------------

void High_leve(uchar a)//a*280uS

{

uchar k;

IRF = 0;

count = a;

TL0 = 0xF6; //设置定时初始值

TH0 = 0xCF;

while(!IRF) //38khz载波

{

k = 118; //可适当修改达到最远红外遥控距离

while (--k);

IRO = ~IRO;

}

IRO = 1;

}


//-------------------------红外发送低电平
----------------------------

void Low_leve(uchar a)//a*280uS

{ count = a;

IRO = 0;

IRF = 0;

TL0 = 0xF6; //设置定时初始值

TH0 = 0xCF;

while(!IRF);

}


//-------------------------红外发送单字节数据
----------------------------

void Send_IR(void)

{uchar dat;

uchar i,j;

High_leve(16);//发送引导码 0.56*16=9ms

Low_leve(8); //间隔码 4.5ms

for(i=0;i<4;i++){ dat=IRom[i];//发送4个字节地址码及数据码

for(j=0;j<8;j++)

{

High_leve(1);//0.56ms

if(dat&0x01) Low_leve(3);// 1.69ms

else Low_leve(1);//0.56ms

dat = dat>>1;

}

}

High_leve(1);//0.56ms

}

void Uart1_Init(void) //9600bps@22.1184MHz

{

SCON = 0x50; //8位数据,可变波特率

AUXR |= 0x40; //定时器时钟1T模式

AUXR &= 0xFE; //串口1选择定时器1为波特率发生器

TMOD &= 0x0F; //设置定时器模式

TL1 = 0xC0; //设置定时初始值

TH1 = 0xFD; //设置定时初始值

ET1 = 0; //禁止定时器中断

TR1 = 1; //定时器1开始计时

REN=1; //串口接收允许

ES=1; //串口接收中断打开

EA=1;

}

//**************************** 延时子程序 ************************

void Delay1(void)

{uchar i,j,k;

for(i=200;i>0;i--)

for(j=200;j>0;j--)

for(k=250;k>0;k--) ; //k=3;

}

void Delay18ms(void) //18ms

{uchar i,j;

for(i=250;i>0;i--)

for(j=250;j>0;j--);

}

void LEDS(void)

{LED=0;

Delay18ms(); Delay18ms();

LED=1;

}


//-------------------------定时器0初始化
----------------------------

void Timer0_Init(void) //556微秒@22.1184MHz

{

AUXR |= 0x80; //定时器时钟1T模式

TMOD &= 0xF0; //设置定时器模式

TL0 = 0xF6; //设置定时初始值

TH0 = 0xCF; //设置定时初始值

TF0 = 0; //清除TF0标志

TR0 = 1; //定时器0开始计时

ET0=1; //使能T0中断

}


//机顶盒遥控器数字键

void k0(void)

{IRom[0]=0xb3;IRom[1]=0x4c; IRom[2]=0x77; IRom[3]=~0x77; Send_IR();}

void k1(void)

{IRom[0]=0xb3;IRom[1]=0x4c; IRom[2]=0x92; IRom[3]=~0x92; Send_IR();}

/*

void k2(void)

{IRom[0]=0xb3;IRom[1]=0x4c; IRom[2]=0x93; IRom[3]=~0x93; Send_IR();}

void k3(void)

{IRom[0]=0xb3;IRom[1]=0x4c; IRom[2]=0xcc; IRom[3]=~0xcc; Send_IR();}

void k4(void)

{IRom[0]=0xb3;IRom[1]=0x4c; IRom[2]=0x8e; IRom[3]=~0x8e; Send_IR();}

void k5(void)

{IRom[0]=0xb3;IRom[1]=0x4c; IRom[2]=0x8f; IRom[3]=~0x8f; Send_IR();}

void k6(void)

{IRom[0]=0xb3;IRom[1]=0x4c; IRom[2]=0xc8; IRom[3]=~0xc8; Send_IR();}

void k7(void)

{IRom[0]=0xb3;IRom[1]=0x4c; IRom[2]=0x8a; IRom[3]=~0x8a; Send_IR();}

void k8(void)

{IRom[0]=0xb3;IRom[1]=0x4c; IRom[2]=0x8b; IRom[3]=~0x8b; Send_IR();}

void k9(void)

{IRom[0]=0xb3;IRom[1]=0x4c; IRom[2]=0xc4; IRom[3]=~0xc4; Send_IR();}

*/

void pwoeTV(void) //海信电视电源

{Delay1(); IRom[0]=0x00;IRom[1]=0xbf; IRom[2]=0x0d; IRom[3]=0xf2;

}

void pwoe(void) //机顶盒电源

{ IRom[0]=0x22;IRom[1]=0xdd; IRom[2]=0xdc; IRom[3]=0x23;

}


//-------------------------主函数
----------------------------

void main(void)

{

P3M0 &= ~0x0f; P3M1 &= ~0x0f;//P3.0、 P3.1、P3.2、P3.3 双向

P5M0 |= 0x30; P5M1 &= ~0x30;//P5.4 P5.5 推挽输出

LEDS();

Timer0_Init(); //定时计数器0初始化函数

Uart1_Init(); //串口初始化程序

EX1=1;EA=1;

IRO=1; LED=1; //红外发射置高

SBUF=0xca; while(!TI); TI=0;//测试

while(1)

{

if(KN==0){pwoe();}

if(KN==1){k1();} //发送数字键1

Delay1();

PCON=0x02; //单片机休眠

}

}


//-------------------------外部中断1服务函数-------------------------

void key() interrupt 2

{

Delay18ms();Delay18ms();

if(!KEY1){ LEDS();

KN++;

if(KN>1)KN=0;

}

}


//-------------------------定时器0中断服务函数-------------------------

void TIMER1_ISR() interrupt 1

{

count--;

if(count == 0)

{

IRF = 1;

}

}


//-------------------------串口中断服务函数-------------------------

void UART_SER() interrupt 4

{

RI=0;

Rm=SBUF;

if(Rm==0xaa)

{ SBUF=0xaf; while(!TI); TI=0;

Delay1(); Delay1();

IAP_CONTR=0x60;//复位下载程序

}


}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表