#include
#include
void delay_ms(void) //毫秒延时
{
unsigned int i;
for (i=0;i<140;i++)
{
}
}
void delay_nms(unsigned int n) //延时周期
{
unsigned int i;
for (i=0;i
{
delay_ms();
}
}
void spaz(void) //响蜂鸣器
{
PORTC|=(1<<5);
delay_nms(50);
PORTC&=~(1<<5);
}
unsigned long decode(void) //无线解码
{
unsigned long DATA; //记录数据
unsigned char count,i; //暂时计数
/*一共接收三字节*/
DATA=0; //
for (count=0;count<24;count++) //开始收集
{
/*测量高电平宽度*/
i=0; //宽度计数
while (PINC&(1<<4)) //高位计数
{
asm("nop"); //
i++; //计数增加
if (i>192) goto end; //限时解码
}
/*分辨出电平高低*/
DATA*=2; //数据左移
if (i<64) //分辨高低
{
if (!((56>i)&(i>24))) goto end; //电平合法
DATA+=0; //记低电平
}
else
{
if (!((168>i)&(i>72))) goto end; //电平合法
DATA+=1; //记高电平
}
/*测量低电平宽度*/
while (!(PINC&(1<<4))) //低位计数
{
asm("nop"); //
i++; //计数增加
if (i>224) goto end; //限时解码
}
/*低电平是否过窄*/
if (i<96) goto end; //对比宽度
}
/*解码成功返结果*/
return DATA; //成功返回
/*有误码结束解码*/
end:
return 0; //误码结束
}
void main(void)
{
unsigned long DATA; //
unsigned char D[3]; //
signed char i; //
DDRB =0B00000000; //定义输入
PORTB=0B11111111; //上拉使能
DDRC =0B11101111; //输入通道
PORTC=0B11011111; //上拉选择
DDRD =0B11111111; //定义输出
PORTD=0B00000000; //输出显示
while (1)
{
DATA =decode(); //解码程序
if (DATA>0) //
{
spaz(); //解码成功
for (i=2;i>=0;i--) //数据转换
{
D[i]=DATA; //
DATA>>=8; //
}
i=0; //转换完毕
while (1) //输出显示
{
if (!(PINB&(1<<0))) //按键检查
{
delay_nms(20); //防误处理
if (!(PINB&(1<<0))) //
{
i++; //显示值加
spaz();
}
while (!(PINB&(1<<0))) //按键弹起
{
delay_nms(20); //防误处理
}
}
if (i>2) break; //
PORTD=D[i]; //输出显示
}
}
}