8位单片机随机数

发布者:数字翻飞最新更新时间:2016-09-30 来源: eefocus关键字:8位  单片机  随机数 手机看文章 扫描二维码
随时随地手机看文章
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进制),这里不

作讨论,因为篇幅问题是借口,其实自己没弄懂。

;==============================================================================

; 快速版本

;==============================================================================

丰收先要选好种子,育种很重要,同样,获得随机种子是重要的一步。

种子变量设定在零页RAM可以提高速度。

程序F_RandomSeed计算 1664525*种子,需要5个字节(R_Seed0~R_Seed3,R_Temp)。

F_GeneratTables预先计算1664525*X(x=0~255),生成四个256字节的列表T3,T2,T1,T0.

T3,X = 表T3的第X字节 = 1664525 * X的第31~24位(X = 0 to 255)

T2,X = 表T2的第X字节 = 1664525 * X的第23~16位(X = 0 to 255)

T1,X = 表T1的第X字节 = 1664525 * X的第15~ 8位(X = 0 to 255)

T0,X = 表T0的第X字节 = 1664525 * X的第 7~ 0位(X = 0 to 255)

对于单片机来说 使用1K RAM很夸张,也可以不用F_GeneratTables,直接把随机数表存

在ROM中。

;==============================================================================

; 伪随机数函数的线性叠加

; 计算 Seed = 1664525 * Seed + 1

;------------------------------------------------------------------------------

; 输入:

; R_Seed0 <--- 种子0

; R_Seed1 <--- 种子1

; R_Seed2 <--- 种子2

; R_Seed3 <--- 种子3

; 回返:

; 种子0 ---> R_Seed0

; 种子1 ---> R_Seed1

; 种子2 ---> R_Seed2

; 种子3 ---> R_Seed3

; 重写

; R_Temp

;------------------------------------------------------------------------------

; 为提高速度R_Seed0,R_Seed1,R_Seed2,R_Seed3,R_Temp选零页Ram

; 每张列表从Rom地址 xx00h 处开始 或在Rom中

;------------------------------------------------------------------------------

; 空间: 程序58个字节

; 列表1024个字节

; 速度: 调用F_RandomSeed需要94个周期

;==============================================================================

F_RandomSeed:

CLC ; 计算低32位:

LDX R_Seed0 ; 1664525*($100* R_Seed1+ R_Seed0)+1

LDY R_Seed1

LDA T0,X

ADC #1

STA R_Seed0

LDA T1,X

ADC T0,Y

STA R_Seed1

LDA T2,X

ADC T1,Y

STA R_Temp

LDA T3,X

ADC T2,Y

TAY ; 把字节3留在Y中

CLC ; 加低32位:

LDX R_Seed2 ; 1664525*($10000* R_Seed2)

LDA R_Temp

ADC T0,X

STA R_Seed2

TYA

ADC T1,X

CLC

LDX R_Seed3 ; 加低32位:

ADC T0,X ; 1664525*($1000000* R_Seed3)

STA R_Seed3

rts

;==============================================================================

; 产生T0,T1,T2和T3列表,使用F_GeneratTables,列表在ram中

;==============================================================================

F_GeneratTables:

LDX #0 ;1664525*0=0

STX T0

STX T1

STX T2

STX T3

INX

CLC

L_GT1:

LDA T0-1,X ;把1664525加入

ADC #$0D ;字节0

STA T0,X

LDA T1-1,X

ADC #$66 ;字节1

STA T1,X

LDA T2-1,X

ADC #$19 ;字节2

STA T2,X

LDA T3-1,X

ADC #$00 ;字节3

STA T3,X

INX ;进位C=0退出

BNE L_GT1

RTS

;------------------------------------------------------------------------------

; 生成的列表,如果不要F_GeneratTables,可以直接将此表放在Rom中

;------------------------------------------------------------------------------

;1664525 * X的第31~24位(X = 0 to 255)

T3:

.DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$01,$01

.DB $01,$01,$01,$01,$01,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$03

.DB $03,$03,$03,$03,$03,$03,$03,$03,$03,$04,$04,$04,$04,$04,$04,$04

