51单片机串口的使用

一般在调试上串口使用较多,也作为数据收发使用

串行接口(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文库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值