菜鸟单片机随写(51单片机串口通信)

USART这个东西在很多的数据手册上你都能看到,UART,SPI,IIC,USB,CAN什么乱七八糟的通信,你就知道这东西相当犀利了吧,串口通信,有数据格式,数据的传输速率,目前单片机中很多都有UART,尤其是我们大学学的51,那个实在网络上到处都泛滥了。所以我想了想我也泛滥一下,不然以后都忘了,哈哈。

51串口通信比较的简单,设置好传输模式:模式1

设置好波特率,定时器T1工作方式二的自动重载模式为uart提供时钟。

再看看中断的标志位,那么一切就OK了,额还要看看你用的时钟源频率是多少。所以当你学了UART你就会晓得为啥子单片机弄一个怪怪的11.0592M或者某些单片机是22.1184M

这个就是为了要产生准确的波特率。

还有一个重要的就是SBUF这个东西,寻址都是同一个地址,但是都是独立的单片机,也就是说,你每次用的时候写 eg:SBUF = x;这个是TX的SBUF,

x=SBUF这个就是RX的SBUF

简单吧,还有需要注意的就是注意缓冲区溢出问题。有些可以装几个字节,而且有些单片机溢出的话就死机,千万要注意,一定要仔细看数据手册上详细说明。

下面就贴一个简单的事例程序,51单片机的资源基本上就被玩完了,哈哈。

 

#include <reg52.h>
#include <stdio.h>
#define  OSC 	12

typedef unsigned int uint16;
typedef unsigned char uint8;
void uart_init(void);

void main(void)
{
	  uart_init();
	  printf("*******************Welcome to MCU world !******************\n");
	  printf("####let's begin!\n");
	  while(1)
	  {
	  	  printf(">");
		  if(getchar() == 'c')
		  {
		  	  puts("");
			  printf("yeah !You input a char !\n");
			  printf(__TIME__);
		  }
	      puts("");
	  }
	  
}

void uart_init()
{
	SCON = 0x50;
	TMOD |=0x20;
	#if (OSC == 12)
	TH1 = 0XFD;
	TL1 = 0xFD;
	#endif
	EA = 1,ES = 1,TR1 = 1;
	TI = 1;//要用stdio 库中的函数必须设置为TI=1
}


#include <reg51.h>
#include <stdio.h>
typedef unsigned int uint16_t;
typedef unsigned char uint8_t;
#define OSC ((unsigned long)11.0592e6)
#define Baud 9600

void UartInit(void);

void main(void)
{
	UartInit();
	printf("Uart");
	while(1);	
}

void UartInit(void)
{
	SCON = 0x50;
	TMOD = 0x20;
	TH1 = TL1 = 256-(unsigned int)(OSC/12/32/Baud);
	TR1 = 1;
	TI = 1; // printf 首先判断就是TI 是不是为一 不然就一直卡在那里 如果是先送数据到SBUF就不会出错。
}




反汇编 已经看出来  是while(!TI);TI=0;SBUG = var; 先判断然后清除标志位,然后再往BUFFER里送数据。TI是串口的标志位 是标志SBUF发完没有,如果串口中的数据没有发送完TI就不会硬件置位,所以 一般写轮询串口的时候都必须等待标志位 然后清除送数据!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值