當今網際網路時代,很多網遊和手遊、大資料網站都需要到隨機發生器,我們需要先了解真隨機的邏輯需要計算的資料模型非常大,目前真正意義上隨機的模式是原子核上面隨機出現的電子。所以市面上出現的演算法都是偽隨機。
DIY隨機數發生器(偽隨機)
本文展示了一個使用 8051 的隨機數生成器,它顯示 0 到 99 之間的隨機數。電路本身非常簡單,在嚴肅的嵌入式專案中可能找不到任何應用,本文只是一個說明。該電路基於 AT89S51 微控制器、兩個七段 LED 顯示器、兩個電晶體和少量無源元件。
電路圖
·微控制器 (AT89S51) – 1 個
·按鈕開關 – 2 個
·7 段顯示 – 2 個
·電晶體 (2N2222) – 2 個
·電阻器(100 歐姆)– 10 個
·電阻器 (8.2k ohm) – 1 個
·電阻器 (10k ohm) – 1 個
·電容器 (10uF/10V) – 2 個
在職的
兩個七段LED顯示屏複用在一起,它們的資料線連線到微控制器的Port0。電晶體 Q1 和 Q2 驅動相應的顯示器 D1 和 D2。那裡的電晶體的驅動訊號是從P1.1 和P1.2 獲得的。按鈕開關S1、電容C1和電阻R10組成去抖復位電路。每當按下 S2 時,電阻器 R9、電容器 C2 和按鈕開關 S2 將在 INTO (pin12) 處提供低電平有效硬體中斷訊號。這裡 R9 和 C2 也用於去抖動。
開機後顯示屏會顯示空白,按下按鈕 S2 時顯示屏會顯示 0 到 99 之間的隨機數。再次嘗試時,您必須按下復位開關,然後再按下 S2。如果您只需要一個數字設定,則移除顯示器 D2 及其相關元件。其他一切都是一樣的。
程式
ORG 000H
SJMP MAIN
ORG 003H // sets the starting address for the ISR
ACALL ISR // calls the ISR subroutine when S2 is pressed
RETI // return from interrrupt
MAIN:SETB IP.0 // this part sets the initial conditions
SETB TCON.0
SETB IE.0
SETB IE.7
MOV P0,#00000000B
MOV P1,#00000000B
MOV DPTR,#LUT // moves the starting address of LUT to DPTR
LABEL:MOV R6,#99D // this part generates the random number
LOOP:MOV A,R6
DJNZ R6,LOOP
SJMP LABEL
ISR: MOV A,R6 // Subroutine ISR displays the current random number
MOV B,#10D
DIV AB
SETB P1.2
ACALL DISPLAY
MOV P0,A
ACALL DELAY
MOV A,B
CLR P1.2
SETB P1.1
ACALL DISPLAY
MOV P0,A
ACALL DELAY
CLR P1.1
SJMP ISR
RET
DELAY: MOV R3,#02H // this subroutine creates 1mS delay for switching the displays
DEL1: MOV R2,#0FAH
DEL2: DJNZ R2,DEL2
DJNZ R3,DEL1
RET
DISPLAY: MOVC A,@A+DPTR // produces the digit drive pattern for the current digit in A
RET
LUT: DB 3FH // Look up table
DB 06H
DB 5BH
DB 4FH
DB 66H
DB 6DH
DB 7DH
DB 07H
DB 7FH
DB 6FH
END
關於節目
程式的第一部分是標記為 MAIN 的部分,它設定初始條件和中斷引數。下一部分是名為 LABEL 的迴圈,它將 99D 載入到暫存器 R6,然後將其遞減 1 直到 0,然後再次重複迴圈。這是生成隨機數的部分。每次 R6 遞減,結果值被移到累加器 A。下一部分是中斷服務程式,它被編寫為名為 ISR 的子程式。每當 INT0 出現中斷(按下按鈕 S2)時,就會呼叫 ISR。
ISR 對 A 的內容執行必要的數學操作,以便拆分出兩個數字,然後繼續將其顯示在顯示器上。子程式 DELAY 為切換顯示產生大約 1ms 的延遲。子程式 DISPLAY 將 A 中的當前值與 DPTR 中儲存的地址(LUT 的起始地址)相加,並將目標內容移動到 A。結果將是 A 中當前數字的數字驅動模式。