红外解码程序及很经典的38KHZ产生方法
时间:10-02
整理:3721RD
点击:
# include <reg52.h>
# include <intrins.h>
typedef unsigned char uchar;// # define uchar unsinged char
typedef unsigned int uint; // # define uint unsinged int
sbit key1 = P3^3;
sbit key2 = P3^4;
sbit key3 = P3^5;
sbit out = P3^7;
sbit led = P1^0;
uchar i;//产生38KHZ时用到
//======初始化================================================
void init()
{
EX0 = 1;//外中断0使能
IE0 = 0//触发方式 电平
PX0 = 1;//中断优先级 高
EA = 1;//总中断 开
key1 = 1;
key2 = 1;
key3 = 1;
}
//======延时==================================================
void delay(uchar a)
{
uchar b,c;
for(b = 0; b < a; b++)
for(c = 0; c < 200; c++);
}
void delayms(uchar a)//延时程序
{
uchar b;
for(b = 0; b < a; b++)
{
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
}
}
//======发送38KHZ程序====频率:38KHZ 周期:26us =================
void _38KHZ(uchar a)//调制脉冲发送时间
{
//时间自己测试 周期 26us 高低电平各占 13us
uchar j;
for(j = 0; j < a; j++)
{
out = !out;
i = 7;
while( i > 0) i--; //26us 38KHZ
}
out = 1;
}
/* 延时时间测试值在括号内
//khz(?); // 精确的时间
//khz(?); //
//khz(?); //
//delayms(?); // 这里是一些时间的介绍
//delayms(?); //
//delayms(?); //
*/
//====================编码数据发送===本程序的关键==============================
void send_data(uchar temp)
{
uchar num
_38KHZ(116) //3ms 38khz 这里是发送引导码 开始码
delayms(125); //2ms
for(num = 0; num < 8; num++)
{
_38KHZ(40);// 1ms
//out = 1;
if(temp & 0x01)
delay(93)// 1.5ms 上面的1ms+这里的1.5ms 即发送的“1”
else
delay(65)// 1ms 上面的1ms+这里的1ms 即发送的“0”
temp = temp >> 1;//从最低位先发送
}
_38KHZ(20); //一字节的数据发送完成后的结束码
}
//====================发送成功状态指示灯=================================
void _38khz_led(void)
{
uchar k;
for(k = 0; k < 4; k++)
{
LED0 = !LED0;
delay(50);
}
LED0 = 1;
}
//====================按键扫描功能程序=================================
void keyscan(void)
{
if(0 == key1)//按键1
{
_nop_(); _nop_(); _nop_(); _nop_();//延时10us消除按键抖动
_nop_(); _nop_(); _nop_(); _nop_();
if(0 == key1)
{
while(!key1);//按下按键后 收放开后开始红外线发射程序
send_data(0xf3);//发送数据
_38khz_led(); //状态指示
}
}
if(0 == key2)//按键1
{
_nop_(); _nop_(); _nop_(); _nop_();//延时10us消除按键抖动
_nop_(); _nop_(); _nop_(); _nop_();
if(0 == key2)
{
while(!key2);//按下按键后 收放开后开始红外线发射程序
send_data(0x3f);//发送数据
_38khz_led(); //状态指示
}
}
if(0 == key3)//按键1
{
_nop_(); _nop_(); _nop_(); _nop_();//延时10us消除按键抖动
_nop_(); _nop_(); _nop_(); _nop_();
if(0 == key3)
{
while(!key3);//按下按键后 收放开后开始红外线发射程序
send_data(0xf5);//发送数据
_38khz_led(); //状态指示
}
}
}
//====================主程序=================================
void main(void)
{
init();//初始化
key1 = 0;
while(1)
{
keyscan();
}
}
# include <intrins.h>
typedef unsigned char uchar;// # define uchar unsinged char
typedef unsigned int uint; // # define uint unsinged int
sbit key1 = P3^3;
sbit key2 = P3^4;
sbit key3 = P3^5;
sbit out = P3^7;
sbit led = P1^0;
uchar i;//产生38KHZ时用到
//======初始化================================================
void init()
{
EX0 = 1;//外中断0使能
IE0 = 0//触发方式 电平
PX0 = 1;//中断优先级 高
EA = 1;//总中断 开
key1 = 1;
key2 = 1;
key3 = 1;
}
//======延时==================================================
void delay(uchar a)
{
uchar b,c;
for(b = 0; b < a; b++)
for(c = 0; c < 200; c++);
}
void delayms(uchar a)//延时程序
{
uchar b;
for(b = 0; b < a; b++)
{
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
}
}
//======发送38KHZ程序====频率:38KHZ 周期:26us =================
void _38KHZ(uchar a)//调制脉冲发送时间
{
//时间自己测试 周期 26us 高低电平各占 13us
uchar j;
for(j = 0; j < a; j++)
{
out = !out;
i = 7;
while( i > 0) i--; //26us 38KHZ
}
out = 1;
}
/* 延时时间测试值在括号内
//khz(?); // 精确的时间
//khz(?); //
//khz(?); //
//delayms(?); // 这里是一些时间的介绍
//delayms(?); //
//delayms(?); //
*/
//====================编码数据发送===本程序的关键==============================
void send_data(uchar temp)
{
uchar num
_38KHZ(116) //3ms 38khz 这里是发送引导码 开始码
delayms(125); //2ms
for(num = 0; num < 8; num++)
{
_38KHZ(40);// 1ms
//out = 1;
if(temp & 0x01)
delay(93)// 1.5ms 上面的1ms+这里的1.5ms 即发送的“1”
else
delay(65)// 1ms 上面的1ms+这里的1ms 即发送的“0”
temp = temp >> 1;//从最低位先发送
}
_38KHZ(20); //一字节的数据发送完成后的结束码
}
//====================发送成功状态指示灯=================================
void _38khz_led(void)
{
uchar k;
for(k = 0; k < 4; k++)
{
LED0 = !LED0;
delay(50);
}
LED0 = 1;
}
//====================按键扫描功能程序=================================
void keyscan(void)
{
if(0 == key1)//按键1
{
_nop_(); _nop_(); _nop_(); _nop_();//延时10us消除按键抖动
_nop_(); _nop_(); _nop_(); _nop_();
if(0 == key1)
{
while(!key1);//按下按键后 收放开后开始红外线发射程序
send_data(0xf3);//发送数据
_38khz_led(); //状态指示
}
}
if(0 == key2)//按键1
{
_nop_(); _nop_(); _nop_(); _nop_();//延时10us消除按键抖动
_nop_(); _nop_(); _nop_(); _nop_();
if(0 == key2)
{
while(!key2);//按下按键后 收放开后开始红外线发射程序
send_data(0x3f);//发送数据
_38khz_led(); //状态指示
}
}
if(0 == key3)//按键1
{
_nop_(); _nop_(); _nop_(); _nop_();//延时10us消除按键抖动
_nop_(); _nop_(); _nop_(); _nop_();
if(0 == key3)
{
while(!key3);//按下按键后 收放开后开始红外线发射程序
send_data(0xf5);//发送数据
_38khz_led(); //状态指示
}
}
}
//====================主程序=================================
void main(void)
{
init();//初始化
key1 = 0;
while(1)
{
keyscan();
}
}
不错的资料,值得收藏