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

DIY随机数发生器(伪随机)

本文展示了一个使用 8051 的随机数生成器,它显示 0 到 99 之间的随机数。电路本身非常简单,在严肃的嵌入式项目中可能找不到任何应用,本文只是一个说明。该电路基于 AT89S51 微控制器、两个七段 LED 显示器、两个晶体管和少量无源元件。

电路图

随机数生成器使用原理(随机和伪随机的区别)(1)

组件列表

·微控制器 (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 中当前数字的数字驱动模式。

随机数生成器使用原理(随机和伪随机的区别)(2)

,