实验七 单片机串口通信

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验七串口通信实验

【实验目的】

1、理解单片机串行口的工作原理;

2、学习使用单片机的TXD、RXD口;

3、学习PC机的串口通讯原理。

【实验内容】

任务:

1.单片机与电脑串口通讯,将单片机与电脑相连,借助串口调试助手,单片机发送“Everything is possible ^_^”。

2.串口调试助手中输入“turnonled1”、“turnonled2”、“turnonled3”中一个,相应的led点亮,单片机再发送“Turn on LED1 has been executed!”消息提示输入下一个需要点亮的灯。通讯波特率:9600bps,信息格式:无校验位+8个数据位+1个停止位,传送方式,单片机采用中断方式接收信息。

原理:

SM0、SM1:由软件置位或清零,用于选择串行口四种工作方式。

SM2:多机通信控制位。在方式2和方式3中,如SM2=1,则接收到的第9位数据(RB8)为0时不启动接收中断标志RI(即RI=0),并且将接收到的前8位数据丢弃;RB8为1时,才将接收到的前8位数据送入SBUF,并置位RI,产生中断请求。当SM2=0时,则不论第9位数据为0或1,都将前8位数据装入SBUF 中,并产生中断请求。在方式0时,SM2必须为0。

REN:允许串行接收控制位。若REN=0,则禁止接收;REN=1,则允许接收,该位由软件置位或复位。

TB8:发送数据D8位。在方式2和方式3时,TB8为所要发送的第9位数据。在多机通信中,以TB8位的状态表示主机发送的是地址还是数据:TB8=0为数据,TB8=1为地址;也可用作数据的奇偶校验位。该位由软件置位或复位。

RB8:接收数据D8位。在方式2和方式3时,接收到的第9位数据,可作为奇偶校验位或地址帧或数据帧的标志。方式1时,若SM2=0,则RB8是接收到的停止位。在方式0时,不使用RB8位。

TI:发送中断标志位。在方式0时,当发送数据第8位结束后,或在其它方式发送停止位后,由内部硬件使TI置位,向CPU请求中断。CPU在响应中断后,必须用软件清零。此外,TI也可供查询使用。

RI:接收中断标志位。在方式0时,当接收数据的第8位结束后,或在其它方式接收到停止位的中间由内部硬件使RI置位,向CPU请求中断。同样,在CPU 响应中断后,也必须用软件清零。RI也可供查询使用。

倍。其余各位与串行口无关。

波特率设置:

串行口的4种工作方式对应着三种波特率模式。

对于方式0,波特率是固定的,为fosc/12。

对于方式2,波特率由振荡频率fosc和SMOD(PCON.7)所决定。其对应公式为

波特率=2SMOD×fosc/64。当SMOD=0时,波特率为fosc/64;当SMOD=1时,波特率为fosc/32。

对于方式1和方式3,波特率由定时器/计数器T1的溢出率和SMOD决定,即由下式确定:

波特率=2SMOD×定时器/计数器T1溢出率/32

鉴于8051单片机输入、输出电平均为TTL/CMOS电平,而计算机配置的是RS232标准串行接口,使用的是RS232标准电平(逻辑0:+3V~+15V,逻辑1:约-3V~-15V),二者的电气规范不一致,因此要完成PC机与单片机的数据通讯,必须进行电平转换。

实验参考程序:

一、任务1

1.main.c程序

/************************************************************************* 程序名称:串口发送数据(晶振频率18.432MHz)

功能说明: 通过串口1发送“Everything is possible!”

波特率9600,数据位8,奇偶效验无,停止位1,数据流控制无************************************************************************/ #include "iap15w4k58s4.h"

#include // 加入此头文件后,可使用_nop_库函数

#include "delay.h" // 延时函数头文件

#include "uart.h" // 串行通信函数头文件

//======================================================================== // 函数: void SYS_Init(void)

// 描述: 单片机端口初始化

//======================================================================== void SYS_Init()

{

P0M0=0x20;

P0M1=0x20;

P1M0=0x3C;

P1M1=0x3C;

P2M0=0x00;

P2M1=0x00;

P3M0=0x00;

P3M1=0x00;

P4M0=0x00;

P4M1=0x00;

P5M0=0x00;

P5M1=0x00;

}

//======================================================================== // 函数: void main(void)

// 描述: 主函数

//======================================================================== void main() // 主函数

{

SYS_Init();

DelayMS(100);

UartInit(); // 初始化串口

DelayUS(100);

while (1) // 主循环

{

DelayMS(2000);

// 延时2秒

SendString("Everything is possible ^_^\r\n"); // 发送字符串 }

}

2. uart.c程序

/************************************************************************* 程序名称:串口1通讯函数(晶振频率18.432MHz)

功能说明: 串口1初始化,字符发送与字符串发送函数,波特率9600bps

**********************************************************************/ #include "iap15w4k58s4.h"

#include "intrins.h"

void SendData(unsigned char ch);

void SendString(char *s);

void UartInit(void);

/*----------------------------

串口初始化

----------------------------*/

void UartInit(void) //9600bps@18.432MHz

{

PCON &= 0x7F; //波特率不倍速

SCON = 0x50; //8位数据,可变波特率

AUXR |= 0x40; //定时器1时钟为Fosc,即1T

AUXR &= 0xFE; //串口1选择定时器1为波特率发生器

TMOD &= 0x0F; //清除定时器1模式位

TMOD |= 0x20; //设定定时器1为8位自动重装方式

TL1 = 0xC4; //设定定时初值

TH1 = 0xC4; //设定定时器重装值

ET1 = 0; //禁止定时器1中断

相关文档
最新文档