手把手教你单片机串口通信-基础篇

2020-02-08来源: 51hei关键字:单片机  串口通信  基础篇

通信方式

并行

适合短距离通信,并行通信控制简单、相对传输速度快(8位一起传输)。

串行

只能一位一位的传送。

同步(了解)

建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙。

发送方对接收方的同步可以通过外同步和自同步

异步(常)

以字符(构成的帧)为单位进行传输。数据位从低到高传送。

格式:

这里的空闲时间是任意的。

串行通信的制式(传输方向)

单工(仅能沿一个方向)

半双工(可进行双向,但需分时)

全双工

串行通信的错误校验

奇偶校验

在发送数据时,数据位尾随的1位为奇偶校验位(1/0)。奇校验时,数据中1的个数与检验位1的个数之和应为奇数;偶校验时,数据中1的个数与校验位1的个数之和应为偶数。接收字符时,对1的个数进行校验,若字符不一致,则说明传输数据过程中出现错误。

代码和校验

发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据时,同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,一致则无差。

循环冗余校验

通过某种数学预算实现有效信息与校验位之间的循环校验,常用语对磁盘信息的传输、存储区的完整性校验。

串口的基本结构

SBUF:51单片机中的特殊寄存器,串行数据缓冲器(一个接收一个发送),两个其实是共用的一个地址99H,但是两个在物理上面是分开的。

当发送使用时,就采用SBUF=XXX;  (XXX为需要传送的数据)

当接收使用时,采用XXX=SBUF;

记得因为是串行的所以传输都是一位一位进行的。

T1溢出率:T1计时器的溢出频率(就是计时器每次低位计满向高位进位时间的倒数)

用处:用于计算波特率(每秒传输二进制代码的位数)

实现单片机与电脑之间的互相传送字符串通信代码:

     #include   

     #include               //printf头文件  

     #define uc unsigned char   

     #define uint unsigned int  

       

     uc flag,i,flag_t,s[50]="",j=0,flag_n=0;  

     uc code table[]="I get ";          

       

     void init()  

{  

     TMOD=0x20;    //定时器工作方式,选择了定时器1,工作方式2 八位初值自动重装的8位定时器。          

     TH1=0xfd;     //定时器1初值  ,设置波特率为9600 晶振11.0529MHZ?  

     TL1=0xfd;  

     TR1=1;        //开启定时器1  

   

     SM0=0;  

     SM1=1;        //10位异步接收,(8位数据)波特率可变  

     REN=1;        //允许串行口接收位  

     EA=1;         //允许中断(总闸)  

     ES=1;         //允许串口中断  

}  

void main()  

{  

     init();  

     while(1)  

{  

       if(flag==1)  

     {     if(flag_n!=0)        //使第二个及以后I get xx 换行,不与You transfer在一行(单纯为了格式好看)  

             {TI=1;  

             printf("n");  

             while(!TI);  

             TI=0;  

             }  

         for(i=0;i<6;i++)  

         {  

             SBUF=table[i];  

             while(!TI);  

             TI=0;  

         }  

             for(i=0;s[i]!='#'&&i<50;i++)  

         {  

             SBUF=s[i];  

             while(!TI);  

             TI=0;  

         }  

         flag=0;  

     }  

     if(flag_t==1)                          //发送完毕之后,在电脑端输出。  

     {  

         TI=1;                              //printf之前必须将T1置为1才行。  

         printf ("nYou transfer %s",s);  

         while(!TI);  

         TI=0;  

         flag_t=0;  

     }     

}  

}  

   

void ser() interrupt 4  

{  

         if(RI)       //接收数据,手动将RI清0  

     {         

         RI=0;  

           

         if(flag==0&&j!=0)//1.循环赋值为''(字符串结尾标志符),j=0,为了第二次传递字符串是又是从头输出  

         {            //2.flag为0和j不为0时,保证是第二次及以后,传输字符串(控制输出格式)  

             flag_n++;              

             for(j=0;s[j]!='#'&&j<50;j++)  

                   s[j]='';  

                   j=0;  

         }  

         s[j]=SBUF;  

         flag=1;  

         if(s[j]=='#'||j==49)     //以'#'作为传送字符串的结尾符,我定义的字符数组最长为50所以49也应该结束。  

             flag_t=1;  

         else  

             j++;  

     }  

   

     if(TI)     //发送数据  

     {  

     }      

}  


运行截图:

代码解读:基本上就是几个模块:计时器、中断以及串口通信中断寄存器介绍IE(interrupt enable):(可位寻址)设定各个中断源的打开和关闭IP(interrupt prior)中断优先级寄存器:(可位寻址)用来设定各个中断源属于两级中断中的哪一级

中断源:

中断响应条件:

1.中断源有中断请求

2.此中断源的中断允许位为1

3.CPU开中断(EA=1)

代码书写:

1.先开总中断EA

2

.然后再开特定的中断去控制

3.如果有特殊需要优先级问题再设置IP

4.中断函数书写

格式

void 函数名() interrupt 中断号(上面图示的序号)

//中断函数返回值一定是void  

//函数名随便写

//中断号用来判断是哪个中断源

计时器寄存器介绍TCON 支持位寻址 :控制寄存器,控制T1、T0的启动和停止及设置溢出标志

TMOD,不支持位寻址:定时/计数器的工作方式寄存器,确定工作方式和功能

