原创 让你更好的掌握51UART的发送接受机制:单片机串口通信编程注意事项_原创

2008-9-1 10:05 7284 7 15 分类: MCU/ 嵌入式

这是我自己的串口通信原理的编程小节,本人自己认为是很好的资料,附件中是该文档的doc文件,大家可以给个评价!!!<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


单片机的串口通信编程的总结


在紧张的工作中,现在对单片机的串口通信编程有了一个新的认识,下面就针对下面不同的几个工程程序文件的区别做一个比较详细的总结。


本次小结的主要目的是更加明确单片机的串口中断是如何发生的。即:是如何触发串口中断的发送功能的。在说明中我使用特殊的字体颜色来强调重点部分和注意事项。


程序一:


本程序是使用软件设置TI来实现串口中断的触发,如果在初始化函数中不增加TI=1;这条语句,那么是不会触发中断的


#include <STC<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />89C5X.h>    //包含51单片机的头文件


#define uint unsigned int


#define uchar unsigned char


/* 串口通讯接口定义


   RXD-------P3.0   数据接收端


   TXD-------P3.1   数据发送端


*/


/*===========================================


//函 数 名:  void InitUart(void)


//    : 


//返 回 值: 


//函数功能:  串口初始化函数


===========================================*/


void InitUart(void)


{


    //使用定时器1作为波特率发生器


    TMOD|=0x20;//T1工作为方式2


    SCON=0x50;//方式110位异步同通讯,串口允许接收


    PCON|=0x80;//波特率倍增,SMOD='1'


    TH1=0xfa;


    TL1=0xfa;


    TR1=1;


    TI=1;//使用软件触发首次串口中断的发生


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


    EA=1;//总中断允许


}


/*===========================================


//函 数 名:  main()


//    : 


//返 回 值: 


//函数功能:  串口通信工程的主函数


===========================================*/


main()


{


    InitUart();//串口设置初始化


    while(1);//死循环等待哦!


}


/*===========================================


//函 数 名:  void uart(void) interrupt 4


//    : 


//返 回 值: 


//函数功能:  串口中断处理函数


===========================================*/


void uart(void) interrupt 4


{   /*接收数据中断处理*/


    if(RI)


    {


        RI=0;//接收语句放在本语句前面,本语句是软件复位接收中断标志


    }


    /*发送数据中断处理*/


    if(TI)


    {


        TI=0;//复位TI


        SBUF = 'B';


    }  


}


 


程序二:


本程序是使用在软件的初始化时在串口缓冲区SBUF中先放一个数据来实现串口中断的触发,如果在初始化函数中不增加SBUF = 0x00这条语句,那么是不会触发中断的


#include <STC89C5X.h>    //包含51单片机的头文件


#define uint unsigned int


#define uchar unsigned char


/* 串口通讯接口定义


   RXD-------P3.0   数据接收端


   TXD-------P3.1   数据发送端


*/


/*===========================================


//函 数 名:  void InitUart(void)


//    : 


//返 回 值: 


//函数功能:  串口初始化函数


===========================================*/


void InitUart(void)


{


    //使用定时器1作为波特率发生器


    TMOD|=0x20;//T1工作为方式2


    SCON=0x50;//方式110位异步同通讯,串口允许接收


    PCON|=0x80;//波特率倍增,SMOD='1'


    TH1=0xfa;


    TL1=0xfa;


    TR1=1;


    SBUF = 0x00;//初始化是来实现串口中断的触发,在这里你也可以将TI复位为’0’不会影响串口中断的数据发送,任意的值都可以放到SBUF中,不一定非是0x00


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


    EA=1;//总中断允许


}


/*===========================================


//函 数 名:  main()


//    : 


//返 回 值: 


//函数功能:  串口通信工程的主函数


===========================================*/


main()


{


    InitUart();//串口设置初始化


    while(1);//死循环等待哦!


}


/*===========================================


//函 数 名:  void uart(void) interrupt 4


//    : 


//返 回 值: 


//函数功能:  串口中断处理函数


===========================================*/


void uart(void) interrupt 4


{   /*接收数据中断处理*/


    if(RI)


    {


        RI=0;//接收语句放在本语句前面,本语句是软件复位接收中断标志


    }


    /*发送数据中断处理*/


    if(TI)


    {


        TI=0;//复位TI


        SBUF = 'B';


    }  


}


程序三:


在初始化函数中即不要“TI1;”语句,也不要“SBUF0x00;”语句就形成了程序三,这个程序是用来与上面的两个程序对比说明的。程序三是不能正确的发送数据的,串口中断服务程序一直都不会进去的!


不知道说明白没有,希望大家可以好好的看看!


自己动手调试一下就会有很深的体会!!!!


 

文章评论8条评论)

登录后参与讨论

用户89529 2009-4-14 09:02

我试过了,最起码在我用的89v51上并不是这种情况,没有必要对SBUF或TI进行赋值, 最好是加一条ET1 = 1,就完全可以了,也可不加

用户1462752 2009-4-10 20:09

学习了,但是有个问题,初始的时候写入一个东西进SBUF的话,楼主的意思是写什么都“无所谓”了,但是另一端的机器是否就接收到了这个“无所谓”的内容了呢?

用户105409 2009-2-27 21:41

学习

用户538075 2008-11-24 23:08

不论是不是精华,但是写的是不错!

用户461316 2008-9-7 18:22

编辑后不是精华文章了!

用户69956 2008-9-7 17:56

呵呵,说得挺简洁的,不错,把中断发送的实质说清楚了。

用户485340 2008-9-5 16:47

收藏一下

用户480534 2008-9-2 09:24

好像以前有这个问题 第三种方法,加上 PS=1 REN=1; 应该是可行的
相关推荐阅读
用户461316 2009-08-17 17:57
Zigbee星型网络组网程序段
最近一直在做Zigbee的星型网络的组网试验,由于时间的原因,现在只是在最高的应用层上来编写程序。即协议栈的程序是2430的开发商(无限龙)编写的,我只是调用相应的函数来完成组网的,星型网络组网部分的...
用户461316 2009-08-17 17:14
VB6的标题栏使用上真彩色图标
模块 ModIcon.Bas 代码: Option Explicit Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long...
用户461316 2009-08-17 16:58
AppendToLog一个API方式存取日志文件的模块
'**************************************' 模块名称: AppendToLog' 功能描述:一个很不错的日志文件写入模块,不同于'     open/print/...
用户461316 2009-08-17 16:57
(VB自定义函数)去除字符串中的空格
'去除字符串中的空格(方法一)Public Function DelBlank(SearchString As String)   DelBlank = Replace(SearchString, C...
用户461316 2009-08-17 16:56
(VB自定义函数)对任意输入的汉字,可以得到它的拼音的第一个字母
调用方法:Command1.Caption = getHzPy("你")'//函数入口为汉字串,返回值为该汉字的第一个字母Public Function getHzPy(hzStr As String...
用户461316 2009-08-17 16:54
VB_代码执行速度测试
'**************************************'Windows API/Global Declarations for :[ '     A Simple] code ...
我要评论
8
7
关闭 站长推荐上一条 /2 下一条