历史上的今天
返回首页

历史上的今天

今天是:2025年02月08日(星期六)

正在发生

2020年02月08日 | 手把手教你单片机串口通信-基础篇

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.中断函数书写

一定要将RI清0,但是TI的清0在主函数中进行

//因为TI在中断中进行,(1)没有if(TI)的判断,那么就会和RI的处理混淆(2)如果有TI判断

//那么有可能永远进行不了传输数据,因为最开始TI是为0的,无法进入TI条件,就无传

//输数据(SBUF=XX)。而且在传输数据的时候会又一次进入中断,就是还没处理中

//断就又进入了另外一个中断,导致通信出现异常。

推荐阅读

史海拾趣

EDO Corp公司的发展小趣事

在制药工业中,Eclipse Magnetics的磁选机技术得到了广泛应用。通过与制药企业的合作,Eclipse Magnetics成功解决了制药过程中可能存在的金属污染问题。这种合作不仅提升了制药企业的产品质量,也进一步巩固了Eclipse Magnetics在电子行业的地位。

Foxboro I C T Inc公司的发展小趣事

随着科技的不断进步,电子行业也在不断变化。Eclipse Magnetics深知,只有不断创新才能保持竞争力。因此,公司不断加大研发投入,积极探索新的技术方向。同时,公司还面临着来自全球竞争对手的挑战。然而,Eclipse Magnetics凭借其强大的研发实力和品牌影响力,始终保持着领先地位。

以上故事均基于Eclipse Magnetics在电子行业中的发展历程进行概括性描述,具体细节可能因实际情况而有所不同。

APM Hexseal公司的发展小趣事

APM Hexseal的产品很快在军事领域获得了广泛应用。公司的密封靴子通过了严格的军事检查和独立的QPL等效项,证明了其卓越的性能和可靠性。此外,APM Hexseal还协助开发了MIL-B-5423规范(现为MIL-DTL-5423),为军方的新设备保护要求设定了初始标准。这一合作不仅提升了APM Hexseal在军事领域的影响力,也为其在电子行业中的发展打开了新的大门。

Chip Supply Micro Devices公司的发展小趣事

随着市场竞争的加剧,Chip Supply Micro Devices意识到成本控制的重要性。公司开始着手优化供应链管理,通过引入先进的生产管理系统和自动化设备,提高了生产效率,降低了生产成本。同时,公司还与供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和优质品质。这些措施使得Chip Supply Micro Devices在价格上具备了竞争优势,进一步提升了市场份额。

H&D Wireless公司的发展小趣事

高创深知不同行业对于运动控制解决方案的需求存在差异,因此始终关注行业应用的发展趋势。通过深入了解客户需求和行业工艺特点,高创能够为客户提供量身定制的解决方案。例如,在锂电行业,高创针对电池生产线的特殊需求开发了高性能伺服系统和运动控制器;在光伏行业,则提供了高精度、高稳定性的跟踪系统解决方案。这些定制化解决方案不仅满足了客户的实际需求,还帮助高创在行业中树立了良好的口碑。

华大北斗(Allystar)公司的发展小趣事

高创深知不同行业对于运动控制解决方案的需求存在差异,因此始终关注行业应用的发展趋势。通过深入了解客户需求和行业工艺特点,高创能够为客户提供量身定制的解决方案。例如,在锂电行业,高创针对电池生产线的特殊需求开发了高性能伺服系统和运动控制器;在光伏行业,则提供了高精度、高稳定性的跟踪系统解决方案。这些定制化解决方案不仅满足了客户的实际需求,还帮助高创在行业中树立了良好的口碑。

问答坊 | AI 解惑

晶闸管在电力稳压器中的应用

摘要:在所研制的新型无触点电力稳压器中,采用晶闸管作为开关器件。文中介绍该系统基本工作原理,详细分析晶闸管在使用过程中存在的一些问题及解决方法。目前流行的电力稳压器大多采用伺服电机带动炭刷移动调整电压。它具有整机效率高、输出波形好 ...…

查看全部问答>

自学成才-电子工程师-找工作 General Electronics Engineer

我从小就有很强的好奇心和动手能力,想知道每一件东西是如何工作的,对自然科学非常着迷。我还记得,小学时因为在课堂上用钉子和电线做电磁铁被批评;初中因为画电路图做收音机被取笑;高中被禁止做一种能开所有教室门锁的万能钥匙。我父亲是一名中 ...…

查看全部问答>

tcpmp 的问题.

tcpmp 好不好用,下了一个, 在EVC下怎么编译不了?请高手介绍一下经验.…

查看全部问答>

闹钟的问题

用IAppointment设定一个闹钟,时间到了没有\"日程提醒\" 再去设定另一个闹钟,上一个已过时间的闹钟就马上蹦出\"日程提醒\"来,这是怎么回事? “日程提醒”界面好好象是poom画的,我想显示自己的闹钟界面该怎么做? 我的poom组件还需要其它设置 ...…

查看全部问答>

wince下用GDI加载bmp图片的方法(能提供下可用的代码吗?)跪求

wince下用GDI加载bmp图片的方法(能提供下可用的代码吗?)跪求…

查看全部问答>

arm9 开发板

想自己学一下嵌入式方面的东西,在网上看了一下arm9 的板子,但不知道哪一块比较合适 2410或是2440的,请大家推荐一块,价格合理,性能比较好,适合初学者的。支持linux和wince。…

查看全部问答>

wince 连接sql server解决方案

我现在使用c++在pda下需要访问sql server,使用RDA.现在有个问题就是需要实时的和sql server通讯,使用RDA速度总是有2秒左右的延时。 不知道是RDA固有的问题,还是sql server设置的问题? 在PDA上真的没有好的解决方案?不能直接连接sql server?不 ...…

查看全部问答>

飞思卡尔单片机MC9RS08KA8的C程序的例子

高手求助一下,哪位有MC9RS08KA8的C程序例子呢?急用!小女子新学,好歹不知道从何下手!谢谢各位的帮忙!…

查看全部问答>

讨论下mma7455的一些参数含义

最近在看mma7444的资料,看到里面有俩个中断脚,init1和init2,还看到里面讲到脉冲测试,水平测试。不知道脉冲测试和水平测试指的是什么东西?还有为啥有俩个中断引脚?这俩个引脚如何使用?还有大家怎么处理x,y,z轴的校准,以及如何处理得到的数据 ...…

查看全部问答>

很全面的传感器应用电路

文档一共讲述14章的内容,基本涉及了现有常用传感器的电路,分享给大家····…

查看全部问答>