当前位置:文档之家› 实验七 单片机串口通信

实验七 单片机串口通信

实验七串口通信实验【实验目的】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秒后,再熄灭。

相关主题