单片机串口发送的数据一直是00;求解
3个回答
展开全部
由于你说的不详细,也不知道你晶振是多少,单片机是什么型号,波特率是多少。也才不清楚你单片机串口的数据是否是一直有用的。我就大概说一下,你可以参考:
第一:如果串口的数据是在你需要的时候才有用,这样你可以在需要的地方打开串口中断,在中断中判断接收的是不是所用串口数据的最后一个字节,如果是那么就关闭中断,如果不是那么就就会继续接收。这样会提高串口和单片机的工作效率。
第二:如果串口数据是必须接收的,那么1楼和2楼所说的就不可以了,其实正常的处理中断就可以了,只要注意中断的优先级就好。串口处理占用的时间其实不是你想的那么多,我不防给你算一下:假设波特率是9600b/s,晶振8m,至于单片机什么类型就不去假设了,毕竟太多了。
串口数据8b一个字节,那么9600的波特率1s传播的次数也就是9600b/s/8b每次=1200次每秒,这个能理解吧。那么中断的时间间隔也就是1s/1200次每秒=0.83ms。再看单片机的处理速度,8m晶振(不算大吧),运行每条指令的时间基本上是1s/8m=0.125us,(就算是51单片机,处理周期是晶振周期的12倍,那每条指令的时间周期也不过是1点几微秒),通过数据你看,一次中断单片机能处理上千条指令,所以不会出现你想的它只是在接收数据,其他什么也许不干的情况。你所要做的就是如果有其他中断,处理好中断的优先级,哪些中断重要,需要优先处理之类的事情即可。
你不会存在误区吧,认为一直有数据,就一直在中断中吧,它接收是一个字节一个字节的。一个字节一中断。
楼上说的定时器你还是不要考虑了,需要多少次数不定,处理定时器中断后还要在处理串口,耽误的时间会更多。而且可靠性不高,串口一直传输数据的项目我做过,正常处理就不会出问题
第一:如果串口的数据是在你需要的时候才有用,这样你可以在需要的地方打开串口中断,在中断中判断接收的是不是所用串口数据的最后一个字节,如果是那么就关闭中断,如果不是那么就就会继续接收。这样会提高串口和单片机的工作效率。
第二:如果串口数据是必须接收的,那么1楼和2楼所说的就不可以了,其实正常的处理中断就可以了,只要注意中断的优先级就好。串口处理占用的时间其实不是你想的那么多,我不防给你算一下:假设波特率是9600b/s,晶振8m,至于单片机什么类型就不去假设了,毕竟太多了。
串口数据8b一个字节,那么9600的波特率1s传播的次数也就是9600b/s/8b每次=1200次每秒,这个能理解吧。那么中断的时间间隔也就是1s/1200次每秒=0.83ms。再看单片机的处理速度,8m晶振(不算大吧),运行每条指令的时间基本上是1s/8m=0.125us,(就算是51单片机,处理周期是晶振周期的12倍,那每条指令的时间周期也不过是1点几微秒),通过数据你看,一次中断单片机能处理上千条指令,所以不会出现你想的它只是在接收数据,其他什么也许不干的情况。你所要做的就是如果有其他中断,处理好中断的优先级,哪些中断重要,需要优先处理之类的事情即可。
你不会存在误区吧,认为一直有数据,就一直在中断中吧,它接收是一个字节一个字节的。一个字节一中断。
楼上说的定时器你还是不要考虑了,需要多少次数不定,处理定时器中断后还要在处理串口,耽误的时间会更多。而且可靠性不高,串口一直传输数据的项目我做过,正常处理就不会出问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
……
TMOD|=0x20;
SCON=0x50;
TH0=0xfd;
//波特率9600--应该是TH1
TL0=0xfd;
--------应该是TL1
TR1=1;
ES=0;
---------
另外:
SBUF=read0832(0);--数据来自read0832()
而:
……
//读取结束
……
if(data1==data2)
//相等时
return(data2)
;//才返回值
}
那么,不相等时,函数返回的,是什么?
SBUF=read0832(0),你所发送的,究竟是什么?
TMOD|=0x20;
SCON=0x50;
TH0=0xfd;
//波特率9600--应该是TH1
TL0=0xfd;
--------应该是TL1
TR1=1;
ES=0;
---------
另外:
SBUF=read0832(0);--数据来自read0832()
而:
……
//读取结束
……
if(data1==data2)
//相等时
return(data2)
;//才返回值
}
那么,不相等时,函数返回的,是什么?
SBUF=read0832(0),你所发送的,究竟是什么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
/*串口初始化*/
void
UART_int()
{
TMOD|=0x20;
SCON=0x50;
TH1=0xfd;
//这是TH1,你写成TH0啦
TL1=0xfd;//这是TL1
TR1=1;
ES=0;
}
/*定时中断*/这个中断程序顺序不对
void
T0_time()interrupt
1
{
TH0=(65536-500000)/256;
//放在第一条
TL0=(65536-500000)%256;
//
if(TI!=0)这都删掉,定时器中断怎么能判断TI呢?
//{
//TI=0;
//delayms(50);
//}
SBUF=read0832(0);
while(TI!=0);//用查询法发送
TI=0;
}
void
UART_int()
{
TMOD|=0x20;
SCON=0x50;
TH1=0xfd;
//这是TH1,你写成TH0啦
TL1=0xfd;//这是TL1
TR1=1;
ES=0;
}
/*定时中断*/这个中断程序顺序不对
void
T0_time()interrupt
1
{
TH0=(65536-500000)/256;
//放在第一条
TL0=(65536-500000)%256;
//
if(TI!=0)这都删掉,定时器中断怎么能判断TI呢?
//{
//TI=0;
//delayms(50);
//}
SBUF=read0832(0);
while(TI!=0);//用查询法发送
TI=0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询