作业1:光电开关,检测到光电开关发生变化打开风扇。
作业2:火焰传感器,检测到有明火靠近时打开蜂鸣器报警。
// 系统时钟初始化 - 不加入会报错 可以尝试一下
typedef struct
{
volatile unsigned int GPIO_MODE;
volatile unsigned int GPIO_TYPE;
volatile unsigned int GPIO_SPEED;
volatile unsigned int GPIO_PUPD;
volatile unsigned int GPIO_IDR;
volatile unsigned int GPIO_ODR;
volatile unsigned int GPIO_BSRR;
}GPIOX;
volatile GPIOX * GPIO_A = (volatile GPIOX *)0x52020000;
volatile GPIOX * GPIO_B = (volatile GPIOX *)0x52020400;
volatile GPIOX * GPIO_C = (volatile GPIOX *)0x52020800;
void SystemInit(void)
{
//对地址 0xE000ED88 的内容 进行修改:
//将0X3向左移动20位 或上 0X3 向左移动22位
*(unsigned int*) 0xE000ED88=((3UL << 20U)|(3UL << 22U));
}
//PB2 光电门
//PB3 火焰传感器
//PA15 蜂鸣器报警
//PC6 风扇除烟
int main(void)
{
//RCC AHB2 时钟使能
//GPIOA
*(unsigned int *)0x56020C8C |= 1 << 0;
//GPIOB
*(unsigned int *)0x56020C8C |= 1 << 1;
//GPIOC
*(unsigned int *)0x56020C8C |= 1 << 2;
//PB2 配置
//MODE 输入模式 00
GPIO_B->GPIO_MODE &= ~(1 << 5);
GPIO_B->GPIO_MODE &= ~(1 << 4);
//PUPD 浮空输入 00
GPIO_B->GPIO_PUPD &= ~(1 << 5);
GPIO_B->GPIO_PUPD &= ~(1 << 4);
//PB3 配置
//MODE 输入模式 00
GPIO_B->GPIO_MODE &= ~(1 << 7);
GPIO_B->GPIO_MODE &= ~(1 << 6);
//PUPD 浮空输入 00
GPIO_B->GPIO_PUPD &= ~(1 << 7);
GPIO_B->GPIO_PUPD &= ~(1 << 6);
//PA15 配置
//MODE 通用输出模式 01
GPIO_A->GPIO_MODE &= ~(1 << 31);
GPIO_A->GPIO_MODE |= 1 << 30;
//TYPE 推挽输出 0
GPIO_A->GPIO_TYPE &= ~(1 << 15);
//SPEED 低速模式 00
GPIO_A->GPIO_SPEED &= ~(1 << 31);
GPIO_A->GPIO_SPEED &= ~(1 << 30);
//PC6 配置
//MODE 通用输出模式 01
GPIO_C->GPIO_MODE &= ~(1 << 13);
GPIO_C->GPIO_MODE |= 1 << 12;
//TYPE 推挽输出 0
GPIO_C->GPIO_TYPE &= ~(1 << 6);
//SPEED 低速模式 00
GPIO_C->GPIO_SPEED &= ~(1 << 13);
GPIO_C->GPIO_SPEED &= ~(1 << 12);
while(1)
{
//读取光电门状态 PB2
if((GPIO_B->GPIO_IDR & 1 << 2) == 0)
{
GPIO_C->GPIO_ODR &= ~(1 << 6);
}
if(GPIO_B->GPIO_IDR & 1 << 2)
{
GPIO_C->GPIO_ODR |= 1 << 6;
}
//读取火焰传感器状态 PB3
if((GPIO_B->GPIO_IDR & 1 << 3) == 0)
{
GPIO_A->GPIO_ODR &= ~(1 << 15);
}
if(GPIO_B->GPIO_IDR & 1 << 3)
{
GPIO_A->GPIO_ODR |= 1 << 15;
}
}
return 0;
}
1772

被折叠的 条评论
为什么被折叠?



