原创 MCS-51学习小结之RS232通讯

2010-5-7 21:23 4438 10 16 分类: MCU/ 嵌入式

MCS-51学习小结之RS232通讯<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


随着多微机系统的广泛使用和计算机网络技术的普及,计算机的通讯功能越来越显得重要,一般来说,可以采用串行通讯和并行通讯两种方式,由于串行通讯方式使用线路少、成本低,特别是在远程传输时,可以避免多条线路的不一致而被广泛使用,其中,RS232通讯是比较常用的,操作起来也简单,对于一般的全双工通讯,只需要3根信号线就可以了,即一条TXD线、一条RXD线和一条地线。


3c9dcc69-6e24-4a66-8794-2a7f67503c08.jpg


我手里用的是9D型串口,它的引脚分布为2RXD3TXD5:逻辑地。如下图所示,


565c98d1-0f2a-4a06-9f07-82d9a5d9173c.jpg986ea44e-9288-47fa-afa3-bcd88e0571e8.jpg


MCS-51的串行发送和串行接收利用了P3口的第二功能,P3.0作为串行数据的接收线RXDP3.1作为串行数据线的发送线TXD。串行通信的控制寄存器占据了26SFR中的3个,其中,PCONSCON用于设置串行口工作方式以及确定数据的发送和接收波特率,SBUF实际上由两个8位寄存器组成,一个用于存放将要发送的数据,另一个用于存放接收到的数据,起着数据的缓冲作用。


MCS-51的串行接口如下图:


8e0fbbc3-000c-4b73-a138-015079d87fdb.jpg


记得还是大二暑假的时候开始接触RS232通讯,当时对这3SFR的概念非常模糊,那个时候的数字电路是自学的,基础不扎实,现在回头好好理解一下,发现这种通讯操作起来还是比较简单的,关键是要把这3SFRFunctional Block Diagram理解清楚,这涉及到一些数字电路方面的知识,一点体会就是电路基础一定要过硬,否则控制程序将无从写起。


串行口通讯有4种工作方式可供选择,我这次调试的是方式1,即10位异步收发方式,这种方式比较常用。波特率的设置这里就不多说了,有专门的表可以直接查询,可以按照自己的需求选择其中一种就OK了。需要注意的是,这里数据的传送有两种途径可供选择,分别为:


1)查询式:CPU通过查询通讯端口TXDRXD的状态进行数据的传送,它的优点是硬件连线和查询程序十分简单,但是CPU在查询等待过程中会降低效率。


2)中断法:中断传送是利用CPU本身的中断功能来实现对终端的数据传送,这种方式可以提高CPU的工作效率。


下面是我修改好的程序,我尽量把它写的清楚、简单、易懂、格式标准:


(1)查询法:


#include "reg52.h"



#define uchar unsigned char 


#define uint  unsigned int



uchar temp;


//************************************************


void send_back() //数据返回子程序


{


    SBUF="P1";


    while(!TI);  //等待数据发送完毕


    TI="0";        //将发送标志位清零


}


//************************************************


void main()


{


    TMOD="0x20";    //定时器1,工作方式


    TH1=0xFD;


    TL1=0xFD;     //给定时器1装初值,设定波特率为9600bps


    PCON="0x00";    //波特率不进行加倍


    SM0=0;


    SM1=1;        //串行工作方式1


    REN="1";        //允许接收数据


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


    while(1)


    {


        if(RI==1) //接收到数据时该位自动置为1


        {


            RI="0"; //将接收标志位清零,否则上位机会一直不停地发送数据


            temp="SBUF";


            P1=temp;


            send_back(); //把接收到的数据返回PC


        }


    }


}


 


(2)中断法:


#include<reg52.h>


#define uchar unsigned char 


#define uint  unsigned int


//************************************************


void send_back() //数据返回子程序


{


    SBUF="P1";


    while(!TI);  //等待数据发送完毕


    TI=0; //将发送标志位清零


}


//************************************************


void main()


