目录
一、什么是通信:
1、以信件为例进行理解:
2、推广到电子通信:
3、具体到串口通信:
二、具体到单片机STC89C51与电脑沟通(方式1):
1、总体思路:
2、了解51单片机串口硬件电路:(建议有数电基础的人了解)
3、编写程序:
试想在古代,我们怎么依靠信件来传递信息:写信-->传信-->读信,这个是我们表面理解的步骤,如果我们看的深层一点,可以理解为:
(假设写信人想让收信人去将XX屋子的椅子移动一厘米)
写信人将“将XX屋子的椅子移动一厘米”用双方规定好意思的象形字即汉字表示,并记录在纸张载体上——》通过鸽子或者别人骑马把纸张载体送给收信人——》收信人把信中的象形字翻译成“将XX屋子的椅子移动一厘米”,并按照指示将XX屋子的椅子移动一厘米
发送方用一种编码方式对信息进行编码——》通过一种传输介质发送编码信息——》接收方接受编码信息——》 接收方按照这一种编码方式进行解码,得到有效信息
(1)发送字符帧的基本格式:(编码方式)
(a)起始位:起始位固定为0
(b)数据位:你所要发送的八位一字节数据
(c)校验位:初学时可设置为无校验位,则该位忽略不管
(d)停止位:停止位固定为1
(2)发送信息:通常是单片机直接一位一位发送出去,不过为了提高效率等原因,会存放在硬件电路中经过处理后再发送。
(3)传输介质:可以用蓝牙、WiFi、无线电等方式,这里使用的是用数据线和电脑直接连接进行简单测试,其他方式同理。
TXD:发送数据 Transmit(tx) Data 简写形式
RXD:接受数据 Receive(rx) Data 简写形式
GND:共地,以提供参考点电压
(4)接受信息:因为减轻单片机的负担,不需要每时每刻检测对方是否发送信息,通常会用到中断。
有以上分析可以,我们本次实验的步骤:了解51单片机串口硬件电路——》编写程序控制单片机发送信息给硬件电路,硬件电路按照字符帧格式发送信息——》通过USB转TTL模块发送给电脑(有下载功能的开发板都有)———》电脑收到后,我们通过串口调试助手(网上现成的软件)将收到的二进制信息转换成十进制数、字母等或者16进制数
1、接收信息:当软件将允许接收标志位置1后,当RXD逐位收到发送10位字符帧并经过一系列处理后,RI会被硬件置1,将接下来的八位数据位存放入SBUF寄存器中,如果串口中断有开启,那么单片机就会进入中断执行中断服务函数中的内容。
2、发送信息:当单片机执行一段写SBUF命令时,发送硬件电路会将写入的八位数据位转换成完整的十位字符帧,最后由TXD口逐位发送出去。
4、由于我们使用的是异步通信,所以单片机内部也要通过内置的时钟,产生脉冲信号确定接收或发送的频率,而且该频率要与电脑的一致。
5、定时器1为串口通信提供脉冲信号:TH1,TL1确定时钟脉冲频率,具体查定时器的配置;SMOD确定产生的脉冲信号是否需要分频即降低接收的频率
6、接收和发送SBUF共用一个地址码
7、TI=1或RI=1时中断都会发生,但是我们通常只在接收时才使用中断
(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
(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(不可位寻址)
- SMOD:波特率选择位,SMOD=1时,波特率加倍
- 其他位没有用到全部置0,令PCON=0x80
(c)中断允许寄存器IE(可位寻址)
- EA:CPU的总中断允许位,令EA=1
- ES:串口中断允许位,令ES=1
(2)STC89C51参考代码:
实现功能:接收电脑发来的信息后,再发送给回给电脑
#include
#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)步骤:选择相应的串口——》选择相应的波特率——》打开串口——》发送信息