实验七串口通信实验【实验目的】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机与单片机的数据通讯,必须进行电平转换。
实验参考程序:一、任务11.main.c程序/************************************************************************* 程序名称:串口发送数据(晶振频率18.432MHz)功能说明: 通过串口1发送“Everything is possible!”波特率9600,数据位8,奇偶效验无,停止位1,数据流控制无************************************************************************/ #include "iap15w4k58s4.h"#include <intrins.h> // 加入此头文件后,可使用_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,即1TAUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xC4; //设定定时初值TH1 = 0xC4; //设定定时器重装值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1}/*----------------------------发送串口数据----------------------------*/void SendData(unsigned char ch){SBUF = ch; //写数据到UART数据寄存器while(TI == 0);TI = 0;}/*----------------------------发送字符串----------------------------*/void SendString(char *s){while (*s) //检测字符串结束标志{SendData(*s++); //发送当前字符}}3.uart.h程序#ifndef __UART_H_#define __UART_H_void SendData(unsigned char ch);void SendString(char *s);void UartInit(void);#endif4.delay.c程序/****************************************************************程序名称:延时函数(晶振频率18.432MHz)功能说明: 延时毫秒与微秒******************************************************************/#include "iap15w4k58s4.h" // 单片机STC15F2K60S2头文件,可以不再加入reg51.h #include <intrins.h> // 加入此头文件后,可使用_nop_库函数#include <stdio.h>void Delay1us() //@18.432MHz{unsigned char i;i = 2;while (--i);}void Delay1ms() //@18.432MHz{unsigned char i, j;i = 18;j = 235;do{while (--j);} while (--i);}void DelayMS(int t){while(t--){Delay1ms();}}void DelayUS(int t){while(t--){Delay1us();}}5.delay.c 程序#ifndef __DELAY_H_#define __DELAY_H_void DelayUS(int t);void DelayMS(int t);#endif二、任务2 扩展部分程序串口1中断控制,串口控制单片机上的三只LED灯的开启和关闭,串口1收到数据,如果数据为“turnonled1"、"turnonled2"、"turnonled3"对应LED点亮2秒后,再熄灭。
(上一工程的主程序换成如下程序)Main.c/************************程序名称:串口1中断控制测试(晶振频率18.432MHz)功能说明: 串口1收到数据,如果数据为“turnonled1"、"turnonled2"、"turnonled3"对应LED点亮2秒后,再熄灭。