在单片机程序设计的时候有时候需要产生一个随机数,但是C语言库函数里面的随机数生成函数是伪随机数,rand()函数会根据srand()函数设置的随机数种子产生一个随机数,也就是说若随机数种子一样的话每次产生的随机数也是一样的,在PC机编程里面一般都是用系统的时间来作为随机数种子,这样就可以产生不同的随机数,但是单片机系统中一般很少有时间,所以这种办法不可行,但是一般单片机都有ADC转换器,ADC采集的电压一般都不会完全一样,如果ADC输入悬空的话一般都是白噪声数据信号,所以可以根据这个信号来作为随机数的种子,这样产生出来的数据就是真正的随机数。下面是产考程序设计。
/**
* @brief 通过ADC采集的电压值作为随机数种子产生一个随机数
* @param maxValue 随机数最大值
* @retval 随机数
*/
int32_t Random(int32_t maxValue)
{
int32_t seed,random;
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开始ADC转换
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)!=SET);//等待转换完毕
seed = ADC_GetConversionValue(ADC1);//获取ADC值
printf("seed = %d\n\r",seed);
srand(seed);//设置随机数种子
random = rand()%maxValue;//产生一个随机数,并将返回值限定在maxValue范围内
printf("random = %d\n\r",random);
return random;
}
|