打印

【原创】让你更好的掌握51UART的发送接受机制

[复制链接]
1828|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xnwxq|  楼主 | 2009-8-25 20:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
【原创】让你更好的掌握51UART的发送接受机制:单片机串口通信编程注意事项
这是我自己的串口通信原理的编程小节,本人自己认为是很好的资料,附件中是该文档的doc文件,大家可以给个评价!!!
单片机的串口通信编程的总结
在紧张的工作中,现在对单片机的串口通信编程有了一个新的认识,下面就针对下面不同的几个工程程序文件的区别做一个比较详细的总结。
本次小结的主要目的是更加明确单片机的串口中断是如何发生的。即:是如何触发串口中断的发送功能的。在说明中我使用特殊的字体颜色来强调重点部分和注意事项。
程序一:
本程序是使用软件设置TI来实现串口中断的触发,如果在初始化函数中不增加TI=1;这条语句,那么是不会触发中断的
#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;//
方式1:10位异步同通讯,串口允许接收


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';

}
}

相关帖子

沙发
xnwxq|  楼主 | 2009-8-25 20:30 | 只看该作者
程序二:

本程序是使用在软件的初始化时在串口缓冲区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;//方式1:10位异步同通讯,串口允许接收

    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';

    }   

}

使用特权

评论回复
板凳
xnwxq|  楼主 | 2009-8-25 20:31 | 只看该作者
程序三:

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

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

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

使用特权

评论回复
地板
xnwxq|  楼主 | 2009-8-25 20:32 | 只看该作者
希望大家可以提一下有写的不好的地方!由于字数比较多,所以我只能将三种程序例子回复来完成整个帖子!希望大家理解!

使用特权

评论回复
5
箫笑| | 2009-8-26 08:27 | 只看该作者
你就是为了说明TI复位是0吗?
我一般设全局标志,第一个字节直接填buffer,
51跟AVR才是这样的,STM的上电就是1的,没这个问题.

使用特权

评论回复
6
LYXQ| | 2009-8-26 08:42 | 只看该作者
人为制造个中断,还是在初始化的时候,没啥道理啊。通过中断发送数据是没错的,当想发送数据时调用个子程序把发送缓冲区设置好,将发送缓冲区首字符送SBUF就可以了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我们都是风雨中的孩子,手牵着手才不会跌倒

162

主题

294

帖子

1

粉丝