1、初始化定时器100us中断
void Tim4_Init(void)//1/(16/32/50)=100us
{
TIM4_TimeBaseInit(TIM4_PRESCALER_32,50);
TIM4_ITConfig(TIM4_IT_UPDATE,ENABLE);
TIM4_Cmd(ENABLE);
}
2、初始化IO
void GPIO_Init(void)
{
GPIO_Init(RF433_GPIO_PORT,(GPIO_Pin_TypeDef)RF433_GPIO_PIN,GPIO_MODE_OUT_PP_LOW_FAST);
}
3、编写中断处理函数
unsigned char Send433_Status = 0; //发送过程的状态
unsigned int Send433_Time = 0; //记录433发送数据的高低电平时间
unsigned char Yaokong_Data[4][3]={
0x56,0x11,0x11,
0x56,0x11,0x12,
0x56,0x11,0x14,
0x56,0x11,0x18,
};
unsigned char Send433_Byte_Cont=0;//记录发送一组433数据的字节数
unsigned char Send433_Bit_Cont = 0; //记录发送位
unsigned char Temp=0;
bool Chose_Data_En=0;//使能选择一组433数据的第N个字节
void Send433_Byte(void) //100us执行一次
{
switch (Send433_Status)
{
case 0: //同步头高
RF433_H;
Send433_Status = 1; //进入同步头低
break;
case 1:
RF433_L;
if (++Send433_Time >= 31)
{
Send433_Time = 0;
Send433_Status = 2; //进入发送24位
}
break;
case 2:
if(!Chose_Data_En)//还没开始发送 或者上次已经发送完一个字节才使能选择
{
Chose_Data_En=1;
Temp=Yaokong_Data[3][Send433_Byte_Cont];
//Send433_Byte_Cont++;
}
Send433_Time++;
if (Temp & 0x80) //1
{
if (Send433_Time <= 3)
{
RF433_H;
}
else if (Send433_Time >= 4)
{
RF433_L;
Send433_Time = 0;
Temp <<= 1;
Send433_Bit_Cont++;
}
}
else
{
if (Send433_Time == 1)
{
RF433_H;
}
else if (Send433_Time > 1 && Send433_Time <= 4)
{
RF433_L;
if (Send433_Time == 4)
{
Send433_Time = 0;
Temp <<= 1;
Send433_Bit_Cont++;
}
}
}
if (Send433_Bit_Cont == 8)//发送完一字节
{
Send433_Bit_Cont = 0;
Chose_Data_En=0;//使能选择下一个字节
if(++Send433_Byte_Cont==3)
{
Send433_Byte_Cont=0;
Send433_Status = 0; //发送完毕
}
}
break;
default:
break;
}
}
433数据的同步头、数据“0”与“1”时间可以根据实际进行更改。