一般在调试上串口使用较多,也作为数据收发使用
串行接口(Serial port),也称串行接口或串行端口,串行通信接口,COM接口,简称串口。主要用于串行式逐位数据传输。常见的有一般电脑应用的RS-232(使用 25 针或 9 针连接器)和工业电脑应用的半双工RS-485与全双工RS-422。
查看芯片手册
这里笔者采用的是P30和P31
使用独立波特率发生器
主函数如下
#include <STC12C5A60S2.H>
#include "public.h"
#include "uart.h"
sbit led1=P1^0;
uchar rx_buffer[100];
uchar tx_buffer[100];
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器时钟1T模式
BRT = 0xDC; //设置定时重载值
AUXR |= 0x01; //串口1使用独立波特率发射器为波特率发生器
AUXR |= 0x10; //启动独立波特率发射器
}
void main()
{
UartInit();
EA=1;
ES=1;
while(1)
{
UART_SendString("hello world\r\n");
delay(200);
}
}
void Uart_Isr() interrupt 4
{
if (RI==1)
{
led1=~led1;
RI=0;
}
}
其中包含两个头文件
public.h内容为
#ifndef _PUBLIC_H
#define _PUBLIC_H
#include <STC12C5A60S2.H>
#include "intrins.h"
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
void delay(uint c);
#endif
uart.h
#ifndef UART_H
#define UART_H
#include "public.h"
void UART_SendByte(uchar byte);
void UART_SendString(uchar* str);
#endif
与uart.h相关联的uart.c如下
#include "uart.h"
void UART_SendByte(uchar byte)
{
SBUF=byte;
while(TI==0);
TI=0;
}
void UART_SendString(uchar* str)
{
while(*str)
{
UART_SendByte(*str++);
}
}
使用定时器1作为波特率发生器
main.c如下
#include <STC12C5A60S2.H>
#include "public.h"
#include "uart.h"
sbit led1=P1^0;
uchar rx_buffer[100];
uchar tx_buffer[100];
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xDC; //设置定时初始值
TH1 = 0xDC; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}
void main()
{
UartInit();
EA=1;
ES=1;
while(1)
{
UART_SendString("hello world\r\n");
delay(200);
}
}
void Uart_Isr() interrupt 4
{
if (RI==1)
{
led1=~led1;
RI=0;
}
}
二者效果均为
如果点击发送,开发板上P10的 电平 将发生翻转
关于串口重定向
#include "uart.h"
void UART_SendByte(uchar byte)
{
SBUF=byte;
while(TI==0);
TI=0;
}
void UART_SendString(uchar* str)
{
while(*str)
{
UART_SendByte(*str++);
}
}
//void UartInit(void) //9600bps@11.0592MHz
//{
// PCON &= 0x7F; //波特率不倍速
// SCON = 0x50; //8位数据,可变波特率
// AUXR |= 0x04; //定时器时钟1T模式
// BRT = 0xDC; //设置定时重载值
// AUXR |= 0x01; //串口1使用独立波特率发射器为波特率发生器
// AUXR |= 0x10; //启动独立波特率发射器
//}
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xDC; //设置定时初始值
TH1 = 0xDC; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}
/串口重定向代码///
char putchar(char c){
UART_SendByte(c);
return c;
}
完整工程文件资料:(129条消息) 单片机串口通信keil工程文件资源-CSDN文库