驱动程序下载地址:http://share.eepw.com.cn/share/download/id/60556
本实验是由4键无线遥控器,315MHz超再生接收模块和MCU-DIY开发板一起来完成的。其中:4键无线遥控器采用SC2262遥控编码电路,最多有12位三态编码;315MHz超再生接收模块通常与PT2272解码芯片配合来完成遥控器解码的。而本实验是由MCU-DIY开发板上的单片机直接对无线遥控接收软件模拟解码,而无需专用的解码芯片,解码效果如下:
解码程序:
/*******MCU-DIY开发板遥控解码程序*****/
#include <STC12C5A60S2.H> //STC头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char display[4] = { 0x77, 0x7c, 0x39, 0x5e};//显示码数组
/*****控制口定义 *****/
sbit WUXIAN = P3^7; //遥控信号输入I/O口
#define _rlcar_(RX) CY=RX&0X80 //RX带进位左移1位,数据放入ACC
uchar bdata wx_data0,wx_data1,wx_data2; //存储24位无线数据
uchar data wx_code0,wx_code1,wx_code2;
uchar data wx_count,wxcount_buf; //低电平时间计数器
uchar data wx_bit; //无线码位数
bit tb_flag; //同步码接收成功标志
bit wx_ok; //无线码接收成功标志
bit wx_sta; //无线信号输入脚的高低电平状态
//************单片机初始化************//
void mcu_initialize()
{
// WDT_CONTR=0x00; //关闭看门狗
AUXR=0x00; //定时器0和1设为传统8051速度,12分频
//TCON = 0x8E; // 1 0 0 0 1 1 1 0
P3M1=0x80;P3M0=0x00; //P1为准双向口
P3=0x00;
TR0=0; //定时器T0停止
TH0=0xA4;TL0=0xA4; //100us中断一次
TMOD=0x22; //设置T0为自动装入的8位定时器
ET0=1; //允许T0中断
EA=1; //全局中断开启
TR0=1; //定时器T0启动
}
/*********************************************************************************************
函数名:毫秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (uint a){
uint i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
/*********************************************************************************************/
void led_display(void){ //主程序
uchar i;
for(i=0;i<8;i++)
{
P2 = i;
}
}
/*********************************************************************************************/
//************解码程序************//
void decode()
{
if(WUXIAN) //检测无线I/O口为高
{
if(!wx_sta) //无线信号输入脚的电平状态为低
{
wx_sta=1; //无线信号状态从低变高
wxcount_buf=wx_count;
if(tb_flag) //同步码标志为1
{
if((0x03<wxcount_buf)&&(wxcount_buf<0x07)) //低电平脉宽范围在200us到800us之间 ------码1
{
CY=1;
}
else if((0x0e<wxcount_buf)&&(wxcount_buf<0x12)) //低电平脉宽范围在1.3ms到2ms之间 ------码0
{
CY=0;
}
else //干扰码
{
P0 = 0x00;
wx_count=0;
wx_bit=0;
wxcount_buf=0;
tb_flag=0;
return;
}
_rlcar_(wx_data0); //移位寄存器,接收一位数据
wx_data0=ACC;
_rlcar_(wx_data1);
wx_data1=ACC;
_rlcar_(wx_data2);
wx_data2=ACC;
if(++wx_bit==24) //接收完24位码,接收成功标志wx_ok置1
{
tb_flag=0;
wx_bit=0;
wx_ok=1;
wx_code0=wx_data0;
wx_code1=wx_data1;
wx_code2=wx_data2;
}
}
else
{
if((0x64<wxcount_buf)&&(wxcount_buf<0xc8)) //低电平脉宽范围在13.5ms到20ms之间,把同步码标志置1
tb_flag=1; // 同步码标志
else
P0 = 0x00;
}
}
}
else //检测无线I/O口为<低>
{
if(wx_sta) //无线信号输入脚的电平状态为<高>
{
wx_count=0; //无线信号从高变低,清零低电平脉宽计数器
wx_sta=0;
}
else //无线信号输入脚的电平状态为<低>
wx_count++; //无线信号为低电平,低电平脉宽计数器加1
}
}
//************定时器0中断程序************//
void timer0_isr() interrupt 1
{
decode();
switch(wx_code0)
{
case 0xc0: P0 = display[0];break;
case 0x30: P0 = display[1];break;
case 0x0c: P0 = display[2];break;
case 0x03: P0 = display[3];break;
default: break;
}
}
//************主程序************//
void main()
{
mcu_initialize();
P0 = 0x00;
while(1)
{
led_display();
}
}
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |