找回密码
 注册
关于网站域名变更的通知
查看: 339|回复: 1
打印 上一主题 下一主题

IO模拟串口

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 Heaven_1 于 2022-3-10 13:54 编辑 ; G+ R- I; w3 z, v
: Z% V. U( w  ?1 M' A$ N
//该模拟串口为半双工模式, 2400/8/N/14 y7 B6 F7 P5 y" _3 Y: L: B
//如需不同波特率改变T2定时器的时间便可
& c9 u8 i8 Z+ j: ]: C2 n- S1 n& R3 Y7 U' H; U7 }; I% v

$ Z  s6 U/ S% U4 }; ^8 g6 H
- S' w: o8 A/ ?" e# O+ W0 G#pragma vector = TIMER2_OVF_vect& m3 G. a0 B7 M* M  M& K
__interrupt
, j, W( t# m# V% X$ dvoid T2time139us(void)
" w( b7 c7 C0 ]/ d) F{
8 j& J8 \) F3 _        static unsigned char bit;0 M% L5 v4 P& d. O3 P  \
        static unsigned char count;* }7 k8 U) x8 Z$ K2 g( P
        static unsigned char stat_flag;' ~" x/ [7 r" W
        static unsigned char tmp;- M% y4 p( J! h# N& B* x5 F
        static unsigned char recv_byte;% a, R3 S4 l7 \% Y
        TCNT2 = 152;
" H- ^# F" D/ r, w3 N( g        0 l; C- i/ t" B9 P3 p) y
        if((Uart1_RX_overtimer != 0) && (Uart1_RX_overtimer != 0xff)){
/ b& V: M! V* E9 c/ u                Uart1_RX_overtimer--;: h# z0 K3 e( L$ _" E( g5 v' U
    }2 Z5 Z) c/ i" J# Z) \$ i, L2 S

/ r" t/ @) I3 z4 B    if( Uart1_RX_overtimer == 0 ){
, D" A! Q. S, \# h  p: @                asm("sei");* Z0 h4 \% k) y) C) W- F
                return;
  D0 u+ I3 ?) h9 {        }
- D7 D$ a9 P: z0 M  B5 f  U        ' z% s& j9 D4 A: i% s
        if(Uart1_send_haveframe == NONE)
( l8 m6 C$ `9 o; [; ?* m6 n        {
' D5 K+ b: _4 ]& ^" j                if(Uart1_recv_haveframe != NONE) {5 ]) b4 W- G, u( }% M
                        asm("sei");
# z' W* b- ]5 [& \                        return;
) ?" a3 S/ l! A5 `1 j9 [                }8 b! t' q" S7 N- Q6 T- E/ l0 c+ c
# H* B7 [1 X2 s" N$ \! A7 _+ L
                if(stat_flag == 0xa5){
8 C' ^3 n6 g' T- u+ o                        stat_flag = 0;3 s# `- T; E- n: i1 G/ \9 T
                        bit = 1;9 Z, J7 r* X. `4 Y  [
                        count = 0;
3 X! ]9 P/ C' n' @: ^: v3 L                        tmp = 0;: p8 H7 S7 E: p/ z$ u1 u7 Z0 u
                        recv_byte = 0;! i( z0 W! K. {: M
                        asm("sei");7 k$ }( _4 J9 Y) s7 \
                        return;
. ^) |) J# ]! u$ e6 l" D- r                }
4 z$ d; S  {0 h3 u& E4 s0 o' f                if(bit == 0)% r$ z7 Q2 L- \0 L7 V* Y1 r5 N
                {1 _! O8 i- B8 h4 b/ [
                        if(!(IORxd_PIN & (1<<IORxd_BIT))){; o( G* Z  F6 L, y2 Z, O& ^
                                count ++;
8 O7 A5 j+ `# [  H& Q. F8 |                                if(count >= 2)  stat_flag = 0xa5;
3 B2 y$ e" j; n+ b2 N                        }7 V! W! ^/ {( A, _2 T# U' d: b
                        else{
7 D! z" P& e+ n. _. R                                count = 0;% h+ o% X4 ^9 ^- V. X
                                stat_flag = 0;
9 P3 v# W6 t, q' X6 `; @                        }6 V/ z8 n# g* M% {- ~; m9 U
                        asm("sei");
1 m  C6 M3 k" w- y9 U                        return;
3 h: t$ `0 q% H- z                }( F# C* V1 O7 K% _# u) {% u3 d
                if(bit == 9)
2 ]+ T7 \9 j  Q9 t                {- I  a$ L- b  n0 x! x
                        if(!(IORxd_PIN & (1<<IORxd_BIT))) {: O3 h+ L0 H6 k/ E
                                asm("sei");6 S+ |4 I: @! d% x% ~
                                return;
( _' l$ _2 m6 x                        }) o  W: g0 ~$ S  ]  _
                        count++;8 v3 Q/ M# A- B
                        if(count >= 3 ){9 B6 ^$ Y9 l( W
                                bit = 0;# P! U/ l. G, V: u" K& ?
                                count = 0;/ [! V9 u( E, H; ^# Q" N
                                Uart1_recv_buf[Uart1_recv_pt++] = recv_byte;
3 j2 J# ]% R7 M& q/ @) F                                if(Uart1_recv_pt>=63) Uart1_recv_pt = 62;
  Q* k* a" L: H; q4 _5 h                                Uart1_RX_overtimer = 100;$ W" M! E4 G5 R6 K6 w/ \
                        }. t( ^0 E' y& n# U
                        asm("sei");
. ~+ b/ ?* X; @( p3 |& O1 L                        return;
, _2 t* D9 r! g3 R7 [# Z6 x                }( n! C7 e3 _  g, E- H
                tmp = tmp << 1;" ?2 F+ K6 ]7 _, l( q- y) c, C
                if((IORxd_PIN & (1<<IORxd_BIT))) tmp++;, Y  i1 K7 v0 X
                count ++;: Q% c8 A# V" y3 t8 }, e8 X9 e
                if(count >= 3){
9 j  ^9 C3 t( g1 [* j" O5 Q                        recv_byte = recv_byte >> 1;
; L+ X% L) z( [! i                        if( (tmp==3) || (tmp>4) ) recv_byte |= 0x80;
, y/ c. [" m1 Z$ @6 H                        tmp = 0;' u8 a0 y' d+ ^! C8 {- a
                        count = 0;
& E$ H6 \3 L1 B: Y6 o0 \! ]7 C, f0 o                        bit ++;
( y' f! f: ?4 A; x4 z/ U" j                }
, Z  [  E1 {9 j& O; |, s        }$ w9 O0 T* p7 m' X: \+ W5 B2 x
        else
+ }  E; q( Z& S' t& N4 H/ T        {
6 M. N$ r8 S  J* }                count++;$ X6 i; E  N9 g" X# n# L
                if(count >= 3)+ l! [( Y9 t! r
                {
7 g& s! }* N$ n, u4 j4 F5 \                        count = 0;( ?" Z# a2 t2 j: H; ]
                        if(bit == 0){
$ ~- Q  i% _9 n& M) H6 k: G                                IoTxd_PORT &= ~(1<<IOTxd_BIT);# Z! z9 ^" ^3 W2 F7 ^5 N  m
                        }" w$ x) r3 ~6 q% b* @: x! q
                        else if(bit == 9)
6 w+ N" b& l6 _; T                        {# F. L  ]& X, Q: ]3 j
                                IOTxd_PORT |= (1<<IOTxd_BIT);
" G. F; P8 h6 b% e$ ~                                Uart1_send_pt ++;
% V: t/ l3 S/ [                                if(Uart1_send_pt >= Uart1_neet_send){
9 e' v. d, x3 |% ~2 a$ R                                        Uart1_send_haveframe = NONE;8 ?0 R- [9 `+ S3 n* k0 d  l& I# s) \
                                }
) j1 i. n* U. J% h( o1 M                        }
( U" ~* F/ {2 ]3 O( b                        else
5 C- F1 B6 K8 P                        {
+ i+ ?- [9 W. p0 ]7 g                                if((Uart1_send_buf[Uart1_send_pt] & (1<<(bit-1))) == 0)  IOTxd_PORT &= ~(1<<IOTxd_BIT);
8 X1 i5 r3 {+ b& I! L                                else IOTxd_PORT |= (1<<IOTxd_BIT);; r, }: t( _6 c+ e
                        }
* y' _8 U1 Y5 R0 V- T                        if(bit >= 9) bit = 0;
5 t1 i* q& }/ P2 i: w                        else         bit ++;; c+ l9 Y+ W7 }, h% {$ ]
                }
) Z7 G$ ]1 G: V. _+ v; T        }
, l. l/ y- |8 L4 G        asm("sei"); ( ]5 U& U; s7 {8 N2 S- F
}
4 C0 z: s4 r6 L$ G, A3 F8 N0 M6 E
, q! G% i; s0 ]2 c: ]- i6 b$ Z8 Z+ }1 k5 U

该用户从未签到

2#
发表于 2022-3-10 19:08 | 只看该作者
赶紧收藏起来,感谢你的分享
% s& \# O9 p' y9 S* l; ^
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-6 23:18 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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