最近需要用到单片机随机数,但是用rand()产生的随机数,发现每次单片机上电时产生的随机数都是一样的,没有实现真正的随机数。查资料发现要用到srand(t)产生一个随机种子,同样获取随机种子的时候也需要一个随机信号,随机信号可以通过系统时间或者悬空的AD引脚产生。但是对于单片机来说每次上电后系统时间都是一样的,所以每次上电产生的随机数也是一样的。也可以读取悬空的AD引脚值,这样每次读取AD的值是随机的,用这个产生随机数是可行的。但是由于条件限制没有悬空的AD引脚可以用。难道就没有更简单的方式实现每次上电都产生不同的随机数吗?突然想到了每次上电时单片机内存中有些地址的值是随机的,那么能不能每次一上电就去读内存中的值,然后用这些值去产生随机种子。然后写了一段测试代码,测试发现这种方法果然可行。可以实现单片机上电产生随机数,每次上电产生的随机数都不同。
测试用的是STM8S003单片机。
测试代码如下:
#include "iostm8s103F3.h"
#include "stdlib.h"
void main(void)
{
u8 tem = 0;
//系统初始化
srand(* ( u16 * ) ( 0x000008 )); //直接读取内存地址的值,当做随机种子
tem = rand() % 10; //产生0--9随机数
}