/*****************************************************
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被反复擦写
}
}
}
这是我在别网上转的程序 我现在没有ATmega48V
单片机 我手上有stc11F16XE STC11F08XE还有STC89C54RD+想把上面的程序用在这些蕊片上选那款好,怎么改上面程序 也不知道行不行
***目标就是想做一个带学习功能315解码程序 手上有
晶振3.6864m 4m 12m 我手上现在做好的315不带学习功能解码程序
***望各位师傅指点 !也不知道上面程序
一周热门 更多>