STM32F103 軟體配置亂數Rand()
個人總結:在做畢設 “智能快遞柜” 的時候使用到了亂數的配置來產生一個取件碼,因為使用的主控為STM32F103C8T6,沒有硬體亂數,所以需要自己通過軟體配置,
問題關鍵:
rand函式在產生亂數前,需要系統提供的生成偽亂數序列的種子,rand根據這個種子的值產生一系列亂數,如果系統提供的種子沒有變化,每次呼叫rand函式生成的偽亂數序列都是一樣的,srand(unsigned seed)通過引數seed改變系統提供的種子值,從而可以使得每次呼叫rand函式生成的偽亂數序列不同,從而實作真正意義上的"隨機",通常可以利用系統時間來改變系統的種子值,即srand(time(NULL)),可以為rand函式提供不同的種子值,進而產生不同的亂數序列,
.
.在Keil中 我們無法像C語言一樣獲取本機的時間,所以我們只能通過將時間變數轉換為其他的動態變數.
下面便是我在配置程序中 使用的思路,
1、C語言上的使用配置
首先用C語言實作一個亂數的配置功能,其代碼如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
//=======================用亂數配置一個四位的隨機密碼===================//
//
// rand() :產生一個亂數
//
// Time(0):是得到當前時時間值
//
// srand(time(0)): 就是給這個演算法:rand()一個啟動種子,也就是演算法的隨機種子數,有
// 這個數以后才可以產生亂數,用1970.1.1至今的秒數,初始化亂數種子,
int main()
{
int a;
int i;
char arry[10];
char arry1[10] = {"\0"};
srand(time(0)); //獲得隨機種子庫的動態變化
for(i=0;i<4;i++)
{
a = rand()%9; //生成隨機種子
printf("%d\r\n",a);
sprintf(arry,"%d",a);
strcat(arry1,arry); //字串連接
}
printf("%s\r\n",arry1);
return 0;
}
2、Keil上的使用配置
在Keil上 我們通過呼叫C的庫函式,不過就是沒有了time(0)這個獲取時間的功能了,我們將time(0)換成一個其他的動調值去代替,那么我們為了能獲取一個處于動態的變化量,我們可以想到至少有兩個方法,
Keil上的使用配置:
其一,通過系統的定時器,生成一個時間引數,這是個動態的;
其二,通過測量AD,電壓值也是一個不斷變化的值,
我這里只用到了方法一,定時器來配置亂數,
下面是代碼:
·random.c
//===================================用亂數配置一個四位的隨機密碼===============================//
//
// rand() :產生一個亂數
//
// srand(seed): seed必須是一個動態變數,這樣才能確保每次的隨機種子不一樣
//
// seed 可以用定時器做一個us累加的動態變數,也可以用ADC的電壓檢測值(引腳可以設定為懸空)
//
//===============================================================================================//
#include "random.h"
#include "stdlib.h" //==用于產生真亂數
#include "string.h" //==用于連接字串
#include "usart.h"
#include "key.h"
extern u32 time_us; //用定時器提供一個動態變數
u8 seed[10] = {"\0"}; //種子字串,用作快遞取件碼
//---------------------------------------------------
//
// 功 能: 亂數種子配置
// 入口引數: n:幾位亂數
// 回傳值 :
//
//---------------------------------------------------
void rand_seed(u8 n)
{
int a,i;
char arry[5];
char arry1[5] = {"\0"};
if(first) //只執行一次
{
first = 0;
srand(time_us); //提供亂數種子
}
for(i=0;i<n;i++)
{
a = rand()%9; //產生亂數
printf("%d\r\n",a);
sprintf(arry,"%d",a);
strcat((char *)arry1,arry); //將亂數種子連接為字串
}
}
那么我們便可以通過串口去列印發現,在不使用 srand(time_us); 或者把 time_us 設定成一個常量的時候,我們會發現rand() 所列印的值是不會變化的,反之則是可以的,這里就不展示串口的截圖了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282377.html
標籤:其他
上一篇:STM32F103五分鐘入門系列(二)GPIO的七大暫存器+GPIOx_LCKR作用和配置(全網找不到【狗頭】)
