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

 这是别人写的文章,我 整理一下先各~~~

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


 

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


 

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


 

程序一:


 

本程序是使用软件设置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';


 

    }  


 

}


 

 


 

程序二:


 

本程序是使用在软件的初始化时在串口缓冲区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';


 

    }  


 

}


 

程序三:


 

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


 

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


 

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

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值