单片机串口通讯实验报告
时间:2020-09-27 08:43:31 来源:工作范文网 本文已影响 人
实验十 单片机串行口与PC机通讯实验报告
㈠ 实验目的
掌握串行口工作方式的程序设计,掌握单片机通讯的编制;
了解实现串行通讯的硬环境,数据格式的协议,数据交换的协议;
了解PC机通讯的基本要求。
㈡ 实验器材
G6W仿真器 一台
MCS—51实验板 一台
PC机 一台
㈢ 实验内容及要求
利用8051单片机串行口,实现与PC机通讯。
本实验实现以下功能,将从实验板键盘上键入的字符或数字显示到PC机显示器上,再将PC机所接收的字符发送回单片机,并在实验板的LED上显示出来。
㈣ 实验步骤
编写单片机发送和接收程序,并进行汇编调试。
运行PC机通讯软件“commtest.exe”,将单片机和PC机的波特率均设定为1200。
运行单片机发送程序,按下不同按键(每个按键都定义成不同的字符),检查PC机所接收的字符是否与发送的字符相同。
将PC机所接收的字符发送给单片机,与此同时运行单片机接受程序,检查实验板LED数码管所显示的字符是否与PC机发送的字符相同。
㈤ 实验框图
单片机接收程序N开 始置串口方式,设置波特率置T1模式及常数
单片机接收程序
N
开 始
置串口方式,设置波特率
置T1模式及常数
Y
开串口中断
接收完毕?
启动定时器1,串口接收开放
结 束
清串口中断标志ES
设置波特率,启动定时器T1
开 始
设置串口方式
Y
N
读键盘,调用按键去抖子程序
数据送串口
发送完毕?
单片机发送程序
读串口
数据送RAM
调用显示子程序
串口中断入口
中断返回
ORG 0000H
AJMP START
ORG 0023H
AJMP SERVE
ORG 0050H
START: MOV 41H,#0H ;对几个存放地址进行初始化
MOV 42H,#0H
MOV 43H,#0H
MOV 44H,#0H
MOV SCON,#00H ;初始化串行口控制寄存器,设置其为方式0
LCALL DISPLAY ;初始化显示
MOV TMOD,#20H ;设置为定时器0,模式选用2
MOV TL1, #0E6H ;设置1200的波特率
MOV TH1, #0E6H
SETB TR1 ;开定时器
MOV SCON,#50H ;选用方式1,允许接收控制
SETB ES
SETB EA ;开中断
LOOP: ACALL SOUT ;键盘扫描并发送,等待中断
SJMP LOOP
SERVE JNB RI,SEND ;判断是发送中断还是接收中断,若为发送中断则调用
ACALL SIN ;发送子程序,否则调用接收子程序
RETI
SEND: CLR TI ;发送子程序
RETI
SIN: CLR RI ;接受子程序
MOV SCON, #00H
MOV A, SBUF ;接收数据
LCALL XS ;调用显示子程序
RETI
子程序:
SOUT: CLR TI ;清发送中断标志位
LCALL KEY ;调用判断按键是否按下子程序
MOV A,R0 ;将按键对应的数字存入A
MOV SBUF,A ;输出按键数字给锁存
RET
KEY: MOV P1,#0FFH ;将P1设置为输入口
MOV A, P1
CPL A ;将A内值取反
ANL A, #0FFH
JZ KEY ;将A与FFH与后判断是否为0,若为0则表示无按键按下跳回KEY
LCALL D ;调用延时子程序消抖
MOV A, P1
CPL A
ANL A, #0FFH
JZ KEY
MOV B,A ;判断有按键按下,将值赋给B
KEY1: MOV A, P1
CPL A
ANL A,#0FFH
JNZ KEY1
LCALL D
MOV A,B
JB ACC.0,PKEY1 ;依次判断A内数据每个位是否为1,并跳
JB ACC.1,PKEY2 ;转到相对应位的子程序
JB ACC.2,PKEY3
JB ACC.3,PKEY4
JB ACC.4,PKEY5
JB ACC.5,PKEY6
JB ACC.6,PKEY7
JB ACC.7,PKEY8
EKEY: RET
PKEY1: AJMP K1
PKEY2: AJMP K2
PKEY3: AJMP K3
PKEY4: AJMP K4
PKEY5: AJMP K5
PKEY6: AJMP K6
PKEY7: AJMP K7
PKEY8: AJMP K8
K1: MOV R0,#01H ;将相应的数据赋给R0后跳转到EKEY
SJMP EKEY
K2: MOV R0,#02H
SJMP EKEY
K3: MOV R0,#03H
SJMP EKEY
K4: MOV R0,#04H
SJMP EKEY
K5: MOV R0,#05H
SJMP EKEY
K6: MOV R0,#06H
SJMP EKEY
K7: MOV R0, #07H
SJMP EKEY
K8: MOV R0, #08H
SJMP EKEY
XS:MOV SCON,#00H ;显示子程序,采用同步移位寄存器
CLR TI
MOV DPTR, #TAB
MOVC A,@A+DPTR ;将相应数值的数码管显示数值送入SBUF
MOV R5,#04H ;共四位需要显示
MOV 41H, A
MOV R0, #41H
DISPLAY1: MOV A,@R0
MOV SBUF, A
JNB TI,$ ;是否传完了
CLR TI ;清除中断标志位
INC R0
DJNZ R5, DISPLAY1
MOV SCON, #50H
RET
D: ;延时子程序
MOV R7, #10H
DELAY1: MOV R6, #0FFH
DELAY2: DJNZ R6, DELAY2
DJNZ R7, DELAY1
RET
TAB: DB 0BBH, 09H, 0EAH, 6BH
DB 59H, 73H, 0F3H, 0BH
DB 0FBH
本次实验中解决了如何判断数据是发送还是接收的问题和如何判断数据是否发送或接受完毕的问题,通过实验中的讨论和研究书上关于串行口的内容,我们通过中断标志位和循环很好的解决了这个问题。这个实验让我认识到单片机中中断的巨大作用,它不仅可以省去很多繁琐的设计步骤,还可以帮助我们解决许多设计上的问题。
另外,我觉得这是一次较为综合性的实验,按键,消抖,数码管显示,定时,串行口中断,串行口数据的收发这些内容都在本次实验中体现出来了,也算是让我们进行了一个小复习,让我们站在一个更高的平台上去编写程序。
主要操作上的问题有两个:
问题:PC机可以根据按键的按下显示相应的符号,但是不是预期的数字
原因:PC机没有设置十六进制显示和十六进制接收
解决办法:在与PC机相关的软件下方,在设置十六进制显示和十六进制接收的选项的前面打勾
问题:输入的字符串只能在四个七段数码管的最右边的那个显示,其余三个处于随机状态。
原因:其余三个数码管未给初值
解决办法:在程序开始的地方加上数码管显示初始化语句