单片机生成随机数:定时器法与rand()函数实现

需积分: 50 46 下载量 154 浏览量 更新于2024-09-13 2 收藏 47KB DOC 举报
本文主要介绍了在单片机中生成随机数的两种方法,适用于需要随机数据的嵌入式系统设计。 方法一:定时器直接随机取值 这种方法利用单片机内部的定时器来获取“随机”数。当按键被按下时,定时器的当前值(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; } } } ... } } ``` 这两种方法各有优缺点,第一种方法简单但随机性较差,第二种方法虽然更随机但需要额外处理避免重复。在实际应用中,可以根据对随机性的需求以及系统资源的限制选择合适的方法。