本文主要介绍了在单片机中生成随机数的两种方法,适用于需要随机数据的嵌入式系统设计。
方法一:定时器直接随机取值
这种方法利用单片机内部的定时器来获取“随机”数。当按键被按下时,定时器的当前值(TL0和TH0)被读取并赋值给变量,作为随机数。由于定时器的计数值基于系统时钟,其变化有一定的规律性,因此这种方法得到的“随机”数其实并不具备真正的随机性,只是看起来比较随机。
代码示例:
```c
#include<reg51.h>
sbit k1 = P1^0;
void delay(unsigned int i) {...}
unsigned int sum1, sum2;
unsigned char led[11] = {...};
void init() interrupt 1 { TH0 = 0X00; TL0 = 0X00; }
void display() {...}
void main() {
TMOD = 0X01;
TH0 = 0X00; TL0 = 0X00;
EA = 1; ET0 = 1; TR0 = 1;
while (1) {
if (k1 == 0) { while (k1 == 0); sum1 = TL0; sum2 = TH0; }
display();
}
}
```
方法二:用定时器加rand()随机函数
这种方法是在单片机上电后,通过按键启动随机数生成。为了避免每次上电时得到相同的随机数,需等待用户按键触发。生成0到9之间的不重复随机数,程序会检查新生成的随机数是否与之前生成的数相同,如果不同则存入数组,否则重新生成。这里需要用到标准库中的rand()函数,该函数需要初始化,通常通过srand()函数结合一个种子(如系统时间)来实现。
代码示例:
```c
#include<reg52.h>
#include<stdlib.h> // 包含rand()随机函数的头文件
unsigned char t, k, i, j, a, f, n[10]; // t是计时变量,k是按键标志,i是数组下标,f是随机数重复标志,n[10]是存放随机数的数组
void init() // 初始化函数
{
t = 0;
i = 0;
f = 0;
k = 0;
TMOD = 0x...
}
void main() {
srand(time(0)); // 使用系统时间作为种子初始化随机数生成器
...
while (1) {
if (k == 1) {
t++;
if (t >= 100 && f == 0) {
k = 0;
a = rand() % 10;
for (j = 0; j < i; j++) {
if (a == n[j]) {
f = 1;
break;
}
}
if (f == 0) {
n[i++] = a;
f = 0;
}
}
}
...
}
}
```
这两种方法各有优缺点,第一种方法简单但随机性较差,第二种方法虽然更随机但需要额外处理避免重复。在实际应用中,可以根据对随机性的需求以及系统资源的限制选择合适的方法。