资源描述
安徽文达信息工程学院学生实验报告
学年第 学期 课程名称《 单片机原理与应用 》 实验日期:
院部
班级
姓名
学号
实验项目名称:
实验九 串行口通信实验
指导老师:
实验类型:
编程仿真
成绩:
一、【实验目的】
1. 掌握MCS-51单片机的串行口工作原理。
2.学习编程实现MCS-51的UART通讯。
3.掌握CPU利用串口通讯的方法
二、【实验原理及内容】
(一) 串行口控制寄存器
与串行通信有关的控制寄存器主要是串行通信控制寄存器SCON。SCON是8051的一个可以位寻址的专用寄存器,用于串行数据通信的控制。SCON的单元地址98H,位地址9FH—98H。寄存器内容及位地址表示如下:
电源控制寄存器PCON中SMOD位可影响串行口的波特率。SMOD是串行口波特率倍增位,当SMOD=1时,串行口波特率加倍。系统复位默认为SMOD=0。实验中我们一般了不设置电源控制寄存器。
PCON
(二) 四种工作方式
1.串行工作方式0
串行口为同步移位寄存器方式,波特率固定为f晶振/12。该方式主要用
于I/O口扩展等,方式0传送数据时,串行数据由RXD(P3.0)端输入或输出,而TXD(P3.1)此时仅作为同步移位脉冲发生器发出移位脉冲。
2.串行工作方式1
(1) 方式1传送的数据格式
方式1传送一帧为10位的串行数据,包括1位起始位,8位数据位和1位停止位。
数据发送由一条写入单片机发送寄存器SBUF指令启动。8位数据在串行口由硬件自动加入起始位和停止位组成完整的帧格式。在内部移位脉冲作用下,由TXD端串行输出。发送完一帧数据后,使TXD输出端维持”1”状态并置使TI标志位置1以通知CPU发送下一个字符。
接收数据由接收单片机SCON中的REN置1开始,随后串行口不断采样RXD端电平,当采样到RXD端电平从1向0跳变时,就认定是接收信号并开始接收从RXD端输入的数据,并送入内部接收寄存器SBUF中,直到停止位到来之后,并使RI位置1,通知CPU从SBUF中取走接收到的一帧字符。
方式1传送数据时发送前应先清TI,接收前应先清RI。
3.串行工作方式2
方式2是11位为一帧的串行通信方式,即1位始位,9位数据位和1位停止位。其中第9位数据既可作奇偶校验位,也可作控制位使用。其帧格式为:
4.串行工作方式3
方式3通信过程与方式2完全相同。区别仅在于方式3的波特率可通过设置定时的工作方式和初值来设定(与串行工作方式1波特率设定方法相同)。顺便指出,由于方式1和方式3的波特率设置较为灵活,在单片机串行通信中得到广泛应用。
三、【实验器材】
PC机、Proteus仿真软件、Keil c51仿真软件
四、【实验步骤】
1、基础实验:
如下图,控制8个发光二极管流水点亮。图中74LS164的8脚(CLK端)为同步脉冲输入端,9脚为控制端,9脚电平由单片机的P1.0控制,当9脚为0时,允许串行数据由RXD端(P3.0)向74LS164的串行数据输入端A和B(1脚和2脚)输入,但是74LS164的8位并行输出端关闭;当9脚为1时,A和B输入端关闭,但是允许74LS164中的8位数据并行输出。当串行口将8位串行数据发送完毕后,申请中断,在中断服务程序中,单片机向通过串行口输出下一个8位数据。
2扩展实验
串口外接一片8位并行输入、串行输出同步移位寄存器74LS165,扩展一个8位并行输入口的电路,可将接在74LS165的8个开关S0~S7的状态通过串行口的方式0读入到单片机内。
五、【实验过程原始记录】(可附页)
基础实验:
4 / 4
#include <reg51.h>
#include <stdio.h>
sbit P1_0=0x90;
unsigned char nSendByte;
void delay(unsigned int i)
{
unsigned char j;
for(;i>0;i--)
for(j=0;j<125;j++);
}
main( )
{
SCON = 0x00;
EA=1; ES=1;
nSendByte=1;
SBUF=nSendByte;
P1_0=0;
while(1)
{;}
}
void Serial_Port( ) interrupt 4 using 0
{
if(TI)
{
P1_0=1;
SBUF=nSendByte;
delay(500);
P1_0=0;
nSendByte=nSendByte<<1;
if(nSendByte==0)
nSendByte=1;
SBUF=nSendByte;
}
TI=0;RI=0;
}
扩展实验:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit shft=P1^1;
void delay(){
uint j;
for(j=0;j<32000;j++);
}
void main(){
while(1){
shft=0;
shft=1;
SCON=0x10;
while(!RI);
P2=SBUF;
RI=0;
delay();
}
}
六、【实验结果分析】
实验结果符合预期。本次试验巩固了课堂上所学的串行口通信的知识(SCON和PCON各位的作用及串行口四种工作方式的原理及区别),同时复习了前面学习的中断系统的程序的编写、keil C51的使用,收获颇丰。
教师评语:
展开阅读全文