文档库 最新最全的文档下载
当前位置:文档库 › c51随机数产生

c51随机数产生

开一个计数器,自动装入初值的模式,不开他的溢出中断,然后不要管它了,什么时候要随机数到里面去取就是了。 你每次都是去读TL0呢,然后两次读到的8位组合成一个16位来看看
>>>>>>>>用软件也许真不到真正的随即,如果用时间作为随机数的种子,而在软件执行一个完整的循环时间是固定的话,那就做不到随机,如果执行一个主循环的时间不是固定的话,那用时间作为时间种子是没有多大问题的。
>>>>>>>>> 若系统是一个没有外部条件输入的系统,则无论程序怎么写,总是确定的。
-----------
DSP的12位AD采一个大温漂电路,出来值有上百的变化量。。
反正有16路之多,就拿出一路来做个事儿了。。。

------------------
我常用的简单随机数产生方法

在单片机程序编写中,常常需要使用随机数字,如何产生随机数的方法有许多,常见的是用一个简单的算法计算出随机数,这样就可以得到一个数学理论上是随机分布的随机数序列。

我个人不习惯使用这种方法:首先是使用的人理解计算用的数学公式会比较难;其次虽然序列整体看是随机数组合,但每次开机后都得到同样随机数序列,对应用程序来说并不完全符合随机状态;另外还需要比较多的程序代码才能实现。

我在程序中对于随机数的生成一般都不用公式的方法,而是直接利用硬件的特性来产生。

方法一:
利用定时中断,创建一个1毫秒的定时中断程序,里面对一个计数器进行累加,在程序需要使用随机数的时候就使用这个计数器的值。只要程序有人机交互功能,
一旦人有进行选择控制,做出选择控制的时间对机器来说无疑是绝对随机,因为人和机器完全独立,机器并不知道人会在什么时候做出选择。
就算是两个人看到机器某个提示立即按下某个键,表面看好像两个人是同时做出反应,如果把时间细分,这两个人就不可能是绝对同时反应,
一定会存在一个时间差。想一想,人的反应速度能达到毫秒级别吗?所以如果是一个16位的毫秒计数器,就可以提供65536种可能给应用程序,重复的可能性已经相当小。
该方法不足时会占用一定的系统资源,比如一个指令速度为8MHz的8位单片机,假定定时中断需要占用20个指令周期,中断程序会占用单片机约0.2%的运行时间。

方法二:
利用ADC,我们知道电路上电后会有噪声,这个噪声可以被看做随机干扰,如果用ADC测量这个噪声,得到的同样是随机数。该方法不足主要是噪声一般只有几十毫伏,
不能得到精度很高的随机数,尤其是8位ADC,效果会不太理想,最好是12位以上的ADC才有比较好的效果。

方法三:
方法一合方法二组

合使用,用这两种方法产生的连个不同随机数经过运算得出新的随机数。


相关文档