📄 sc2262.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];
#define uchar unsigned char
uchar UP[7]={0xff,0x01,0x00,0x08,0x00,0x1f,0x28};
uchar DOWN[7]={0xff,0x01,0x00,0x10,0x00,0x1f,0x30};
uchar left[7]={0xff,0x01,0x00,0x04,0x1f,0x00,0x24};
uchar right[7]={0xff,0x01,0x00,0x02,0x1f,0x00,0x22};
uchar STOP[7]={0xff,0x01,0x00,0x00,0x00,0x00,0x01};
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;
}
//发送字符串
void uart_transmit_string( unsigned char *string)
{
unsigned char i,j;
for(i=0;i<7;i++)
{
j=*string;
uart_transmit_byte(j);
string++;
}
}
unsigned long decode(void) //无线解码
{
unsigned long DATA; //记录数据
unsigned char count,i; //暂时计数
/*一共接收三字节*/
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; //对比宽度
}
/*解码成功返结果*/
return DATA; //成功返回
/*有误码结束解码*/
end:
return 0; //误码结束
}
void main(void)
{
unsigned long DATA; //
// unsigned char D[3]; //
signed char i; //
DDRC|=(1<<power_led);PORTC&=~(1<<power_led); //电源显示灯
DDRA |=0x40; //无线输入通道
PORTA|=0x40; //上拉选择
uart0_init();
while (1)
{
DATA =decode(); //解码程序
if (DATA>0) //
{
//spaz(); //解码成功
for (i=2;i>=0;i--) //数据转换
{
D[i]=DATA; //
DATA>>=8; //
}
//i=0; //转换完毕
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]);
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -