51单片机——串口通信详解(STC89C51为例)

目录

一、什么是通信:

1、以信件为例进行理解:

2、推广到电子通信:

3、具体到串口通信:

二、具体到单片机STC89C51与电脑沟通(方式1):

1、总体思路:

2、了解51单片机串口硬件电路:(建议有数电基础的人了解)

3、编写程序


一、什么是通信:

1、以信件为例进行理解:

       试想在古代,我们怎么依靠信件来传递信息:写信-->传信-->读信,这个是我们表面理解的步骤,如果我们看的深层一点,可以理解为:

(假设写信人想让收信人去将XX屋子的椅子移动一厘米)

       写信人将“将XX屋子的椅子移动一厘米”用双方规定好意思的象形字即汉字表示,并记录在纸张载体上——》通过鸽子或者别人骑马把纸张载体送给收信人——》收信人把信中的象形字翻译成“将XX屋子的椅子移动一厘米”,并按照指示将XX屋子的椅子移动一厘米

2、推广到电子通信:

    发送方用一种编码方式对信息进行编码——》通过一种传输介质发送编码信息——》接收方接受编码信息——》 接收方按照这一种编码方式进行解码,得到有效信息

3、具体到串口通信:

(1)发送字符帧的基本格式:(编码方式)

(a)起始位:起始位固定为0

(b)数据位:你所要发送的八位一字节数据

(c)校验位:初学时可设置为无校验位,则该位忽略不管

(d)停止位:停止位固定为1

在这里插入图片描述

(2)发送信息:通常是单片机直接一位一位发送出去,不过为了提高效率等原因,会存放在硬件电路中经过处理后再发送。

(3)传输介质:可以用蓝牙、WiFi、无线电等方式,这里使用的是用数据线和电脑直接连接进行简单测试,其他方式同理。

TXD:发送数据 Transmit(tx) Data 简写形式  

RXD:接受数据 Receive(rx) Data 简写形式  

GND:共地,以提供参考点电压

(4)接受信息:因为减轻单片机的负担,不需要每时每刻检测对方是否发送信息,通常会用到中断。

二、具体到单片机STC89C51与电脑沟通(方式1):

1.总体思路:

有以上分析可以,我们本次实验的步骤:了解51单片机串口硬件电路——》编写程序控制单片机发送信息给硬件电路,硬件电路按照字符帧格式发送信息——》通过USB转TTL模块发送给电脑(有下载功能的开发板都有)———》电脑收到后,我们通过串口调试助手(网上现成的软件)将收到的二进制信息转换成十进制数、字母等或者16进制数

2、了解51单片机串口硬件电路:(建议有数电基础的人了解)

 ​​​​​​

 1、接收信息:当软件将允许接收标志位置1后,当RXD逐位收到发送10位字符帧并经过一系列处理后,RI会被硬件置1,将接下来的八位数据位存放入SBUF寄存器中,如果串口中断有开启,那么单片机就会进入中断执行中断服务函数中的内容。

2、发送信息:当单片机执行一段写SBUF命令时,发送硬件电路会将写入的八位数据位转换成完整的十位字符帧,最后由TXD口逐位发送出去。

4、由于我们使用的是异步通信,所以单片机内部也要通过内置的时钟,产生脉冲信号确定接收或发送的频率,而且该频率要与电脑的一致。

5、定时器1为串口通信提供脉冲信号:TH1,TL1确定时钟脉冲频率,具体查定时器的配置;SMOD确定产生的脉冲信号是否需要分频即降低接收的频率

6、接收和发送SBUF共用一个地址码

7、TI=1或RI=1时中断都会发生,但是我们通常只在接收时才使用中断

 3、波特率的计算:

  (1)波特率:串口通信每秒能发送或接收多少位,也就是上面第五点指的频率

  (2)为什么要计算波特率:其实就像高铁运输乘客一样,无论是乘客还是司机都要在相同的时间到达才能完成运输,而由于我们使用的是异步通信,没有使用时钟线,我们就要在接收和发送双方都规定好一个特定的频率,防止错过信息

  (3)计算方法:由上面的第五点可和由下面的电源控制寄存器PCON可知51单片机串口收发频率由TH1、TL1和SMOD位决定,所以我们要找到TH1,TL1,SMOD与波特率之间的关系:

计算过程较为复杂,初学者可使用该工具

(8条消息) 51单片机波特率计算器-单片机文档类资源-CSDN文库https://download.csdn.net/download/powern8520/405367?ops_request_misc=&request_id=&biz_id=103&utm_term=51%E6%B3%A2%E7%89%B9%E7%8E%87%E8%AE%A1%E7%AE%97%20%E5%85%8D%E8%B4%B9&utm_medium=distribute.pc_search_result.none-task-download-2~download~sobaiduweb~default-2-405367.pc_v2_rank_dl_default&spm=1018.2226.3001.4451.3

4、编写程序:

 (1)需要配置的寄存器:

        (a)串口控制寄存器SCON(可位寻址——即直接操作某一位,如SM0=1)

SM0,SM1:工作方式选择位,具体看手册,这里我们选择方式1,令SM0=0,SM1=1

REN:允许串口接收位,令REN=1;

TI,RI:接收,发送标志位,在接收或者发送会由硬件置1,为了停止中断,要注意软件将TI、RI置0。

SM2,TB8,RB8:我们在这里没有用到

        (b)电源控制寄存器PCON(不可位寻址)

  1. SMOD:波特率选择位,SMOD=1时,波特率加倍
  2. 其他位没有用到全部置0,令PCON=0x80

         (c)中断允许寄存器IE(可位寻址)

  1. EA:CPU的总中断允许位,令EA=1
  2. ES:串口中断允许位,令ES=1

(2)STC89C51参考代码:

                实现功能:接收电脑发来的信息后,再发送给回给电脑 

#include <reg52.h>
#define u8 unsigned char 
#define u16 unsigned int 	
u8  table[]="I get ";
u8 a,flag;
void Tim1_Init();
void Serial_Init();
void Serial_Interrupt_Init();
void delay(u16 time_out)
{
	while(time_out--);
}
void main()
{

	u8 i;
	Tim1_Init();
	Serial_Init();
	Serial_Interrupt_Init();	
	while(1)
	{
		if(flag==1)
		{
			//发送字符串
			for(i=0;i<6;i++)
			{
				SBUF=table[i];
				//等待发送发送完成
				while(!TI);
				//清除标志位
				TI=0;
			}
			//发送接收到字符
			SBUF=a;
			while(!TI);
			TI=0;
			flag=0;
		}
	 delay(1000);
	}
}
//定时器初始化,为串口提供时钟脉冲
void Tim1_Init()
{
	TMOD=0x20;
	//设置SMOD=1,波特率加倍
	PCON=0X80;			
	//波特率为9600 STC89C51 11.052MHZ
	TH1=0xfA;
	TL1=TH1;
	//启动定时器1
	TR1=1;
}
//串口初始化
void Serial_Init()
{
  //方式1
	SM0=0;
	SM1=1;
	//启动串口接收数据
	REN=1;
}
//打开中断
void Serial_Interrupt_Init()
{
	//打开串口中断
	ES=1;
	//打开总中断
	EA=1;
}
//中断服务函数,串口中断后会自动跳到这里
void Serial_Interrupt() interrupt 4
{
	//清除标志位
	RI=0;
	//将接收到的数据位记录到a中
	a=SBUF;
	flag=1;
}

(3) 串口调试助手的使用:

(a)下载:        

(7条消息) 串口调试工具XCOMV2.0_xcomv2.0-C++工具类资源-CSDN文库https://download.csdn.net/download/xiajhua/10147635?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167171191716782425640209%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167171191716782425640209&biz_id=1&utm_medium=distribute.pc_search_result.none-task-download-2~download~sobaiduend~default-1-10147635-null-null.pc_v2_rank_dl_default&utm_term=XCOM%20V2.0&spm=1018.2226.3001.4451.2

(b)步骤:选择相应的串口——》选择相应的波特率——》打开串口——》发送信息

——》——》

——》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值