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就不会硬件置位,所以 一般写轮询串口的时候都必须等待标志位 然后清除送数据!