单片机生成随机数:定时器法与rand()函数实现
需积分: 50 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;
}
}
}
...
}
}
```
这两种方法各有优缺点,第一种方法简单但随机性较差,第二种方法虽然更随机但需要额外处理避免重复。在实际应用中,可以根据对随机性的需求以及系统资源的限制选择合适的方法。
2012-04-25 上传
2020-10-21 上传
2021-07-10 上传
点击了解资源详情
2010-12-27 上传
2020-08-01 上传
hmg6681
- 粉丝: 1
- 资源: 4
最新资源
- 正整数数组验证库:确保值符合正整数规则
- 系统移植工具集:镜像、工具链及其他必备软件包
- 掌握JavaScript加密技术:客户端加密核心要点
- AWS环境下Java应用的构建与优化指南
- Grav插件动态调整上传图像大小提高性能
- InversifyJS示例应用:演示OOP与依赖注入
- Laravel与Workerman构建PHP WebSocket即时通讯解决方案
- 前端开发利器:SPRjs快速粘合JavaScript文件脚本
- Windows平台RNNoise演示及编译方法说明
- GitHub Action实现站点自动化部署到网格环境
- Delphi实现磁盘容量检测与柱状图展示
- 亲测可用的简易微信抽奖小程序源码分享
- 如何利用JD抢单助手提升秒杀成功率
- 快速部署WordPress:使用Docker和generator-docker-wordpress
- 探索多功能计算器:日志记录与数据转换能力
- WearableSensing: 使用Java连接Zephyr Bioharness数据到服务器