, 星星灯
源程序:SLAVR737.ASM
用AVR 单片机 8位数据产生随机数,由PORTA 口及PORTC 口输出随机数,在8X8 LED上显示,硬件接线电路见“7.3.8按钮猜数”。随机数的种子由程序设定(也可外接开关设定),启动种子后,由移位寄存器以互斥的异或逻辑组合返回循环产生。
.include"8515def.inc"
rjmp RESET
.def temp =r16 ;暂存器
.def temp1 =r17 ;暂存器1
.def udata =r21 ;存随机数送A口
.def ddata =r22 ;存随机数送C口
.cseg
.org 0x10
RESET: ldi temp,high(RAMEND);设堆栈指针
out SPH,temp
ldi temp,low(RAMEND)
out SPL,temp
ldi temp,0xff ;设A口、C口为输出
out ddra,temp ;送方向寄存器A
out ddrc,temp ;送方向寄存器C
start: wdr ;关看门狗
ldi udata,0x6a ; 设置随机数初值
ldi ddata,0x3c ;
startp: out porta,udata ;输出到A口
out portc,ddata ;输出到C口
ldi temp,0x80 ;设延时常数
rcall delay ;调用延时子程序
rcall randm ;调用十六位随机数子程序
rjmp startp
delay: ; 通用延时子程序 从略
....
16位移位产生随机数原理图
8~16位移位寄存器产生随机数循环组合
位 数 循环输入组合 S=2^n-1 Qn XOR Qm
8 Q2 ⊕ Q3 ⊕ Q4 ⊕ Q8 (现程序按钮猜数采用8位数)
9 Q5 ⊕ Q9
10 Q7 ⊕ Q10
11 Q9 ⊕ Q11
12 Q2 ⊕ Q10 ⊕ Q11 ⊕ Q12
13 Q1 ⊕ Q11 ⊕ Q12 ⊕ Q13
14 Q2 ⊕ Q12 ⊕ Q13 ⊕ Q14
15 Q14 ⊕ Q15
16 Q4 ⊕ Q13 ⊕ Q15 ⊕ Q16
randm: ;产生十六位随机数子程序
mov temp,udata ;产生A口随机数
mov temp1,udata ;
rol temp ;通过进位位左循环移位
eor temp1,temp ;异或
rol temp ; 通过进位位左循环移位
rol temp ; 通过进位位左循环移位
eor temp1,temp ;异或
mov temp,ddata ; 产生C口随机数
swap temp ; 通过进位位左循环移位
eor temp,temp1 ;异或通过进位位左循环移位
rol temp ; 通过进位位左循环移位
rol ddata ; 通过进位位左循环移位
rol udata ; 通过进位位左循环移位
ret ;子程序返回
7.3.8 按钮猜数程序
源程序:SLAVR738.ASM
许多场合如按钮猜数(电脑摇奖,电脑选出幸运号),游戏开始按钮等待一个不规则且不定序的数据产生,即须要随机数发生器。随机数的种子由程序设定(也可外接开关设定),启动种子后,由移位寄存器以互斥的异或逻辑组合返回循环产生。产生随机数的原理图如下:
16位移位产生随机数原理图
8~16位移位寄存器产生随机数循环组合
位 数 循环输入组合 S=2^n-1 Qn XOR Qm
8 Q2 ⊕ Q3 ⊕ Q4 ⊕ Q8 (现程序按钮猜数采用8位数)
9 Q5 ⊕ Q9
10 Q7 ⊕ Q10
11 Q9 ⊕ Q11
12 Q2 ⊕ Q10 ⊕ Q11 ⊕ Q12
13 Q1 ⊕ Q11 ⊕ Q12 ⊕ Q13
14 Q2 ⊕ Q12 ⊕ Q13 ⊕ Q14
本文关键字:单片机 AVR单片机,单片机-工控设备 - AVR单片机
上一篇:HT1621驱动程序-AVR