标题:
基于NEC协议红外发射程序,STC89C52单片机开发板调试通过,附源码
[打印本页]
作者:
wzqwxx
时间:
2021-10-15 21:18
标题:
基于NEC协议红外发射程序,STC89C52单片机开发板调试通过,附源码
基于NEC协议红外发射程序,STC89C52开发板调试通过,发这个贴子是呼应前期的帖子——接收程序,欢迎大家多提宝贵意见。
NEC 标准下的编码表示
发送端: 引导码高电平约9000us 左右,低电平约4500us 左右;
接收端:引导码低电平约9000us 左右,高电平约4500us 左右;
用户码16 位,数据码16 位,共32位;
发送端: 数据0 是用“高电平约560us +低电平约560us”表示。
数据1 可用“高电平约560us+低电平约1680us”表示
接收端反转:数据0 是用“低电平约560us +高电平约560us”表示。
数据1 可用“低电平约560us+高电平约1680us”表示
单片机源程序如下:
/*****************************************************
主机:AT89C52 主频为11.0592Mhz 红外NEC协议编码
编程:wzqwxx 水上人家
******************************************************/
#include <REGX52.H>
sbit IR_TX = P2^4; //定义红外发射端口
void T0_init() //初始化定时器0
{
TMOD = 0x01;
ET0 = 1;
EA = 1;
}
void T1_Init(void) //13微秒@11.0592MHz
{
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xF4; //设置定时初始值 38KHz
TH1 = 0xF4; //设置定时重载值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
}
/****中断产生红外发射不同时长延时函数560us 1680us 4500us 9000us*****/
void IR_TXD_time( unsigned char th0,tl0)
{
TH0 = th0;
TL0 = tl0;
TR0 = 1; //打开定时器计时
IR_TX = 1;
while(TF0 == 0); //延时,等待产生中断
TF0 = 0;
TR0 = 0;
TR1 = 0;
IR_TX = 1;//结束时拉高发射端口,结束发射
}
/*********红外发送4字节数据函数**********/
void IR_Send_4B_Date(unsigned char *p)
{
unsigned char i,j;
ET1 = 1; TR1 = 1; //打开T1中断,产生38KHz频率波,调制产生高电平信号
IR_TXD_time(0xdf,0x9a);// 产生9000us信号
ET1 = 0;//关闭38KHz频率波,调制产生低电平信号 ,下同
IR_TXD_time(0xef,0xcd);// 产生4500us信号
for(i = 0 ; i < 4 ; i++)
{
for(j = 0x01 ; j != 0 ; j <<= 1)//发送32位数据
{
ET1 = 1; TR1 = 1;
IR_TXD_time(0xfe,0x08);// 产生560us高电平信号
ET1 = 0;
if(*(p+i) & j) //按位与是1则
IR_TXD_time(0xfa,0x4c);// 产生1680us低电平信号
else
IR_TXD_time(0xfe,0x3f);// 产生560us低电平信号
}
}
ET1 = 1;TR1 = 1;
IR_TXD_time(0xfd,0xfc);// 产生560us高电平信号,结束32位数据发送
ET1 = 0;
}
/*********主函数**********/
void main()
{
unsigned char IR_Data[] = {0x22,0xdd,0x00,0xff} ;//待发数据
unsigned char num;
T0_init();
T1_Init();
while(1)
{
P3 = 0x0f;
if(P3 != 0x0f)
{
IR_TXD_time(0x8f,0x9a);// 延时消抖
if(P3 !=0x0f)
{
num = P3&0x0f;
}
if(num == 0x0e) //我家机顶盒的遥控数据,简单测试四个键值
{IR_Data[2] =0xdc ; IR_Data[3] = ~IR_Data[2];} // 电源
else if(num == 0x0d)
{IR_Data[2] = 0x99 ; IR_Data[3] = ~IR_Data[2];}//左移
else if(num == 0x0b)
{IR_Data[2] = 0xc1 ; IR_Data[3] = ~IR_Data[2];} //右移
else if(num == 0x07)
{IR_Data[2] = 0xd2 ; IR_Data[3] = ~IR_Data[2];} //下翻
IR_Send_4B_Date(IR_Data); //发送
IR_TXD_time(0xff,0x01);// 延时间隔连发
}
}
}
void Timer1() interrupt 3
{
IR_TX = ~IR_TX; //13微秒@11.0592MHz ,产生38KHz载波
}
void Timer0() interrupt 1
{
}
复制代码
作者:
vscos
时间:
2021-11-26 07:33
我有这红外模块,正可以下来玩玩,
作者:
vscos
时间:
2021-11-26 07:34
我这有个带红外收发的模块,刚好可以下来玩玩
作者:
lsg0280
时间:
2022-2-17 17:22
刚刚学过了红外解码,正好学习发射。感谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1