.DB $04,$04,$04,$05,$05,$05,$05,$05,$05,$05,$05,$05,$05,$06,$06,$06

.DB $06,$06,$06,$06,$06,$06,$06,$07,$07,$07,$07,$07,$07,$07,$07,$07

.DB $07,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$09,$09,$09,$09,$09

.DB $09,$09,$09,$09,$09,$0A,$0A,$0A,$0A,$0A,$0A,$0A,$0A,$0A,$0A,$0B

.DB $0B,$0B,$0B,$0B,$0B,$0B,$0B,$0B,$0B,$0C,$0C,$0C,$0C,$0C,$0C,$0C

.DB $0C,$0C,$0C,$0C,$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0E,$0E

.DB $0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F

.DB $0F,$0F,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$11,$11,$11,$11

.DB $11,$11,$11,$11,$11,$11,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12

.DB $13,$13,$13,$13,$13,$13,$13,$13,$13,$13,$14,$14,$14,$14,$14,$14

.DB $14,$14,$14,$14,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$16,$16

.DB $16,$16,$16,$16,$16,$16,$16,$16,$17,$17,$17,$17,$17,$17,$17,$17

.DB $17,$17,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$19,$19,$19,$19

;1664525 * X的第23~16位(X = 0 to 255)

T2:

.DB $00,$19,$32,$4C,$65,$7E,$98,$B1,$CB,$E4,$FD,$17,$30,$4A,$63,$7C

.DB $96,$AF,$C9,$E2,$FB,$15,$2E,$48,$61,$7A,$94,$AD,$C7,$E0,$F9,$13

.DB $2C,$46,$5F,$78,$92,$AB,$C5,$DE,$F7,$11,$2A,$44,$5D,$76,$90,$A9

.DB $C3,$DC,$F5,$0F,$28,$42,$5B,$74,$8E,$A7,$C1,$DA,$F3,$0D,$26,$40

.DB $59,$72,$8C,$A5,$BF,$D8,$F1,$0B,$24,$3E,$57,$70,$8A,$A3,$BD,$D6

.DB $EF,$09,$22,$3C,$55,$6E,$88,$A1,$BB,$D4,$ED,$07,$20,$3A,$53,$6C

.DB $86,$9F,$B9,$D2,$EB,$05,$1E,$38,$51,$6A,$84,$9D,$B7,$D0,$E9,$03

.DB $1C,$36,$4F,$68,$82,$9B,$B5,$CE,$E7,$01,$1A,$34,$4D,$66,$80,$99

.DB $B3,$CC,$E5,$FF,$18,$32,$4B,$64,$7E,$97,$B1,$CA,$E3,$FD,$16,$30

.DB $49,$62,$7C,$95,$AE,$C8,$E1,$FB,$14,$2D,$47,$60,$7A,$93,$AC,$C6

.DB $DF,$F9,$12,$2B,$45,$5E,$78,$91,$AA,$C4,$DD,$F7,$10,$29,$43,$5C

.DB $76,$8F,$A8,$C2,$DB,$F5,$0E,$27,$41,$5A,$74,$8D,$A6,$C0,$D9,$F3

.DB $0C,$25,$3F,$58,$72,$8B,$A4,$BE,$D7,$F1,$0A,$23,$3D,$56,$70,$89

.DB $A2,$BC,$D5,$EF,$08,$21,$3B,$54,$6E,$87,$A0,$BA,$D3,$ED,$06,$1F

.DB $39,$52,$6C,$85,$9E,$B8,$D1,$EB,$04,$1D,$37,$50,$6A,$83,$9C,$B6

.DB $CF,$E9,$02,$1B,$35,$4E,$68,$81,$9A,$B4,$CD,$E7,$00,$19,$33,$4C

;1664525 * X的第15~ 8位(X = 0 to 255)

T1:

.DB $00,$66,$CC,$32,$98,$FE,$64,$CA,$30,$96,$FC,$62,$C8,$2E,$94,$FA

.DB $60,$C6,$2C,$92,$F9,$5F,$C5,$2B,$91,$F7,$5D,$C3,$29,$8F,$F5,$5B

