315-433MHZ学习遥控器芯片
支持1527 2264 2260 2262 SC5211 HS2240等解码,自动适应振荡电阻
2260 2262 2264 如果不进行人工地址编码,好多个遥控器地址编码一样的,只要学习一个遥控器,所有的遥控器都能同时用
一:如何设置自锁,互锁,点动输出
1:断电。按住学习键然后上电保持1-2秒钟后松开,学习灯闪3次,设置为自锁输出。
2:断电。按住学习键然后上电保持1-2秒钟后松开,学习灯闪1次,设置为互锁输出。
3:断电。按住学习键然后上电保持1-2秒钟后松开,学习灯闪2次,设置为点动输出。
二:遥控器学习:以上输出模式设置后断开电源,然后上电,按一下学习键,学习灯保持亮,再按遥控器上的任意一键,学习灯熄灭,遥控器学习成功。重复上述操作可以学习多达20个遥控器。1527 2260 2262 2264等的遥控器可以混合学习使用。
三:如何清空已学习过的遥控器:断电,按住学习键然后上电保持4秒以上再松开按键,学习灯闪烁4次,说明已学习过的遥控器已被清空。
单片机源程序如下:
//内部晶振:11.0592M
//测试芯片:STC15F104E/STC11F04W
//硬件最简版
//实现2262、1527解码输出,学习、自适应多阻值,片内EEPROM存储相关信息
#include< reg52.h>
#include< intrins.h>
sfr AUXR=0x8e;
sfr IAP_DATA = 0xC2; //片内EEPROM资源声明
sfr IAP_ADDRH = 0xC3;
sfr IAP_ADDRL = 0xC4;
sfr IAP_CMD = 0xC5;
sfr IAP_TRIG = 0xC6;
sfr IAP_CONTR = 0xC7;
sfr P3M0 =0xb2;
sfr P3M1 =0xb1;
#define uchar unsigned char
#define uint unsigned int
sbit RF = P3^4; //射频引脚定义
sbit set = P3^3; //设置键定义
sbit keya = P3^0; //第一路
sbit keyb = P3^1; //第二路
sbit keyc = P3^2; //第三路
sbit keyd = P3^5; //第四路
uint ll_w;
uchar hh_w; //高,低电平宽度
uchar ma_x; //接收到第几位编码了
uchar idata bma1,bma2,bma3; //用于接收过程存放遥控编码,编码比较两次,这是第一次
uchar idata mmb1,mmb2,mmb3; // 用于接收过程存放遥控编码,第二次
uchar key_data;
uchar short_k;
uchar mma1,mma2,mma3; //用于解码过程
uchar L_M_select;
uchar xplx;
uint s,s1;
bit old_rc5; //保存上一次查询到的电平状态
bit tb_ok; //接收到同步的马时置1
bit rf_ok1,rf_ok2; //解码过程中的临时接收成功标志
bit rf_ok; //接收到一个完整的遥控命令后置1,通知解码程序可以解码了
bit study; //进入学习状态标志
bit system_int; //系统清零标志
bit m1,m2,m3,m4;
bit flag_zs;
bit decode_ok; //解码成功
uchar idata key_number[61];
void delay_1ms(uint x) //1毫秒延时
{
uchar b,c;
for(x;x>0;x--)
{
for(b=5;b>0;b--)
{
for(c=150;c>0;c--);
}
}
}
void BB(uint size,uchar Number)
{
if(Number)
{
for(Number;Number>0;Number--)
{
set=0;
delay_1ms(size);
set=1;
delay_1ms(size);
}
}
else
{
set=0;
delay_1ms(size);
set=1;
}
}
void chick1527(uchar d)
{
uchar u;
for(u=0;u<4;u++)
{
if(((d>>(u*2))& 3)==2)
{
xplx=0x55;
}
}
}
//====================================================
/////////片内EEPROM读写驱动程序///////////////////////////
//====================================================
void IAP_Disable() //关闭IAP
{
//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
IAP_CONTR = 0; //关闭IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用
IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}//
//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
uchar read_add(uint addr) //读EEPROM
{
IAP_DATA = 0x00;
IAP_CONTR = 0x84; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x01; //IAP/ISP/EEPROM 字节读命令
IAP_ADDRH = addr>>8; //设置目标单元地址的高8 位地址
IAP_ADDRL = addr&0xff; //设置目标单元地址的低8 位地址
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被触发起动
_nop_();
EA = 1;
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
return (IAP_DATA);
}//------------------------------------------------------------------------------
//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
void write_add(uint addr,uchar ch) //直接写EEPROM
{
IAP_CONTR = 0x84; //打开 IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x02; //IAP/ISP/EEPROM 字节编程命令
IAP_ADDRH = addr>>8; //设置目标单元地址的高8 位地址
IAP_ADDRL = addr&0xff; //设置目标单元地址的低8 位地址
IAP_DATA = ch; //要编程的数据先送进IAP_DATA 寄存器
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被触发起动
_nop_();
EA = 1;
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}//------------------------------------------------------------------------------
//擦除扇区, 入口:DPTR = 扇区地址
void Sector_Erase(uint addr) //扇区擦除
{
IAP_CONTR = 0x84; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇区擦除命令
IAP_ADDRH =addr>>8; //设置目标单元地址的高8 位地址
IAP_ADDRL =addr&0xff; //设置目标单元地址的低8 位地址
EA = 0;
IAP_TRIG = 0x5a; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xa5; //送完 B9h 后,ISP/IAP 命令立即被触发起动
_nop_();
EA = 1;
下载烧录说明
IRC频率选11.0592M
如果已烧录过的单片机,烧录前必须下载后恢复下出厂设置。才能再烧录,新单片机不用恢复