跳到主要内容

使用 8051 的随机数生成器

在本项目中,我将解释使用 8051 单片机的随机数生成器的电路与工作原理,即如何使用 8051 单片机生成随机数。

本项目在按下按钮时生成 0 到 100 之间的随机数。该项目是一个简单的演示项目,在嵌入式项目中可能没有太多实际应用。项目的目的是展示随机数生成过程。

1. 使用 8051 的随机数生成器电路原理

随机数生成器是一种物理设备,当按下按钮时可在一定范围内随机生成数字。在本项目中,当按下连接到 P3.0 的按钮时,LCD(液晶显示器)显示随机数。

在本项目中,计数器以高速从 0 增加到 99。如果按下按钮,LCD 显示当前的计数值。由于计数高速递增,8051 单片机会在按钮按下时选择一个随机数。

2. 使用 8051 的随机数生成器电路图

电路图如下所示:

alt text

3. 所需元件

  • AT89C51 (8051 单片机)
  • 8051 编程器
  • 编程电缆
  • 5V 电源
  • 16×2 字母数字 LCD
  • 陶瓷电容 – 33pF × 2
  • 11.0592 MHz 晶振
  • 按钮 × 3
  • 电解电容 – 10μF, 16V
  • 电阻 10kΩ (1/4 瓦) × 2
  • 电阻 330Ω (1/4 瓦) × 2
  • 电位器 10kΩ
  • 1kΩ × 8 电阻包
  • 连接线

4. 使用 8051 的随机数生成器电路设计

该电路使用 8051 单片机、16×2 字母数字 LCD 显示屏、按钮以及少量被动元件。主要组件是 AT89C51 单片机。

在电路中,两个按钮连接到 P3.0 和 P3.1,其中一个按钮(随机数生成 – P3.0)用于生成随机数,另一个按钮(RST – P3.1)用于复位计数。

LCD 数据引脚连接到单片机的 PORT2,控制引脚 RS、RW、En 分别连接到 P2.0、GND 和 P2.1。LCD 以 8 位模式连接,因此需要使用所有数据引脚。

10kΩ 电阻、10μF 电容和按钮组成 8051 单片机的复位电路。两个 33pF 电容与 11.0592 MHz 晶体振荡器一起,为 8051 单片机提供时钟信号。

LCD 的 VEE 引脚连接了一个 10kΩ 电位器,用于调节对比度。通过调节电位器阻值,可改变 LCD 的对比度或亮度。

注意:若想减少 LCD 数据线,可使用 4 位模式。

alt text
alt text
alt text

5. 程序编写方法

程序编写步骤如下:

  1. 定义整数类型的计数变量,并初始化 LCD 为 8 位模式
  2. 使用无限 while 循环重复程序
  3. 在循环中,使用另一个 while 循环将整数值递增,直到按钮被按下
  4. 计数器从 0 递增到 99,当计数达到 100 时归零,重复过程
  5. 按下按钮时,计数停止,当前值显示在 LCD 上

若需扩展随机数上限,可在程序中稍作修改。使用 LCD 时可轻松扩展上限,而使用两个七段显示器时需增加七段显示器数量。

程序代码

#include<reg51.h>
#define lcd P0

sbit rs=P2^0;
sbit e=P2^1;
sbit sw=P3^0;
sbit rst=P3^1;

unsigned int i=0;

void delay (int);
void display (unsigned char);
void cmd (unsigned char);
void string (char *);
void init (void);
void int_lcd(unsigned int);

void delay (int d)
{
unsigned char i=0;
for(;d>0;d--)
{
for(i=250;i>0;i--);
for(i=248;i>0;i--);
}
}

void cmd (unsigned char c)
{
lcd=c;
rs=0;
e=1;
delay(5);
e=0;
}

void display (unsigned char c)
{
lcd=c;
rs=1;
e=1;
delay(5);
e=0;
}
void string (char *p)
{
while(*p)
{
display(*p++);
}
}

void init (void)
{
cmd(0x38);
cmd(0x0c);
cmd(0x01);
cmd(0x80);
}

void int_lcd(unsigned int n)
{
char a[4]={0},i=0;
if(n==0)
{
display('0');
return;
}
else
{
while(n>0)
{
a[i++]=(n%10)+48;
n/=10;
}
for(--i;i>=0;i--)
{
display(a[i]);
}
}
}

void main()
{
sw=1;
rst=1;
init();
cmd(0x80);
string(" Random Number ");
cmd(0xc0);
string(" Generator ");
delay(2000);
cmd(0x01);
while(1)
{
cmd(0x80);
string("Press the button");
while(sw!=0)
{
i=++i;
if(i==100)
i=0;
}
cmd(0x80);
string("RAND NUM: ");
cmd(0x8a);
int_lcd(i);
while(rst!=0);
}
}

6. 使用方法

  1. 在 Keil μVision 软件中编写随机数生成程序并生成 hex 文件
  2. 使用 8051 编程器将 hex 文件烧录到 AT89C51 单片机
  3. 按电路图连接线路
  4. 确保电路供电为 5V DC
  5. 开启电源,LCD 显示 “Random Number Generator”
  6. 按下按钮生成随机数,LCD 显示生成的随机数
  7. 按下 RST 按钮(P3.1)可重新生成随机数
  8. 重复以上步骤,直到关闭电源

7. 电路应用

  • 在需要生成随机数的应用中使用
  • 用于噪声生成器
  • 可作为传统骰子替代品,用于 Monopoly、蛇梯棋等游戏