{


    TMOD="0x20";    //定时器1,工作方式


    TH1 =0xfd; 


    TL1 =0xfd;    //给定时器1装初值,设定波特率为9600bps


    PCON="0x00";    //波特率不进行加倍


    SM0 =0;


    SM1 =1;       //串行工作方式1


    REN =1;       //允许接收数据


    ES  =1;       //打开串口中断4


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


    EA  =1;       //打开总中断


    while(1); 


}


//************************************************


void UART() interrupt 4


{


    if(RI==1)  //接收到数据时该位自动置为1


    {


        RI="0";  //将接收标志位清零,否则上位机会一直不停地发送数据


        P1=SBUF;


        send_back();//把接收到的数据返回PC


    }


}


 

调试这个通讯程序时,发现使用串口调试发送数据时必须使用16进制模式发送,否则单片机收不到数据,以后得记住这一点,如图:







77a10566-3b33-46d8-a5fd-515b6b42c879.jpg


 
PARTNER CONTENT

文章评论6条评论)

登录后参与讨论

用户168888 2010-5-11 21:01

你QQ多少 我加你啊 我的809886634

用户1528479 2010-5-9 20:34

恩,我知道可以用VB写上位机软件。我看到有现成的软件可用,所以就没有费劲去写这个软件了,,

用户1528479 2010-5-9 20:32

我看了一下,的确很有用,谢谢2008zhoushuai的推荐,,

用户168888 2010-5-8 21:17

另外VB里有哥控件可以调用计算机串口,可用vb写上位机软件!

用户168888 2010-5-8 21:14

无线电杂志里得 杜杨老师写得那个12864液晶屏得数字钟里面就有自己定义数据发送函数去控制液晶屏得!有时间可以去看看!

用户168888 2010-5-8 21:07

其实也不比用通讯端口TXD和RXD可以自己写个通讯函数来发送数据
相关推荐阅读
用户1528479 2011-04-12 21:50
设计第一个六层板所得到的一个深刻体会
        今天中午,由于确实有点困,于是乎仰躺在座椅上眯了半个小时的眼,睡眼朦胧中,好消息随即到来——我的第一个六层板从深圳寄到长沙了!而且元器件都已经由深圳那边的人焊接好了,拆开包装袋一看,简...
用户1528479 2011-03-25 15:28
DDR2 SDRAM×32布局、布线经验谈
最近忙于一块以CycloneIII为核心主控芯片的六层板设计,开发环境是Capture+Allegro+CAM350,从原理图修改到PCB的布局、布线这整个过程中我遇到了相当多的问题,值得庆幸的是...
用户1528479 2011-03-25 13:30
DDR2 SDRAM×32布局、布线经验谈
DDR2 SDRAM×32布局、布线经验谈最近忙于一块以CycloneIII为核心主控芯片的六层板设计,开发环境是Capture+Allegro+CAM350,从原理图修改到PCB的布局、布线这整个过...
用户1528479 2011-02-27 19:48
使用Cadence16.2过程中遇到的一些问题(附解惑方法)
使用Cadence16.2过程中遇到的一些问题(附解惑方法) 很久没有写博文了!确实有点过意不去。最近两个多月以来,由于公司的需要,我不得不学习Cadence16.2的使用方法——用它来画高速板子...
用户1528479 2011-02-27 19:46
使用Cadence16.2过程中遇到的一些问题(附解惑方法)
使用Cadence16.2过程中遇到的一些问题(附解惑方法)很久没有写博文了!确实有点过意不去(呵呵,这意味着自己最近懈怠了)。最近两个多月以来,由于公司的需要,我不得不学习Cadence16.2的使...
用户1528479 2011-02-12 09:15
数字旋转编码开关的原理及使用方法
在电子产品设计中,经常会用到旋转编码开关,比如数码电位器等,它的英文名翻译过来就是Rotary Encoder Switch。在写这个元件的驱动程序之前,我google、baidu了一些它的使用说明资...
EE直播间
更多
我要评论
6
10
关闭 站长推荐上一条 /3 下一条