.DB $C1,$27,$8D,$F3,$59,$BF,$25,$8B,$F2,$58,$BE,$24,$8A,$F0,$56,$BC

.DB $22,$88,$EE,$54,$BA,$20,$86,$EC,$52,$B8,$1E,$84,$EB,$51,$B7,$1D

.DB $83,$E9,$4F,$B5,$1B,$81,$E7,$4D,$B3,$19,$7F,$E5,$4B,$B1,$17,$7E

.DB $E4,$4A,$B0,$16,$7C,$E2,$48,$AE,$14,$7A,$E0,$46,$AC,$12,$78,$DE

.DB $44,$AA,$10,$77,$DD,$43,$A9,$0F,$75,$DB,$41,$A7,$0D,$73,$D9,$3F

.DB $A5,$0B,$71,$D7,$3D,$A3,$09,$70,$D6,$3C,$A2,$08,$6E,$D4,$3A,$A0

.DB $06,$6C,$D2,$38,$9E,$04,$6A,$D0,$36,$9C,$03,$69,$CF,$35,$9B,$01

.DB $67,$CD,$33,$99,$FF,$65,$CB,$31,$97,$FD,$63,$C9,$2F,$95,$FC,$62

.DB $C8,$2E,$94,$FA,$60,$C6,$2C,$92,$F8,$5E,$C4,$2A,$90,$F6,$5C,$C2

.DB $28,$8E,$F5,$5B,$C1,$27,$8D,$F3,$59,$BF,$25,$8B,$F1,$57,$BD,$23

.DB $89,$EF,$55,$BB,$21,$88,$EE,$54,$BA,$20,$86,$EC,$52,$B8,$1E,$84

.DB $EA,$50,$B6,$1C,$82,$E8,$4E,$B4,$1A,$81,$E7,$4D,$B3,$19,$7F,$E5

.DB $4B,$B1,$17,$7D,$E3,$49,$AF,$15,$7B,$E1,$47,$AD,$13,$7A,$E0,$46

.DB $AC,$12,$78,$DE,$44,$AA,$10,$76,$DC,$42,$A8,$0E,$74,$DA,$40,$A6

;1664525 * X的第 7~ 0位(X = 0 to 255)

T0:

.DB $00,$0D,$1A,$27,$34,$41,$4E,$5B,$68,$75,$82,$8F,$9C,$A9,$B6,$C3

.DB $D0,$DD,$EA,$F7,$04,$11,$1E,$2B,$38,$45,$52,$5F,$6C,$79,$86,$93

.DB $A0,$AD,$BA,$C7,$D4,$E1,$EE,$FB,$08,$15,$22,$2F,$3C,$49,$56,$63

.DB $70,$7D,$8A,$97,$A4,$B1,$BE,$CB,$D8,$E5,$F2,$FF,$0C,$19,$26,$33

.DB $40,$4D,$5A,$67,$74,$81,$8E,$9B,$A8,$B5,$C2,$CF,$DC,$E9,$F6,$03

.DB $10,$1D,$2A,$37,$44,$51,$5E,$6B,$78,$85,$92,$9F,$AC,$B9,$C6,$D3

.DB $E0,$ED,$FA,$07,$14,$21,$2E,$3B,$48,$55,$62,$6F,$7C,$89,$96,$A3

.DB $B0,$BD,$CA,$D7,$E4,$F1,$FE,$0B,$18,$25,$32,$3F,$4C,$59,$66,$73

.DB $80,$8D,$9A,$A7,$B4,$C1,$CE,$DB,$E8,$F5,$02,$0F,$1C,$29,$36,$43

.DB $50,$5D,$6A,$77,$84,$91,$9E,$AB,$B8,$C5,$D2,$DF,$EC,$F9,$06,$13

.DB $20,$2D,$3A,$47,$54,$61,$6E,$7B,$88,$95,$A2,$AF,$BC,$C9,$D6,$E3

.DB $F0,$FD,$0A,$17,$24,$31,$3E,$4B,$58,$65,$72,$7F,$8C,$99,$A6,$B3

