洪嵐峰 發表於 2023-4-23 14:07:11

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微控制器中。
頁: [1]
查看完整版本: ATtiny10電子骰子