冰楓論壇

標題: 定時開關附顯示即時時間 [打印本頁]

作者: 洪嵐峰    時間: 2023-4-28 20:03
標題: 定時開關附顯示即時時間
零件清單:

PIC12F675 微控制器
晶體振盪器(通常使用4MHz)
2個按鈕(用於設置時間和啟用/停用計時器)
2個LED(用於顯示計時器狀態和時間)
2個100歐姆電阻(用於限制LED的電流)
2個10K歐姆電阻(用於按鈕上拉)
10K歐姆電阻(用於晶體振盪器上拉)
22pF陶瓷電容器(用於晶體振盪器)
0.1μF陶瓷電容器(用於微控制器電源濾波)
3個端子(用於連接電源和負載)

PIC12F675連結腳位:


        +----U----+
  VDD   |1       8|  VSS
Switch1|2       7|  GP5/OSC1/CLKIN
Switch2|3       6|  GP4/OSC2/CLKOUT
    LED1|4       5|  LED2/GP3
          +---------+
以下是使用MPLAB X IDE和XC8編譯器編寫的PIC12F675定時開關附顯示即時時間的基本程式碼。
這個程式碼假設4MHz的晶體振盪器已經連接到GP5和GP4腳位。


#include <xc.h>
#include <stdint.h>

// 定義GPIO和LED腳位
#define LED1 GP3
#define LED2 GP2
#define Switch1 GP0
#define Switch2 GP1

// 計時器計數器
volatile uint16_t timer_counter = 0;

// 時間變量
volatile uint8_t hour = 0;
volatile uint8_t minute = 0;

// 主程序
void main(void) {
    // 初始化GPIO腳位
    TRISIO = 0b00000011;    // GP0和GP1腳位為輸入,其餘為輸出
    GPIO = 0;               // 初始輸出為低電位
    CMCON0 = 0b00000111;    // 關閉比較器模式以減少電流消耗

    // 初始化定時器
    T0CS = 0;               // 設置計時器時鐘源為內部振盪器
    PSA = 0;                // 選擇分頻器
    PS0 = 1;                // 分頻器設置為1:256
    PS1 = 1;
    PS2 = 1;
    TMR0 = 0;               // 定時器計數器清零
    T0IE = 1;               // 啟用計時器中斷
    GIE = 1;                // 啟用全局中斷

// 主循環
while (1) {
    // 檢測Switch1是否按下,如果是則增加小時計數器
    if (!Switch1) {
        __delay_ms(50);     // 延時一段時間以避免彈跳
        if (!Switch1) {     // 確認按鈕是否仍被按下
            hour++;         // 增加小時計數器
            if (hour > 23)  // 如果小時計數器大於23則歸零
                hour = 0;
        }
    }

    // 檢測Switch2是否按下,如果是則啟用/停用計時器
    if (!Switch2) {
        __delay_ms(50);
        if (!Switch2) {
            T0IF = 0;           // 清除計時器中斷標誌
            timer_counter = 0;  // 計數器歸零
            if (T0IE) {         // 如果計時器中斷被啟用,則停用計時器
                T0IE = 0;
                LED1 = 0;       // 關閉LED1
                LED2 = 0;       // 關閉LED2
            } else {            // 否則啟用計時器
                T0IE = 1;
            }
        }
    }

    // 更新時間顯示
    LED1 = (hour >> 1) & 1;     // 小時的十位數
    LED2 = hour & 1;            // 小時的個位數
    __delay_ms(5);
    LED1 = ((minute >> 5) & 1) | ((minute >> 3) & 2) | ((minute >> 1) & 4);  // 分鐘的十位數
    LED2 = (minute >> 4) & 1;   // 分鐘的個位數
    __delay_ms(5);
}
}

// 計時器中斷服務程序
void interrupt isr(void) {
if (T0IF) { // 如果計時器中斷被觸發
T0IF = 0; // 清除計時器中斷標誌
timer_counter++; // 增加計數器
if (timer_counter == 9375) { // 如果計數器達到約1秒
timer_counter = 0; // 計數器歸零
minute++; // 分鐘加1
if (minute > 59) { //
            minute = 0;      // 分鐘歸零
            hour++;          // 小時加1
            if (hour > 23)   // 如果小時大於23,則歸零
                hour = 0;
        }
    }
}
}

在這個程式中,我們使用了PIC12F675微控制器來製作定時開關,並且加入了顯示即時時間的功能。
所需的零件清單如下:

PIC12F675 微控制器
4 MHz 晶振
22pF 無極性電容 (x2)
10K 歐姆電阻 (x2)
4N35 光耦 (x2)
1K 歐姆電阻 (x2)
7 段顯示器 (x2)
共陰極 7 段顯示器驅動IC (例如:CD4511)
按鈕開關 (x2)
電源 (9V 電池或 DC 電源)
這個程式的功能如下:

當按下 Switch1 時,小時計數器會增加。
當按下 Switch2 時,定時器將會啟動/停止。

當啟動定時器時,LED1 和 LED2 將會開啟,當定時器到達預設時間時,LED1 和 LED2 將會關閉。

顯示即時時間。
這裡使用了共陰極的 7 段顯示器,其中 LED1 顯示小時的十位數,LED2 顯示小時的個位數,第二個 7 段顯示器顯示分鐘的十位數和個位數。




歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