当今互联网时代,很多网游和手游、大数据网站都需要到随机发生器,我们需要先了解真随机的逻辑需要计算的数据模型非常大,目前真正意义上随机的模式是原子核上面随机出现的电子。所以市面上出现的算法都是伪随机。
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 中当前数字的数字驱动模式。
,