关闭

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

857人阅读 评论(0) 收藏 举报

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

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8889次
    • 积分:236
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类