STM8自学笔记(推荐STM8很好的入门电子书)
无刷直流电机控制应用+基于STM8S系列单片机---电子书
【精华资料】STM8Sxx固件库FOR IAR
基于STM8的DALI (数字可寻址调光协议)
分享STM8 风驰光盘的资料,是完整的(包括原理图+例程+PDF注释)
《无刷直流电机控制应用 基于STM8S系列单片机》
STM8S库函数中文参考 小软件
【资料分享】STM8L的智能手持血糖监测设备的源码
基于STM8S207工程模板
【培训资料】STM8系列PPT培训资料
微信公众号
手机版
基于STM8S的外部I/O 中断 红外遥控解码
基于STM8S的红外遥控功能。我给大家分享一段代码。由于是产品了,不上传全部程序了# \+ E8 m% B1 I7 u' s5 L! v
FuncState InfraredWate_Flag; //等待按键松开标志% m8 d- v3 ^0 J6 s- N+ B! h# Q
Uint8 InfraredWate_Index; //用于等待按键松开计时
FuncState InfraredRec_Flag; //红外采集完成标志) r9 {+ c; d/ @, O9 ?/ u
Uint8 InfraredCode; //红外接收代码
Uint8 InfraredCode_Index; //红外接位计数
Uint8 InfraredBuffer_H; //红外识别码接收缓存
Uint8 InfraredBuffer_L; //红外接收代码缓存4 N5 p6 `! y. h" `$ Y
Uint8 InfPeriod_Status; //红外周期状态
Uint16 TimeCounterVal; //计数器临时值
Uint8 ReciveIndex; //红外接收计数 + k: T; U, g, c" O7 P
static void TimeCounter_Start(void) //启动计数
{
TIM2->CNTRH = 0;3 r$ t- |6 K7 f
TIM2->CNTRL = 1;* V; x; A9 N. s* ?2 e
TIM2->CR1 |= 0x01;9 B, }+ x+ Z8 ]( u
}
void TimeCounter_Stop(void) //停止计数" ^4 D6 [) ~4 \0 o& m0 P- G) J. Z; L- e
{& o H& P% z" |; B7 ? v
TIM2->CR1 &= 0xfe;
}# `7 Q. s; V" q" y; w; q$ b
static void InfraredRec_Bit(Uint8* BufferAddr) B- K; ?8 d1 z0 i9 v6 L( ?
{
if((12000 < TimeCounterVal)&&(TimeCounterVal < 22000)) //0周期约为17000% P9 s8 ^; W! S. B9 z
{
*BufferAddr = (*BufferAddr) * 2;# [. M+ b8 c* a% J
}
else if((30000 < TimeCounterVal)&&(TimeCounterVal < 40000)) //1周期约为35000
{
*BufferAddr = ((*BufferAddr) * 2) + 1;) _8 [2 |4 M! {$ p& S; U9 b& w! U
}4 V; U+ y( P8 n3 M
else ReciveIndex = 0;- `7 y' o- s0 u5 T7 H3 m
}
void InfraredInterrupt_Process(void): A A! \6 h4 U4 O: A+ I
{; K- {, h) \3 n( m0 @3 g$ ~+ _
if(InfraredWate_Flag != L_FASE) //等待接收到按键松开的间隔符,才开始下次接收 每次中断4ms,10次约40ms
{) g, w% ?# U# W2 [. w3 k
if(InfraredWate_Index <10) InfraredWate_Index ++; ?+ Q. n* p6 `' q, K
else & y. I- d$ Z' J$ K: r2 z
{' O- [/ ^; A* Y$ q
InfraredWate_Flag = L_FASE; //已等到间隔符,清标志位
TimeCounter_Stop(); 0 M5 ]2 B, J' N3 W' E) C# ^5 O
InfPeriod_Status = InfPeriod_Start;4 `8 i# y( J! F e% a1 D5 g# m# a
}4 I2 \( i* n' l0 I+ ?* h1 N% w: u
}
else //防止计数中间产生的,错把间隔符当成正常位。还有一种是由于排除红外不工作时产生的干扰。9 z; E1 x: \& ^% _) y5 b% I
{
TimeCounter_Stop();
InfPeriod_Status = InfPeriod_Start;
}/ c. C0 q1 W( f( y% B
}
void PeripheralInfrared_Receive(void)
{
if(InfraredWate_Flag == L_FASE) //处于非等待间隔符状态,开始正常接收 # r: W! V k/ p3 }! Z
{
if(InfPeriod_Status == InfPeriod_Stop) //开始接收数据, j$ i) S% C# O: b/ {5 n6 R9 b
{
disableInterrupts();: `0 u% L9 Q! `
TimeCounterVal = ((uint16_t)TIM2->CNTRH << 8);
TimeCounterVal |= (uint16_t)(TIM2->CNTRL);
TimeCounter_Start();
enableInterrupts(); //存在一些硬件上的互锁机制,为了使得数据更准确,这里关掉中断,防止其它干扰' V A* D' c3 T; b( |7 n
9 r [2 m! t j, b2 `) h: T
ReciveIndex ++;' l+ j) X0 d o! p
if(ReciveIndex <= 8) InfraredRec_Bit(&InfraredBuffer_H); //前8位数据
else InfraredRec_Bit(&InfraredBuffer_L); //后8位数据 ! |* C) u& h0 L* D
if(ReciveIndex >= 16)
{: r* O* j* j% h. O0 t7 c7 M# d
InfPeriod_Status = InfPeriod_Start;) M& w3 q1 }) j9 A
if(InfraredBuffer_H == InfraredUser_Code) //如果识别码正确
{
InfraredWate_Flag = L_TRUE; //已接收到功能码,等待间隔符0 P, n. Z' V; L Q4 u
InfraredWate_Index = 0;
InfraredRec_Flag = L_TRUE; // Y( x& t& ^ v$ M9 {6 q) s+ k
InfraredCode = InfraredBuffer_L; // 将数据送入缓存区 2 ~$ S& \( |$ o* b; {' B
}
} . }4 k7 W/ L$ U! a8 A, a
}: w( w3 J$ h- U! q
else //如果接收到了启始符,置标志位,开始接收数据1 Y7 i) h! H- d, `* T4 _8 }
{
TimeCounter_Start();
InfPeriod_Status = InfPeriod_Stop;
ReciveIndex = 0;7 ]% G$ I+ K& ?: L F4 z- i8 W a
}
2 p' B9 T! W& L8 J" H6 t) Q
}! W) N& _! u* M' l& }' x: m
else InfraredWate_Index = 0; //在等待按键松开,理论上讲,是不允许再接收重复红外信号的
}https://www.stmcu.org.cn/module/foru ... &pid=2049512&page=1
void Infrared_InitVar(void)5 ]0 Y! i: m6 ~; R9 z3 A1 m! a
{
InfPeriod_Status = InfPeriod_Start;
TimeCounterVal = 0;
ReciveIndex = 0;3 U( P8 p! Q: Q: e
InfraredBuffer_H = 0;
InfraredBuffer_L = 0;
InfraredCode = 0;2 X9 t" j' c7 m# b* v
InfraredCode_Index = 0;
InfraredRec_Flag = L_FASE;4 B% B/ b' x1 Q$ L+ ?; m* I
InfraredWate_Flag = L_FASE;
InfraredWate_Index = 0;4 W! q) V0 h) O
}
在这个红外编码中由16位组成一串字帧。0 由 0.26ms的低电平和0.8ms的高电平表示, 1由 0.26ms的低电平和1.8的高电平表示。
两者的周期相差一倍,我把红外信号由红外接收头HS3818接收后送到STM8S的外部中断I/O上面,我是根据数据周期来判断是0
还是1的。
STM8S还是挺简单的,好好学,专心学习,天天学两周应该就可以了
不然不安全
实际的产品中绝大部分都是直接用市电220V的