打印

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

[复制链接]
2414|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

使用特权

评论回复
5
xbyu520|  楼主 | 2014-4-1 08:45 | 只看该作者
各位来看看啊

使用特权

评论回复
6
ningling_21| | 2014-4-1 08:49 | 只看该作者
TI=0;

SBUF= X;

while(TI==0);

TI=0;

使用特权

评论回复
评论
xbyu520 2014-4-1 12:04 回复TA
您的建议也很好(我已经在代码里采纳),可以提高单片机发送效率,代码效率。但没找到发送错误的原因 
7
ayb_ice| | 2014-4-1 09:25 | 只看该作者
还有可能是参数错误

注意临界代码问题

使用特权

评论回复
8
xbyu520|  楼主 | 2014-4-1 09:33 | 只看该作者
ayb_ice 发表于 2014-4-1 09:25
还有可能是参数错误

注意临界代码问题

临界代码问题?请问是什么意思?time值肯定没有溢出啊。60毫秒中断一次,要溢出要很长时间的

使用特权

评论回复
9
ayb_ice| | 2014-4-1 09:41 | 只看该作者
xbyu520 发表于 2014-4-1 09:33
临界代码问题?请问是什么意思?time值肯定没有溢出啊。60毫秒中断一次,要溢出要很长时间的 ...

与计数器飞读类似

使用特权

评论回复
10
xbyu520|  楼主 | 2014-4-1 10:22 | 只看该作者
ayb_ice 发表于 2014-4-1 09:41
与计数器飞读类似

更不懂了,

使用特权

评论回复
11
ayb_ice| | 2014-4-1 11:10 | 只看该作者
LS正确


void uart_long_send(tep1)

void uart_long_send(unsigned long tep1)

使用特权

评论回复
12
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写在函数外面不行呢。

使用特权

评论回复
13
xbyu520|  楼主 | 2014-4-1 12:01 | 只看该作者
ayb_ice。再次感谢你!!!

使用特权

评论回复
14
xbyu520|  楼主 | 2014-4-1 12:05 | 只看该作者
ningling_21,您的建议也很好(我已经在代码里采纳),可以提高单片机发送效率,代码效率。但没找到发送错误的原因

使用特权

评论回复
15
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位的长度

明白

使用特权

评论回复
16
xyz549040622| | 2014-4-1 14:51 | 只看该作者
楼主要明白形参和实参是怎么回事

使用特权

评论回复
17
yklstudent| | 2014-4-1 16:28 | 只看该作者
楼主这个发送数据函数效率高体现在哪里?

使用特权

评论回复
18
yklstudent| | 2014-4-2 07:30 | 只看该作者
yyy71cj 发表于 2014-4-1 20:54
这年头真是世风日下,人心不古呀,谢这个谢那个不知道感谢我呀?LS正确是什么意思不知道吗? ...

正确不正确我不管 我就想知道效率高体现在何处?
你既然这么说,肯定知道,麻烦就解答下呗

使用特权

评论回复
19
xbyu520|  楼主 | 2014-4-2 08:22 | 只看该作者
ayb_ice 发表于 2014-4-1 13:32
函数体内的tep1实际是局部变量,与外面的那个tep1没有关系

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

哦,是这样啊。那实际上就是变量作用域的事情了。等有时间用仿真器好好详细看下。c语言水也很深啊

使用特权

评论回复
20
xbyu520|  楼主 | 2014-4-2 08:26 | 只看该作者
yyy71cj 发表于 2014-4-1 20:54
这年头真是世风日下,人心不古呀,谢这个谢那个不知道感谢我呀?LS正确是什么意思不知道吗? ...

您的指教也很好(虽然没有指出tep1变量看似长整型,实际上是unsigned int型)。代码风格好。谢谢指教!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

43

主题

853

帖子

5

粉丝