单片机产生随机数

2019-04-14 19:40发布

最近需要用到单片机随机数,但是用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随机数   }