原创 单片机串口通讯

2009-8-12 16:37 2500 9 9 分类: MCU/ 嵌入式
  通信协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。 电子园51单片机学习网m1ST9i [a#Y t
  测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。 电子园51单片机学习网yNr/I~(~6Bl电子园51单片机学习网*m0Rd'pj#P1p


)yWZ_3l:e40185//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
l%jTr&h40185//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的

l-a ~"F S40185

(qryQ M6U$r%I Q40185
^G8~0svX#bC40185#include 电子园51单片机学习网)VSR,d)eHH
#include 电子园51单片机学习网8f,YqF.Y1W3T


ilMn&t:llVE40185#define INBUF_LEN 4 //数据长度 电子园51单片机学习网2NE!bciP$YF%e,s


JSIbB[9NF40185unsigned char inbuf1[INBUF_LEN]; 电子园51单片机学习网*ym]P&VV
unsigned char checksum,count3;
]l/Vqq,sYk"yv40185bit read_flag= 0 ; 电子园51单片机学习网4hH}Y-}G

电子园51单片机学习网 gl!@GJ h

void init_serialcomm( void ) 电子园51单片机学习网u a*q Xwsg2^.{
{ 电子园51单片机学习网 I\3G'y F)Ow8gK ?j
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
!eg2F6_h4i{e \40185TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload 电子园51单片机学习网;q_/Mhe(N!_8\M7sM
PCON |= 0x80 ; //SMOD=1; 电子园51单片机学习网#mG9L J&x U
TH1 = 0xF4 ; //Baud:4800 fosc="11".0592MHz
9j9q/?:H ~D!w)\n{?40185IE |= 0x90 ; //Enable Serial Interrupt 电子园51单片机学习网IQ@L` um
TR1 = 1 ; // timer 1 run
S pFn HO;p4w40185// TI="1"; 电子园51单片机学习网1U*Q+m.Q/u/~^b5M,p
} 电子园51单片机学习网EI{;I-W7q\z


0l9bU?vc40185//向串口发送一个字符 电子园51单片机学习网-Z4Z0|4WiV/v+P*Yc
void send_char_com( unsigned char ch) 电子园51单片机学习网o"Qse0xNM \
{ 电子园51单片机学习网Tw3O&Q&}C8W!M
SBUF=ch; 电子园51单片机学习网_YU6u Ok/^,d{:}$yY
while (TI== 0 );
+xq$``l-x4k1]$R40185TI= 0 ;
"cd9@5rO0a"]40185} 电子园51单片机学习网oy7g Gc%S fg t;m

电子园51单片机学习网in8N B9l]l2r

//向串口发送一个字符串,strlen为该字符串长度 电子园51单片机学习网1Gyh{IaC&_*s
void send_string_com( unsigned char *str, unsigned int strlen)
I,f8Uz] MpIx40185{ 电子园51单片机学习网Zj0@CK'Pp2Y
unsigned int k= 0 ;
_x(z7Uog#]N!rm;W"JV40185do 电子园51单片机学习网-f%qJ2cA
{ 电子园51单片机学习网h sRo3WX q
send_char_com(*(str + k)); 电子园51单片机学习网3B:R`+L6U9Vp
k++; 电子园51单片机学习网%~R`];q;F c|
} while (k < strlen);
`bxdV``40185}

K3snI8vve40185 电子园51单片机学习网u3X TvA&W;U p


5X\'\`6Hc C40185//串口接收中断函数
"w|nqtqZ~,I40185void serial () interrupt 4 using 3
| iB3H;G&d40185{
P`5?!qOf40185if (RI) 电子园51单片机学习网:t kaH;z&y/[QB2E
{ 电子园51单片机学习网 s^7Yy!?Kw0GK Vu
unsigned char ch; 电子园51单片机学习网e C1f-c+y%l%t] @y
RI = 0 ;
*H @As:U*u\c A4~ c6U+N40185ch=SBUF; 电子园51单片机学习网"I-vE*L5I,J
if (ch> 127 )
xL6[*_ml40185{
J0r?GBs yG:P40185count3= 0 ; 电子园51单片机学习网_Pam8B4q:Xr
inbuf1[count3]=ch; 电子园51单片机学习网3ps.D? Vl)]
checksum= ch- 128 ;
.bzH T*u40185} 电子园51单片机学习网j`7|dCM6W
else 电子园51单片机学习网-L+w#V X!t$F4tm s)vu
{
Z9}U9fE40185count3++;
vLH3B1P'?)T+S1Z40185inbuf1[count3]=ch;
._C-] Ut#|T,[!z7X40185checksum ^= ch;
^+F"_E;Vn40185if ( (count3==(INBUF_LEN- 1 )) && (!checksum) )
c0w dv?8e8p40185{
2z Lq6c;m+i3fO v40185read_flag= 1 ; //如果串口接收的数据达到INBUF_LEN个,且校验没错, 电子园51单片机学习网#U*A`_RP_c ]
//就置位取数标志 电子园51单片机学习网5^mi5fFKC
}
~\n"Tp4^,e7P40185} 电子园51单片机学习网8pb;Ob!zA&N$C[T
} 电子园51单片机学习网:P x3{u4{2X%b
}

8\ st? U&k'h%I'I40185 电子园51单片机学习网,ut3W0PfC


V C&i;n vp[#JRC40185main()
e[X(q(r[qr40185{
b ^'uYGX40185init_serialcomm(); //初始化串口 电子园51单片机学习网9S;On$zy,{9t.I FK
while ( 1 ) 电子园51单片机学习网]9U:Lwh}m
{ 电子园51单片机学习网L eQTj3_&v9X
if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 电子园51单片机学习网 Md2s7Cl2oGe"f*VJ
{ 电子园51单片机学习网]L6U-~t.[R? xE
read_flag= 0 ; //取数标志清0 电子园51单片机学习网JY)AUo]{
send_string_com(inbuf1,INBUF_LEN); 电子园51单片机学习网rmo}x
}
ox/XB1Vp2fT;{40185}

gZ+V#M"|*q*o8L40185

vA#MI_:y40185}

| DQ5O,e,p p40185 电子园51单片机学习网7AL8ANA8j;aI&H

串行通信虽然有其自身优点:如适合长距离通信,有一定的纠错能力等,但并行通信在短距离(数米范围内)传输过程中的优点是显而易见的。首先串行通信时要设置串口数据,如:串口号(Com1、Com2或者其他串口)、波特率、数据位数、停止位、校验位等等。而且单片机与PC机的串口数据必须一一对等,否则不能传输。而并行传输时,无需上述过程。其次,PC机的串口电平值为+12V~-12V,单片机是TTL电平(0~+5V),两者必须要经过电平转换芯片进行电平间的转换。而进行并行传输时,由于双方都是TTL电平,所以PC的并口可以与单片机或其他芯片直接相连;另外,串行传输速度慢,每次只能传送一位,而并行每次可以传送8位,速度上的差异显而易见。

q"k{LK n WB40185

S_3wg'^/}S? ]-^40185而对于单片机,串口(UART)是最常用的端口,尤其对于存在两个或多个串口的单片机来说,充分利用串口进行通信是非常重要的。

|0eShR8ES40185 电子园51单片机学习网|qGB Kdj5Y


-x-gR%m8y Eg!X4k]40185输出输入接口的扩展 电子园51单片机学习网6`?rWn3V4`O

电子园51单片机学习网2J"D!]tu%Xk}0o)q^


*W(xk9I:O(y40185单片机串口实现"并行"通信,其原理就是将PC机传过来的并行数据转换成串行数据,送入单片机的串口再由其进行相应处理。实质上就是一个数据串-并、并-串转换的过程。

7m.r Y^6^40185

7@@zck],\40185PC的并口为一个标准的25针插座,包含一个八位二进制数据端口(地址为378H),即第2脚到第9脚;一个输入控制端口(地址为379H),即第15脚、13脚、12脚、10脚、11脚,其另外低三位无定义;一个输出控制口(地址为37AH),即第1脚、14脚、16脚、17脚,其另外高四位无定义。由此可见后面两个端口都不是完全的8位。

Xtu @#N6k+g0c40185

y ~9|&k sY-m,\`'~]40185输出接口电路扩展 电子园51单片机学习网jv,nF?\p

电子园51单片机学习网Q](n vz$U(MQ+l

这里使用常用的移位寄存器74LS164与单片机的RXD口构成输出接口电路。电子园51单片机学习网E"M z9["f,xg


c'Jv!u C0`Y40185双列直插式74LS164引脚定义如图1所示。电子园51单片机学习网.[SeM!\


a'}5[w {,lY$B+@40185其中:QA~QH为并行输出的数据,送入PC机并口378H端口(接收数据的8个数据位);单片机串口输出的数据从AB输入;CLR信号用于清除输出数据(通常用在移位完成时);内部数据移位依靠时钟CLK信号上升沿(由单片机TX提供)控制。电子园51单片机学习网9q6Z2I,g'XwX+lc9@


`UR,G2jEpdH E40185表1是该芯片工作的真值表。 电子园51单片机学习网{/C6UD ~;@+?p

电子园51单片机学习网eQedg^ x


pY'hM2v40185输入接口电路扩展 电子园51单片机学习网&a}qQor


E;r F7p$l|40185
w+fq8CTa'C x40185使用常用的移位寄存器74LS165与单片机的RXD口构成输入接口电路。

(tZW}!G40185

`&H8t \uq40185双列直插式74LS165引脚定义如图2所示。电子园51单片机学习网%?P_g{Z

电子园51单片机学习网_i9kat A

其中:A~H为并行输入的数据,接PC机并口378H端口(接收数据的8个数据位);单片机串口接收的数据(RXD端口)从QH输入;SH/LD信号用于重新装载数据(通常用在数据完全移出后);SER是用于填充数据移出后的空位的逻辑电平信号(逻辑"1"或"0");而数据是否移动由CLK INH和CLK联合控制;内部数据移位依靠时钟CLK信号(仍由单片机的TXD提供)上升沿控制。

"b'UXa_&I40185

&}2Uu*W5_\40185表2是该芯片工作的真值表。

2N8WlYr2l?9Y*{o J40185

\Is:wFM9\b40185其他软硬件准备工作 电子园51单片机学习网 B~?3r2I

电子园51单片机学习网$I ]\J2{/RI8c a5x

输入输出控制端口的连接。将单片机的P3.4、P3.5口分别与PC并口的第15脚、第16脚相连。这样在进行数据通信时,两者的握手信号传输就解决了:当并口的第16脚置高电平时,用来通知单片机接收PC机已准备就绪的数据,单片机收到以后就可以进行相应控制,接收数据;当单片机接收完数据时,会置P3.4为高电平并被379H的第15脚接收,于是PC机准备发送下一个数据……单片机向PC机发送数据时,情况与此类似,由P3.4发送信号给PC机,而由P3.5接收PC机发送过来的信号。电子园51单片机学习网#Mic0bhA@

电子园51单片机学习网 f%N okI.m~k0w/E

软件方面,由于是用串口进行"并行"通信,因此就不能将串口的工作方式设置为方式0(移位寄存器输入/输出方式)以外的其他方式。还要注意此时串口的波特率固定为单片机外接晶振频率的1/12。串行数据通过RXD输入/输出,TXD用于发送控制输入输出数据移位的时钟脉冲。收发的数据为8位,低位在前。

qv T%@5?-u40185 电子园51单片机学习网 F.C+o|R)F ~5}4~_v'a

设计实例 电子园51单片机学习网W K7zt8dVFoA1rN


2rIMF.JJ BNj8s40185由于这一并行通信实现方法非常简单,所以对于有一定单片机编程经验的开发人员来说,只要硬件电路确定下来,软件方面的问题就非常容易。图3为电路原理图。电子园51单片机学习网DpDB/b/v };Hs

电子园51单片机学习网 u7cz7Q_A"b:|c

需要说明的是:1、单片机与PC机并口要共地;2、由于并行通信存在应答信号(本图中由单片机的P3.4、P3.5实现此功能),所以不会出现RXD端口数据混乱的情况。 电子园51单片机学习网g Z ~(X2^B

电子园51单片机学习网m*F3hP2h0M!\mgr{/z

小结 电子园51单片机学习网"Y*W3nFwF}

电子园51单片机学习网q+G(Io(F]x

现在单片机的应用越来越广泛,单片机与PC之间的通信是一个非常重要的应用。如果单纯的从实现单片机与PC的并行通信的角度来说,该实现方法并不是最简单的。最简单的方法是将PC的并口对应引脚与单片机的P1口和P3口直接相连,然后软件上实现。本文的目的是充分利用单片机的串口资源与PC机进行通信。 电子园51单片机学习网vkkQ6`L(F4J

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条