最近在学习无线的单片机解码。
示波器测试 :有的遥控器是24位脉冲 ,有是28位脉冲 有的遥控器是32位脉冲 汽车遥控器的脉冲数更多。 同步头也不同
使用2个接收模块 测出来的波形也不相同 有一个MPS单片机的遥控器测出来相位相反 其他ev1527 2262 其他sop14单片机做的测出来相位相同。
这2个接收模块分别是PT4302 和SYN480 芯片的波形图:
这份是从网上找的,程序中没有同步码解码 ,楼主可以参考一下!
#include<reg52.h> //库文件
#include< stdio.h>
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int //宏定义无符号整型
uint addr,key;
uchar cntint;//外部中断0计数
void eint0(void) interrupt 0//外部中断0
{
static uint tempaddr;//接收地址缓存
static uint tempkey;//接收数据缓存
uint timecnt;
timecnt=TH0*256+TL0;
TH0=0;
TL0=0;
if(cntint<16)//接收地址码
{
tempaddr=tempaddr<<1;//将接收的到最低位移到最高位
if(timecnt>1000)//210为宽脉冲与低脉冲界线,当振荡电阻为1M时,窄脉冲为110uS,宽脉冲为320uS
{
tempaddr|=1;//宽脉冲为1
}
cntint++;//中断次数加1
}
else if(cntint<24)//接收数据码
{
tempkey=tempkey<<1;
if(timecnt>1000)
{
tempkey|=1;
}
cntint++;
}
else//cntint大于24也就是中断了25次时,关闭外部中断0,等待同步码
{
TMOD&=0xf0;//设定时器0为定时方式
TMOD|=0x01;
TH0=0xf9;
TL0=0x66;
cntint=0;
EX0=0;//关外部中断0
addr=tempaddr;
key=tempkey;
tempaddr=0;
tempkey=0;
}
}
void timer0(void) interrupt 1//定时器0中断,只有初始化时,空闲时和同步码到来时才中断
{
TMOD&=0xf0;//将定时器0的工作方式设为门控定时,用以检测脉宽。
TMOD|=0x09;
cntint=0;//外部中断0中断次数设为0
TH0=0;//设定时器0定时初值为0
TL0=0;
EX0=1;//允许外部中断0
IE0=0;//清除外部中断0标志
}
void main(void)
{
// void sendd(unsigned int intnum);
unsigned int i;
TMOD=0x21;//设定定时器0和定时器1,定时器1用来驱动串口
TH0=0xf9;//设定定时器的初始值,这个值必小于同步码
TL0=0x66;
// TH1=243;//12M晶振时,串口波特率为2400
// TL1=243;
TH1=0xdc;//11.0592M晶振时,串口波特率为9600
TL1=0xdc;
SCON=0x50;//设定串口工作方式
TI=1;//要用printf就将其设为1
EA=1;//开所有中断
ET0=1;//开定时器0中断
EX0=0;//关外部中断0,在Timer0中断里面将其打开
IT0=1;//外部中断0设为跳变触发
TR0=1;//定时器0启动
TR1=1;//定时器1启动
while(1)
{
// P2=key;
// P0=key>>8;
printf("%u\n",addr);//输出解码地址
printf("%u\n\n",key);//输出解码数据
for(i=0;i<65500;i++);//这个用来防止串口不同步
}
}
/********************************************************************
结束
*********************************************************************/
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |