- UID
- 373967
- 帖子
- 8850
- 主題
- 2609
- 精華
- 0
- 積分
- 999
- 楓幣
- 1
- 威望
- 976
- 存款
- 34705
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 50
- 在線時間
- 454 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-11-18
|
零件清單:
STM32F030F4P6微控制器
紅外線感應模塊
5位共陰極數碼管
4個PNP晶體管(2N3906)
5個220歐姆電阻
1個10K歐姆電阻
杜邦線
STM32F030F4P6腳位圖:
+3.3V PB1
| |
PB15 PB0
| |
PB14 PA7
| |
PA5 PA6
| |
PA4 PA3
| |
PA2 PA1
| |
PA0 GND
程式碼:
#include "stm32f0xx.h"
#define IR_PIN GPIO_Pin_15 // 定義紅外線感應模塊的輸入腳位
#define DISP_PIN0 GPIO_Pin_0 // 定義數碼管第0位的輸出腳位
#define DISP_PIN1 GPIO_Pin_1 // 定義數碼管第1位的輸出腳位
#define DISP_PIN2 GPIO_Pin_2 // 定義數碼管第2位的輸出腳位
#define DISP_PIN3 GPIO_Pin_3 // 定義數碼管第3位的輸出腳位
#define DISP_PIN4 GPIO_Pin_4 // 定義數碼管第4位的輸出腳位
uint32_t counter = 0; // 計數器變量
void delay(uint32_t ms) {
// 延遲函數
for (uint32_t i = 0; i < ms * 1000; i++);
}
void init_gpio(void) {
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN; // 啟用GPIOA和GPIOB時鐘
// 設置PA0 ~ PA7為輸入
GPIOA->MODER &= ~(GPIO_MODER_MODER0 | GPIO_MODER_MODER1 |
GPIO_MODER_MODER2 | GPIO_MODER_MODER3 |
GPIO_MODER_MODER4 | GPIO_MODER_MODER5 |
GPIO_MODER_MODER6 | GPIO_MODER_MODER7);
// 設置PB0 ~ PB1為輸出
GPIOB->MODER &= ~(GPIO_MODER_MODER0 | GPIO_MODER_MODER1);
GPIOB->MODER |= (GPIO_MODER_MODER0_0 | GPIO_MODER_MODER1_0);
// 設置PB14 ~ PB15為輸入
GPIOB->MODER &= ~(GPIO_MODER_MODER14 | GPIO_MODER_MODER15);
// 設置PB0 ~ PB4為推挽輸出
GPIOB->OTYPER &= ~(GPIO_OTYPER_OT_0 | GPIO_OTYPER_OT_1| GPIO_OTYPER_OT_2 | GPIO_OTYPER_OT_3 |
GPIO_OTYPER_OT_4);
// 設置PB0 ~ PB4的輸出速度為高速
GPIOB->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR0 | GPIO_OSPEEDER_OSPEEDR1 |
GPIO_OSPEEDER_OSPEEDR2 | GPIO_OSPEEDER_OSPEEDR3 |
GPIO_OSPEEDER_OSPEEDR4);
// 設置PB0 ~ PB4的上拉電阻
GPIOB->PUPDR |= (GPIO_PUPDR_PUPDR0_0 | GPIO_PUPDR_PUPDR1_0 |
GPIO_PUPDR_PUPDR2_0 | GPIO_PUPDR_PUPDR3_0 |
GPIO_PUPDR_PUPDR4_0);
}
void display(uint32_t number) {
// 顯示數字函數
uint32_t digits[5] = {0};
for (uint32_t i = 0; i < 5; i++) {
digits[i] = number % 10;
number /= 10;
}
GPIOB->ODR |= (digits[0] << 0) | (digits[1] << 1) | (digits[2] << 2) |
(digits[3] << 3) | (digits[4] << 4);
}
int main(void) {
init_gpio(); // 初始化GPIO
while (1) {
if (GPIOB->IDR & IR_PIN) { // 如果檢測到紅外線信號
counter++; // 計數器加1
display(counter); // 顯示計數器的值
delay(1000); // 延遲1秒
}
}
}
這是一個基本的紅外線自動感應5位數顯計數器的程式碼,會持續監測紅外線感應模塊是否有輸入信號,如果有,計數器就會加1並且顯示在5位共陰極數碼管上,每次顯示後會延遲1秒鐘,然後再次等待紅外線信號的輸入。 |
|