你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于一块测线板,让你从STM8S从入门到提高  

[复制链接]
w453509596 发布时间:2015-1-8 21:14
阅读主题, 点击返回1楼
赞 收藏 5 评论44 发布时间:2015-1-8 21:14
44个回答
w453509596 回答时间:2015-1-9 13:17:58

基于STM8S的外部I/O 中断 红外遥控解码

本帖最后由 w453509596 于 2015-1-11 10:48 编辑
9 M" ^0 e( f; b* d, t
! \0 K( f3 X0 J$ w8 q& i9 [基于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;     //用于等待按键松开计时
' T; A; O: u- w( b, f/ ZFuncState InfraredRec_Flag;   //红外采集完成标志) r9 {+ c; d/ @, O9 ?/ u
Uint8 InfraredCode;           //红外接收代码
' r) g. b6 x( l- l# @Uint8 InfraredCode_Index;     //红外接位计数
0 h4 r' q1 y1 S" {Uint8 InfraredBuffer_H;       //红外识别码接收缓存
& j  @+ |. M' {) j. o  AUint8 InfraredBuffer_L;       //红外接收代码缓存4 N5 p6 `! y. h" `$ Y
Uint8 InfPeriod_Status;       //红外周期状态
/ V/ K5 n4 }* i+ {Uint16 TimeCounterVal;        //计数器临时值
/ }" N7 q# T# `8 C) Y4 T& w/ |9 ~Uint8 ReciveIndex;            //红外接收计数 + k: T; U, g, c" O7 P

1 G% A1 O/ q! p& S, S3 a1 ^" dstatic void TimeCounter_Start(void)    //启动计数
5 i4 A( [) I; N% V6 `{
: |: P6 r0 [& U& v' L3 T' b  q    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
}
+ L- B% s" n# O3 D+ v' p
. I6 f: i- R$ J  K! Hvoid TimeCounter_Stop(void)    //停止计数" ^4 D6 [) ~4 \0 o& m0 P- G) J. Z; L- e
{& o  H& P% z" |; B7 ?  v
    TIM2->CR1 &= 0xfe;
/ {4 S, W$ n' g* V/ Z9 l}# `7 Q. s; V" q" y; w; q$ b

3 P' i# r. @6 x% ?- _4 zstatic void InfraredRec_Bit(Uint8* BufferAddr)  B- K; ?8 d1 z0 i9 v6 L( ?
{
2 O; j8 D& z4 M   if((12000 < TimeCounterVal)&&(TimeCounterVal < 22000))    //0周期约为17000% P9 s8 ^; W! S. B9 z
   {
& o1 j6 E+ e$ |+ x% t7 U     *BufferAddr = (*BufferAddr) * 2;# [. M+ b8 c* a% J
   }
3 z! R  }' |5 ]8 ~" {5 z+ ?' u   else if((30000 < TimeCounterVal)&&(TimeCounterVal < 40000))  //1周期约为35000
4 |  ~5 k, j  [5 \( b9 ~   {
9 z2 M& C( @' q& r& i     *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
}
! P. y; Q/ p7 C3 _# T9 U) p+ f
) d0 B* d) E8 J$ F  O" a0 Kvoid 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
" k9 Y( S, Z9 g; w  d  {) 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;                                   //已等到间隔符,清标志位      
4 E# R/ M. D9 ~& F      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
  }
8 F! N- }2 M# P' m7 Y  [" \  else                            //防止计数中间产生的,错把间隔符当成正常位。还有一种是由于排除红外不工作时产生的干扰。9 z; E1 x: \& ^% _) y5 b% I
  {
! n; i! @2 A, x6 d1 U    TimeCounter_Stop();
9 f% d# f. Z, }0 z7 L4 L    InfPeriod_Status = InfPeriod_Start;
8 D, u- [/ z" H7 @0 p$ R  }/ c. C0 q1 W( f( y% B
}
, u3 |" g" S. t
7 h5 F/ U: ]. bvoid PeripheralInfrared_Receive(void)
2 G; _! Q9 Y+ P4 _, z{
* m: N1 n6 J, d4 A+ o( x  if(InfraredWate_Flag == L_FASE)                            //处于非等待间隔符状态,开始正常接收  # r: W! V  k/ p3 }! Z
  {
( G& s+ v" j2 ~( p% ~4 v    if(InfPeriod_Status == InfPeriod_Stop)                   //开始接收数据, j$ i) S% C# O: b/ {5 n6 R9 b
    {
4 M7 W. X* B: e7 T3 V) g      disableInterrupts();: `0 u% L9 Q! `
      TimeCounterVal  = ((uint16_t)TIM2->CNTRH << 8);
  R( G, o0 j& |; x1 Y6 c' \      TimeCounterVal |= (uint16_t)(TIM2->CNTRL);
; h% ]; c- V! N. q. ~% Y      TimeCounter_Start();
- B& Z% K6 h8 H& a  o3 L3 L4 T& R      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位数据
! {" \4 b! x- o5 J7 A      else  InfraredRec_Bit(&InfraredBuffer_L);                 //后8位数据                ! |* C) u& h0 L* D
      if(ReciveIndex >= 16)
) j' `) ?' _+ C6 z2 u( p  o      {: r* O* j* j% h. O0 t7 c7 M# d
        InfPeriod_Status = InfPeriod_Start;) M& w3 q1 }) j9 A
        if(InfraredBuffer_H == InfraredUser_Code)   //如果识别码正确
$ G( V  k0 ^8 Y, d* Y% c        {
- Z9 h; G. H1 c/ V          InfraredWate_Flag = L_TRUE;               //已接收到功能码,等待间隔符0 P, n. Z' V; L  Q4 u
          InfraredWate_Index = 0;
5 F4 q$ s8 X% W          InfraredRec_Flag = L_TRUE;               //  Y( x& t& ^  v$ M9 {6 q) s+ k
          InfraredCode = InfraredBuffer_L;         // 将数据送入缓存区  2 ~$ S& \( |$ o* b; {' B
        }
  s& U) ~( S9 `6 m! [" t9 L5 I      } . }4 k7 W/ L$ U! a8 A, a
    }: w( w3 J$ h- U! q
    else                                      //如果接收到了启始符,置标志位,开始接收数据1 Y7 i) h! H- d, `* T4 _8 }
    {
0 I* J1 I6 t, Q+ y      TimeCounter_Start();
3 _' m" w7 |2 {+ I6 F      InfPeriod_Status = InfPeriod_Stop;
. u6 R1 r) B" I  M% v      ReciveIndex = 0;7 ]% G$ I+ K& ?: L  F4 z- i8 W  a
    }
: {( b5 T5 r+ M' z! r4 f  _. G 2 p' B9 T! W& L8 J" H6 t) Q
  }! W) N& _! u* M' l& }' x: m
  else InfraredWate_Index = 0;                //在等待按键松开,理论上讲,是不允许再接收重复红外信号的
6 P/ t* v# g( ~2 ]) _+ T* V# V, V}https://www.stmcu.org.cn/module/foru ... &pid=2049512&page=1
1 l0 E* Z/ D# g- |# p4 |
3 g% e+ l3 ?& }8 o5 pvoid Infrared_InitVar(void)5 ]0 Y! i: m6 ~; R9 z3 A1 m! a
{
' v6 z3 p7 W! B$ p: c  InfPeriod_Status = InfPeriod_Start;
& s- K- s) \0 ?. c  TimeCounterVal = 0;
! |7 @& y! {% z- D0 Y0 ]  ReciveIndex = 0;3 U( P8 p! Q: Q: e
  InfraredBuffer_H = 0;
7 S# z+ }" d4 l( m' E  InfraredBuffer_L = 0;
( U" l" W; J: i; w6 q5 Q5 I& t5 x  InfraredCode = 0;2 X9 t" j' c7 m# b* v
  InfraredCode_Index = 0;
4 E# Q+ K% S* I: G2 |  InfraredRec_Flag = L_FASE;4 B% B/ b' x1 Q$ L+ ?; m* I
  InfraredWate_Flag = L_FASE;
4 ?6 W, N5 m- E; w4 ?/ e: |  InfraredWate_Index = 0;4 W! q) V0 h) O
}
0 l3 G0 A  A0 T0 d; G4 X9 c
2 [) I; \' t& I! Q# z( q
$ z8 Y1 n, Z5 q) h* c  y在这个红外编码中由16位组成一串字帧。0 由 0.26ms的低电平和0.8ms的高电平表示, 1由 0.26ms的低电平和1.8的高电平表示。
9 P& f1 e/ }! @0 [/ X2 b两者的周期相差一倍,我把红外信号由红外接收头HS3818接收后送到STM8S的外部中断I/O上面,我是根据数据周期来判断是0
" i1 i* }( K. w5 i9 ?) D# x还是1的。
. f+ [) z& y2 B+ k1 f  o5 K
w453509596 回答时间:2015-1-10 16:34:01
我感觉我分享的东西还是可以的吧,怎么就没什么人看呢
hfei 回答时间:2015-1-13 22:09:03
谢谢,刚转入STM8,请多指点。。
w453509596 回答时间:2015-1-13 22:46:15
hfei1980 发表于 2015-1-13 22:09
) Z  F. Y& g* y/ I谢谢,刚转入STM8,请多指点。。

