AVR单片机8位数据产生随机数

发布者:AngelicHeart最新更新时间:2017-12-17 来源: 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单片机8位数据产生随机数

上一篇:AVR单片机键盘子程序(中断方式和查询方式 )
下一篇:ICCAVR自动下载程序说明

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

avr单片机串口多机通讯及实例
在多机通信过程中,所有设备的 RS232接口是并在通信线上的,其中只能有一个设备为主机,其他为从机,通信由主机发起。数据帧一般采用1位起始位、9位数据位,其中第9位(RXB8)被用作为表征该帧是地址帧还是数据帧。当帧类型表征位为 1 时,表示该帧数据为一个地址帧;当帧类型表征位为 0 时,表示这个帧为一个数据帧。   在AVR中,通过设置从机的UCSRA寄存器中标志位MPCM,可以使能USART接收器对接收的数据帧进行过滤的功能。如果使能了过滤功能,从机接收器对接收到的那些不是地址信息帧的数据帧将进行过滤,不将其放入接收缓冲器中,这在多机通信中有效的方便了从机MCU处理数据帧程序的编写(同标准51 结构相比)。而发送器则不受MP
[单片机]
AVR单片机(学习ing)—(一)、ATMEGA16的I\0端口的使用—01
一、ATMEGA16的I\0端口的使用:(只有一个实验,下面的部分每个小节可能有几个实验验证,你懂得) 一—(01)、)—使用4*4行列式按键开关的使用 I/O端口介绍: 直接一个图就哦了,因为根本没什么,就是控制寄存器(这里一定要注意,后面的ATmega16的引脚的功能都是控制寄存器来实现引脚或者器件的功能的,说白了,知道了寄存器,会用了寄存器,再来点51的基础,那这些东西真的就没什么了,AVR单片机很简单的~~~) 我用的就是IAR和Proteus(我这还有AVRStudio和WinAVR,有要的Q我,哈哈 好了先给个图,这个是按照手机上的设计的~~你看了就懂了 别的就不费话了,一看图不就全明白了 然后就是今天的
[单片机]
<font color='red'>AVR单片机</font>(学习ing)—(一)、ATMEGA16的I\0端口的使用—01
使用AVR单片机做AD转换的几点建议
结合自己的开发经验给出几点建议: AD转换时间应当大于64us(预分频决定),如果采样保持时间短,采集结果可能不准确; 应该让采集电压源尽量保持稳定; (是让采样保持电路稳定。) AVCC和VCC之间的电压差不得超过0.3V,否则采样值波动会很大; 在采样的过程中,不要有数字电路的操作,比如IO口赋值等; 如果有可能,请使用外部参考电压源; 选择合适的参考电压值,比如测1.5V电压,参考电压为2V就比较合适; 如果AD采样要求较高,被测电路与芯片工作电路分开供电。 调试的过程中不要有JTAG的参与,JTAG会影响采样结果,应该将程序直接烧录到单片机中,用串口或者LED等查看结果。 按照以上建议,
[单片机]
AVR单片机Atmega128外扩RAM
由于AVR系列单片机采用的是内部外部RAM统一编址,ATmega128工作在非ATmega 103模式时具有4k+256B的包括寄存器文件(通用工作寄存器)、I/O寄存器、扩展I/O寄存器和内部SRAM的连续内部存储空间。所以在扩展外部RAM时,和内部SRAM地址重叠的外部RAM地址是不能直接访问的。也就是说扩展的外部RAM每64k要浪费掉内部SRAM那么大的空间(AT90系列如此)。所幸的是mega系列解决了这一缺点,专门有一个寄存器XMCRB用来解决对与内部SRAM地址空间相同地址的外部RAM访问。其低三位XMM2 、XMM1 、XMM0三位的设置,决定高位地址线PC口的哪些口线被释放为普通I/O,而不是作为高位地址。这
[单片机]
<font color='red'>AVR单片机</font>Atmega128外扩RAM
AVR单片机定时/计数器学习笔记(二)
定时/计数器1(16位)有普通模式、CTC模式、快速PWM模式、相位修正PWM模式等工作模式。 2.CTC模式(需要用到OC1A、OC1B两个引脚) 应用:用于产生占空比为50%的方波信号 ( N为分频系数 ) 需要配置的寄存器:T/C1控制寄存器A(TCCR1A)、T/C1控制寄存器B(TCCR1B)、输出比较寄存器1A(OCR1A)。 (1)TCCR1A的bit7、bit6用于设置OC1A脚的比较输出模式,bit5、bit4用于设置OC1B脚的比较输出模式。(此处我们都设为,比较匹配时OC1A、OC1B电平取反) (2)TCCR1B的bit4、
[单片机]
<font color='red'>AVR单片机</font>定时/计数器学习笔记(二)
基于AVR单片机高精度电子秤设计
0 引言 随着电子技术和自动化测量技术的不断发展,传统的称重系统在功能、精度、性价比等方面已难以满足人们的需要,尤其在智能化、便携式、对微小质量的测量方面更显得力不从心。近年来,新型单片机的出现和集成电路技术的发展为更新产品设计,研制高性价比的称重控制器提供了条件。本设计采用AVR单片机为控制核心,结合电阻应变式压力传感器和相应的信号采集电路,设计出一种高精度、多功能、低成本的新型电子秤。 1 系统总体设计 首先由称重传感器采集因压力变化而产生的电压信号,通过A/D转换器将模拟信号转换为数字信号,把数字信号送入AVR单片机,单片机做相应的处理后,得到当前物体重量的数据,并通过LCD显示出来。系统硬件结构如图1所示。 系
[单片机]
基于<font color='red'>AVR单片机</font>高精度电子秤设计
AVR单片机IO使用注意事项及结构全攻略
为搞清IO结构,首先看看上拉和下拉电阻的作用。 一、上拉电阻 上拉就是将不确定的信号通过一个电阻钳位在高电平!电阻同时起限流作用!下拉同理! 上拉电阻是用来解决总线驱动能力不足时提供电流的。一般说法是拉电流,下拉电阻是用来吸收电流。 1、在用TTL电路驱动CMOS电路时,若TTL的高电平低于CMOS要求的高电平的门限值(1,TTL电平: 输出高电平 2.4V,输出低电平 0.4V。在室温下,一般输出高电平是3.5V,输出低电平 是0.2V。最小输入高电平和低电平:输入高电平 =2.0V,输入低电平 =0.8V,噪声容限是 0.4V。 2,CMOS电平: 1逻辑电平电压接近于电源电压,0逻辑电平接近于0V。而且具有很宽的噪
[单片机]
<font color='red'>AVR单片机</font>IO使用注意事项及结构全攻略
AVR单片机视觉智能寻迹车设计与实现
0 引 言 智能运输系统是未来交通运输系统发展的趋势,智能汽车在智能运输系统中扮演着十分重要的角色。作者提出智能寻迹车作为构建未来智能交通运输系统中重要部分,针对未来交通运输系统有导航线的环境命题假设下智能汽车的自主寻迹问题,提出一种基于视觉的智能寻迹车模设计方案,作为该假设问题的解决方案。 基于视觉的智能寻迹车模设计方案能够在线型复杂,转弯半径不确定性大的情况下,利用视觉自主寻迹前进,分级精确转向。 1 系统总体设计 基于视觉的智能寻迹车模系统以AVR单片机MEGAl6为核心,由单片机模块、路径识别模块、直流电机驱动模块、舵机驱动模块等组成,如图1所示。 直流电动机为车辆的驱动装置,转向电动机用于控
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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