[请教高手]单片机怎么实现产生随机数?
启动定时器,需要随机数时从定时器里读一个值出来当作随机数。
或者调用random()函数,不过得到的是伪随机数。
仅靠算法是无法产生真正的随机数,但可以产生一个伪随机数的序列,要想产生真正的随机数,需要一些硬件辅助。比如一些专用的随机数发生器。当然也可以搭建一个小硬件来产生,利用单片机的内置时钟设为1M,外接一个用温度敏感电阻搭建一个特征频率10M的RC振荡电路,用慢时钟去采集快时钟,然后经过简单处理,就可以得到一个真正的随机数了。
给你一个超强例子: 欢迎到卡卡空间: http://hi.baidu.com/woodking 主 题: 线性叠加伪随机数函数 ; 关 键 词: 随机数,8位单片机,random,8 bit mcu ; 参考资料: 1.<> ; by Bruce Clark, 7 Jun 2004 ; 2.<> ; by Donald Knuth ; 8位单片机很多地方需要随机数,比如游戏的洗牌,可在timer中取数,但是随机数质 量不高。随机数是一个既简单又复杂的问题,这里的例子使用了众所周知的线性叠加法,没 有完美的方法产生随机数,不过线性叠加法是一个合适的方法,彻底解决8位机随机数的问 题。 伪随机数函数总是返回可预知的数字,像抛骰子,如果抛足够多次,那么我们得到了一 个足够长的数字序列, 3,1,5,1,4,6,5,4,6,5,4,5,6,1,3,2,1,6,4,6,5,4,3,2,1,3,2,1,4,2,3,1,3...... 如果从序列中一个接一个的取出数字,那么数字就看似随机。 问题的关键是从这序列的哪个点(数字)开始取数?这个开始的点(数字)叫做种子。 注意,如果从相同的点(种子)开始,将会得到相同的数字,这是因为我们是从固定的序 列中取数字(所以叫伪随机)。但这却是一个有用的特性,我们可以每次从不同的点取数,即 改变种子! 在6502上,8位或16位随机数是最常用的,函数返回一个32位的数字,范围0~2^32。名 词"线性叠加"听起来容易范晕, 其实只涉及二个内容:乘法和加法。三个步骤: 1. 为了取得新的种子(也就是从序列开始的那个点的数字),旧的种子和一个常数A相乘, 2. 所得结果然后和第二个常数c相加。 3. 新的种子是结果的低32位(记住,这个函数返回32位数字)。保留低32位很重要,用来获 得下一个种子。 计算公式: 种子 = A * 种子 + C 此公式在几何图中表示一条直线,而且新种子由旧种子反复相加得来,所以叫线性叠加。 随机数函数的关键在于选择优秀的"常数A"(也叫乘数A),其实也就是选择了一个固定 的数字序列。"常数c",不像乘数A那样重要,但是它一定是个奇数。事实上, c可选1,而 且这是例程所使用的,因为它会简化计算。 注意,奇数(旧的种子)乘奇数(乘数A)是奇数,再加奇数(常数c)将会是一个偶数;偶数 (旧的种子)乘奇数(乘数A),加奇数(常数c)将会是一个奇数。如此种子将会在奇数和偶数之 间转变。因为种子的变化足够随机,所以新种子的值可以作为8位或16位随机数。 子程序F_RandomSeed,计算 "种子 = 乘数 * 种子+1" (记得,c=1)。有三个版本: (1) 快速版本, 速度快,但占用Rom多。 (2) 兼顾版本,速度和占用Rom适中,空间和速度是在另外二个版本之间。 兼顾版B, 使用了另一个神奇的数字66066(10进制). (3) 最小版本,速度慢,但占用Rom小。 三个版本中使用的乘数1664525(10进制)=19660D(16进制),是从<<计算机程序的艺术, 第2册>>一书中选出,这是一个神奇的数字,经过论证和测试,这个数字对产生随机数至 关重要。想进一步研究的朋友可以阅读原著(参考资料2),书中以特别专业的数学方法讨论 了随机数问题。这里只是应用了其中的两个常数1664525(10进制)和69069(10进制),这里不 作讨论,因为篇幅问题是借口,其实自己没弄懂。 ;============================================================================== ; 快速版本 ;===================对于51单片机里有两个定时器/计数器,可以利用其中的一个来产生随机数。但要设置成方式2,自己计数状态。这样,只有8位数。但不要开中断,只要计数就行。需要时就读一次定时器的低8位就行了。
汇编程序,用定时器T1
MOV TMOD,#20H
MOV TH1,#0
MOV TL1,#0
SETB TR1
需要的时候,读TL1,是8位数
MOV A, TL1
如果需要16位数,可以对读出的8位数进行加或乘计算
请精通单片机的高手进来,我诚心请教一个问题,急急急!
1、应该用89C52就能解决了。都是定时的东西。2、反复论证,提炼系统框图和控制流程图。3、先用仿真,再制作。4、有大问题问导师。小问题Baidu。
请教各位单片机高手一个问题
你看下你的单片机pdf 当方向寄存器置一时 是配置成输入还是输出 不同的单片机不一样 PIC单片机的方向寄存器置一是配置成输出 而AVR的正好相反 反正你的这句P6DIR = 0XFF;P6OUT = 0XFF 意思就是将PORT6口的方向寄存器置一 然后输出高电平 这些语句的目的是用来初始化端口 给它一个状态 如果不给它...
请教高手,这个单片机系统的AD转换是如何实现的?
跟随器输出的电压和Rx的阻值就有了一定的关系,而跟随器的电压配合(7474+比较器形成的)RC振荡器,就产生了电压与输出的脉冲频率有一定的关系,所以,最后的结果就是把Rx的阻值的变化通过电压再通过脉冲频率表现给单片机看。最后,单片机通过测量脉冲频率,或者脉冲周期,就知道Rx上的电压,进而知道Rx的...
请教单片机高手,如何将某一液晶显示器(电流表表头)上的数据用单片机读取...
首先电流表要改造~~~如果是那种指针方式的~在指针机械部分加划变~当做表的数据取样。类似传感器功能,在在网上或书上找成套的数模转换电路焊上~可能要用A\/D.单片机和7段译码器了~以及滤波放大电路。哦才看到你的是液晶的啊!你先看自己驱液晶的那个芯片叫什么名字~·找到它 的说明书看看芯片端口能不...
请教单片机高手,关于一键双控制
可以这样 设置个变量 第一次按下 变量 由0变为1 第二次按下 变量由1变为2
如何学好单片机
对于初学者,建议就选一种单片机为主(当然,最基础的51单片机是必学的),把它学透、用精。即使以后需要用到其它种类的单片机,由于基础扎实很快也能学会,因为单片机功能毕竟都是大同小异的。至于选用哪种单片机,最好请教有经验的老师或工程师。2、学的精比学的多好 有些学习板号称带有几G——几...
请教高手怎样往单片机IC里面烧写程序?
Easy 51pro V2.0 ISP 下载线,很简单。一个并口插头,一块74HC373 ,6 个小电阻
单片机汇编程序问题请教高手
嘿嘿 俺来帮你解决啊 1 使用双指针 用DPTR做片外数据存储器的源操作数指针 指向DATA1 使用R0作为片内数据存储器的目的操作数的指针 指向DATA2 2 然后 使用访问片外数据存储器的传送指令 MOVX A,@DPTR 将要传送到数据送给A,判断A=0? 如果等于0 则结束传送 否则 将它传送到目...
请教单片机高手下面这段程序哪里错了?一直报错说uchar附近有语法错误...
子程序调用时不能加uchar等 void writeddata(uchar l,uchar y,uchar dat){ uchar l,y,dat;writedadd(l,y); \/\/此处去掉uchar delayms(1);writedat(dat); \/\/此处去掉uchar } 还有你的l,y,da使用前没有赋值,也会报错的
如何自学单片机编程
是自己慢慢参悟呢,还是向高手请教?建议先自己参悟,实在不行在向高手请教,这是记忆最深刻,效果最好的办法。但不要参悟的时间太长,否则会削减我们刚建立起来的信心;事事都问,记忆就不深刻,成不了自己的东西,就像练武,只学到了招式,没学到内功。如果这一步能过关,哈哈,相信你已经被单片机...
蒯毕红色: rnda=rand()%2;rndb=rand()%3;这样就可以了 ..不过要记得包含rand 函数的头文件
红桥区17552305869: 怎么让51单片机产生随机数? - ?
蒯毕红色: 源代码不提供,你可以使用srand函数或是启用一个定时器,需要的随机数取自定时器的计数值或是以计数值作为种子,按照一定的算法产生随机数.
红桥区17552305869: 单片机如何产生随机数?
蒯毕红色: 其他的库函数SAND RAND都是伪随机数. 使用若干个一直运行的timer,作为随机源最好,不影响功耗没有多余开销. AD也可以不过测量的源在某个时间内随机范围比较小,可以选不同的源,比如悬空的IO电平,VCC,或者内部温度,等等. 如果有外部输入可以把这个作为随机源,比如有用户按键盘,或者外部通信
红桥区17552305869: 51单片机用C语言如何产生随机数 - ?
蒯毕红色: 1. 绝对宏:在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD 具体使用可看一看absacc.h便知,例如: rval=CBYTE[0x0002];指向程序存贮...
红桥区17552305869: 如何用单片机产生随机信号?
蒯毕红色: C51中有伪随机数函数rand,利这个函数返回值就能生成你所要的随机信号
红桥区17552305869: 单片机C语言如何产生随机数?
蒯毕红色: time.h头文件是利用PC机的系统时间,而单片机没有,需要用定时器来模拟. 在C51中rand函数是有的,包含stdlib.h头文件就可以调用了. 下面是我之前回答过的问题,跟你的问题很类似. http://wenwen.soso.com/z/q213187811.htm 如有什么不清楚欢迎追问!
红桥区17552305869: 如何51单片机产生0到1之间的随机数 - ?
蒯毕红色: 计算机 只能产生伪随机数 (计算机不具有自发性) 你可以用定时器来产生伪随机数 比如事先运行定时器 然后再读定时器的值
红桥区17552305869: stm32单片机怎么获取随机数 - ?
蒯毕红色: 举个例子: srand(gSystickMsecCount); //gSystickMsecCount这个值是在Systick中断中计数的变量 for(i=0;i<7;i++){ number[i] = rand() % 100; //生成0—100内的随机整数 }
红桥区17552305869: 如何使单片机产生0~9中的任意一个随机的数,并显示出来 - ?
蒯毕红色: 把数生成BCD码送显示就可以了
红桥区17552305869: 单片机 C语言 随机数 - ?
蒯毕红色: 用C51轻松实现 #include <stdlib.h> n= rand(); // 调用 rand 库函数 n就是得到的随机数