实验七 单片机串口通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
#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中断