📄 11.c
字号:
#include <iom32v.h>
#include <macros.h>
#define wuxian_js PA3 //无线接收
#define study_key PC1 //报警
#define zhuangtai_d PC7 //LED
#define power_led PC6
#define UDRE 5
#define DATA_REGISTER_EMPTY (1<<UDRE)
unsigned char D[3],D1[3];
unsigned char flag;
unsigned long DATA=0;
#define uchar unsigned char
uchar forward[14]={0x00,0x7f,0x7f,0xff,0xff,0xfb,0x00,0x00,0x7f,0xff,0xff,0xff,0xfd,0x00};
uchar back[14]={0x00,0x7f,0x7f,0xff,0xff,0xfd,0x00,0x00,0x7f,0xff,0xff,0xff,0xfd,0x00};
uchar UP[7]={0xff,0x01,0x00,0x08,0x00,0x2f,0x38};
uchar DOWN[7]={0xff,0x01,0x00,0x10,0x00,0x2f,0x40};
uchar left[7]={0xff,0x01,0x00,0x04,0x3f,0x00,0x44};
uchar right[7]={0xff,0x01,0x00,0x02,0x3f,0x00,0x42};
uchar STOP[7]={0xff,0x01,0x00,0x00,0x00,0x00,0x01};
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<n;i++)
{
delay_ms();
}
}
//==============================================================================
void eeprom_writ(uchar dz,uchar sj) //写EEPROM
{
CLI(); //清总中断
while(EECR & (1<<EEWE)){;}
EEARH=0x00;
EEARL=dz;
EEDR=sj;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
SEI();
}
//==============================================================================
uchar eeprom_read(uchar dz) //读EEPROM
{
CLI(); //清总中断
while(EECR & (1<<EEWE)){;}
EEARH=0x00;
EEARL=dz;
EECR |= (1<<EERE);
SEI();
return(EEDR);
}
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x19; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x08;
}
//发送单字节字符
void uart_transmit_byte( unsigned char data)
{
while(!(UCSRA&DATA_REGISTER_EMPTY));
UDR=data;
}
unsigned char decode(void) //无线解码
{
//unsigned long DATA; //记录数据
unsigned char count,i; //暂时计数
signed char j;
/*一共接收三字节*/
//DATA=0; //
for (count=0;count<24;count++) //开始收集
{
/*测量高电平宽度*/
i=0; //宽度计数
while (PINA&(1<<3)) //高位计数
{
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 (!(PINA&(1<<3))) //低位计数
{
asm("nop"); //
i++; //计数增加
if (i>224) goto end; //限时解码
}
/*低电平是否过窄*/
if (i<96) goto end; //对比宽度
}
/*解码成功返结果*/
for(j=2;j>=0;j--)
{
D[j]=DATA;
DATA>>=8;
}
return 1; //成功返回
/*有误码结束解码*/
end:
return 0; //误码结束
}
void ana_decode(void)
{
//unsigned long DATA;
uchar key_var;
uchar i;
DDRC&=~(1<<study_key);PORTC|=(1<<study_key);
key_var=PINC&(1<<study_key);
if(key_var==0)
{
while(1)
{
while(1)
{
flag=decode();
if(flag==1) {break;}
}
for(i=0;i<2;++i){D1[i]=D[i];}
while(1)
{
flag=decode();
if(flag==1) {break;}
}
for(i=0;i<2;++i){if(D1[i]!=D[i]){break;}}
if(i==2){flag=1;break;}
}
if(flag==1)
{
for(i=0;i<2;++i)
{
eeprom_writ(i,D[i]);
}
}
return;
}
// else return;
flag=decode();
if(flag==1)
{
for(i=0;i<2;++i)
{
if(eeprom_read(i)!=D[i]) {flag=0;break;};
}
}
if(flag==1)
{
if(D[2]==0xc0)
{
for(i=0;i<14;i++)
{
uart_transmit_byte(forward[i]);
}
}
else if(D[2]==0x30)
{
for(i=0;i<14;i++)
{
uart_transmit_byte(back[i]);
}
}
else if(D[2]==0xf0) //上
{
for(i=0;i<7;i++)
{
uart_transmit_byte(UP[i]);
}
}
else if(D[2]==0x0c)//下
{
for(i=0;i<7;i++)
{
uart_transmit_byte(DOWN[i]);
}
}
else if(D[2]==0xcc)//左
{
for(i=0;i<7;i++)
{
uart_transmit_byte(left[i]);
}
}
else if(D[2]==0x3c)//右
{
for(i=0;i<7;i++)
{
uart_transmit_byte(right[i]);
}
}
}
}
void main(void)
{
//unsigned long DATA;
//signed char i;
DDRC|=(1<<power_led);PORTC&=~(1<<power_led); //电源显示灯
DDRA |=0x40; //无线输入通道
PORTA|=0x40; //上拉选择
uart0_init();
while (1)
{
ana_decode();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -