单片机 初识UART

/*SCON 设置使用mode 0;设置TI的值为1 开始发送数据,发送完毕后,软件置0.
TI是指单片机SFR中SCON的一位,而且是被硬件置位的。当单片机发送完一帧数据后,该数据位由硬件置1
*/

#include<reg51.h> #include<intrins.h>

#define uchar unsigned char #define uint unsigned int sbit SPK=P3^7; uchar FRQ=0x00; //Time delay. void DelayMS(uint ms) {  uchar i;  while(ms--) for(i=0;i<120;i++); } //Main procedure. void main() {  uchar c=0x80;  SCON=0x00;  //Serial control register,Operating Mode:0;  TI=1;  //Transmit interrupt flag ,Set by hardware at the end of the 8th bit time in mode 0  while(1)  {   c=_crol_(c,1);   //Left move 1 bit.   SBUF=c;     //Serial Buffer   while(0 == TI);  //Waiting for send over.   TI=0;   //Cleared by software.   DelayMS(400); //Setting time delay.  } }  

为了数据接收不完整这个问题,纠结了好几天,一个小问题,却能让人奔溃。今天算解决了,总结如下:

1.程序流程的考虑。以前总是觉得实现了这个功能就行了,很少留意到程序的编写流程,例如总开关EA的打开关闭,ES的打开关闭。项目中用到的中断不止UART一个,如果每次都操作EA,可能会造成不可预料的后果。在中断初始化的时候,只需关注自己操作的中断,将中断关闭,然后再打开,完成初始化操作。总开关EA 的打开放在各个中断初始化后。

2.解决数据接收不完整:

a.单个字符是否可以正常接收完整

b.考虑数据接收的时候所需要的时间

在下面程序中, for(i = 1000; i > 0 ; i--)   其实是为了在1S内接收中断发过来的数据,在接收完成后再进行数据的发送。

void UART() {    u8 i = 0;

 if (1 == ReadFlag)            {                 ReadFlag = 0;   for(i = 0;i  < 50; i++)   {    if(0 != UARTBuf[i])    SendByte(UARTBuf[i]);    }   SBUFData = 0;   while(SBUFData < 50)   {    UARTBuf[SBUFData] = 0;    SBUFData++;   }     }    

}

 

//serial interrupt function void serial () interrupt 4  {  u16 i;     inuartnum = 0;  for(i = 1000; i > 0 ; i--)      // Define 100ms delay time for reception.  {      if (1 == RI_0)         //when receiving data, hardware automatic set 1   {      RI_0 = 0 ;                    // SBUFData =SBUF0;      UARTBuf[inuartnum] = SBUF0;    inuartnum++;     ReadFlag = 1;     }        }

  }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值