• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 用AVR單片機產生隨機數

    用AVR單片機產生隨機數

    作者: 時間:2013-12-09 來源:網絡 收藏

    , 星星燈
    源程序:SLAVR737.ASM
    產生,由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字幕以廣告動畫畫面顯示,并令隨機數隨著變化使無法預測隨機數起始值,廣告動畫面共有四張,每張有。見”org dpfstb”;

    由按鈕(PD1)按下,AVR用產生隨機數,由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

    單片機相關文章:單片機教程


    單片機相關文章:單片機視頻教程


    單片機相關文章:單片機工作原理


    上拉電阻相關文章:上拉電阻原理


    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 五指山市| 青龙| 凤台县| 泸水县| 修武县| 定边县| 辉南县| 平度市| 儋州市| 永川市| 永定县| 三台县| 峡江县| 天镇县| 洪雅县| 旬阳县| 出国| 光泽县| 高陵县| 汽车| 武夷山市| 特克斯县| 依兰县| 天气| 棋牌| 读书| 册亨县| 开阳县| 昆山市| 全南县| 灵石县| 方城县| 鄯善县| 五莲县| 仪征市| 香格里拉县| 永德县| 化州市| 阿城市| 丹阳市| 盐池县|