这有个帖子,你看了就明白,看看是怎样实现输入晶振频率自适应解码。
#define CPU_Fosc 12000000L //输入主频,自适应解码(单位:Hz,范围:6MHz ~ 40MHz)
红外线解码程序+遥控器程序+仿真文件(可定义任意I/O作接收脚,支持长/短按,适应6MHz~40MHz)
>
红外一体接收头把典型是hx1838家电遥控都用它,三根脚 Vout,gnd,vcc 当他收到38kHz的红外信号时,就会在vout上解调。去掉38kh调制波,把信号分离出来在vout上输出,然后可以直接连到单片机,一般是中断脚。用程序解码。vout平时是高电平,有信号了就低电平。
#include <reg51h>
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
sbit IRIN = P3^2; //遥控输入脚
sbit BEEP = P3^7; //蜂鸣器
sbit RELAY= P3^6; //继电器
uchar IR_buf[4]={0x00,0x00,0x00,0x00};//IR_buf[0]、IR_buf[1]为用户码低位、用户码高位接收缓冲区
// IR_buf[2]、IR_buf[3]为键数据码和键数据码反码接收缓冲区
uchar disp_buf[2]={0x10,0x10}; //显示缓冲单元,初值为0x10(即16),指向显示码的第16个"-"
uchar code seg_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
//0~F和"-"符的显示码(字形码)
/以下是014ms的x倍延时函数/
void delay(uchar x) //延时x014ms
{
uchar i;
while(x--)
for (i = 0; i<13; i++);
}
/以下是延时函数/
void Delay_ms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
/以下是蜂鸣器响一声函数/
void beep()
{
BEEP=0; //蜂鸣器响
Delay_ms(100);
BEEP=1; //关闭蜂鸣器
Delay_ms(100);
}
/以下是显示函数/
void Display()
{
P0=(seg_data[disp_buf[0]]);
P2=0x7f;
Delay_ms(1);
P0=(seg_data[disp_buf[1]]);
P2=0xbf;
Delay_ms(1);
}
/以下是主函数/
main()
{
EA=1;EX0=1; //允许总中断中断,使能 INT0 外部中断
IT0 = 1; //触发方式为脉冲负边沿触发
IRIN=1; //遥控输入脚置1
BEEP=1; RELAY=1; //关闭蜂鸣器和继电器
P0=0xff; P2=0xff; //P0和P2口置1
Display(); //调显示函数
while(1)
{
if(IR_buf[2]==0x02) //02H键(键值码为02H)
RELAY=0; //继电器吸合
if(IR_buf[2]==0x01) // 01H键(键值码为01H)
RELAY=1; //继电器关闭
Display();
}
}
/以下是外中断0函数/
void IR_decode() interrupt 0
{
uchar j,k,count=0;
EX0 = 0; //暂时关闭外中断0中断请求
delay(20); //延时20014=28ms
if (IRIN==1) //等待 IRIN低电平出现
{
EX0 =1; //开外中断0
return; //中断返回
}
while (!IRIN) delay(1); //等待IRIN变为高电平,跳过9ms的低电平引导码
for (j=0;j<4;j++) //收集四组数据,即用户码低位、用户码高位、键值数据码和键值数码反码
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等待IRIN变为低电平,跳过45ms的高电平引导码信号。
delay(1);
while (!IRIN) //等待IRIN变为高电平
delay(1);
while (IRIN) //对IRIN高电平时间进行计数
{
delay(1); //延时014ms
count++; //对014ms延时时间进行计数
if (count>=30)
{
EX0=1; //开外中断0
return; //014ms计数过长则返回
}
}
IR_buf[j]=IR_buf[j] >> 1; //若计数小于6,数据最高位补"0",说明收到的是"0"
if (count>=6) {IR_buf[j] = IR_buf[j] | 0x80;} //若计数大于等于6,数据最高位补"1",说明收到的是"1"
count=0; //计数器清0
}
}
if (IR_buf[2]!=~IR_buf[3]) //将键数据反码取反后与键数据码码比较,若不等,表示接收数据错误,放弃
{
EX0=1;
return;
}
disp_buf[0]=IR_buf[2] & 0x0f; //取键码的低四位送显示缓冲
disp_buf[1]=IR_buf[2] >> 4; //右移4次,高四位变为低四位送显示缓冲
Display(); //调显示函数
beep(); //蜂鸣器响一声
EX0 = 1; //开外中断0
}
因为在pc1838中集成了解调、解码等电路,所以在输出时输出的是电平信号。所以也就跟你在用按键控制一个LED灯一样的,遥控器在按键式PC1838接受到信号后,将信号通过解调器、解码器转换成电平信号,所以也就成了你的按一个键点亮一个二极管。这个源码你自己去设计就行可其实很简单的。
以上就是关于最简单51单片机红外编码获取问题全部的内容,包括:最简单51单片机红外编码获取问题、谁能帮我解释一下这个有关51单片机的红外解码的部分程序、红外传感器的接受是如何接收的,其使用原理是什么,红外传感器与单片机可以直接连接吗求大神,灰常感谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)