- UID
- 373967
- 帖子
- 9008
- 主題
- 2609
- 精華
- 0
- 積分
- 1003
- 楓幣
- 0
- 威望
- 980
- 存款
- 35891
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 460 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-12-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 段顯示器顯示分鐘的十位數和個位數。 |
|