led.h
#ifndef __LED_H__
#define __LED_H__
void led_init(void);
void led1_on(void);
void led1_off(void);
void led1_turn(void);
void led2_on(void);
void led2_off(void);
void led2_turn(void);
#endif /*__LED_H__*/
led.c
#include "led.h"
#include "stm32f10x.h" // Device header
//LED初始化
void led_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//A1 A2
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//设置为高电平
GPIO_SetBits(GPIOA, GPIO_Pin_1);
GPIO_SetBits(GPIOA, GPIO_Pin_2);
}
//LED1亮
void led1_on(void)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
//LED1灭
void led1_off(void)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
//LED翻转
void led1_turn(void)
{
if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
}
//LED2亮
void led2_on(void)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
//LED2灭
void led2_off(void)
{
GPIO_SetBits(GPIOA, GPIO_Pin_2);
}
//LED2翻转
void led2_turn(void)
{
if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_2);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
}
key.h
#ifndef __KEY_H__
#define __KEY_H__
#include "stm32f10x.h" // Device header
void key_init(void);
uint8_t key_scan(void);
#endif /*__KEY_H_*/
key.c
#include "key.h"
#include "delay.h"
//按键初始化
void key_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//B1 B11
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //对于输入用途不大
GPIO_Init(GPIOB, &GPIO_InitStruct);
}
//按键扫描
uint8_t key_scan(void)
{
uint8_t ret = 0;
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
{
delay_ms(10);
//等待按键抬起
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
delay_ms(10);
ret = 1;
}
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
{
delay_ms(10);
//等待按键抬起
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
delay_ms(10);
ret = 2;
}
return ret;
}
main.c
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"
int main(void)
{
led_init();
key_init();
while(1)
{
if (key_scan() == 1)
{
led1_turn();
}
if (key_scan() == 2)
{
led2_turn();
}
}
return 0;
}
电路图:
实物图:
buzzer.h
#ifndef __BUZZER_H__
#define __BUZZER_H__
#include "stm32f10x.h"
//蜂鸣器初始化 B12
void buzzer_init(void);
//on
void buzzer_on(void);
//off
void buzzer_off(void);
#endif
buzzere.c
#include "buzzer.h"
//蜂鸣器初始化 B12
void buzzer_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//B12
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
//设置为高电平
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
//on
void buzzer_on(void)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}
//off
void buzzer_off(void)
{
//设置为高电平
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
lightsensor.h
#ifndef __LIGHT_SENSOR_H__
#define __LIGHT_SENSOR_H__
#include "stm32f10x.h"
void lightsensor_init(void);
uint8_t lightsensor_get(void);
#endif /*__LIGHT_SENSOR_H__*/
lightsensor.cpp
#include "lightsensor.h"
//B13
void lightsensor_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//B1 B11
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //对于输入用途不大
GPIO_Init(GPIOB, &GPIO_InitStruct);
}
uint8_t lightsensor_get(void)
{
return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
}
main.c
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "buzzer.h"
#include "lightsensor.h"
int main(void)
{
buzzer_init();
lightsensor_init();
while(1)
{
if (lightsensor_get() == 1)
{
buzzer_on();
}
else
{
buzzer_off();
}
}
return 0;
}