- UID
- 373967
- 帖子
- 8850
- 主題
- 2609
- 精華
- 0
- 積分
- 999
- 楓幣
- 1
- 威望
- 976
- 存款
- 34705
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 50
- 在線時間
- 454 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-11-18
|
零件:
PIC12F508 微控制器
紅外線感應模塊
共陰極5位數碼管
1K歐姆電阻(x5)
10K歐姆電阻(x1)
1N4148二極管(x5)
0.1微法電容器(x1)
以下是PIC12F508的腳位連結:
+-----+
VDD --|1 |-- VSS
IR_IN --|2 |-- GP5
--|3 |-- GP4
DIG4 --|4 |-- GP3
DIG3 --|5 |-- GP2
DIG2 --|6 |-- GP1
DIG1 --|7 |-- GP0
--|8 |--
+-----+
以下是這個紅外線自動感應5位數顯示計數器的基本程式碼
#include <pic12f508.h>
#include <stdint.h>
#define _XTAL_FREQ 4000000 // 定義晶振頻率為4MHz
// 計數器變量
volatile uint32_t counter = 0;
// 初始化函數
void init(void) {
// 設置GP0 ~ GP4為輸出狀態
TRISIO = 0b00000000;
// 設置GP5為輸入狀態
GPIO5 = 1;
// 設置計數器為0
counter = 0;
}
// 顯示函數
void display(uint32_t number) {
// 定義數字0~9的模式
const uint8_t patterns[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111, // 9
};
// 轉換計數器數值為5個數字
uint8_t digits[5] = {0};
for (uint8_t i = 0; i < 5; i++) {
digits[i] = number % 10;
number /= 10;
}
// 顯示數字
// 依次點亮每個數字的LED
for (uint8_t i = 0; i < 5; i++) {
// 將數字模式輸出到GP0~GP4
GPIO = patterns[digits[i]];
// 點亮對應的LED
switch (i) {
case 0:
DIG1 = 1;
break;
case 1:
DIG2 = 1;
break;
case 2:
DIG3 = 1;
break;
case 3:
DIG4 = 1;
break;
default:
break;
}
// 延時一段時間
__delay_ms(5);
// 熄滅所有LED
DIG1 = 0;
DIG2 = 0;
DIG3 = 0;
DIG4 = 0;
// 延時一段時間
__delay_ms(5);
}
}
// 主程序
void main(void) {
// 初始化
init();
while (1) {
// 檢測紅外線感應模塊是否接收到信號
if (GPIO5 == 0) {
// 紅外線信號被感應,計數器+1
counter++;
}
// 顯示計數器數值
display(counter);
}
}
這個程式碼的基本原理是檢測紅外線感應模塊是否接收到信號,如果接收到信號,則計數器加1。
然後使用5位數的共陰極數碼管顯示計數器的數值。
在顯示計數器數值時,我們通過依次點亮每個數字的LED,來顯示5位數的數值。
此示例程式碼假設您已經熟悉PIC12F508的基本編程和硬件連接知識,因此可能需要進行修改,以適應您的具體應用場景。 |
|