微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 遇到一个uart串口通信的问题,请大神帮忙看看一下;

遇到一个uart串口通信的问题,请大神帮忙看看一下;

时间:10-02 整理:3721RD 点击:
  我想实现的目的是串口助手发送一个字符串给单片机,单片机又原封不动的返回给我;
实现的机制,是接受到的字节放入一个数组,30毫秒后,再把接受到的数据发送给单片机。
现在代码是一发送数据,就不停的给串口助手发0,完全停不下来,跟吃了炫迈一样;
百思不得其解;望有能力的大神帮小弟一把;
一下是代码:
//把接受的字符串发送到串口
#include <reg52.h>
#include <stdio.h>
typedef unsigned int uint;
typedef unsigned char uchar;
uchar i = 0;                        //接受的字节数;
uchar tr[80];                          //接受缓冲区;
bit biaozhi = 0;                //30ms标志位;
uchar th = 0;                   //定时器0高字节;
uchar tl = 0;                   //定时器0低字节;
void UART_Init()          //串口初始化;
{
        TMOD &= 0X0F;                //清空高4位;
        TMOD |= 0X20;                //定时器1,工作模式2;
        TH1 = 0XDF;                        //9600波特率
        TL1 = 0XDF;
        SCON |= 0X50;           //串口工作方式1,允许接受;
        TR1 = 1;                  //开定时器1;
        ES = 1;                          //开串口中断;
}
void tmer0(uint t)                 //定时器0初始化
{
        TMOD &= 0XF0;                //清空低4位
        TMOD |= 0X01;                //设置定时器0,工作模式1;
        th = (65535-t*1000)/256;         //定时器初值;
        tl = (65535-t*1000)%256;
        TH0 = th;                                //给定时器0赋初值;
        TL0 = tl;
        ET0 = 1;                                //开定时器0中断过
               
}
void URT_zd() interrupt 4          //串口中断;
{
        TR0 = 1;                                 //当接受到数据定时器0开始计数;
        RI = 0;                                         //清零接受标志位
        tr[i] = SBUF;                         //把接受到的数据放入缓冲区;
        i++;                                          
       

}
void tmer() interrupt 1                  //定时器0;
{
        static uchar j = 0;
        TH0 = th;                                 //赋初值;
        TL0 = tl;
        j++;                                         //        每1ms加1;
        if(j == 30)                                 //当三十毫秒后,我们就把接受到的数据发送出去;
        {
                j = 0;                                 //清空时间;从0开始计数;
                biaozhi = 1;                 //发送标志位置1;
                TR0 = 0;                         //并关闭定时器0;
        }
}
void UART_Xie_Bit(uchar x)           //发送一个字节函数;
{
        SBUF = x;                                   //把一字节数据方入到发送区;
        while(!TI);                                   //判断是否发送完毕;
        TI = 0;                                           //把发送标志位置0;等待下一字节的发送;
}
void UART_Xie_Bety(uchar *p)          //发送字符串函数;
{
        while(*p)                                  //判断是否发送到最后一个字节;
        {
                UART_Xie_Bit(*p++);           //一个字节一个字节的发送;
        }
}
void main()
{
        EA = 1;                                   //开总中断;
        UART_Init();                        //初始化串口;
        tmer0(1);                           //初始化定时器0;
        while(1)
        {
                if(biaozhi)                   //当三十毫秒到就把缓冲区的数据发送出去;
                {
                        biaozhi = 0;                //清0标志位;
                        UART_Xie_Bety(tr);        //发送
                        i = 0;                           //清零字节计数标志位;
                }
        }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top