上回书提到,ht6621,能够经过hs0038进行解码,但因为只能够经过遥控器进行操控,觉得不爽,并且项目中,也不答应用遥控器,所以就决议弄个单片机来做个编码。上回书说了,pt6221能够进行编码,所以百度,去找数据手册,就有了日志里的编码方法,然后,用示波器打了一下波形,看了一下,真是和手册上说的相同,所以傻了吧唧,的依照手册上说的时序,写了一个仅仅电平改变的程序。写完后,把红外二极管,接到管脚上一试,成果接纳木有反映,但按下红外遥控器就有反映,拿手机照相机看,也都有光。所以我陷入了纠结。开端是认为红外二极管的波长不对,所以跑到了鞍山西道,别离找了4家,买了林林总总不同的红外二极管。本认为会好了,但回来一试,仍是相同 。所以我一决然,把红外遥控器拆掉,把外面塑料皮拆掉的时分还挺疼爱 , 拿万用表打红外的波形,看到了成果今后,我遽然间想起了数据手册里的一句话,信号被调制在37.92khz 所以遽然理解。hs0038需求在发光管发射38khz频率的时分,才会变成低电平。不然一向会是高电平。所以将单片机的凹凸电平改为了38k频率的方波,再一试,这回hs0038上面有了反映 因为运用的单片机是stm8的,能够经过定时器来发生38k方波,这样的话,就便利多了,假如要是在程序中完成38k,必定需求延时的调试。时序便利操控不容易。因为运用了定时器来发生38k方波,那么直接装备就好了。操控的时分,经过敞开和封闭定时器即可。这样的话,就能够驱动凹凸电平相同的便利了。所以我们在运用的时分必定要注意。不要简略的认为红外接纳,都是和光敏三极管相似,那么你在调试的时分,就比较麻烦了。
以下是初始化装备函数,和红外发射函数,
运用的单片机为stm8s103,没有运用外部晶振,若用其他的单片机或晶振,在发送函数中的软件延时,还要经过示波器来调试。
还有一个问题,便是关于编译器的优化,这东西在时序要求很高的时分,尽量选用一些方法,把优化关掉,不然,软件延时很可能会有差错,然后形成通讯的问题。
void init()
{
//时钟装备
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);//内部高速RC振动时钟分频
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);//CPU中心时钟分频
//IO装备
//可不必设置,在敞开相应外设时,外设会接纳io
//TIM装备
asm(“sim”); // 关大局中止
TIM2->PSCR = 0x00;
TIM2->ARRH = (u8)(418 >> 8);
TIM2->ARRL = (u8)(418);
TIM2->CCMR1 = 0x60;
TIM2->CCER1 = 0x01;
TIM2->CCMR1 |= 0x08;
TIM2->CCR1H = 0;
TIM2->CCR1L = 100;
TIM2_OC1PreloadConfig(ENABLE);
TIM2->CCMR2 = 0x60;
TIM2->CCER1 |= 0x10;
TIM2->CCMR2 |= 0x08;
TIM2->CCR2H = 1;
TIM2->CCR2L = 0;
TIM2->CCMR3 = 0x60;
TIM2->CCER2 |= 0x01;
TIM2->CCMR3 |= 0x08;
TIM2->CCR3H = 1;
TIM2->CCR3L = 0;
TIM2->CR1 |= 0x81;
GPIOD->DDR &= ~(1<<5);
GPIOD->CR1 |= (1<<5);
GPIOD->ODR |= (1<<5);
GPIOD->DDR &= ~(1<<6);
GPIOD->CR1 |= (1<<6);
GPIOD->ODR |= (1<<6);
GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);
UART1->BRR2 = 0x02; // 设置波特率9600
UART1->BRR1 = 0x68; // 8M/9600 = 0x341
UART1->CR2 = 0x2C; // 答应接纳中止,答应接纳,答应发送
UART1->CR1 &=~ (1 << 5); //使能uart1
GPIO_DeInit(GPIOB);
asm(“rim”); // 开大局中止
}
#pragma optimize=none
void IR_send(u8 add_l,u8 add_h,u8 dat)
{
u8 t,temp;
temp =~ dat;
//发送前导码
IR_1;
IR_delay(4350);
IR_0;
IR_delay(2200);
for(t = 0; t < 8; t++) //发送低8位地址
{
if(add_l&0x01)
{
IR_1;
IR_delay(300);
IR_0;
IR_delay(800);
}
else
{
IR_1;
IR_delay(270);
IR_0;
IR_delay(270);
}
add_l >>= 1;
}
for(t = 0; t < 8; t++) //发送高8位地址
{
if(add_h&0x01)
{
IR_1;
IR_delay(300);
IR_0;
IR_delay(800);
}
else
{
IR_1;
IR_delay(270);
IR_0;
IR_delay(270);
}
add_h >>= 1;
}
for(t = 0; t < 8; t++) //发送8位数据
{
if(dat&0x01)
{
IR_1;
IR_delay(300);
IR_0;
IR_delay(800);
}
else
{
IR_1;
IR_delay(270);
IR_0;
IR_delay(270);
}
dat >>= 1;
}
for(t = 0; t < 8; t++) //发送8位数据反码
{
if(temp&0x01)
{
IR_1;
IR_delay(300);
IR_0;
IR_delay(800);
}
else
{
IR_1;
IR_delay(270);
IR_0;
IR_delay(270);
}
temp >>= 1;
}
IR_1;IR_delay(270);
IR_0;IR_delay(270);
}