這個東西的出現其實是因為一個店家的老闆請我做的,不過目前我還沒有把它交出去(被毆),因為我還沒有想好怎麼把版子洗出來…
在這個小小的東西裡,最重要的東西就是隨機選取燈號的部分,不過卻也是最簡單的,因為他只是幾條涵式再加上一點硬體的小配合而已。
我們先來看看隨機選取的這段小程式長甚麼樣子吧!
(rand() % 7) +1; //取餘數後+1,8個狀態選擇
甚麼!? 竟然就只有這麼短短的一行而已? 是的,你沒看錯。其中的
rand() 就是最重要的主角,但別以為這樣子就結束了!因為在C語言中的rand()涵式是要再搭配一個種子,也就是另一個會變換的數字來搭配,才能達到真正的隨機。
srand(s_num); // 從s_num獲得種子數字給予 rand() 使用
其中的 srand() 即是讓 rand()
獲得種子的涵式,也是最重要的一個小涵式,少了它,你的rand就不會random了,而是永遠保持在同1個數值(這就不叫隨機了吧!)。
再來,因為是使用8051來實現的關係,因此我們不能像在電腦裡寫C時的方法一樣用系統時間的方式來獲得種子數字,這時候就需要硬體的搭配了!
srand_num(){
int i;
CV=0;
delay(10); //電容放電
CV=1; //電容開始充電
do{i++;}while(!CV); // 累加 i 到充電完畢
s_num=i; //將i值丟給 s_num
}
我是利用RC充放電的原理達到種子產生的效果,從上面可以看出,電容會在放電後執行充電的動作。
而每次充電的時間其實都有些許不同,做過相關實驗便知道RC充放電的函數圖形呈曲線狀態,然後利用這一特性,讓 i 在這段時間中累加,最後取得最終數值。 最後將這些小片段組合起來,再加上一些小設定便可以達到隨機顯示的效果了! 如何? 是不是很有趣呢? 我剛把這個雛形弄出來的時候也玩了很久,哈哈~:P
. .
機率是不可確定的,你永遠只能知道它的數值但無法預知它出現的時機。
View Comments
嘿嘿
最近有再碰8051
可以跟你要原始碼嗎 :)
過幾天吧~
時間托很久了啦= =..................
XD,總工程師來釘我了...
廚型是指雛型嗎XD?
改好了XD
C學了想學期,還沒做過控制硬體的部份
是兩學期..
這個是硬體上的C...跟一般的C有些些的不一樣
哇賽
我們二下也要學8051耶
ㄎㄎㄎ
請問我也想學8051作亂數 可以交我嗎??
就...那樣。
請問電容的硬體電路能提供給我嗎?
謝謝
過幾天我補上電路圖
請問可以 PO 上完整的電路圖 和程式嗎??
最近對亂數 很頭痛 需要一個參考
近日忙,這篇有點久了,要想想我當時怎麼弄的,周末補上!
p.s. 這次真的會補!
找不到歷史資料了 XD
簡單說明一下當時的做法,我是利用 RC 充放電原理來做的,電路就一顆電容串電阻,電阻接地,然後電阻再跟一個按鈕開關並聯。電容接到正極,負極端接到電阻,然後兩者相連的部分連接至 8051。
8051 程式部分則是用 while( P1^0 == 0) i++; 的方式來做 rand() 的種子,因為每次的 RC 時間都會有些不同,所以可以利用這方式來做種子。