8.1 什么是串行异步通信?它有哪些特点?MCS-51单片机的串行通信有哪几种帧格式? 8.1见8.1节
8.2 某异步通信接口按方式3传送,已知其每分钟传送3600个字符,计算其传送波特率。
8.2 方式3为每帧11位数据格式.即3600*11/60=660(波特)
8.3 为什么定时器T1用做串行口波特率发生器时,常采用工作方式2? 若已知系统时钟频率、通信选用的波特率,如何计算其初值?
8.3 T1的方式2模式不需要重装时间常数(计数初值),不影响cPU执行通信程序。设波特率为fboud计数初值为X,依据公式
fbaud=(2smod/32)*(fosc/12(256-X)) 求得X=256-((2smod/32)*(fosc/fbaud))。
8.4 已知定时器T1设置为方式2,用做波特率发生器,系统时钟频率为6MHz,求可能产生的最高和最低的波特率是多少?
8.4最低波特率为,T1定时最大值时,此时计数初值为256,并且SMOD=0,得
fbaud=(1/32)*(fosc/(12(256-0))=61
最高波特率为T1定时最小值且SOMD=1时,得 fbaud=(2/32)*fosc/(12(256-1))=31250
8.5 设甲、乙两机采用方式1通信,波特率为4800,甲机发送O,1,2,?,1FH,乙机接收存放在内部 RAM以20H为首址的单元,试用查询方式编写甲、乙两机的程序(两机的fosc=6MHz)。
8.5取SMOD=1计算TH1=TL1=B2;
;***********************发送查询方式******
ORG 0000H
MOV TMOD,#20H MOV THl,#OB2H MOV TL1,#0B2H SETB TR1
MOV SCON,#40H MOV A,#O
NEXT:MOV SBUF,A TES:JBC T1,ADD1 SJMP TES ADD1:INC A
CJNE A,#20H,NEXT SJMP $ END
;************************发送中断方式********************************* ORG 0000H
AJMP MAIN;转主程序 ORG 0023H ;中断服务 CLR TI INC A
MOV SBUF,A
CJNE A,#20H,RE
29
CLR ES RE:RETI
MAIN:MOV TMOD,#20H;主程序 MOV TH1,#0B2H MOV TL1,#082H SETB TR1
MOV SCON,#40H SETB EA SETB ES MOV A,#O MOV SBUF,A
SJMP$ ;等待中断
;*******************************接收查询方式***************************
ORG 0000H MOV TMOD,#20H MOV TH1,#0B2H MOV TL1,#0B2H SETB TR1
MOV SCON,#50H MOV RO。#20H TEC:JBC R1,REC
SJMP TES REC:MOV @R0,SBUF INC R0
CJNE R0,#40H,TEC
SJMP $ END
;******************************接收中断斤方式**************************** ORG O000H
AJMP MAIN;转主程序 ORG 0023H;中断服务 CLR RI
MOV @RO,SBUF INC R0
CJNF R0,#40,RE CLR ES RE:RETI
MAlN:MOV TMOD,#20H;主程序 MOV TH1,#0B2H MOV TL1,#0B2H SETB TR1
MOV SCON,50H SETB EA SETB ES
SJMP$ ;等待中断 END
30
8.6 一个8XX511单片机的双机通信系统波特率为9600, fosc=12MHz,用中断方式编写程序,将甲机片外RAM 3400H~34AOH的数据块通过串行口传送到乙机的片外RAM 4400H~44AOH单元中去。 8.6
/********************************发送程序***************************/ #include
#define uchar unsigned char VOId int4(void) uchar xdata*P; {P=Ox3400 TMOD=0x20;
TL1=0xfd;TH1=0xfd; SCON=0x40:
TR1=1;EA=1;ES=1; SBUF=*P:
whaile(1);/*等待中断*/ }
void int4(void)interrupt 4 {TI=O: P++: SBUF=*P; if(P==0x34a0)EA=0; }
/***********************接收程序***************************/ #include
#define ucher Unsigeried char void int4(void) char xdata*P: void mian() {P=0x4400: TMOD=0x20; TL1=Oxfd: TH1=0xfd; SCON=0x50;
TR1=1;EA=1;ES=1; for(;;);/*等待中断*/ }
void int4(viod)interrupt 4 {RI=0; *P=SBUF; P++;
if(P==0x44a1)EA=O; }
8.7 数据传送要求同题8.6,要求每帧传送一个奇校验位,编出查询方式的通信程序。 8.7 利用串行通信方式2(波特率固定),采用奇校验方式,将校验位放在TB8中.乙机检验校验位,如正确,则存于片外4400H开始的RAM中,如错误,通知对方重发,R6存放数据
31
块长度。汇编语言程序如下: 发送方
ORG 0000H
MOV DPTR,#3400H MOV R6,#0A1H
MOV SCON,#90H MOV SBUF,R6 L2: JBC TI,L3
AJMP L2
L3: MOV A,@DPTR JB P,L4
SETB TB8 L4: MOV SBUF,A L5: JBC TI,L6
AJMP L5 L6: JBC RI,L7 AJMP L6
L7: MOV A,SBUF CJNE A,#0FFH,L8 AJMP L3 L8: INC DPL DJNZ R6,L4 SJMP $ 接收方
ORG 0000H
MOV DPTR,#4400H MOV SCON,#90H L1: JBC RI,L2 AJMP L1
L2: MOV A,SBUF MOV R6,A
L3: JBC RI,L4 AJMP L3
L4: MOV A,SBUF JB P,L5 JNB RB8,L8 sIMP $
L5: JB JB8,L8 L6:MOVX @DPTR,A INC DPL INC DPH DJNZ R6,L3
SJMP $ L8: MOV A,#0FFH MOV SBUF,A L9: JBC TI,L3
32