設置 | 登錄 | 註冊

作者共發了4篇帖子。

【STM32入門級程序10】繼電器的控制

1樓 巨大八爪鱼 2016-6-30 16:19

【接線】

2樓 巨大八爪鱼 2016-6-30 16:20
【程序】
#include "stm32f10x.h"
#define _BV(n) (1 << (n))
#define K1 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)
// 延時函數
void delay()
{
 uint32_t i;
 for (i = 0; i < 20000; i++);
}
int main(void)
{
 GPIO_InitTypeDef init;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 開啟PB時鐘
 // PB8~15為輸出
 init.GPIO_Pin = 0xff00;
 init.GPIO_Speed = GPIO_Speed_50MHz;
 init.GPIO_Mode = GPIO_Mode_Out_OD;
 GPIO_Init(GPIOB, &init);
 // PB0~7為輸入
 init.GPIO_Pin = 0x00ff;
 init.GPIO_Mode = GPIO_Mode_IPD;
 GPIO_Init(GPIOB, &init);
 while (1)
 {
  // 當按鍵1按下時
  if (!K1)
  {
   delay();
   if (!K1)
   {
    GPIOB->ODR ^= _BV(8); // 反轉繼電器所在引腳的電平
    while (!K1);
   }
  }
 }
}

3樓 巨大八爪鱼 2016-6-30 16:21

【說明】
STM32單片機通過PNP三極體的基極控制繼電器,必須把輸出模式設為GPIO_Mode_Out_OD(開漏輸出)。
參考資料:https://zh.arslanbar.net/post.php?t=24217

4樓 巨大八爪鱼 2016-6-30 16:29
【程序2:每隔一定時間自動吸合和釋放繼電器】
#include <stm32f10x.h>
void delay(void)
{
 uint32_t i;
 for (i = 0; i < 8000000; i++);
}
int main(void)
{
 GPIO_InitTypeDef init;
 init.GPIO_Pin = GPIO_Pin_8;
 init.GPIO_Speed = GPIO_Speed_50MHz;
 init.GPIO_Mode = GPIO_Mode_Out_OD; // 必須為開漏輸出
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 GPIO_Init(GPIOB, &init);
 
 while (1)
 {
  GPIOB->ODR ^= GPIO_Pin_8; // 反轉PB8上的電平
  delay(); // 延時
 }
}

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。