一、功能实现
1.电脑通过串口发送数据:0F
2.点亮4个LED
二、注意事项
1.发送和接受数据的文本模式
2.串口要对应
3.注意串口的波特率要和程序中的波特率保持一致
4.有无校验位和停止位
三、如何使用串口波特率计算器
1.以本程序为例
2.生成代码如下
void Uart1_Init(void) //9600bps@11.0592MHz
{SCON = 0x50; //8位数据,可变波特率AUXR |= 0x40; //定时器时钟1T模式AUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //设置定时器模式TL1 = 0xE0; //设置定时初始值TH1 = 0xFE; //设置定时初始值ET1 = 0; //禁止定时器中断TR1 = 1; //定时器1开始计时
}
3.需要手动配置中断系统
根据原理图
配置代码
//手动配置中断系统ES=1;EA=1;PS=0;
四、如何理解软件生成的波特率
void UART_Init()
{//由软件自动生成SCON=0x50; //STC89C52操作手册P235方式1PCON &= 0x7F; //波特率不倍速TMOD &= 0x0F; //设置定时器1模式TMOD |= 0x20; //设置定时器1模式TL1 = 0xFA; //设置定时初始值TH1 = 0xFA; //设置定时重载值ET1 = 0; //禁止定时器中断TR1 = 1; //定时器1开始计时//需要手动配置中断系统ES=1;EA=1;PS=0;
}
以上述代码为例子进行分析
由于配置是8位自动重载,TL1=TH1=0xFA ,0xFA=250;
总计八位,那么数据范围0~255(256溢出)
256-250=6
那么每计6个数溢出一次
晶体振荡器的输出经12 分频后得到输入的时钟脉冲
一个机器周期内有12 个振荡周期。故其频率为晶振频率的1/12。
此设备是11.0592M 的晶振,1.085μs为一个输入脉冲的时间
则6.51μs溢出一次
1/6.51,则0.1536098MHz就是定时器的溢出率
再看PCON=0111 1111
可知SMOD=0(参考串口模式图)
那么波特率=0.1536098MHz /2 /16
波特率为0.00480030625MHz约等于4800Hz
约等于没有误差
串口模式图
五、如何计算波特率
参考STC89C52手册P235
六、串口中断函数
中断函数(函数可自由命名,但是要加上中断号"interrupt 4")
void UART_Routine(void) interrupt 4
{if (TI==1) //检测串口1发送中断{//功能......TI = 0; //清除串口1发送中断请求位}if (RI==1) //检测串口1接收中断{//功能......RI = 0; //清除串口1接收中断请求位}
}
中断函数查询表P166
七、模块化代码:
1.main.c
#include <REGX52.H>
#include "UART.h"unsigned char Sec=0;void main()
{UART_Init();while(1){}}/*** @brief 中断函数查询P166,函数命名可自由,但是要更上中断号"interrupt 4"* @param 无* @retval 无*/
void UART_Routine(void) interrupt 4
{if(RI==1){P2=~SBUF;RI=0;}
}
2.UART.c
#include <REGX52.H>/*** @brief 串口初始化//4800bps@11.0592MHz* @param 无* @retval 无*/void UART_Init()
{SCON=0x50; //STC89C52操作手册P235方式1PCON &= 0x7F; //波特率不倍速TMOD &= 0x0F; //设置定时器1模式TMOD |= 0x20; //设置定时器1模式TL1 = 0xFA; //设置定时初始值TH1 = 0xFA; //设置定时重载值ET1 = 0; //禁止定时器中断TR1 = 1; //定时器1开始计时//补上中断系统ES=1;EA=1;PS=0;
}/*** @brief 串口发送一个字节的数据* @param Byte 要发送的一个字节数据* @retval 无*/void UART_SendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0); //TI=0,数据完整发送出去,TI=1,跳出循环TI=0; //TI=0,使用软件复位}
3.UART.h
#ifndef __UART_H__
#define __UART_H__void UART_Init();void UART_SendByte(unsigned char Byte);#endif