/*****************************************************************************
函数功能:单片机接收电脑串口发送的字符串,已验证正常,最大可接收100个字符
最近一直在研究这个串口接收字符串问题,也看了网上很多例子都不能实现,现在
终于将此程序调试成功.
设计者:空心菜
联系qq:190719416
修改时间2016/07/15 下午15:22
****************************************************************************/
#include<at89x52.h>
#define uint unsigned int
#define uchar unsigned char
#define Fclk 11059200UL //晶体频率
#define BitRate 9600UL //波特率
uchar st[100]; //保存串口数据的缓冲区数组,如果想接收更多的字符可创建多个数组
volatile uchar Sending;
static uchar i=0;
uchar flag;
/****************************************************
函数功能:串口初始化
入口参数:无
返 回:无
备 注:无
*****************************************************/
void InitUART(void)
{
EA=0; //暂时关闭中断
TMOD&=0x0F; //定时器1模式控制在高4位
TMOD=0x20; //定时器1工作在模式2,自动重装模式,定时器0工作在模式1,16位定时
SCON=0x50; //串口工作在模式1
TH1=256-Fclk/(BitRate*12*16); //给定时器装初值
TL1=256-Fclk/(BitRate*12*16);
PCON|=0x80; //串口波特率加倍
ES=1; //串行中断允许
TR1=1; //启动定时器1
REN=1; //允许接收
EA=1; //允许中断
}
/*****************************************************
函数功能:串口中断处理
入口参数:无
返 回:无
备 注:无
******************************************************/
void UartISR(void) interrupt 4
{
if(RI)
{
RI=0;
st[i++]=SBUF; //把电脑串口发送到缓冲区的数据保存到数组
flag=1;
}
if(TI) //发送完1字节数据
{
字符串函数连接 TI=0;
Sending=0; //清正在发送标志
}
}
/****************************************************
函数功能:往串口发送字符串数据
入口参数:无
返 回:无
备 注:将数组中的数一个个发送到电脑串口
*****************************************************/
void UartPutString()
{
uchar j=0;
uchar x;
uint num;
if(flag==1)
{
flag=0; //判断电脑是否有发送数据出来,有的话就将标志位置0
}
num++;
if(num==10000&&flag==0)
//如果延时一段时间后,标志位还是为0,说明没有接收到数据,可以进行数据输出
{
num=0;
for(x=0;x<i;x++) //i变量是接收到的字节数
{
Sending=1; //设置发送标志
SBUF=st[j++];
//将数组中的数据写入到串口缓存,让电脑串口显示出来
if(j==i)j=0; //如果输出的字符完毕,将j清0
while(Sending); //等待发送完毕
}
i=0; //将接收字符数清0,等待下次接收
}
}
main()
{
InitUART();
while(1)
{
UartPutString();
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论