串口通信
1.单片机向电脑发送数据
利用STC-ISP中的波特率计算器来初始化串口,AUXR在STC89C52RC中没有,可以删除这两行代码。
其中波特率发生器,定时器时钟一定要选择方框中的选项,波特率4800表示发送的速率。然后将初始化代码模块化。
初始化代码如下
/**
* @brief 串口初始化,4800bps@11.0592MHz
* @param 无
* @retval 无
*/
void UART_Init()
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFA; //设置定时初始值
TH1 = 0xFA; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}
利用STC-ISP中的波特率计算器来初始化串口,AUXR在STC89C52RC中没有,可以删除这两行代码。
其中波特率发生器,定时器时钟一定要选择方框中的选项,波特率4800表示发送的速率。然后将初始化代码模块化。
发送数据函数
void UART_SendToCom(char Byte)
{
SBUF=Byte; //发送数据
while(TI==0); //等待发送结束
TI=0; //TI复位
}
SBUF就是要发送的8位比特。赋值后自动发送。
main函数,每一秒向电脑发送一个自增的数字(16进制)
#include <REGX52.H>
#include "UART.h"
void Delay(int num) //@12.000MHz,延迟1ms
{
unsigned char i, j;
while(num--){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void main(){
int sec=0;
UART_Init(); //串口初始化
while(1)
{
UART_SendToCom(sec);
sec++;
Delay(1000);
}
}
打开串口助手页面,查看收到来自单片机发送的数据
这个串口默认关闭,要打开后才能收到数据。
2.电脑通过串口控制LED
main函数
#include <REGX52.H>
#include "UART.h"
void main(){
UART_Init(); //串口初始化
while(1)
{
}
}
void UART_0() interrupt 4
{
if(RI==1){
P2=~SBUF;
UART_SendToCom(SBUF);
}
RI=0;
}
UART.c函数,加了2个打开串口中断的代码
#include <REGX52.H>
/**
* @brief 串口初始化,4800bps@11.0592MHz
* @param 无
* @retval 无
*/
void UART_Init()
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFA; //设置定时初始值
TH1 = 0xFA; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
EA=1; //打开串口中断
ES=1;
}
/**
* @brief 发送数据
* @param 要发送的一个字节数据
* @retval 无
*/
void UART_SendToCom(char Byte)
{
SBUF=Byte; //发送数据
while(TI==0); //等待发送结束
TI=0; //TI复位
}
在串口助手页面,向单片机发送0xfe数据,LED灯如下