.DB $C0,$CD,$DA,$E7,$F4,$01,$0E,$1B,$28,$35,$42,$4F,$5C,$69,$76,$83

.DB $90,$9D,$AA,$B7,$C4,$D1,$DE,$EB,$F8,$05,$12,$1F,$2C,$39,$46,$53

.DB $60,$6D,$7A,$87,$94,$A1,$AE,$BB,$C8,$D5,$E2,$EF,$FC,$09,$16,$23

.DB $30,$3D,$4A,$57,$64,$71,$7E,$8B,$98,$A5,$B2,$BF,$CC,$D9,$E6,$F3

;==============================================================================

; 最小版本

;==============================================================================

对于单片机来说,使用1K RAM或rom来完成一个随机数,是很浪费的,以下是最小版本,

但是程序执行周期长。程序每次计算所需要的列表值。

;==============================================================================

; 线性叠加伪随机数函数

; 计算 R_Seed=1664525 * R_Seed + 1

;------------------------------------------------------------------------------

; 输入:

; R_Seed0 <--- 种子0

; R_Seed1 <--- 种子1

; R_Seed2 <--- 种子2

; R_Seed3 <--- 种子3

; 回返:

; 种子0 ---> R_Seed0

; 种子1 ---> R_Seed1

; 种子2 ---> R_Seed2

; 种子3 ---> R_Seed3

; 重写

; R_Temp,R_Temp+1,R_Temp+2,R_Temp+3

; 注意

; R_Temp~R_Temp+3 和 L_Rand6 是高字节在前,低字节在后

;------------------------------------------------------------------------------

; 空间: 53个字节

; 速度: 调用F_RandomSeed平均2744个周期

; 1624+70* N(N=种子数) = 1624~3864个周期

;==============================================================================

F_RandomSeed:

LDA #1 ; R_Temp=1,需要给定初始值

LDX #3

L_Rand1 STA R_Temp,X

LSR

DEX

BPL L_Rand1

LDY #$20 ; 计算种子 = 种子 * L_Rand4+ R_Temp

BNE L_Rand5 ; 总是分支

L_Rand2 BCC L_Rand4 ; 如果零被移位,分支

CLC ; 把乘数加入乘积

LDX #3

L_Rand3 LDA R_Temp,X

ADC T_Rand6,X ;源码有误,已改正

STA R_Temp,X

DEX

BPL L_Rand3

L_Rand4 ROR R_Temp ; 右移结果

ROR R_Temp+1

ROR R_Temp+2

ROR R_Temp+3

L_Rand5 ROR R_Seed3 ; 右移种子

ROR R_Seed2

ROR R_Seed1

ROR R_Seed0

DEY

BPL L_Rand2

RTS

T_Rand6 .DB $00,$19,$66,$0D ;乘数(高字节在前)

;==============================================================================

; 兼顾版本 乘数1664525(10进制)

;==============================================================================

兼顾版本 是不用上面的循环加来做乘法,而是在必要的时候加上 种子,$100* 种子,

$10000* 种子,来获得数字序列,这样能够提高速度,又不增加太多代码。

分解公式表

b7 b6 b5 b4 b3 b2 b1 b0

$0D = 0 0 0 0 1 1 0 1 b ---> +种子

$66 = 0 1 1 0 0 1 1 0 b ---> *$100h

$19 = 0 0 0 1 1 0 0 1 b ---> *$10000h

$00 = 0 0 0 0 0 0 0 0 b --->

| | | | | | | |

| | | | | | | |

V V V V V V V V

左 左 左 左 左 左

移 移 移 移 移 移

6 5 4 3 2 1

位 位 位 位 位 位

那么 种子*bit0 时,种子*$10000+种子

种子*bit1 时,种子*$100, 左移1位

种子*bit2 时,种子*$100+种子, 左移2位

种子*bit3 时,种子*$10000+种子,左移3位

种子*bit4 时,种子*$10000, 左移4位

种子*bit5 时,种子*$100, 左移5位

种子*bit6 时,种子*$100, 左移6位

;==============================================================================

; 伪随机数函数的线性叠加

; 计算 R_Seed=1664525 * R_Seed + 1

;------------------------------------------------------------------------------

; 输入:

; R_Seed0 <--- 种子0

; R_Seed1 <--- 种子1

; R_Seed2 <--- 种子2

; R_Seed3 <--- 种子3

; 回返:

; 种子0 ---> R_Seed0

; 种子1 ---> R_Seed1

; 种子2 ---> R_Seed2

; 种子3 ---> R_Seed3

; 重写

; R_Temp,R_Temp+1,R_Temp+2,R_Temp+3

;-------------------------------------------------------------------------------

; 空间: 106个字节

; 速度: F_RandomSeed 517个周期

;===============================================================================

F_RandomSeed:

CLC ; 复制种子进入R_Temp

LDA R_Seed0 ; 计算 种子 = 种子 *$10000+ 种子 +1

STA R_Temp

ADC #1

STA R_Seed0

LDA R_Seed1

STA R_Temp+1

ADC #0

STA R_Seed1

LDA R_Seed2

STA R_Temp+2

ADC R_Temp

STA R_Seed2

LDA R_Seed3

STA R_Temp+3

ADC R_Temp+1

STA R_Seed3

;-------------------------------------------------

;因为$0019660D 的Bit7=0,所以只需6次移位

;-------------------------------------------------

LDY #5

L_Rand1 ASL R_Temp ; 左移旧的种子

ROL R_Temp+1

ROL R_Temp+2

ROL R_Temp+3

;-------------------------------------------------

; 从 L_Rand4 列表取得 X, 4个索引值对应4种情况,数值选的巧妙!

; X=$00, 种子 = 种子 +$10000* R_Temp

; X=$01, 种子 = 种子 +$100 * R_Temp

; X=$FE, 种子 = 种子 +$10000* R_Temp+ R_Temp

; X=$FF, 种子 = 种子 +$100 * R_Temp+ R_Temp

;-------------------------------------------------

LDX L_Rand4,Y

BPL L_Rand2 ; 分支如果 X=$00 或 X=$01

CLC ; 种子 = 种子 +R_Temp

LDA R_Seed0

ADC R_Temp

STA R_Seed0

LDA R_Seed1

ADC R_Temp+1

STA R_Seed1

LDA R_Seed2

ADC R_Temp+2

STA R_Seed2

LDA R_Seed3

ADC R_Temp+3

STA R_Seed3

INX ; $ FE->$00,$ FF->$01

INX

L_Rand2 CLC

BEQ L_Rand3 ; 如果 X=$00, 种子 =种子 + R_Temp*$10000

LDA R_Seed1 ; 种子 = 种子 + R_Temp*$100

ADC R_Temp

STA R_Seed1

L_Rand3 LDA R_Seed2

ADC R_Temp,X

STA R_Seed2

LDA R_Seed3

ADC R_Temp+1,X

STA R_Seed3

DEY

BPL L_Rand1

RTS

L_Rand4 .DB $01,$01,$00,$FE,$FF,$01

;==============================================================================

; 改进的 兼顾版本B 选择新的 乘数=69069(10进制)

;==============================================================================

兼顾版本B中, 用69069(10进制)替换1664525(10进制)作乘数,也就是说,选择了另外一

个数字序列,这个乘数也是<<计算机程序的艺术,第2册>>一书中选出,经过论证和测试,

这个数字虽不及1664525做乘数好,但也是个神奇的数字,而且可以进一步减小程序时间。

;===============================================================================

; 伪随机数函数的线性叠加

; 计算种子 = 种子 * 69069 + 1

;-------------------------------------------------------------------------------

; 输入:

; R_Seed0 <--- 种子0

; R_Seed1 <--- 种子1

; R_Seed2 <--- 种子2

; R_Seed3 <--- 种子3

; 回返:

; 种子0 ---> R_Seed0

; 种子1 ---> R_Seed1

; 种子2 ---> R_Seed2

; 种子3 ---> R_Seed3

; 重写

; R_Temp,R_Temp+1,R_Temp+2,R_Temp+3

;--------------------------------------------------------------------------------

