钻石会员
主题
帖子
积分11931
阅读权限50
注册时间2009-7-18
最后登录1970-1-1
在线时间 小时
|
大家新年好!我也发一个带学习功能的无线遥控解码编码程序,标题加入315MHzPT2240PT2262PT2272EV1527是为了搜索的需要
遥控接收使用超外差模块,芯片是RX3310A,再生式接收暂时还没有测试,不知道是否可以通过
/*****************************************************
CodeWizardAVR V1.25.9 Professional
Chip type : ATmega48V
Clock frequency : 7.372800 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
*****************************************************/
#include <mega48.h>
#define lck1 10 //lck1*4=lck4
#define lck4 40 //数据位H和L电平只和 lck4*wucha4<255
#define wucha1 2 //lck1的允许正负误差
#define wucha4 8 //wucha1*4=wucha4
#define in_1 PINC.0==1 //定义遥控接收端口
#define in_0 PINC.0==0
#define k_1 PINC.1==1
#define k_0 PINC.1==0
unsigned int time_init;
unsigned char time, time_h, time_l, data0, data1, data2, n, jishu, biaoji, linshi;
unsigned char eeprom e_data0, e_data1, e_data2;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if(in_1) {if(jishu<5) jishu++;} else {if(jishu>0) jishu--;} //积分检测 jishu<lck1-wucha1
if(jishu==5) biaoji=1; //上升沿判断
if(jishu==0) biaoji=0; //下降沿判断
if(time<255) time++;
if(time_init<65535) time_init++;
}
void main(void)
{
DDRC=252; PORTC=255; //C0接收信号 C1记忆按键 C2点亮LED
UCSR0B=8; UCSR0C=0x06; UBRR0L=3; //串口初始化/监视辅助语句
TCCR0A=0; TCCR0B=1; TIMSK0=1; //时钟1分频/溢出中断使能 255/7.3728=34.6us中断一次
SREG|=128; //全局中断使能
while (1)
{
while(biaoji==0); //等待上升沿
while(biaoji==1); //等待下降沿
time_init=0; //同步信号L电平计时复位
while(biaoji==0); //等待上升沿
time=0; time_h=0; time_l=0; //时间清零
data0=0; data1=0; data2=0; //数据清零
if(time_init>(lck1-wucha1)*31 && time_init<(lck1+wucha1)*31)
{
for(n=0; n<24; n++)
{
while(biaoji==1); //等待下降沿
time_h=time; //记录高电平的持续时间
time=0;
//UDR0=time_h; //辅助语句/通过串口输出H电平的时间值
while(biaoji==0); //等待上升沿
time_l=time; //记录低电平的持续时间
time=0;
//UDR0=time_l; //辅助语句/通过串口输出L电平的时间值
linshi=time_h+time_l;
if(time_h==time_l || time_h>lck4 || time_l>lck4) break; //这条语句和下面那条语句要分先后
if(linshi>lck4+wucha4 || linshi<lck4-wucha4) break;
if(time_h>time_l) //如果数据位是1则更新记录/实际应用时建议再检测1和0的H和L电平的宽度
{
if(n<16) {if(n<8) data0+=1<<(7-n); else data1+=1<<(15-n);} else data2+=1<<(23-n);
}
}
}
if(data0==e_data0 || data1==e_data1) //遥控点亮LED测试
{
if(data2==e_data2+4) PORTC.2=1;
if(data2==e_data2+8) PORTC.2=0;
}
if(k_0 && n==24) //记忆数据/第三个数据取高4位/低4位是按键位
{
e_data0=data0; e_data1=data1; e_data2=data2&240;
while(k_0); //等待按键松开/防止EEPROM被反复擦写
}
}
}
/*****************************************************
CodeWizardAVR V1.25.9 Professional
Chip type : ATtiny13
Clock frequency : 1.200000 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 16
模拟EV1527(PT2240),它的原理是:先输出一个同步位,再依次输出3个字节(24位)的数据,循环
同步位:一个lck高电平和31个lck低电平
数据位:1就是3个lck高电平和1个lck低电平。0就是1个lck高电平和3个lck低电平
高电平就是遥控器发射315MHz的电波,低电平就是停止发射
*****************************************************/
#include <tiny13.h>
#include <delay.h>
#define lck 400 //400微妙
#define io_1 PORTB.0=1;
#define io_0 PORTB.0=0;
unsigned char data0 = 0b********; //20位ID码+4位按键码
unsigned char data1 = 0b********;
unsigned char data2 = 0b****0000;
void txd_out(unsigned char id)
{
unsigned char n=128;
while(n)
{
if(id&n)
{
io_1; delay_us(lck*3); io_0; delay_us(lck);
}
else
{
io_1; delay_us(lck); io_0; delay_us(lck*3);
}
n/=2;
}
}
void txd_init(void)
{
io_1; delay_us(lck); io_0; delay_us(lck*31);
}
void main(void)
{
PORTB.0=0;
DDRB.0 =1;
DDRB.1=0;
DDRB.2=0;
while (1)
{
if(PINB.1==1 && PINB.2==1) while(1);
if(PINB.1) { txd_init(); txd_out(data0); txd_out(data1); txd_out(data2+4); } //开
if(PINB.2) { txd_init(); txd_out(data0); txd_out(data1); txd_out(data2+8); } //锁
}
}
我想用如下的接收头,能否帮改为89s52上面用的程序呀?谢谢啦!
谢谢! |
|