文章目录
- 一、实验目的
- 二、原理
- 三、实验内容
一、实验目的
掌握串行口工作方式的程序设计,掌握单片机通信程序设计方法。
二、原理
发送指令:MOV SBUF,A 接收指令:MOV A,SBUF
1、串行口控制寄存器 SCON (地址:98H)
- TI:发送中断标志位。发送前必须要用软件清零。
- RI:接收中断标志位。接收前必须要用软件清零。
- SM2:多机通信控制位。
2、电源控制寄存器 PCON (地址:87H)
3、发送/接收一帧数据结束与否?
(1)查询方式: 发送程序:发送一个数据-----查询TI-------发送下一个数据(先发后查) 接收程序:查询RI--------读入一个数据---------查询RI-----(先查后收)
(2)中断方式: 发送与接收共用一个串口中断0023H, 中断响应后服务程序中应判断是哪个中断。 如:JB TI , LOOP ;TI=1,跳转至 LOOP 发送程序
发送程序:发送一个数据-----等待中断,在中断服务程序中发送下一个数据 接收程序:等待中断,在中断服务程序中接收数据 注:不管是查询还是中断,发送或接收数据后,一定要软件清 TI 或 RI 注意区分:CLR TI; CLR T1
三、实验内容
1、重复发送同一个数据,观察 TXD 端输出的波形。
P3.1 复用为串行发送端 TXD,将其接至示波器,观察输出波形。注意观察 8 位数据位前后的起始位和停止位。
例:串口设为工作方式 1,发送数据 EDH=11101101B。从低位开始发送,8 位数据、 1 位起始位(低电平)、1 位停止位(高电平)。
仿真电路如下:
汇编语言程序如下:
代码语言:javascript复制 ORG 0000H
JMP MAIN
ORG 0040H
MAIN:
MOV R0,#0EDH ;将要发送的数据1放在R0中
MOV TMOD,#20H ;将定时器T1作为波特率发生器 定时工作方式2
MOV TL1,#0EEH ;初始化定时器初值
MOV TH1,#0EEH
SETB TR1 ;允许T1定时
MOV SCON,#40H ;串口工作方式1,发送
MOV PCON,#0 ;波特率不加倍
Loop:
MOV A,R0 ;将要发送的数据送入累加器中
MOV SBUF,A ;将要发送的数据写入发送缓冲区SBUF,启动串口发送数据
L1:
JNB TI,L1 ;判断发送完申请中断标志位,循环等待数据发送完
CLR TI ;软件清除发送中断标志位,保证下一帧数据能发送
MOV TH1,#0EEH ;重装定时器初值
MOV TL1,#0EEH
SJMP Loop ;循环发送同一个数据
END
仿真结果如下:
2、自发自收。将代码段中定义的 10 个数据,通过串口发送和接收,将接收到的数据送 P1 口以 LED 灯显示,并送存内部数据存储空间 60H 开始的单元。要求:数据的发送接收,采用中断方式。
仿真电路如下:
提示如下:
- 1、P3.0 接收端 P3.1 发送端
- 2、每个数据送 LED 灯显示,要加延时程序
- 3、进入中断服务程序,要判断是发送中断,还是接收中断
汇编语言程序如下:
代码语言:javascript复制 ORG 0000H
LJMP MAIN
ORG 0023H ;串口中断入口
LJMP BREAK
ORG 0100H
MAIN:
MOV DPTR,#TAB
MOV R0,#00H ;R0控制循环次数,同时也存放偏移地址
MOV R1,#60H ;接收的内容存放在60H开始的单元中
MOV R2,#0AH ;要发送的数量
MOV R3,#0AH ;要接收的数量
MOV TMOD,#20H ;定时器工作方式2
MOV PCON,#00H ;串口波特率不加倍
MOV SCON,#50H ;串口工作方式1,允许接收;没有校验位
MOV TH1,#0EEH ;定时器T1作波特率发生器,fosc=11.0592Hz时,RB=1600pbs
MOV TL1,#0EEH
SETB TR1 ;启动定时器T1
SETB ES ;串口允许中断
SETB EA ;开中断
MOV A,R0 ;偏移地址
MOVC A,@A DPTR
MOV SBUF,A ;将待发送数据放入发送缓冲区
DEC R2
SJMP $ ;等待中断
BREAK:
JBC RI,LOOP ;判断时接收中断还是发送
CLR TI ;不是接收中断,则是发送中断引起的中断服务;清零发送中断益处标志
INC R0 ;上一帧数据发送完,偏移地址 1,发送下一帧数据
MOV A,R0 ;将偏移地址放到A中
MOVC A,@A DPTR ;查表,取出要发送的数据
MOV SBUF,A ;将待发送数据放入发送缓冲区
DJNZ R2,LOOP1 ;判断数据是否发送完毕
LOOP:
MOV A,SBUF ;读SBUF,访问接收数据寄存器
MOV @R1,A ;将接收到的数据放在60H开始的单元中
MOV P1,A ;把接收到的数据送到P1口显式
ACALL DELAY
INC R1
DJNZ R3,LOOP1
LOOP1: RETI ;中断返回
DELAY:
MOV R5,#10 ;延时子程序
D1:
MOV R7,#0FFH
D2:
MOV R6,#0A0H
DJNZ R6,$
DJNZ R7,D2
DJNZ R5,D1
RET
TAB: DB 0AAH,99H,88H,77H,66H,55H,44H,33H,22H
END
仿真结果如下:
60H单元存放数据如下:
作者:叶庭云 CSDN:https://yetingyun.blog.csdn.net/