赞
踩
目录
含义:通信就是两个设备之间进行的数据传输。
注意:
前言:串行通信按信息的格式又可以分为异步通信和同步通信两种方式。
理解:异步通信是指数据传送按位发送,基本以一个字符为单位,字符与字符之间的传送是完全异步的,一个字符中位与位之间的传送基本上是同步的。
注意:异步通信要求双方要有相同的传输速度(波特率)才可以通信。
理解:同步通信是指数据传送以数据块(一组字符)为单位,字符与字符之间,字符内部的位与位之间都同步。(时钟同步)
注意:同步通信过程中双方都要有时钟引脚,双方的2个时钟clk引脚是连在一起的,通信时由主机传送时钟信号提供同步脉冲,双方要根据这个时钟信号来确定发送或接收每个位,确保数据传输时完全同步。
前言:沟通的双方需要遵守一套既定的规则,这就是通信的协议。
注意:
注意:
注意:MCS-51单片机具有一个异步全双工UART串口,可以同时发送、接受数据,发送,接收数据可通过查询或中断方式处理,使用十分灵活。
注意:
波特率(bps)=一个字符的二进制位数*字符个数/秒
总结:
注意:我们的电脑与单片机的通信就是通过串口,UTX为电脑的发送串口,应连接到单片机的RXD串口(P3.0);URX微电脑的接收串口,应连接在单片机的TXD串口(P3.1)
含义:电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有以下三种。
SBUF:物理上是两个独立的8位寄存器(读和写有各自的缓冲寄存器),但是占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器(两者不会冲突)。
注意:当SMOD位为1时,波特率加倍。
理解:单片机与电脑发送异步串口数据的时候,需要规定发送和接受的速度,也就是波特率,电脑可以通过串口助手设定波特率,而单片机设定波特率就需要设定T1;相对于单片机来说,它发送数据首先要将数据写入SBUF中,当发送完成后TI会置1,引发串口中断进而执行对应的操作;当单片机接收外部发送的数据,那么就会先将外部数据缓存至SBUF中,当接收完成后RI位会置1引发接收中断,进而我们可以在接收中断函数中读取SBUF的接收内容。
注意:
前言:异步通信没有统一的时钟信号保证同步,那么为了确保数据传输正确;要求通信双方的波特率(传输速度)设置必须相同。计算机的串口调试助手可以很简单的设置波特率,但是单片机也需要用相同的波特率进而保证数据传输的正确。
51提供了一个专门的波特率发生器——T1;我们想要使用9600的波特率就是想串口在传输数据的时候每1/9600s能接收或发送一位二进制数;因此只需要每1/9600s告诉串口一下要接收或发送数据;波特率发生器就可以根据我们设置的时间进行提示;我们进而可以根据1/9600s来设置T1的初值;然后启动TR1按照定时器的工作原理,他将在每次定时时间到的时候溢出进而实现了波特率发生器的功能。
注意:
若我们想要使用9600的波特率,首先我们看UART结构图,我们想要使用的波特率他还会进行分频(/2和/16)因此我们想要使用9600波特率,我们需要以9600*2*16的波特率(307200)来算,那么我们就希望每1/307200s初值寄存器溢出一次;;因为我们必须用T1的方式2,所以初值为256-1000000/307200/(12/fosc)
总结:由此我们可以看到,若11.0592MHz频率的晶振可以获得比较精确的9600波特率;而12MHz频率的晶振就有偏差;因此计算机用9600波特率和单片机串口通信就会有传错率。
串行口控制寄存器SCON位的确定
- 根据工作方式确定SM0、SM1位
- 方式2和方式3确定SM2位
- 若是接收端,则置允许接收位REN为1
- 方式2和方式3发送数据,则应将发送数据的第九位写入TB8中
设置波特率
- 方式0:不需要对波特率进行设置
- 方式2:设置波特率仅需对PCON中的SMOD位进行设置
- 方式1和方式3,设置初值
开启中断以及波特率发生器
执行中断程序
前言:
- #include <regx52.h>
- unsigned char dat=0,flag=0;
- void initscon(){
- SCON=0x50; //8位异步通信方式,允许接收数据
- TMOD=0x20; //配置波特率发生器T1,工作方式为2
- TH1=0xFD; //重置TL1
- TL1=0xFD; //设置初值(晶振:12MHz;波特率:9600bps)
- ES=1; //开启串口中断
- EA=1; //开启总中断
- TR1=1; //打开波特率发生器T1
- }
- void main(){
- initscon();
- while(1){
- if(flag){
- SBUF=dat; //向串口助手发送数据
- flag=0;
- }
- }
- }
- void scon_isr() interrupt 4
- {
- if(TI){
- TI=0; //数据发送完清TI
- }
- if(RI){
- RI=0;
- dat=SBUF; //接收串口助手发送的值
- switch(dat){
- case 1:P2_0=~P2_0;break;
- case 2:P2_1=~P2_1;break;
- case 3:P2_2=~P2_2;break;
- case 4:P2_3=~P2_3;break;
- case 5:P2_4=~P2_4;break;
- case 6:P2_5=~P2_5;break;
- case 7:P2_6=~P2_6;break;
- case 8:P2_7=~P2_7;break;
- default:P2=0xff;
- }
- flag=1;
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。