用AVR单片机产生随机数

发布者:灵感驿站最新更新时间:2013-12-09 来源: eefocus关键字:AVR单片机  随机数  8位数据 手机看文章 扫描二维码
随时随地手机看文章

, 星星灯
源程序: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
15 Q14 ⊕ Q15
16 Q4 ⊕ Q13 ⊕ Q15 ⊕ Q16


以8X8 LED阵列,开机时为了避免被使用者预测出压按时间对应随机数的变化值,故LED字幕以广告动画画面显示,并令随机数随着变化使无法预测随机数起始值,广告动画面共有四张,每张有8位数据。见”org dpfstb”;

由按钮(PD1)按下,AVR用8位数据产生随机数,由PORTA 口及PORTC 口输出随机数,在8X8 LED上显示好玩的真实的按钮猜数。
.include "8515def.inc"
.def peed =r16
.def dspn =r17 ;存显示初始动画次数
.def temp2 =r18
.def temp1 =r19
.def temp =r20
.def scndp =r21
.def cnt =r22
.def rdata =r23 ;存随机种子数
.def rdata9 =r24
.equ dpfstb =0x01e0 ;大小矩形图表首址
.equ randtb =0x0210 ;随机数种子表首址
.equ numbertb=0x0240 ;0-9数字表首址
.org $0000
rjmp RESET ;Reset Handle
.cseg
.org $0010
RESET: ldi peed,high(RAMEND) ;设置堆栈$25F,见器件配置文件"8515def.inc"
out SPH,peed
ldi peed,low(RAMEND)
out SPL,peed
ldi peed,0xff ;对口初始化,
out ddra,peed ;设A口为输出
out ddrc,peed ;设C口为输出
ldi peed,0xfd ;PD1作输入,且接内部上拉电阻
out ddrd,peed ;PD1为输入,其余为输出
ldi peed,0xff ;关D口
out portd,peed
ldi peed,0x13 ;显示画面次数
start: ldi dspn,0x06 ;显示初始动画
ldi zh,high(dpfstb*2)
ldi zl,low(dpfstb*2)
dspfm: rcall ldtb8 ;调用程序区数送到内存RAM
ldi temp2,0xa0 ;显示动画面次数
dspfm1: rcall scan1 ;调用从内存取数显示一次
sbis pind,01 ;I/O口的位被置位跳行,检测到PD1按下否
rjmp getseed ; 检测到PD1按下转
dec temp2 ;-1
brne dspfm1 ;不为0转
dec dspn ; 初始画面次数-1
brne dspfm ; 不为0转
rjmp start ;转到显示初始动画
getseed:inc temp ;+`1,根据PD1按下的时间,选择随机数种子
sbis pind,01 ; I/O口的位被置位跳行,检测到PD1按下否
rjmp getseed ; 检测到PD1按下,继续计数
andi temp,0x1f ;按钮松开,取随机数种子与0X0F加
ldi zh,high(randtb*2)
ldi zl,low(randtb*2)
add zl,temp
lpm
MOV rdata,r0 ;得到随机数种子
next: ldi dspn,0x08 ;显示8个不同的随机数;
repeet: rcall randm ;调用产生随机数子程序
rcall dspnumber ;调用显示8个不同的随机数
dec dspn ;-1
brne repeet ;dspn不为0转
rcall randm ; 调用产生随机数子程序
guess1: rcall dspnumber ;调用显示同一随机数,直到有键按下
sbic pind,01 ;松开后再往下执行(I/O口清零跳行)
rjmp guess1 ;转显示同一随机数,直到有键按下
wait: rcall dspnumber ;
sbis pind,01
rjmp wait ;等待按钮按下
ldi rdata9,0x03 ;显示动画三次
start0: ldi dspn,0x06 ;每次显示六幅画面
ldi zh,high(dpfstb*2)
ldi zl,low(dpfstb*2)
dspfm0: rcall ldtb8 ;调用从Z指向的程序区取数据送到内存0080-0087中
ldi temp2,0xa0 ;显示次数
dspfm1a:rcall scan1 ;调用从内存0080-0087中取数据显示一次
dec temp2 ;-1
brne dspfm1a ;不为0转
dec dspn ;显示初始动画次数-1
brne dspfm0 ;不为0转
dec rdata9 ;显示动画三次-1
brne start0 ;不为0转
rjmp next ;转显示8个不同的随机数
dspnumber: ;显示一个0-9数字的子程序
ldi zh,high(numbertb*2)
ldi zl,low(numbertb*2)
add zl,rdata9
rcall ldtb8 ;取数
ldi temp2,0xa0 ;该数字重复显示A0H次
dspn1: rcall scan1
dec temp2
brne dspn1
ret
scan1: push xl ;从内存0080-0087中取数据显示一次
ldi temp,0b01111111
MOV scndp,temp
ldi cnt,0x08
col1: out portc,scndp ;显示屏幕的一列
ld r1,x+
out porta,r1
rcall delay
sec
ror scndp
dec cnt
brne col1
pop xl
ret
ldtb8: ldi xl,0x80 ;从Z指向的程序区取数据送到内存0080-0087中
ldi xh,0x00
ldi temp1,0x08
push xl
nexld1: lpm
st x+,r0
ld r0,z+
dec temp1
brne nexld1
pop xl
ret
delay: ;通用延时子程序从略
....
randm: MOV temp,rdata ;产生8N(0≤N≤9)随机数子程序
MOV temp1,rdata
swap temp1
eor temp,temp1
rol temp1
eor temp,temp1
rol temp1
eor temp,temp1
rol temp
rol rdata
MOV rdata9,rdata
andi rdata9,0x0f
cpi rdata9,0x0a
brsh randm ;产生了一个0≤RDATA9≤9的随机数
lsl rdata9
lsl rdata9
lsl rdata9
ret

.cseg
.org dpfstb; ;大小方框字形表
;small o
.db 0b00000000,0b00000000,0b00000000,0b00011000
.db 0b00011000,0b00000000,0b00000000,0b00000000
.db 0b00000000,0b00000000,0b00111100,0b00100100
.db 0b00100100,0b00111100,0b00000000,0b00000000
.db 0b00000000,0b01111110,0b01000010,0b01000010
.db 0b01000010,0b01000010,0b01111110,0b00000000
;big o
.db 0b11111111,0b10000001,0b10000001,0b10000001
.db 0b10000001,0b10000001,0b10000001,0b11111111
.db 0b00000000,0b01111110,0b01000010,0b01000010
.db 0b01000010,0b01000010,0b01111110,0b00000000
.db 0b00000000,0b00000000,0b00111100,0b00100100
.db 0b00100100,0b00111100,0b00000000,0b00000000
.cseg
.org randtb ;随机数种子表
.db 0x5a,0x7b,0x5b,0x4f,0x66,0x6d,0x7d,0x07
.db 0x3b,0x8c,0x67,0x9a,0x99,0x7e,0x2d,0x3e
.db 0x5c,0x6d,0x5b,0x7e,0xf6,0xe7,0x4c,0xc8
.db 0x69,0x9c,0xe2,0x75,0x6c,0xd3,0xe8,0x9a
.cseg
.org numbertb ;0-9数字字形表
;0
.db 0b00111000,0b01000100,0b01000100,0b01000100
.db 0b01000100,0b01000100,0b01000100,0b00111000
;1
.db 0b00010000,0b00011000,0b00010000,0b00010000
.db 0b00010000,0b00010000,0b00010000,0b00111000
;2
.db 0b00011100,0b00100010,0b00100000,0b00010000
.db 0b00001000,0b00000100,0b00000010,0b00111110
;3
.db 0b00111100,0b00010000,0b00001000,0b00010000
.db 0b00100000,0b00100000,0b00100010,0b00011100
;4
.db 0b00100000,0b00110000,0b00101000,0b00100100
.db 0b00100010,0b11111110,0b00100000,0b00100000
;5
.db 0b01111110,0b00000010,0b00111110,0b01000000
.db 0b01000000,0b01000000,0b01000010,0b00111100
;6
.db 0b00110000,0b00001000,0b00000100,0b00111100
.db 0b01000100,0b01000100,0b01000100,0b00111000
;7
.db 0b01111100,0b01000000,0b00100000,0b00010000
.db 0b00001000,0b00001000,0b00001000,0b00001000
;8
.db 0b00111000,0b01000100,0b01000100,0b00111000
.db 0b01000100,0b01000100,0b01000100,0b00111000
;9
.db 0b00111000,0b01000100,0b01000100,0b01111000
.db 0b01000000,0b01000000,0b01000100,0b00111000

关键字:AVR单片机  随机数  8位数据 引用地址:用AVR单片机产生随机数

上一篇:ARM处理器结合GPRS模块设计M2M终端的总体设计方案
下一篇:基于AVR单片机PWM功能的低成本高精度数控恒流源

推荐阅读最新更新时间:2024-03-16 13:31

avr单片机USART串口通讯初始化配置及说明
avr atmega16 单片机通用同步和异步串行接收器和转发器 (USART) 是一个高度灵活的串行通讯设备,其工作模式及其初始化,寄存器说明如下。 //*****************************USART 控制和状态寄存器A(UCSRA)******************************** /*USART 控制和状态寄存器A(UCSRA) bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 RXC TXC UDRE FE DOR PE U2X MPCM RXC: USART 接收结束
[单片机]
基于AVR单片机的I SP1362OTG设计
简介: 本文设计的USB 0TG主从机系统性能稳定,数据传输效率高。测试表明,此设计能够正确地实现USB 0TG主从机间的数据交换,性能可以满足设备间的数据传输要求,同时又能很好地控制成本,具有一定的实用价值。 0 引言 随着PDA、移动电话、数码相机、打印机等消费类产品的普及,用于这些设备与电脑、或设备与设备之间的高速数据传输技术越来越受到人们的关注。以往以计算机为核心的数据传输结构,非常不利于USB,总线在嵌入式行业的应用,也不适用于野外作业,而OTG技术的推出则可实现在没有PC的情况下,设备与设备之间的数据传输,它拓展了USB技术的应用范围。本文采用的设计方案是基于Philips公司的ISP1362 OTG控制芯片,参照
[单片机]
基于<font color='red'>AVR单片机</font>的I SP1362OTG设计
基于AVR单片机及MODEM芯片的MTU、RTU无线电遥测系统
一、引言  基于AVR单片机及专用MODEM芯片的MTU(Master Terminal Unit中心调度机)、RTU无线电遥测系统。   分散地分布在全市的管网监测点上的远端RTU(系统可带256个RTU)采集数据,进行数据处理后通过无线电台向中心调度端发送数据,中心调度端接收到数据后进行数据处理,数据存储,并送给模拟屏显示。    二、设计思想   原有系统的使用中,主要存在以下几个问题:1. 无线通信波特率低(300bps),误码率高,巡测速度慢,最多带32个RTU终端;2. 当某一远程RTU端的无线电台一直处于长时间误发射状态时(简称“长发” )一直占用系统频点,由于系统共用一组无线电频点,这将使系统其他所有电台无
[单片机]
AVR单片机的相关总结
1、AVR文档里要求最好不要中断嵌套,只能执行完这个中断再执行下一个中断; 2、ADC采样的时候,外部存在上拉51K的情况下,断路,测量的电压值是5V(工作电压是5V),说明mega88的输入阻抗是相当大的 哈哈; 3、SREG状态寄存器中, SEI、CLI就是开全局中断、关全局中断 (还以为没有来着),_NOP 、 _WDR; 4、Volatile (不稳定的) AVR全局变量的时候用 (可以避免编辑器对其的优化); 5、不用的IO口如果悬空的话,1是耗电量大处于判断状态;2是 受外界一点点干扰就可能成为反复振荡的输入信号(干扰问题); 6、推挽结构,输出不能直接接地 (大电流烧掉管子); 7、明确 PC (Program
[单片机]
<font color='red'>AVR单片机</font>的相关总结
51及AVR单片机最小系统使用说明
51/AVR最小系统使用说明 一、产品特点及主要功能: 1、支持STC51系列、AT51系列及ATMEGA16、32单片机(DIP40),或通过其它转接座支持其它型号单片机; 2、8路水晶绿LED可作流水灯实验; 3、4个中断按键(INT0、INT1、T0、T1)相当于1*4键盘和1个复位按键; 4、1个USB供电接口 5、1个标准ISP下载接口,用于下载AT及AVR系列单片机程序,及供电; 6、1个USB-TTL接口,用于下载STC单片机,及供电; 7、32个IO口以排针形式引出,方便外部使用; 8、留有5组电源排针输出,方便外部配件取电,或向板子供电; 9、板载12MHz优质晶振(晶振和拔插更换)及P0口全
[单片机]
51及<font color='red'>AVR单片机</font>最小系统使用说明
使用AVR单片机驱动RT1601 LCD显示芯片
研究了一下,如何用ATmega 16单片机,来驱动字符型液晶显示芯片,现把研究心得写出来: 我手里的这个RT1601液晶显示模块,使用的是S6A0069显示芯片。 各个引脚简单说明一下: 控制和数据引脚配置如下: ------------------------------- PORTD_0 - RS PORTD_1 - R/W PORTD_2 - E PORTA - DATA BUS ------------------------------ LCD.h 1 #ifndef _LCD_H_ 2 #define _LCD_H_ 3 /*****************************************
[单片机]
使用<font color='red'>AVR单片机</font>驱动RT1601 LCD显示芯片
一种以AVR单片机为核心的工频电压/频率仪设计
  1.引言   在电力生产和电气测试工作中,经常需要测量工频电压和频率。目前市面上工频电压表和频率表种类繁多,本设计与其相比具有电路简单、体积小、功耗低、性价比高等特点。利用低价位具备AVR高档单片机性能的ATmega8单片机,设计工频电压和频率两用测量仪。ATmega8单片机除了有A/D转换和定时计数器功能外,其内部的模拟比较器在测量频率电路中省了测量过零电路;I/O端口20mA驱动能力直接驱动LED数码管,省了驱动电路。使整个硬件电路非常简单。   2.硬件设计   基于ATmega8单片机工频电压/频率仪设计硬件电路如图1所示。以单片机为核心,加上少量的外部元件构成。      图1中:T1是电源变压器和电压互感
[单片机]
一种以<font color='red'>AVR单片机</font>为核心的工频电压/频率仪设计
基于AVR单片机的有害气体红外感应及语音警示控制系统
0引言 利用红外感应系统感应附近有无有害气体,当红外感应系统感受到有有害气体接近时,送出持续一段时间的高电平;单片机通过开启中断,启动语音芯片,单片机通过串口通信,从上位机提取的有害气体参数提示给附近人体,并经过与安全值的比较判定当前环境是否安全。对语音芯片的使用,先将必要的文字、数字信息录制进去,放音时,通过单片机自动寻址,把实时参数读取出来。为便于以后系统改进或移植到其他系统,可设计录音、放音电路,通过切换录制不同内容。系统设计友好、方便,给人的信息也更加直接。 1系统总体设计方案 在气体浓度是现有可利用的数据的基础上,考虑了系统的衔接性和可移植性。系统总体方案见图1。 本系统分为四大模块:核心控制模块、语音电路
[工业控制]
基于<font color='red'>AVR单片机</font>的有害气体红外感应及语音警示控制系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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