计时器代码书写步骤:1.EA=1;

2.ETX=1;                            //开启计时器X中断

3.配置工作方式  TMOD=0x..; //根据自己需求按照上表来配     

3.配置计时器初值

//THX=(65535-N)/256;

//TLX=(65535-N)%256;   

//N由你要计时的时长决定。计时器计一个数花费一个时钟周期来计算。

4.TRX=1;                           //开启计时器X

串口通信寄存器介绍PCON电源管理寄存器 :(不可位寻址)

用来管理单片机的电源部分,包括上电复位检测、掉电模式

、空闲模式等

SCON:(可位寻址)用以设定串行口的工作方式、接收/发送控制以及设置状态标志

波特率计算

SMOD就是PCON中的第一位,默认为0

fosc为晶振频率,所以自己设定不同波特率时,也要考虑晶振不同的问题。

代码书写

1.上面都书写完毕之后

2.还需要ES=1

3.传输数据时,SBUF=XX

   接收数据时,XX=SBUF

4.中断函数书

[1] [2]
关键字:单片机  串口通信  基础篇 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic487573.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于单片机的数字电压表毕业设计
下一篇:基于51单片机的pwm直流电机调速

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

9课:单片机数据传递类指令
单片机数据传递类指令(3)以直接地址为目的操作数的指令MOV direct,A 例: MOV 20H,AMOV direct,Rn MOV 20H,R1MOV direct1,direct2 MOV 20H,30HMOV direct,@Ri MOV 20H,@R1MOV direct,#data MOV 20H,#34H(4)以间接地址为目的操作数的指令MOV @Ri,A 例:MOV @R0,AMOV @Ri,direct MOV @R1,20HMOV @Ri,#data MOV @R0,#34H(5)十六位数的传递指令MOV DPTR,#data168051是一种8位机,这是唯一的一条16位立即
发表于 2020-03-10
9课:单片机数据传递类指令
8课:单片机寻址方式与指令系统
通过前面的学习,我们已经了解了单片机内部的结构,并且也已经知道,要控制单片机,让它为我们干学,要用指令,我们已学了几条指令,但很零散,从现在开始,我们将要系统地学习8051单片机的指令部份。一、概述1、指令的格式我们已知,要让计算机做事,就得给计算机以指令,并且我们已知,计算机很“笨”,只能懂得数字,如前面我们写进机器的75H,90H,00H等等,所以指令的第一种格式就是机器码格式,也说是数字的形式。但这种形式实在是为难我们人了,太难记了,于是有另一种格式,助记符格式,如MOV P1,#0FFH,这样就好记了。 这两种格式之间的关系呢,我们不难理解,本质上它们完全等价,只是形式不一样而已。2、汇编我们写指令使用汇编格式,而计算机
发表于 2020-03-10
7课:单片机的特殊功能寄存器
通过前面的学习,我们已知单片机的内部有ROM、有RAM、有并行I/O口,那么,除了这些东西之外,单片机内部究竟还有些什么,这些个零碎的东西怎么连在一起的,让我们来对单片机内部的寄存器作一个完整的功能分析吧!下图中我们能看出,在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。在一个51单片机的内部包含了这么多的东西。对上面的图进行进一步的分析,我们已知,对并行I/O口的读写只要将数据送入到对应I/O口的锁存器就能了,那么对于定时/计数器,串行I/O口
发表于 2020-03-10
7课:单片机的特殊功能寄存器
6课:单片机并行口结构
上两次我们做过两个实验,都是让P1.0这个管脚使灯亮,我们能设想:既然P1.0能让灯亮,那么其它的管脚可不能呢?看一下图1,它是8031单片机管脚的说明,在P1.0旁边有P1.1,P1.2….P1.7,它们是否都能让灯亮呢?除了以P1开头的外,还有以P0,P2,P3开头的,数一下,一共是32个管脚,前面我们以学过7个管脚,加上这32个这39个了。它们都以P字开头,只是后面的数字不一样,它们是否有什么联系呢?它们能不能都让灯亮呢?在我们的实验板上,除了P10之外,还有P11 -> P17都与LED相连,下面让我们来做一个实验,程序如下:MAIN: MOV P1,#0FFHLCALL DELAYMOV P1,#00HLCALL
发表于 2020-03-10
6课:单片机并行口结构
5课:单片机延时程序分析
;      ;(10)〈单片机延时程序〉MOV:这是一条指令,意思是传递数据。说到传递,我们都很清楚,传东西要从一本人的手上传到另一本人的手上,也就是说要有一个接受者,一个传递者和一样东西。从指令MOV R7,#250中来分析,R7是一个接受者,250是被传递的数,传递者在这条指令中被省略了(注意:并不是每一条传递指令都会省的,事实上大部份数据传递指令都会有传递者)。它的意义也很明显:将数据250送到R7中去,因此执行完这条指令后,R7单元中的值就应当是250。在250前面有个#号,这又是什么意思呢?这个#就是用来说明250就是一个被传递的东西本身,而不是传递者。那么MOV R6,#250是什么
发表于 2020-03-10
5课:单片机延时程序分析
单片机模拟I2C总线及24C02(I2C EEPROM)读写实例
/*     51系列单片机在使用时,有时需要模拟I2C总线,                      *//*   这里举出一个实例(读写串行EEPROM芯片at2402)                       
发表于 2020-03-10
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved