遇到一个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; //清零字节计数标志位;
}
}
}
实现的机制,是接受到的字节放入一个数组,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; //清零字节计数标志位;
}
}
}