冰楓論壇
標題:
ATtiny10電子骰子
[打印本頁]
作者:
洪嵐峰
時間:
2023-4-23 14:07
標題:
ATtiny10電子骰子
製作ATtiny10電子骰子需要以下零件:
ATtiny10微控制器
6個LED燈(用於顯示骰子點數)
6個1K歐姆電阻(用於限流,避免LED燈過熱燒壞)
一個按鈕(用於控制開始和停止)
一個9V電池和一個電池座(用於供電)
杜邦線(用於連接零件)
以下是ATtiny10的引腳連接圖:
+--------+
1 -|1 PB5 V|-
2 -|2 PB3 3|-
3 -|3 PB4 4|-
4 -|4 GND 5|-
5 -|5 PB0 6|-
6 -|6 PB1 7|-
+--------+
在上述連接圖中,PB0到PB5是ATtiny10的輸出引腳,可以用來控制LED燈的亮滅。
PB3是ATtiny10的輸入引腳,用於接收按鈕的信號。
以下是ATtiny10的程式碼,用於控制電子骰子的運作。
在這個程式中,當按鈕按下時,LED燈會開始閃爍,然後在幾秒鐘後停止,並且顯示一個隨機數字(1到6之間)。
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int main(void)
{
DDRB |= (1 << PB0) | (1 << PB1) | (1 << PB3) | (1 << PB4) | (1 << PB5); //設定PB0到PB5為輸出
DDRB &= ~(1 << PB3); //設定PB3為輸入
while (1) //持續運作
{
if (bit_is_clear(PINB, PB3)) //如果按鈕按下
{
for (int i = 0; i < 10; i++) //閃爍10次
{
PORTB ^= (1 << PB0) | (1 << PB1) | (1 << PB4) | (1 << PB5); //反轉PB0、PB1、PB4、PB5的狀態
_delay_ms(50); //等待50毫秒
}
_delay_ms(1000); //等待1秒
int dice_roll = (rand() % 6) + 1; //產生一個1到6之間的隨機數字
switch (dice_roll) //根據隨機數字,點
{
case 1:
PORTB = (1 << PB0); //點亮PB0
break;
case 2:
PORTB = (1 << PB1); //點亮PB1
break;
case 3:
PORTB = (1 << PB0) | (1 << PB1); //點亮PB0和PB1
break;
case 4:
PORTB = (1 << PB4) | (1 << PB5); //點亮PB4和PB5
break;
case 5:
PORTB = (1 << PB0) | (1 << PB1) | (1 << PB4) | (1 << PB5); //點亮PB0、PB1、PB4和PB5
break;
case 6:
PORTB = (1 << PB0) | (1 << PB1) | (1 << PB3) | (1 << PB4) | (1 << PB5); //點亮PB0、PB1、PB3、PB4和PB5
break;
}
_delay_ms(3000); //等待3秒
PORTB = 0; //關閉所有LED燈
}
}
return 0;
}
請注意,在編譯程式碼之前,需要安裝AVR-GCC和AVR-LibC工具套件。
在編譯完成後,可以使用AVR-ISP編程器將程式燒錄到ATtiny10微控制器中。
歡迎光臨 冰楓論壇 (https://bingfong.com/)
Powered by 冰楓