; 空间: 173个字节

; 速度: F_RandomSeed 326个周期

;================================================================================

F_RandomSeed:

LDA R_Seed0 ; R_Temp= 种子 *2

ASL

STA R_Temp

LDA R_Seed1

ROL

STA R_Temp+1

LDA R_Seed2

ROL

STA R_Temp+2

LDA R_Seed3

ROL

STA R_Temp+3

CLC ; R_Temp= R_Temp+ 种子 (= 种子 *3)

LDA R_Seed0

ADC R_Temp

STA R_Temp

LDA R_Seed1

ADC R_Temp+1

STA R_Temp+1

LDA R_Seed2

ADC R_Temp+2

STA R_Temp+2

LDA R_Seed3

ADC R_Temp+3

STA R_Temp+3

CLC ; 种子 = 种子 +$10000* 种子

LDA R_Seed2

ADC R_Seed0

TAX ; 把字节2保存在X中(利于提高速度)

LDA R_Seed3

ADC R_Seed1

TAY ; 把字节3保存在Y中

CLC ; 种子 = 种子 +$100* 种子

LDA R_Seed1

ADC R_Seed0

PHA ; 压入堆栈字节1

TXA

ADC R_Seed1

TAX

TYA

ADC R_Seed2

TAY

LDA R_Temp ; R_Temp= R_Temp*4(= 旧种子 *$0C)

ASL

ROL R_Temp+1

ROL R_Temp+2

ROL R_Temp+3

ASL

ROL R_Temp+1

ROL R_Temp+2

ROL R_Temp+3

STA R_Temp

CLC ; 种子 = 种子 +R_Temp

ADC R_Seed0

STA R_Seed0

PLA ; 弹出堆栈的字节1

ADC R_Temp+1

STA R_Seed1

TXA

ADC R_Temp+2

TAX

TYA

ADC R_Temp+3

TAY

CLC

LDA R_Temp ; 种子 = 种子 + R_Temp*$100

ADC R_Seed1

STA R_Seed1

1. 随机函数并非真正的随机数。
  2. 种子确定后,函数值也就确定了。
  3. 1664525和69069是两个特殊的数,用于线性方程的常数,可产生很好的随机效果。

关键字:8位  单片机  随机数 引用地址:8位单片机随机数

上一篇:单片机中与上拉电阻有关的抗干扰提升
下一篇:几种主流单片机的比较

推荐阅读最新更新时间:2024-03-16 15:12

14-基于51单片机的万年历闹钟及温度补偿
具体实现功能 系统由STC89C52单片机+DS1302时钟芯片+DS18B20温度传感器构成 1、可以显示年、月、日、时、分、秒、星期、温度、农历; 2、按键可以设置闹钟及报警; 3、按键可以调整时间,显示是平年还是闰年。 共4个按键:设置、加、减、切换。 设计背景 在现实我们生活中每个人都可能有自己的时钟,光阴在永不停息的流逝,有了时钟人们就能随着时间有计划的过着每一天。然而现在绝大部分的时钟有的需要不断地更换电池,有些时钟需要外接电源,如果一旦电池没电或者外接电源无法供电,时钟就会停止计时了。而美国DALLAS 公司的新型时钟日历芯片DS1302就能解决这一问题。该器件能提供实时时钟(RTC)/日历、定时
[单片机]
14-基于51<font color='red'>单片机</font>的万年历闹钟及温度补偿
Proteus运行Keil编写的51单片机C语言步骤
1. 在Keil 编写好程序以后,在左侧项目栏中单击鼠标右键,如下图 2.点击上图中Options for Target Target1 选项,弹出下列窗口 3.在Target标签中将Xtal(MHz)中的晶振频率改为12.0;再在Output标签中勾选Create HEX Fi复选框。 完成上面两项设置后点击确定。 4.再点击编译,生成Hex 文件。 5 再在Proteus中双击的51 芯片 ,弹出下列窗口,按下图修改 晶振 频率,添加需要运行的C语言生成的hex文件即可运行。 #include reg51.h #define uchar unsig
[单片机]
Proteus运行Keil编写的51<font color='red'>单片机</font>C语言步骤
AT89C52单片机定时器如何设置工作方式
  AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。   AT89C52单片机硬件结构   如图3-1所示,为AT89C52的硬件结构图。AT89C52单片机的内部结构与MCS-51系列单片机的构成基本相同。CPU是由运算器和控制器所构成的。运算器主要用来对操作数进行算术、逻辑运算和位操作的。控制器是单片机的指挥控制部件,主要任务的识