1 ?; k# _; r  ?3 [8 OSTM8S还是挺简单的,好好学,专心学习,天天学两周应该就可以了
mlxy123xy 回答时间:2015-1-14 09:59:43
很详细,可以作为教程。。。
jcrorxp 回答时间:2015-1-14 12:06:11
为什么要用220V变压器.我觉得不如用个5V USB充电器实际点吧, 把强电也弄到这里.除非你有塑料外壳.  q) m, i7 i7 G+ D% O5 k) ^# d
不然不安全
w453509596 回答时间:2015-1-14 17:00:45
jcrorxp 发表于 2015-1-14 12:06# H5 ]% Y+ j" t. B: f0 X7 p
为什么要用220V变压器.我觉得不如用个5V USB充电器实际点吧, 把强电也弄到这里.除非你有塑料外壳.: h: u( X! [2 j* b
不然不安 ...
$ S8 B$ e5 B' w9 ?! w* h: w
实际的产品中绝大部分都是直接用市电220V的
linlangxiyue 回答时间:2015-1-14 18:44:49
侧线板不用单片机吧。。。
mubingml 回答时间:2015-1-14 20:07:12
好长,,居然看完了。。
成力lll 回答时间:2015-1-14 20:16:00
学习。。。。。。。。好好学,专心学习,
德政m 回答时间:2015-1-14 20:38:57
这个好详细,有点牛刀的感觉。。。
埃斯提爱慕 回答时间:2015-1-17 14:43:16
提示: 作者被禁止或删除 内容自动屏蔽
fjjjnk1234 回答时间:2015-1-17 15:26:57
感谢分享!顶一个!
leehehe 回答时间:2016-8-2 02:35:54
这么洋气,谢谢
leehehe 回答时间:2016-8-2 02:36:08
为了下载,刷一次,不好意思

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版