將一個電阻和一個電容串聯起來接地。最左邊為電阻,電阻的最左端接單片機的PC1口,並設為輸出。電阻和電容中間引出一根線,接到PC0口,設為輸入。 最初PC1輸出低電平,電容上沒有電荷,PC0為低電平。 此時立即將PC1設為高電平,電容開始充電,PC0仍為低電平,過了一段時間後才變為高電平。也就是說PC0比PC1變化慢。將PC1設置回低電平後,也要過一段時間PC0才能變回低電平。 【計時用的程序】 #include <stm32f10x.h>
#define MODE 0 // MODE: 0->六位小數, 1->4位小數
#if MODE #define TPSC 7199 // 精度: 100us #define N 4 #else #define TPSC 71 // 精度: 1us #define N 6 #endif
uint8_t seg8[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; uint16_t num = 0;
void delay(void) { uint16_t i; for (i = 0; i < 20000; i++); }
void ser_in(uint8_t data) { uint8_t i; for (i = 0; i < 8; i++) { GPIOB->BRR = GPIO_BRR_BR9; // SCLK=PB9 if (data & 0x80) GPIOB->BSRR = GPIO_BSRR_BS7; // DIO=PB7 else GPIOB->BRR = GPIO_BRR_BR7; data <<= 1; GPIOB->BSRR = GPIO_BSRR_BS9; } }
void par_out(void) { GPIOB->BRR = GPIO_BRR_BR8; // RCLK=PB8 GPIOB->BSRR = GPIO_BSRR_BS8; }
void seg_scan(void) { uint8_t i; uint16_t numbuf = num; for (i = 0; i <= N; i++) { if (i == N) ser_in(seg8[numbuf % 10] & 0x7f); else ser_in(seg8[numbuf % 10]); ser_in(1 << i); par_out(); delay(); numbuf /= 10; } }
int main(void) { RCC->APB1ENR = RCC_APB1ENR_TIM6EN; RCC->APB2ENR = RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN; GPIOB->CRH = 0x00300033; GPIOB->CRL = 0x30000033; GPIOC->CRL = 0x34; TIM6->ARR = TIM_ARR_ARR; TIM6->PSC = TPSC; TIM6->CR1 = TIM_CR1_URS | TIM_CR1_OPM; TIM6->EGR = TIM_EGR_UG; TIM6->CR1 |= TIM_CR1_CEN; // 開始計時 GPIOC->BSRR = GPIO_BSRR_BS1; // 充電 while ((GPIOC->IDR & GPIO_IDR_IDR0) == 0); // 等待輸出端的電平變為1 num = TIM6->CNT; // 記錄時間 GPIOC->BRR = GPIO_BRR_BR1; // 放電 while (1) seg_scan(); }
|