51单片机如何生成随机数?

供稿:hz-xin.com     日期:2025-01-15
求高手赐教:51单片机怎么产生随机数?

启动定时器,需要随机数时从定时器里读一个值出来当作随机数。
或者调用random()函数,不过得到的是伪随机数。

1. 绝对宏:

在程序中,用“#include<absacc.h>”即可使用其中定义的宏来访问绝对地址,包括CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD
具体使用可看一看absacc.h便知,例如:
rval=CBYTE[0x0002];指向程序存贮器的0002h地址
rval=XWORD[0x0002];指向外RAM的0002h地址

2. _at_关键字

直接在数据定义后加上_at_ const即可,但是注意:
(1)绝对变量不能被初使化;
(2)bit型函数及变量不能用_at_指定。
例如:
idata struct link list _at_ 0x40;指定list结构从40h开始。
xdata char text[25b] _at_0xE000;指定text数组从0E000H开始
提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。

用定时器加rand()随机函数来实现。

rnda=rand()%2;

rndb=rand()%3;

单片机上电之后通过按键去启动取随机数,若是单片机上电就立即取随机数的话,那每次上电随机的结果都是一样的。然后是0到9不重复的随机数,程序中用了循环来判断是否和前面取的随机数相同,相同则进入下次取随机数,不同则存入数组。 

在程序中,用“#include<absacc.h>”即可使用其中定义的宏来访问绝对地址,包括CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD

具体使用可看一看absacc.h便知,例如:

rval=CBYTE[0x0002];指向程序存贮器的0002h地址

rval=XWORD[0x0002];指向外RAM的0002h地址

_at_关键字

直接在数据定义后加上_at_ const即可,但是注意:

(1)绝对变量不能被初使化;

(2)bit型函数及变量不能用_at_指定。

例如:

idata struct link list _at_ 0x40;指定list结构从40h开始。

xdata char text[25b] _at_0xE000;指定text数组从0E000H开始

提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。

扩展资料:

统计学伪随机性。统计学伪随机性指的是在给定的随机比特流样本中,1的数量大致等于0的数量,同理,“10”“01”“00”“11”四者数量大致相等。类似的标准被称为统计学随机性。满足这类要求的数字在人类“一眼看上去”是随机的。

密码学安全伪随机性。其定义为,给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。

真随机性。其定义为随机样本不可重现。实际上只要给定边界条件,真随机数并不存在,可是如果产生一个真随机数样本的边界条件十分复杂且难以捕捉(比如计算机当地的本底辐射波动值),可以认为用这个方法演算出来了真随机数。

参考资料来源:百度百科-随机数



用定时器加rand()随机函数来实现 

单片机上电之后通过按键去启动取随机数,若是单片机上电就立即取随机数的话,那每次上电随机的结果都是一样的。然后是0到9不重复的随机数,程序中用了循环来判断是否和前面取的随机数相同,相同则进入下次取随机数,不同则存入数组。 程序如下: #include<reg52.h>  

#include<stdlib.h> //包含rand()随机函数的头文件;

 unsigned char t,k,i,j,a,f,n[10]; 

//t是计时变量,k是按键标志,i是数组下标,f是随机数重复标志,n[10]是存放随机数的数组;



计算机 只能产生伪随机数 (计算机不具有自发性) 你可以用定时器来产生伪随机数 比如事先运行定时器 然后再读定时器的值

其他的库函数SAND RAND都是伪随机数。
使用若干个一直运行的timer,作为随机源最好,不影响功耗没有多余开销。
AD也可以不过测量的源在某个时间内随机范围比较小,可以选不同的源,比如悬空的IO电平,VCC,或者内部温度,等等。
如果有外部输入可以把这个作为随机源,比如有用户按键盘,或者外部通信

1)使用外置部真随机数发生器获取;
2)自已设计一个简单的随机数算法(例如,使用ADC采样晶振引脚的电压,然后结合环境温度,程序例程间的执行跳转合成一个随机数),实用性比较好;
3)使用现成的伪随机数函数;

[请教高手]单片机怎么实现产生随机数?
2011-05-26 51单片机如何生成随机数? 34 2012-05-09 求高手赐教:51单片机怎么产生随机数? 10 2012-02-10 单片机C语言如何产生随机数 18 2010-05-27 在单片机中如何产生随机数字 2013-11-25 怎么让51单片机产生随机数? 2013-12-16 keil中如何产生随机数? 4 2012-06-11 51单片机用C语言如何产生随机...

求51单片机汇编语言取随机数子程序
一个做低8位,一个做8位就行了。在主循环程序中放如下指令:MOV A , NUMBERL INC A MOV NUBBERL, A ;保存低8位 JNZ TONEXT INC NUMBERH ;高8位加1 TONEXT: 其它指令 同样,用随机数时就从这两个单元中读取就行了。

如何让STC单片机生成随机数
rnda=rand()%2;rndb=rand()%3;这样就可以了 。。不过要记得包含rand 函数的头文件

可以用单片机寄存器随机点亮一灯吗?
这只是一个一般性的步骤,实际的代码实现取决于你使用的单片机型号和编程语言。你需要查阅你所使用的单片机的数据手册和编程手册,以了解如何控制GPIO(通用输入\/输出)引脚来点亮和熄灭灯,并如何生成随机数。需要注意的是,随机数生成器在大多数单片机中是伪随机的,它们实际上是通过某种算法生成的数字序列...

求高手赐教:51单片机怎么产生随机数?
启动定时器,需要随机数时从定时器里读一个值出来当作随机数。或者调用random()函数,不过得到的是伪随机数。

怎样用单片机产生0~9随机数,并且送到10个数码管显示?并且10个数码管的...
你可以用定时器产生,开启定时器,随机读取定时寄存器的值,与10取模就可以了。

怎么用C语言在keil里产生随机数?51单片机
靠51单片机内部设备是找不到种子的,还得靠外围设备,例如:将外界的亮度、声音频率通过传感器传入单片机作为种子。那种能产生随机数的单片机内部都有个随机数发生器的。

用51单片机汇编语音随机产生一个1~33的随机数, 或者不能重复,能显示...
一直用C51,汇编不大会,你可以这样:初始化一个8位的定时器,让它自己从0开始加,不用设置中断,每隔一定时间去就读一次定时器的值t,那么t是随机的(0<=t<=255),然后t=t mod 34,产生0~33的一个数,是0就放弃重新取值,就可以达到目的 ...

...的输出口?让单片机此输出端口产生一个随机数?
指针的目的是增大随机性。以下是我写的说明性的程序,可以自己改。org 0h mov a,30h anl a,#7FH;防止指向高128字节。mov r0,a mov a,@r0 loop:mov b,#9 mul ab inc a;a=a*9+1,伪随机数生成式,系数可以换,见参考资料。mov p1,a sjmp loop end 参考资料:http:\/\/hi.baidu.com\/...

汇编语言 8051单片机产生随机数代码
不可用。这时 8088 CPU 的汇编语言。硬件系统中,还有电池,时钟不停。每次读出,就是随机的数字。