找回密码
 注册
查看: 294|回复: 1
打印 上一主题 下一主题

IO模拟串口

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-3-10 10:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 Heaven_1 于 2022-3-10 13:54 编辑
/ c: U- W8 M9 @( E; r, y4 y, ^+ I- v6 N5 a; d
//该模拟串口为半双工模式, 2400/8/N/1  T! k  P3 k( b# ?& x' n. A
//如需不同波特率改变T2定时器的时间便可4 [/ n$ F. ]! y$ P! w

" h2 q" b, L" `4 I! y: c
, T! e5 J# g$ ^$ M) j: S
) P5 _6 h8 {, `0 Z1 R6 b6 U#pragma vector = TIMER2_OVF_vect+ e% d* ^& f+ z" }5 ~, H0 M; ~
__interrupt
* E0 Y* G3 a. ]* jvoid T2time139us(void)7 R. q# Z8 m0 ^/ G0 N8 N
{
' u1 ~. I2 g+ p2 F8 \: \& [" c0 o        static unsigned char bit;
! d& ]5 p9 T5 v  \1 k% J        static unsigned char count;
/ _3 z8 N8 ^2 O- |        static unsigned char stat_flag;# R2 Q( T; D- Y. X/ _* n: J, I
        static unsigned char tmp;
5 D/ b3 |( h  E: k. i" L5 G        static unsigned char recv_byte;- E0 f$ x% _$ m" I  v
        TCNT2 = 152;$ c! d: {! }' [1 i
        
+ t& v: z. B6 r        if((Uart1_RX_overtimer != 0) && (Uart1_RX_overtimer != 0xff)){
% H5 m  e- r! R7 t* ]: G                Uart1_RX_overtimer--;+ S/ Y6 a' I" O  I4 H( C
    }2 T$ e4 g/ O- L  i3 {

8 i( w0 x! ~9 g+ X    if( Uart1_RX_overtimer == 0 ){
8 j. c) n  T5 H7 j2 Z! d' A                asm("sei");
2 e. s2 J) r0 \- p                return;
5 q1 R: t- @$ K1 j& {        }' \6 u' {; f5 n
        2 @  i7 s7 C( N1 d4 [
        if(Uart1_send_haveframe == NONE)
- S8 I! @. _% z& O        {. Q/ L7 H3 p& G9 f: z+ \, a6 e3 c
                if(Uart1_recv_haveframe != NONE) {
% |& E4 [. t4 Z4 M: W' Z' p                        asm("sei");2 |4 a+ A  y+ `9 R  x! Y- y0 E
                        return;
. i/ v& e' ~7 i                }
* y, B( _: m$ L4 c0 O
3 M6 ~9 y. s4 g  N$ U/ _5 a                if(stat_flag == 0xa5){$ I4 x4 M& }! ~
                        stat_flag = 0;
, r  x5 \- E2 d/ T: @1 T. X8 l                        bit = 1;
2 l' q1 f6 x5 q6 I                        count = 0;
) u9 o% c  o( Y5 b                        tmp = 0;
3 i% e  M# N/ r/ u                        recv_byte = 0;
# e5 n5 Q% @7 D% S                        asm("sei");
3 c7 X1 s4 `3 d  u. c                        return;
  D) r5 V& l: ~9 C                }% `8 G. K; k6 j4 F3 R9 _! q
                if(bit == 0)
  E4 D5 T7 e/ b' K. n4 C                {  _# A4 d  l( g! `  {
                        if(!(IORxd_PIN & (1<<IORxd_BIT))){
( r% n' w2 R9 `2 p, X% F- x! E                                count ++;/ }! e3 s# O3 I: b9 C% e6 E7 \, }$ B
                                if(count >= 2)  stat_flag = 0xa5;
- F' l' s" s) r* S6 i' z" l2 {                        }
. t' M, }$ j; Q+ H                        else{3 `; E% M" r" U6 f: Y: h
                                count = 0;
) C- t* Y- {( p# j                                stat_flag = 0;
  B' V1 }: w9 c/ ~7 y$ v* G8 ^. W                        }! a! k% J& b6 g; p; T) L5 X
                        asm("sei");
) t; d" T9 P8 B9 y/ S7 b2 u                        return;
# B0 c* t/ \. \/ x% X: Q, r! z2 o                }
5 P# _) J' h; J4 I4 t                if(bit == 9)
* l+ @, K: T+ {! y% J2 j$ a                {
1 g# o9 d- j8 v: S* j                        if(!(IORxd_PIN & (1<<IORxd_BIT))) {" L& X' K! F' F7 h
                                asm("sei");
# T/ u7 Z0 e+ ?. C6 x& W                                return;
. Z0 `* J0 Z8 J& t7 O) o- K& {                        }0 H* U3 ?/ z# m: ~* Z# |
                        count++;0 n7 E. R/ z# K7 M
                        if(count >= 3 ){
$ h9 s. h; {5 w: z! h                                bit = 0;
0 a% e0 ^+ [: _7 v( ?: ^                                count = 0;
! e. [) n( {8 X$ Y7 q                                Uart1_recv_buf[Uart1_recv_pt++] = recv_byte;8 @3 _4 I9 S; N/ V% x$ K5 {
                                if(Uart1_recv_pt>=63) Uart1_recv_pt = 62;4 `+ V  e- l$ F
                                Uart1_RX_overtimer = 100;# T7 c% n  q+ V& ?
                        }8 x, L: \# a) L. ?
                        asm("sei");" {9 i# \% \. i0 S! }1 ~
                        return;. [0 c" C* L" \7 }
                }3 ^0 |! d0 n+ n5 r$ X7 `
                tmp = tmp << 1;
2 s0 c" C5 J) O# `  P3 l. p                if((IORxd_PIN & (1<<IORxd_BIT))) tmp++;" Q6 |) m" f( J9 @; ]5 G  W
                count ++;
( c# F3 {1 ?" w* Z                if(count >= 3){8 s% m  {9 V* ~1 C0 [; t/ ~
                        recv_byte = recv_byte >> 1;
! U3 G7 f% Q& N' \9 E                        if( (tmp==3) || (tmp>4) ) recv_byte |= 0x80;& H. z& R7 K# E7 b% c
                        tmp = 0;
9 X, g/ T1 T8 n, r& q0 p' O, `/ o                        count = 0;* a2 _9 D# F- c3 M4 z/ t9 a/ p9 j
                        bit ++;
: |# t2 Z  }! Z5 y1 y) _6 B8 Z0 H                }
1 X/ D1 J. t3 U1 _  z' n8 |        }
: m! t1 G9 G$ M5 C7 C7 g        else
$ n9 Z1 L# \. m& C4 s, v        {
4 L3 b4 s& ^  M, F                count++;
: J0 m6 i0 q0 {                if(count >= 3)  s& v: b8 w% k% w, p
                {( t' L* k# d- s4 {' l! v1 Q* G
                        count = 0;  v4 s- n6 b7 b9 }% o
                        if(bit == 0){, |: F8 j) T+ e
                                IoTxd_PORT &= ~(1<<IOTxd_BIT);6 v  g6 r. M. ~3 s1 g6 r0 e
                        }; H9 N! K( B' l* p% ]7 N$ ]
                        else if(bit == 9)
* Z. ?, W8 i/ R: z- `/ d  k                        {$ h2 v; W" I% D. h/ ]
                                IOTxd_PORT |= (1<<IOTxd_BIT);
* L7 ~8 s, p- r; r6 K3 N                                Uart1_send_pt ++;: ]& c# N1 H" `; Q: f$ O& G5 r
                                if(Uart1_send_pt >= Uart1_neet_send){# ?% I; h/ \! c# R. y& E6 s' Y
                                        Uart1_send_haveframe = NONE;
4 ~. Z. a8 [% M. N: l. B  o                                }" A2 p* L. v! g" B# `8 i- ]
                        }
/ E5 j, f: z( v5 H, g                        else* {; H- O1 [! e
                        {' t% @. a* D$ H& ]9 C- T# ]5 ]
                                if((Uart1_send_buf[Uart1_send_pt] & (1<<(bit-1))) == 0)  IOTxd_PORT &= ~(1<<IOTxd_BIT);
3 u) `6 P$ `3 w1 C* p* Q                                else IOTxd_PORT |= (1<<IOTxd_BIT);7 V9 Q1 d# I1 ], N1 J. e
                        }$ l- V3 i! R8 T) k+ A
                        if(bit >= 9) bit = 0;
9 p; H; ?$ N+ w5 k6 q0 \                        else         bit ++;
0 k" a4 c1 b) Y; w: J                }
! q) a' p" s2 k; w' M        }8 G5 l2 Q3 q" a) N
        asm("sei");
# i/ w9 P" n* n& f}8 `! ^+ K# e: s  a! C2 g
, |2 I* h! o6 R+ p
7 o! R2 ]: e; n- }) t

该用户从未签到

2#
发表于 2022-3-10 19:08 | 只看该作者
赶紧收藏起来,感谢你的分享
1 J. O) E) l# J& r$ _
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-5-25 12:47 , Processed in 0.078125 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表