实验3 STC单片机串口通信实验-V20170317 下载本文

3.3 在晶振为11.0592MHz的基础上串口参数设置举例

我们以波特率:9600,数据位:8,校验位:N(无),停止位:1, 一般情况下我们使用的串口参数的默认值是9600-8-N-1。

波特率的计算公式如下: BAUD=fosc/16/BRT;

注意:1.波特率定义为每秒位传输的速率(bps), 波特率:BAUD(bps),fosc:系统时钟频率,BRT的数值(0---255)。

本项目电路中的晶振取11.0592MHz,fosc=11059200; 本项目以波特率9600为例子,则BAUD = 9600;

则当我们采用异步正常模式时BRT =256—(fosc / BAUD / 16)=256—72=184=0xB8 则我们要设置的参数可以如下表示: PCON |= 0x80; //SMD=1 串行通讯的波特率加倍 P265 SCON = 0x50; //当SM0/FE=0 SM1=1时组成工作方式1(8位UART, //波特率可变) AUXR |= 0x01; //S1BRS=1 使用独立波特率发生器作为串行口的波 //特率发生器 AUXR |= 0x04; //BRTx12=1波特率发生器每一个时钟计数一次 //把根据波特率计算的 定时器的溢出值,装//入波特率发生器

BRT = 256 - MAIN_Fosc / 16 / Baudrate0 ; //MAIN_Fosc=11.0592MHZ Baudrate0=9600 BRT =0xB8; AUXR |= 0x10; //BRTR=1 开启独立波特率发生器运行 ES = 1; //IE寄存器的ES位为1 串口1中断 EA = 1; //IE寄存器的EA位为1 CPU开总中断

4.实验步骤

4.1 编写实验源代码文件

4.1.1 打开Keil集成开发环境,打开配套光盘\\源代码\\单片机原理与技术\\实验3 STC单片机串口通信实验-V20170317下的工程文件,编译源码,生成UART.hex可执行文件,该可执行文件自动保存在配套光盘\\源代码\\单片机原理与技术\\实验3 STC单片机串口通信实验-V20170317\\out\\UART目录下。(注意:请根据该目录下UART.hex文件的生成时间,判断该文件是否是自己刚刚编译完成的。)

4.1.2 将12号节点的开关S1拨打到左边让STC单片机与DB9相连。

4.1.3 根据配套光盘\\第三方应用软件\\STC_ISP\\STC-ISP软件使用说明书,使用STC-ISP软件将4.1.1步中生成的可执行UART.hex文件通过STC_ISP串口下载软件,下载到12号节点的STC单片机中。

4.2 实验源代码解析

UART.c源代码 /************************************************************** * 晶振频率 :选取用RC 11.0592MHz * 文件名 :UART.c * 功能说明 :STC12C5A16S2单片机的串口通信演示实验 * 制作 :www.frotech.com * 技术支持 :020-22883196 QQ :1329958919

* 变更记录 :2013.04.27 * 变更内容 :新建造 *************************************************************/ #include #define BUF_LENTH 128 //定义串口接收缓冲长度 unsigned char uart1_wr; //写计数器 unsigned char uart1_rd; //读计数器 unsigned char xdata RX0_Buffer[BUF_LENTH]; //接收缓冲 unsigned char flag; //定义串口是否有接收到数据的标志位 unsigned char i; //普通的循环变量 bit B_TI; //定义B_TI为bit类型 void uart1_init(void); //串口初始化函数声明 void Uart1_TxByte(unsigned char dat); //串口发送单个字符函数声明 void Uart1_String(unsigned char code *puts); //串口发送字符串函数//函数声明 void delay_ms(unsigned char ms); //延时函数声明 #define MAIN_Fosc 11059200UL //定义外部晶振的频率 #define Baudrate0 9600UL //定义串口波特率频率 #define BRT_Reload (256 - MAIN_Fosc / 16 / Baudrate0) //装入定时器1工作在1倍模式下的益出数 /************************************************************* * 函数名:main( void ) * 输入:无 * 输出:无 * 功能描述:串口初始化参数为9600 8 N 1. 程序一开始执行输出\,然后将 串口接收到的数据原样返回 *********************************************************/ void main(void) { uart1_init(); //调用串口初始化函数 Uart1_String(\一开始就输出\ while(1) { if(flag == 1) //是否有串口中断 { for(i = 0; i < uart1_wr; i++) { Uart1_TxByte(RX0_Buffer[i]);//将接收到的字符串原样输出 } uart1_wr = 0; //将写指针清0

flag = 0; //将标志位清0 } } } /************************************************************* * 函数名:uart1_init(void) * 输入:无 * 输出:无 * 功能描述:串口初始化参数为9600 8 N 1. *************************************************************/ void uart1_init(void) { PCON |= 0x80; //SMD=1 串行通讯的波特率加倍 P265 SCON = 0x50; //当SM0/FE=0 SM1=1时组成工作方式1 //(8位UART,波特率可变) P264 AUXR |= 0x01; //S1BRS=1 使用独立波特率发生器作为串行 //口的波特率发生器 P266 AUXR |= 0x04; //BRTx12=1 波特率发生器每一个时钟计数一次 BRT = BRT_Reload; //把根据波特率计算的 定时器的值, //装入波特率发生器 P267 AUXR |= 0x10; //BRTR=1 开启独立波特率发生器运行P266 ES = 1; //IE寄存器的ES位为1 串口1中断开 P192 EA = 1; //IE寄存器的EA位为1 CPU开中断 } /************************************************************* * 函数名:Uart1_TxByte(unsigned char dat) * 输入:发送字符 * 输出:无 * 功能描述:将单个字符通过串口发送. ************************************************************/ void Uart1_TxByte(unsigned char dat) { B_TI = 0; //将B_TI置0 SBUF = dat; //将发送的数据写入SBUF缓冲器中 while(!B_TI); //等待发送 缓冲器发送完数据 B_TI = 0; //将B_TI置位0 } /************************************************************* * 函数名:Uart1_String(unsigned char code *puts) * 输入:发送字符串 * 输出:无 * 功能描述:将字符串通过调用单个字符函数发送.

*************************************************************/ void Uart1_String(unsigned char code *puts) { for(; *puts != 0; puts++) { Uart1_TxByte(*puts); //以指针的形式将字符串分解为单个 //字符,调用上面的单个字符发送函数发送 } } /************************************************************* * 函数名:UART1_RCV (void) * 输入:无 * 输出:无 * 功能描述:定义串口的中断处理函数,串口中断号为4. 当串口接受完或者发送完一帧数据时产生中断,告知CPU进行中断处理 ************************************************************/ void UART1_RCV (void) interrupt 4 //中断接收函数 中断号为4 //P188 { if(RI) //判断接收的数据是否接收完,当接收到第 //8位时 接收结束 RI会置1 P265 { RI = 0; //接收中断使能位清0 RX0_Buffer[uart1_wr++] = SBUF; //将串口缓冲器SBUF的数据//放到数据接收缓冲器RX0_Buffer[]中 flag = 1; //将标志位置1方便主函数判断 } if(TI) //判断发送的数据是否发送完,当发送 //到第8位时 发送结束 TI会置1 P265 { TI = 0; //将发送结束标志位 TI清0 B_TI = 1; //将B_TI 置1 方便上面的Uart1_TxByte 函数判断 } } /************************************************************* * 函数名:delay_ms(unsigned char ms) * 输入:延时时间 * 输出:无 * 功能描述:产生毫秒级别延时. ************************************************************/ void delay_ms(unsigned char ms) { unsigned int i;