网站首页 > 开源技术 正文
用一个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;//复位下载程序
}
}
- 上一篇: 三相异步电机点动控制改造成西门子PLC程序
- 下一篇: 51单片机多机通信系统实现方法
猜你喜欢
- 2025-08-02 编写汇编语言常见错误分析
- 2025-08-02 HC89S003P 20引脚8位ADC型FLASH单片机
- 2025-08-02 基于51单片机的万年历
- 2025-08-02 基于AT89S51单片机接口电路的时序仿真研究
- 2025-08-02 MON-51单片机仿真器使用手册
- 2025-08-02 重要提醒,单片机发展史,它到底是一个什么东西
- 2025-08-02 keil软件是干嘛的?keil软件怎么用?
- 2025-08-02 51单片机多机通信系统实现方法
- 2025-08-02 三相异步电机点动控制改造成西门子PLC程序
- 2025-08-02 C51单片机 15 - 2 步进电机
你 发表评论:
欢迎- 08-02编写汇编语言常见错误分析
- 08-02HC89S003P 20引脚8位ADC型FLASH单片机
- 08-02基于51单片机的万年历
- 08-02基于AT89S51单片机接口电路的时序仿真研究
- 08-02MON-51单片机仿真器使用手册
- 08-02重要提醒,单片机发展史,它到底是一个什么东西
- 08-02keil软件是干嘛的?keil软件怎么用?
- 08-0251单片机多机通信系统实现方法
- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)