51单片机编程问题(串口很难将数据发送至上位机)
51单片机,定时器0每50ms中断一次,60秒置一个sflag标志位,定时器1计数方式2,作为串口波特率来源,总的来说就是每60秒通过串口发送一个a至上位机,可是串口调试...
51单片机,定时器0每50ms中断一次,60秒置一个sflag标志位,定时器1计数方式2,作为串口波特率来源,总的来说就是每60秒通过串口发送一个a至上位机,可是串口调试助手很久才能收到一两条报文,根本就没有60秒一条。。新手比较弱,请问各位大神原因出在哪里?
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count;
char miao;
uchar a=5,sflag;
void init()
{
TMOD=0x21;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=0xfd;
TL1=0xfd;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
PCON=0x80;
ET0=1;
TR0=1;
TR1=1;
}
void main()
{
init();
while(1)
{if(sflag==1)
{sflag=0;
SBUF=a;
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
miao++;
if(miao==60)
{ miao=0;
sflag=1;
}
}
}
USB转串口不稳定,所以用的波特率2400,PCON这个我在程序里已经删掉了,这里可以忽略 展开
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count;
char miao;
uchar a=5,sflag;
void init()
{
TMOD=0x21;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=0xfd;
TL1=0xfd;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
PCON=0x80;
ET0=1;
TR0=1;
TR1=1;
}
void main()
{
init();
while(1)
{if(sflag==1)
{sflag=0;
SBUF=a;
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
miao++;
if(miao==60)
{ miao=0;
sflag=1;
}
}
}
USB转串口不稳定,所以用的波特率2400,PCON这个我在程序里已经删掉了,这里可以忽略 展开
1个回答
展开全部
首先,串口波特率2400,作为串口波特率来源的定时器1计数方式2初值应为0XF4;而你的初装值
为0Xfd,且PCON中最高位又设置为1,那么波特率实为19200,
其次,PCON=0X80为波特率倍增设置,故而19200又倍增为38400。这已远远超出了51单片机的频
率范围,
第三,虽然设置了串口方式1(T1控波),但未设置串口中断(TI)。所以当发送完一个字符后,CPU并未产生中断信号,无法判断是否已发送完毕 ,故而持续等待中断的发生,造成时间上的占用,延缓了发送速度。
为0Xfd,且PCON中最高位又设置为1,那么波特率实为19200,
其次,PCON=0X80为波特率倍增设置,故而19200又倍增为38400。这已远远超出了51单片机的频
率范围,
第三,虽然设置了串口方式1(T1控波),但未设置串口中断(TI)。所以当发送完一个字符后,CPU并未产生中断信号,无法判断是否已发送完毕 ,故而持续等待中断的发生,造成时间上的占用,延缓了发送速度。
追问
中断TI确定需要吗?后来我加了一个ip0等于1,就能收到数据了,pcon我已经删掉了,定时器初始值确实设错了,谢谢
追答
应该说:设置串口中断,会让CPU的工作变得更有序。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询