关于c8051f发送unsigned long 型数据问题

[复制链接]
3168|20
 楼主| xbyu520 发表于 2014-4-1 08:34 | 显示全部楼层 |阅读模式
c8051f单片机内部用中断的方式计时,60毫秒进中断一次,每次进中断,unsigned long型time变量加一。用仿真器仿真时,time值显示正确。但是发返回指令0xfc指令给单片机UART串口时,返回的time值在超过65535时,返回错误了。(65535以内返回的数据是正确的。)比如time值仿真器显示的是0x00012fb8  uart串口显示的是0xffff2fb8 波特率设置成2400bps。波特率应该没有问题。下面是uart发送函数
unsigned long tep1;                  //tep1ÊÇÐÎʽ²ÎÊý¡£¼ò³ÆÐβÎ
unsigned char j5,j6;
void uart_long_send(tep1)         // ·¢Ëͳ¤ÕûÐÍÊý¾Ý
{
       
        SBUF0=(tep1>>24);
        for(j5=0;j5<=60;j5++)                                 //¶ÌÔÝÑÓʱ£¬²»ÖªÊÇ·ñÐèÒª
        for(j6=0;j6<=100;j6++);
       
        SBUF0=(tep1>>16);
        for(j5=0;j5<=60;j5++)                                 //¶ÌÔÝÑÓʱ£¬²»ÖªÊÇ·ñÐèÒª
        for(j6=0;j6<=100;j6++);
       
        SBUF0=(tep1>>8);
        for(j5=0;j5<=60;j5++)                                 //¶ÌÔÝÑÓʱ£¬²»ÖªÊÇ·ñÐèÒª
        for(j6=0;j6<=100;j6++);
       
        SBUF0=tep1;
        for(j5=0;j5<=60;j5++)                                 //¶ÌÔÝÑÓʱ£¬²»ÖªÊÇ·ñÐèÒª
        for(j6=0;j6<=100;j6++);
       
}
wolension 发表于 2014-4-1 08:41 | 显示全部楼层
void uart_long_send(tep1)?
void uart_long_send(unsigned long tep1)?
void uart_long_send(unsigned short tep1)?
void uart_long_send(unsigned char tep1)?
 楼主| xbyu520 发表于 2014-4-1 08:43 | 显示全部楼层
楼上说的是声明吗?这个函数只能用来发unsigned long 数据
 楼主| xbyu520 发表于 2014-4-1 08:43 | 显示全部楼层
我把这个函数写在一个自定义头文件里了,主函数已经#include
 楼主| xbyu520 发表于 2014-4-1 08:45 | 显示全部楼层
各位来看看啊
ningling_21 发表于 2014-4-1 08:49 | 显示全部楼层
TI=0;

SBUF= X;

while(TI==0);

TI=0;

评论

您的建议也很好(我已经在代码里采纳),可以提高单片机发送效率,代码效率。但没找到发送错误的原因  发表于 2014-4-1 12:04
ayb_ice 发表于 2014-4-1 09:25 | 显示全部楼层
还有可能是参数错误

注意临界代码问题
 楼主| xbyu520 发表于 2014-4-1 09:33 | 显示全部楼层
ayb_ice 发表于 2014-4-1 09:25
还有可能是参数错误

注意临界代码问题

临界代码问题?请问是什么意思?time值肯定没有溢出啊。60毫秒中断一次,要溢出要很长时间的
ayb_ice 发表于 2014-4-1 09:41 | 显示全部楼层
xbyu520 发表于 2014-4-1 09:33
临界代码问题?请问是什么意思?time值肯定没有溢出啊。60毫秒中断一次,要溢出要很长时间的 ...

与计数器飞读类似
 楼主| xbyu520 发表于 2014-4-1 10:22 | 显示全部楼层
ayb_ice 发表于 2014-4-1 09:41
与计数器飞读类似

更不懂了,
ayb_ice 发表于 2014-4-1 11:10 | 显示全部楼层
LS正确


void uart_long_send(tep1)

void uart_long_send(unsigned long tep1)
 楼主| xbyu520 发表于 2014-4-1 11:59 | 显示全部楼层
ayb_ice 发表于 2014-4-1 11:10
LS正确


太感谢你了!!!!!!!!!!!!! void uart_long_send(tep1)改成
void uart_long_send(unsigned long tep1)
{
函数体;
}
居然就可以了。不过有点搞不懂,为什么unsigned long tep1写在函数外面不行呢。
 楼主| xbyu520 发表于 2014-4-1 12:01 | 显示全部楼层
ayb_ice。再次感谢你!!!
 楼主| xbyu520 发表于 2014-4-1 12:05 | 显示全部楼层
ningling_21,您的建议也很好(我已经在代码里采纳),可以提高单片机发送效率,代码效率。但没找到发送错误的原因
ayb_ice 发表于 2014-4-1 13:32 | 显示全部楼层
xbyu520 发表于 2014-4-1 11:59
太感谢你了!!!!!!!!!!!!! void uart_long_send(tep1)改成
void uart_long_send(unsigned long tep1)
{

函数体内的tep1实际是局部变量,与外面的那个tep1没有关系

void uart_long_send(tep1)实际是与void uart_long_send(int tep1)等效,

int tep1在C51里是16位的长度

明白
xyz549040622 发表于 2014-4-1 14:51 来自手机 | 显示全部楼层
楼主要明白形参和实参是怎么回事
yklstudent 发表于 2014-4-1 16:28 | 显示全部楼层
楼主这个发送数据函数效率高体现在哪里?
yklstudent 发表于 2014-4-2 07:30 | 显示全部楼层
yyy71cj 发表于 2014-4-1 20:54
这年头真是世风日下,人心不古呀,谢这个谢那个不知道感谢我呀?LS正确是什么意思不知道吗? ...

正确不正确我不管 我就想知道效率高体现在何处?
你既然这么说,肯定知道,麻烦就解答下呗
 楼主| xbyu520 发表于 2014-4-2 08:22 | 显示全部楼层
ayb_ice 发表于 2014-4-1 13:32
函数体内的tep1实际是局部变量,与外面的那个tep1没有关系

void uart_long_send(tep1)实际是与void uart_ ...

哦,是这样啊。那实际上就是变量作用域的事情了。等有时间用仿真器好好详细看下。c语言水也很深啊
 楼主| xbyu520 发表于 2014-4-2 08:26 | 显示全部楼层
yyy71cj 发表于 2014-4-1 20:54
这年头真是世风日下,人心不古呀,谢这个谢那个不知道感谢我呀?LS正确是什么意思不知道吗? ...

您的指教也很好(虽然没有指出tep1变量看似长整型,实际上是unsigned int型)。代码风格好。谢谢指教!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:工作不养闲人,团队不养懒人。赚不到钱赚知识,赚不到知识赚经历,赚不到经历赚阅历,让人迷茫的原因只有一

43

主题

854

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部