冰楓論壇

 找回密碼
 立即註冊
ads_sugarbook
搜索
查看: 680|回覆: 0
打印 上一主題 下一主題

[討論] 定時開關附顯示即時時間

[複製鏈接]

2609

主題

0

好友

945

積分

高級會員

Rank: 4

UID
373967
帖子
7378
主題
2609
精華
0
積分
945
楓幣
914
威望
925
存款
26000
贊助金額
0
推廣
0
GP
1205
閱讀權限
50
在線時間
405 小時
註冊時間
2023-1-12
最後登入
2024-4-27

2023端午節紀念勳章 2023中秋節紀念勳章 2023聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-4-28 20:03:22 |只看該作者 |倒序瀏覽
零件清單:

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 段顯示器顯示分鐘的十位數和個位數。
[發帖際遇]: 洪嵐峰 因為論文抄襲而被台灣大學撤銷論文,白白浪費了學費 2 楓幣 幸運榜 / 衰神榜
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1骰子
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們職位招聘本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-4-28 04:43

回頂部