目录
中断函数(函数可自由命名,但是要加上中断号"interrupt 4")
一、功能实现
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方式1
PCON &= 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方式1
PCON &= 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