|
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
|
|