[单片机]
AT89C52<font color='red'>单片机</font>定时器如何设置工作方式
单片机应该具有的内部抗干扰措施有哪些?
  外时钟是高频的噪声源,除能引起对本应用系统的干扰之外,还可能产生对外界的干扰,使电磁兼容检测不能达标。在对系统可靠性要求很高的应用系统中,选用频率低的单片机是降低系统噪声的原则之一。以8051单片机为例,最短指令周期1 s时,外时钟是12MHz。而同样速度的Motorola 单片机系统时钟只需4MHz,更适合用于工控系统。近年来,一些生产8051兼容单片机的厂商也采用了一些新技术,在不牺牲运算速度的前提下将对外时钟的需求降至原来的1/3。   低噪声系列单片机   传统的集成电路设计中,在电源、地的引出上通常将其安排在对称的两边。如左下角是地,右下角是电源。这使得电源噪声穿过整个硅片。改进的技术将电源、地安排在两个相邻的引脚上
[单片机]
基于CMX860的来电显示电话测试仪的设计
1 引 言      目前,随着电信部门电话主叫识别(来电显示)业务的普遍开通,具有主叫识别功能的电话机越来越普及。根据这个情况,我们设计了一台可以测试主叫识别功能的多功能电话测试仪,采用了CML(ConsumerMicrocircuit Limited)公司的CMX860作为其中来电显示测试电路的核心元件,单片机采用了SST89C58。 1.1 CMX860简介      CMX860是一块通用的低功耗电话机信令收发集成电路。CMX860包含DTMF编码解码器、V.23调制解调器,具有铃流检测、话机摘机检测等功能,它可以广泛应用于由线路提供电源的电话设备。      CMX860的主要特性有:(1)提供V.23 1200/7
[应用]
51单片机和pic单片机有什么区别_其程序设定有什么不一样
 什么是51单片机   51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。      什么是PIC单片机   同步电动机运行稳定性和可靠性对工业生产有重要的影响。单片机用于同步电动机励磁控制,由于软件丰富,能使励磁装置
[单片机]
51<font color='red'>单片机</font>和pic<font color='red'>单片机</font>有什么区别_其程序设定有什么不一样
基于51单片机的自动巡线轮式机器人控制系统设计
1 引言   轮式移动机器人是机器人研究领域的一项重要内容.它集机械、电子、检测技术与智能控制于一体。在各种移动机构中,轮式移动机构最为常见。轮式移动机构之所以得到广泛的应用。主要是因为容易控制其移动速度和移动方向。因此.有必要研制一套完整的轮式机器人系统。并进行相应的运动规划和控制算法研究。笔者设计和开发了基于5l型单片机的自动巡线轮式机器人控制系统。    2 控制系统总体设计   机器人控制系统由主控制电路模块、存储器模块、光电检测模块、电机及舵机驱动模块等部分组成,控制系统的框图如图1所示。    3 主控制模块设计   3.1 CPLD设计   在机器人控制系统中.需要控制多个电动机和行程开关.
[单片机]
基于51<font color='red'>单片机</font>的自动巡线轮式机器人控制系统设计
单片机模拟I2C总线及24C02(I2C EEPROM)读写实例
/* 51系列单片机在使用时,有时需要模拟I2C总线, */ /* 这里举出一个实例(读写串行EEPROM芯片at2402) */ /************************************************************************/ /* Name:AT24C02存储器的读写程序,用到I2C总线,含相对独立的I2C总线读写函数 */ /* Language: C51单片机编程语言 */ /* Platform: Win98,Intel Celeron 433 Processor,伟福仿真器,仿真8
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved