51系列串口通讯例程参考仅供文档格式.docx
《51系列串口通讯例程参考仅供文档格式.docx》由会员分享,可在线阅读,更多相关《51系列串口通讯例程参考仅供文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
![51系列串口通讯例程参考仅供文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/11/f7de2b6c-52bd-4395-9ecf-fd0229f1654a/f7de2b6c-52bd-4395-9ecf-fd0229f1654a1.gif)
13.void
serial_init(void)
14.{
15.
//ET1
=
0;
//CLR
0ABH
;
禁止T1中断
16.
TMOD
0x20;
//MOV
89H,#20H
timer
1
mode
2:
8-Bit
reload(定时器T1
模式2:
8位自动初值重装)
17.
TH1
0xE8;
8DH,#0E8H
18.
TL1
8BH,#0E8H
1200bps,
11.059
19.
TR1
1;
//SETB
8EH
启动定时器1
20.
SCON
0x50;
//
1:
10-bit
UART,
enable
receiver
//(模式1:
10位异步发送/接收,
使能接收允许位)
21.
//SM1
串行口
模式1
22.
//SM0
23.
//REN
允许串行中断接收
24.
SM2
O9DH
收到有效的停止位时才将RI置1
25.
ES
0ACH
允许串行中断
26.
EA
0AFH
总中断开
27.}
28.//中断方式处理串口数据
29.void
serial(void)
interrupt
4
using
30.{
31.
if(RI)
32.
{
33.
RI
34.
串口接收,
采用临时缓冲
35.
}
36.#if
0
37.
if(TI)
38.
39.
TI
40.
串口发送,
没有必要使用中断方式
41.
42.#endif
43.}
44.//
查询方式接收串口数据
45.unsigned
char
getchar(void)
46.{
47.
while(!
RI);
没有收到串口数据则一直等待
48.
RI=0;
49.
return
SBUF;
50.}
51.//
查询方式发送串口数据
52.void
putchar(unsigned
ch)
53.{
54.
SBUF=ch;
55.
TI);
56.
TI=0;
57.}
58.code
unsigned
HEX_TAB
[]="
0123456789ABCDEF"
59.void
puthex(unsigned
60.{
61.
i,j;
62.
i=ch>
>
4;
63.
j=ch&
0x0f;
64.
putchar(HEX_TAB[i]);
65.
putchar(HEX_TAB[j]);
66.}
test.c
采用查询方式进行串口通讯的例子
采用这种方式的弊端:
1.如果对方没有发送数据,则本机无限等待,而不能做其它事情
2.如果对方发送数据而本机正做其它事情,那么有可能丢失数据。
因此实际上串口接收常采用中断方式,串口发送则不需要。
6.#include
7.extern
void
serial_init(void);
8.extern
getchar(void);
9.extern
ch);
10.extern
11.void
main(void)
12.{
13.
i;
14.
serial_init();
串口初始化
do
i=getchar();
如果没有收到串口数据则一直等待(查询接收串口数据的弊端)
++i;
--i;
观察断点
putchar(i);
//在串口显示接收到的ASCII数据(就是把原来收到的数据再送回串口)
putchar('
'
);
0'
x'
puthex(i);
在串口以十六进制格式显示接收的ASCII数据
27.
28.
29.
}while
(1);
30.}
8051串口程序
8051串口程序.rar>
M0.ASM
31.;
FILE:
M0.ASM
32.;
THISPROGRAMTRANSMITSTHEHEXVALUEAAREPETITIVELYACCROSSTHESERIALPORT
33.;
OFAMCS-51MICROCONTROLLERINMODE0
34.;
35.;
DETAILS:
36.;
37.;
MODE0:
SERIALDATAEXITSANDENTERSTHROUGHTHERXDPIN.THETXDPINOUTPUTS
38.;
THESHIFTCLOCK.INMODE0,8BITSARETRANSMITTED/RECEIVEDSTARTINGWITHTHE
39.;
LEASTSIGNIFICANTBIT.THEBAUDRATEISFIXEDTO1/12THEOSCILLATORFREQUENCY.
40.;
41.;
42.ORG00H
43.;
44.JMPMAIN
45.MAIN:
MOVSCON,#00H;
SETUPFORMODE0
46.CLRTI;
READYTOTRANSMIT
47.LOOP:
MOVSBUF,#0AAH;
TRANSMITAAH
48.JNBTI,$;
WAITFORENDOFTRANSMISSION
49.CLRTI;
CLEARTRANSMITFLAG
50.JMPLOOP;
DOITALLAGAIN
51.END
52._
M1INT.ASM
53.;
M1INT.ASM
54.;
55.;
THISPROGRAMRECEIVESAVALUEENTERINGINTOTHESERIALPORTPINRXDANDPUTS
56.;
THEDATAOUTTOPORT1
57.;
58.;
59.;
60.;
61.;
THEPROGRAMISDESIGNEDTOBEINACONTINUOUSNEVERENDINGLOOPUNTILABYTEOFDATAHASBEEN
62.;
COMPLETELYRECEIVED.THELOOPISEXITEDBECAUSEOFTHEOCCURANCEOFASERIALINTERRUPT.AFTER
63.;
THEINTERRUPTHASBEENSERVICED,THEPROGRAMGOESBACKINTOIT'
SENDLESSLOOPUNTILANOTHER
64.;
INTERRUPTOCCURS
65.;
66.;
67.PCONEQU87H;
DEFINEPCONREGISTERLOCATION
68.;
69.ORG00H
70.;
71.JMPMAIN
72.;
73.ORG023H;
STARTINGADDRESSOFSERIALINTERRUPT
74.JMPSERIAL_INT
75.;
76.MAIN:
MOVSCON,#50H;
SETUPSERIALPORTFORMODE0WITHRECEIVEENABLED
77.MOVTMOD,#20H;
SETUPTIMER1ASAUTO-RELOAD8-BITTIMER
78.MOVTH1,#0DDH;
BAUDRATEEQUALS2400BAUDAT16MhZ
79.MOVPCON,#80H;
SETTHEDOUBLEBAUDRATEBIT
80.MOVIE,#81H
81.MOVTCON,#40H;
STARTTIMER1
82.CLRRI;
ENSURETHATTHERECEIVEINTERRUPTFLAGISCLEAR
83.LOOP:
JMPLOOP;
ENDLESSLOOP(UNLESSINTERRUPTOCCURS)