关于KEIL C不用调用随机函数rand(),求解决办法

daibolang 2011-08-19 10:35:51
#include <stdlib.h>
#include <stdio.h> /* for printf */

void tst_rand (void) {
int i;
int r;
UINT8 *str = "2536";
for (i = 0; i < 10; i++) {
r = rand(); // 调试不能跳到下一步。
printf ("I = %d, RAND = %d\n", i, r);

}
}

从汇编代码切实出现问题,跳到初始位置。
20: r = rand();
C:0x3972 120000 LCALL C:0000
C:0x3975 90027B MOV DPTR,#0x027B
C:0x3978 EE MOV A,R6
C:0x3979 F0 MOVX @DPTR,A
C:0x397A A3 INC DPTR
C:0x397B EF MOV A,R7
C:0x397C F0 MOVX @DPTR,A

编译窗口的信息
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: RAND
MODULE: .\Main.obj (MAIN)
ADDRESS: 3973H

请问各位应该如何解决,谢谢
...全文
981 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Great_Bug 2011-08-20
  • 打赏
  • 举报
回复
要排除文件损坏和丢失问题...
Great_Bug 2011-08-20
  • 打赏
  • 举报
回复
库有问题....
daibolang 2011-08-20
  • 打赏
  • 举报
回复
谢谢各位,问题已经解决了!
不是头文件也不是库问题,主要是我有包含了一个rand.c、rand.h的文件,里面只是调用rand的函数而已。没有其它定义。将这文件名修改为其它就可以啦!
schlafenhamster 2011-08-19
  • 打赏
  • 举报
回复
还是没连接
REFERENCE MADE TO UNRESOLVED EXTERNAL
重建工程试试,
daibolang 2011-08-19
  • 打赏
  • 举报
回复
没有错误,有警告:
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: RAND
MODULE: .\Main.obj (MAIN)
ADDRESS: 3973H
schlafenhamster 2011-08-19
  • 打赏
  • 举报
回复
编译没错误,没报警?
daibolang 2011-08-19
  • 打赏
  • 举报
回复
芯片是C8051F500芯片。51CPU.
schlafenhamster 2011-08-19
  • 打赏
  • 举报
回复
是不是51CPU?
daibolang 2011-08-19
  • 打赏
  • 举报
回复
是调用了函数
schlafenhamster 2011-08-19
  • 打赏
  • 举报
回复
调用:tst_rand (void)
daibolang 2011-08-19
  • 打赏
  • 举报
回复
没有优化它。我试过还是不行
daibolang 2011-08-19
  • 打赏
  • 举报
回复
我调用了这个函数rand().编译器就是不生成
schlafenhamster 2011-08-19
  • 打赏
  • 举报
回复
调用一下看看,是不是优化掉了
daibolang 2011-08-19
  • 打赏
  • 举报
回复
是的,没调用,不知为什么,我看了工程设置是没有问题的
schlafenhamster 2011-08-19
  • 打赏
  • 举报
回复
没调用?
daibolang 2011-08-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 schlafenhamster 的回复:]

该函数声明在: #include <stdlib.h>
查看.M51文件有:
E:\KEIL\C51\LIB\C51S.LIB (RAND)
[/Quote]
在我那个工程里的M51没有这个。。
但我的KEIL目录可以找到这个库文件。

假如我单独一个简单的工程文件,只产生一个随机数是没有问题的
在M51文件可以看到
C:\KEIL\C51\LIB\C51L.LIB (RAND)
schlafenhamster 2011-08-19
  • 打赏
  • 举报
回复
该函数声明在: #include <stdlib.h>
查看.M51文件有:
E:\KEIL\C51\LIB\C51S.LIB (RAND)
daibolang 2011-08-19
  • 打赏
  • 举报
回复
那应该怎么解决呢?
schlafenhamster 2011-08-19
  • 打赏
  • 举报
回复
RAND 函数没有连接
lbing7 2011-08-19
  • 打赏
  • 举报
回复
我印象中随机数函数是在数学库里面的

你明显没有包含那个头文件

其它关于51中用随机数的方法,完全可以让定时器跑起来,然后,用到随机数的时候,直接去取定时器寄存器的值即可
LCD1602液晶实验例程C51单片机KEIL工程源码文件10个合集: 1602LCD串行方式显示 1602LCD显示字符A 1602LCD简单时钟显示实验 1602LCD计数显示实验 1602从右到左移动显示字符实验 LCD1602 滚动显示 LCD1602 移动显示C LCD1602显示Welcome LCD循环右移显示Welcome to China LCD液晶时钟程序 LCD随机数字显示 /***************************************************** 函数功能:主函数 ***************************************************/ void main(void) { unsigned char i; //定义变量i指向字符串数组元素 unsigned int x; //定义变量,储存检测结果 unsigned char D1,D2,D3,D4,D5; //分别储存采集的个位、十位、百位、千位和万位数字 LcdInitiate(); //调用LCD初始化函数 delay(10); //延时10ms,给硬件一点反应时间 WriteAddress(0x02); // 从第1行第3列开始显示 i = 0; //指向字符数组的第1个元素 while(string[i] != '\0') { WriteData(string[i]); i++; //指向下字符数组一个元素 } while(1) //无限循环 { x=rand(); //模拟数据采集 D1=x%10; //计算个位数字 D2=(x%100)/10; //计算十位数字 D3=(x%1000)/100; //计算百位数字 D4=(x%10000)/1000; //计算千位数字 D5=x/10000; //计算万位数字 WriteAddress(0x45); // 从第2行第6列开始显示 WriteData(digit[D5]); //将万位数字的字符常量写入LCD WriteData(digit[D4]); //将千位数字的字符常量写入LCD WriteData(digit[D3]); //将百位数字的字符常量写入LCD WriteData(digit[D2]); //将十位数字的字符常量写入LCD WriteData('.'); //将小数点的字符常量写入LCD WriteData(digit[D1]); //将个位数字的字符常量写入LCD for(i=0;i<4;i++) //延时1s(每1s采集一次数据) delay(250); //延时250ms } }

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