资源描述
实验八 串行接口实验
微电子学
【实验目的】
1、掌握8031串行口方式1的工作方式及编程方法。
2、掌握串行通讯中波特率的设置,在给定通讯波特率的情况下,会计算定时时间常数。
3、掌握串行口工作方式的程序设计和单片机通讯程序的编制方法。
【实验原理】
MCS-51 单片机串行通讯的波特率随串行口工作方式选择的不同而不同,它除了与系统的振荡频率f,电源控制寄存器PCON的SMOD位有关外,还与定时器T1的设置有关。
1、在工作方式0时,波特率固定不变,仅与系统振荡频率有关,其大小为f/12。
2、在工作方式2时,波特率也只固定为两种情况:
当SMOD=1时, 波特率=f/32
当SMOD=0时, 波特率=f/64
3、在工作方式1和3时,波特率是可变的:
当SMOD=1时, 波特率=定时器T1的溢出率/16
当SMOD=0时, 波特率=定时器T1的溢出率/32
其中,定时器T1的溢出率=f/(12*(256-N)),N为T1的定时时间常数。
在实际应用中,往往是给定通讯波特率,而后去确定时间常数。例如:f=6.144MHZ,波特率等于1200,SMOD=0时,则:
1200=6144000/(12*32*(256-N)),计算得N=F2H。
【实验内容】
1.利用8031串行口发送和接收数据,并将接收的数据通过扩展I/O口
74LS273输出到发光二极管显示,结合延时来模拟一个循环彩灯。设置串行口工作于方式1,SMOD=0,波特率为1200。循环彩灯的变化花样也可自行设计。
实验连线: 8031 的TXD 接RXD;74LS273 的CS273 接CS0;O0~O7 接发光二极管的L1~L8。
参考程序见 D81.ASM
2.双机实验:本实验由两人共同完成。
分别设计甲、乙两个程序。甲程序为接收程序,在甲机运行,将接收到的字符在数码管上显示出来;乙程序为发送程序,在乙机运行,每次按P-键后发送,每次发送3个字符。
通讯协议:[起始字节(05)][3个数据][结束字符0E],B=2400,用串口通信方式1.
实验连线: 甲机8031CPU板上的RXD接乙机的TXD,甲机的GND接乙机的GND。
甲机:显示数码管的连线方式参考以前的实验
乙机:P3.3接P-
【实验程序与实验现象】
程序一
实验程序及注释:
D81.ASM
ORG 0000H
LJMP START
ORG 4100H
PORT EQU 0CFA0H
START: MOV TMOD,#20H ;选择定时器模式2,计时方式
MOV TL1,#0F2H ;预置时间常数,波特率为1200
MOV TH1,#0F2H
MOV 87H,#00H ;PCON=00,使SMOD=0
SETB TR1 ;启动定时器1
MOV SCON,#50H ;串行口工作于方式1,允许串行接收
MOV R1,#12H ;R1中存放显示计数值
MOV DPTR,#TABLE
MOV A,DPL
MOV DPTR,#L1
CLR C
SUBB A,DPL ;计算偏移量
MOV R5,A ;存放偏移量
MOV R0,A
SEND: MOV A,R0
MOVC A,@A+PC ;取显示码
L1: MOV SBUF,A ;通过串行口发送显示码
WAIT: JBC RI,L2 ;接收中断标志为0时循环等待
SJMP WAIT
L2: CLR RI ;接收中断标志清零
CLR TI ;发送中断标志清零
MOV A,SBUF ;接收数据送A
MOV DPTR,#PORT
MOVX @DPTR,A ;显码输出
ACALL DELAY ;延时0.5秒
INC R0 ;偏移量下移
DJNZ R1,SEND ;为零,置计数初值和偏移量初值
MOV R1,#12H
MOV A,R5
MOV R0,A
JMP SEND
TABLE: DB 01H, 03H, 07H, 0FH, 1FH, 3FH,7FH,0FFH,0FEH
DB 0FCH, 0F8H, 0F0H, 0E0H, 0C0H, 80H, 00H, 0FFH, 00H
DELAY: MOV R4,#05H ;延时0.5秒
DEL1: MOV R3,#200
DEL2: MOV R2,#126
DEL3: DJNZ R2,DEL3
DJNZ R3,DEL2
DJNZ R4,DEL1
RET
END
实验结果记录:
程序将产生循环彩灯效果。(0代表亮,1代表灭)
8个LED灯一开始从00000001方式点亮,接着按00000011方式点亮,接着按00000111方式点亮.,直到全部点亮后。全灭一次,然后再按11111110点亮,接着11111100点亮,直到灯全灭,这样循环往复
实验分析:
实验结果与实验要求符合,实验成功。
将此实验改为中断方式编程,则程序为:
ORG 4000H
LJMP START
ORG 4023H
LJMP INTC
ORG 4100H
PORT EQU 0CFA0H
START: MOV TMOD,#20H
MOV TL1,#0F2H
MOV TH1,#0F2H
SETB TR1
MOV SCON,#50H
MOV IE,#90H
MOV R1,#12H
MOV DPTR,#TABLE
SEND: MOV A,R0
MOVC A,@A+DPTR
MOV SBUF,A
SJMP $
INTC: JBC TI,BACK
CLR RI
MOV A,SBUF
MOV DPTR,#PORT
MOVX @DPTR,A
ACALL DELAY
INC R0
DJNZ R1,RESEND
MOV R1,#12H
MOV R0,#00H
RESEND: MOV DPTR,#TABLE
MOV A,R0
MOVC A,@A+DPTR
MOV SBUF,A
BACK: RETI
TABLE: DB 01H,03H,07H,0FH,1FH
DB 3FH,7FH,0FFH,0FEH,0FCH
DB 0F8H,0F0H,0E0H,0C0H
DB 80H,00H,0FFH,00H
DELAY: MOV R4,#05H
DEL1: MOV R3,#200
DEL2: MOV R2,#126
DEL3: DJNZ R2,DEL3
DJNZ R3,DEL2
DJNZ R4,DEL1
RET
END
运行后实验结果同上,程序可行
程序二:
实验程序:
接收方程序:
ORG 4000H ;设置程序起始地址
LJMP MAIN ;跳转到START
ORG 400BH ;设置内部定时器/计数器T0端口地址
LJMP DISP ;跳转到DISP
ORG 4023H ;设置串行口终端服务程序入口地址
LJMP READ ;跳转到READ
ORG 4100H ;设置主程序起始地址
PORT EQU 0CFA8H ;将PORT等值为0CFA8H
MAIN: MOV 50H,#00H ;将00H送50H单元
MOV 51H,#00H ;将00H送51H单元
MOV 52H,#00H ;将00H送52H单元
MOV 53H,#00H ;将00H送53H单元
MOV 54H,#00H ;将00H送54H单元
MOV 55H,#00H ;将00H送55H单元
MOV TMOD,#21H ;将21H送TMOD,设置定时器1工作方式为方式2,定时器0为方式1
MOV TH0,#235 ;将十进制数235送TH0,设置定时器0初始值
MOV PCON,#00H ;将00H送PCON,设置特殊功能寄存器PCON的值
MOV SCON,#50H ;将50H送SCON,设置串行口控制寄存器的初值
MOV TH1,#0FAH ;将FAH送TH1,设置定时器1高八位地址
MOV TL1,#0FAH ;将FAH送TL1,设置定时器1低八位地址
SETB 7FH ;将7FH单元的值置1
SETB 7EH ;将7EH单元的值置1
SETB EA ;将EA的值置1,令CPU开放中断
SETB ES ;将ES的值置1
SETB ET0 ;将ET0的值置1,允许T0中断
SETB TR0 ;将TR0的值置1,初始化
SETB TR1 ;将TR1的值置1,初始化
SETB PS ;将PS的值置1,
CLR PT0 ;将PT0清零
MOV R0,#50H ;将50H送R0
MOV R2,#3 ;将十进制数3送R2
SJMP $ ;原地跳转,等待中断
;
READ: PUSH ACC ;将累加器A压入栈中
CLR TR0 ;令TR0清零
CLR ES ;令ES清零
CLR RI ;令RI清零
MOV A,SBUF ;将SBUF的值送累加器A
JB 7FH,START ;若7FH单元的值=1,跳转到START
JB 7EH,RED ;若7EH单元的值=1,跳转到RED
XRL A,#0EH ;将累加器A和0EH进行异或处理,存入累加器A中
JNZ EER ;若A不等于0,跳转到EER
MOV R2,#3 ;将十进制数3送R2
MOV R0,#50H ;将50H送R0
SETB 7FH ;将7FH单元的值置1
SETB 7EH ;将7EH单元的值置1
SJMP EXT ;跳转到EXT
START: CLR 7FH ;将7FH单元的值清零
XRL A,#05H ;将累加器A和05H进行异或处理,存入累加器A中
JNZ EER ;若A不等于0,跳转到EER
SJMP EXT ;跳转到EXT
RED: MOV @R0,A ;将累加器A的值送R0指向的单元
INC R0 ;将R0的值加1
DJNZ R2,EXT ;令R2减1,若不为零,跳转到EXT
CLR 7EH ;将7EH的值清零
SJMP EXT ;跳转到EXT
EER: SETB 7FH ;将7FH单元的值置1
SETB 7EH ;将7EH单元的值置1
MOV R2,#3 ;将十进制数3送R2
MOV R0,#50H ;将50H送R0
EXT: SETB ES ;将ES的值置1
POP ACC ;将栈顶处内内容弹出到累加器A
SETB TR0 ;将TR0的值置1
RETI ;返回
;
DISP: MOV R1,#50H ;将50H送R1
MOV R3,#0DFH ;将DFH的值送R3
MOV DPTR,#PORT ;将#PORT送DPTR,即将#0CFA8H送DPTR
LOOP: MOV P1,R3 ;将R3的值送P1
MOV A,@R1 ;将R1指向单元的值送累加器A
MOVX @DPTR,A ;将累加器A的值送片外DPTR指向的单元
LCALL DELAY ;调用DELAY子程序
MOV A,R3 ;将R3的值送累加器A
JNB ACC.0,EXTT ;若ACC.0为0,跳转到EXIT
RR A ;将累加器A右移一位
MOV R3,A ;将累加器A的值送R3
INC R1 ;将R1的值加1
SJMP LOOP ;跳转到LOOP
EXTT: MOV TH0,#235 ;将十进制数235送TH0
RETI ;返回
;
DELAY: MOV R7,#0FFH ;将FFH送R7
DJNZ R7,$ ;将R7减1,若不为0,原地跳转
RET ;返回
END ;程序结束
发送方程序:
ORG 4000H
LJMP MAIN
ORG 4013H
LJMP SEND
ORG 4100H
MAIN: MOV 50H,#3FH
MOV 51H,#06H
MOV 52H,#5BH
MOV 53H,#39H
MOV 54H,#7CH
MOV 55H,#77H
MOV 56H,#77H
MOV 57H,#3EH
MOV 58H,#76H
MOV R0,#50H
MOV R2,#3
MOV PCON,#00H
MOV SCON,#40H
MOV TH1,#0FAH
MOV TL1,#0FAH
MOV TMOD,#20H
SETB TR1
SETB EA
SETB IT1
SETB EX1
SJMP $
;
SEND: CLR EX1
START: MOV A,#05H
MOV SBUF,A
JNB TI,$
CLR TI
LOOP: MOV A,@R0
MOV SBUF,A
JNB TI,$
CLR TI
CJNE R0,#58H,ST
MOV R0,#4FH
ST: INC R0
DJNZ R2,LOOP
MOV A,#0EH A
MOV SBUF,A
JNB TI,$
CLR TI
MOV R2,#3
SETB EX1
RETI
END
实验结果记录:
每次在乙机按下P-键后,可看到甲机上的三位数码管的数值发生变化,变化为:012→ABC→HUA→012→ 如此循环。
实验分析:
实验结果与实验理论结果一致,程序可行,实验成功。
展开阅读全文