51单片机的串口部分

串口的概念

1.什么是串口

含义:串口通信 //串行通信接口或串口通讯接口
作用:有线通信
分类:RS232 TTL RS485
特点:

  1. 数据一位一位地按顺序传送
  2. 通信线路简单,只要一对(两根)传输线就可以通信
  3. 双向通信
  4. 速度较慢

2.串口通信原理

二进制的方式进行传输
PC拉低电平拉高电平传输给C51
A = 10进制10
B 11
一个16进制数用4个二进制数位表示
8 4 2 1

1 0 0 0
1 0 1 0
1 0 1 1
0xAB
1010 1011
8+0+2+0 = 10
8+0+2+1 = 11

数据8如何从PC传到C51单片机
0000 1000

3.串口通信协议

16进制的A:00001010
字符的‘A’:65->0x41->01000001

协议:怎么传这8位

讲话:

  1. 语言:中文,英文//数据格式
  2. 语速:快/慢//波特率

数据格式(一帧数据的格式)

  1. 数据位(8位)00001010
  2. 起始位
  3. 停止位
  4. 奇偶校验位

波特率

4.串口编程

芯片手册
看芯片手册,配置通信协议的参数
SHIFT脉冲
原理图

  1. SCON(算出数据位)
B7 B6 B5 B4 B3 B2 B1 B0
0 1 x 1 x x 当数据发完(往外)时,TI(硬件)变为1 当数据收完时,RI变为1

如何配置:
SCON:01010000

SCON=0X50//配置串口工作的方式一:8位数据位,1位停止位
//波特率,定时器1做波特率发生器 TH1 = 0XFD

TI代表发送结束,被硬件置1
SBUF数据缓存,发送接受都往该寄存器放数据
SCON=0X1<<6;SCON = 0X1<<4;

  1. PCON:加倍 帧错误
  2. SBUF:数据缓存
    0XA:00001010

char SBUF = 8位
char data;
if(RI == 1)
data = SBUF

5.串口波特率如何计算

定时器1的工作模式怎么配
模式1
PCON:SMOD = 0(复位为0)
SYSclk(11059200)
2^SMOD/32 *(SYSclk/12/(256-TH1))=9600

6.单片机发送数据给电脑

#include 
void delay()
{
int i;
for(i=0; i<10000; i++);
}

void initUart()
{
SCON = 0x50;//串口工作方式1:8位数据位,无奇偶校验位,一位停止位
//波特率9600
TMOD = 0x20;//定时器1的工作方式
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
}

   int main()
{
		initUart();
		while(1)
		{
		delay();
		SBUF = 0xA;//往sbuf放数据,硬件就开始发送工作
		while(TI == 0);//什么事情都不干,如果等于0,代表没法送完毕,等到TI等于1,才退出循环,进入下一次的发送
		TI = 0;//软件编程让TI==0,当发送完毕后会被硬件拉高。
		}
		return 0;
}

注意波特率是9600的哦!

将发送的字符封装为一个函数

#include 
void delay()
{
int i;
for(i=0; i<10000; i++);
}

void initUart()
{
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
}


void sendByte(char c)
{
SBUF = c;
while(TI == 0);
TI = 0;
}
   int main()
{
		initUart();
		while(1)
		{
		delay();
		sendByte(0xA);
		}
		return 0;
}

如何发送一串字符

#include 
void delay()
{
int i;
for(i=0; i<10000; i++);
}

void initUart()
{
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
}


void sendByte(char c)
{
SBUF = c;
while(TI == 0);
TI = 0;
}

void sendString(char *str)
{
while(*str != '\0')
{
sendByte(*str);
str++;
}
}
   int main()
{
		initUart();
		while(1)
		{
		delay();
		sendString("Hello From C51\r\n");
		}
		return 0;
}

7.电脑发送数据控制单片机

void sendByte(char c)
{
SBUF = c;
while(TI == 0);
TI = 0;
}

void sendString(char *str)
{
while(*str != '\0')
{
sendByte(*str);
str++;
}
}
int main()
{
		int cmd = 0;
		initUart();
		while(1)
		{
		if(RI == 1)//RI为1,代表收到数据了
		{
		RI = 0;//软件制令
		cmd = SBUF;//读取PC发来的数据并保存在cmd中
		if(cmd == 1)
		{
		sendString("11111 Hello From C51\r\n");
		}
		else if(cmd == 2)
		{
		sendString("22222 Hello From C51\r\n");
		}
		}
		}
		return 0;
}

你可能感兴趣的:(51单片机的串口部分)