基于arm写出c语言代码,代码可以实现使用红外感应,红外感应接受到信号时蜂鸣器急促响应,没有信号时蜂鸣器定时循环响应,数码管记录红外感应信号感应次数 写出这个c语言代码
时间: 2024-03-10 21:51:12 浏览: 22
以下是基于ARM的C语言代码,实现了红外感应、蜂鸣器响应和数码管记录感应次数的功能:
```
#include "stdio.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
int cnt = 0; // 红外感应信号感应次数
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
// 设置红外感应输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 设置蜂鸣器输出引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 设置数码管输出引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 999; // 定时器周期为1ms
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 定时器时钟频率为72MHz/72=1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1) // 红外感应接受到信号时
{
GPIO_SetBits(GPIOA, GPIO_Pin_1); // 蜂鸣器急促响应
cnt++; // 红外感应信号感应次数加1
delay_ms(100); // 延时100ms
GPIO_ResetBits(GPIOA, GPIO_Pin_1); // 蜂鸣器停止响应
}
else // 没有信号时
{
GPIO_SetBits(GPIOA, GPIO_Pin_1); // 蜂鸣器定时循环响应
delay_ms(50); // 延时50ms
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
}
}
void display(int n)
{
int digit[8] = {0}; // 数字转化为二进制后的每一位
for (int i = 0; i < 8; i++)
{
digit[i] = n % 2;
n /= 2;
}
GPIO_SetBits(GPIOB, GPIO_Pin_0); // 选择数码管1
GPIO_ResetBits(GPIOB, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
GPIO_WriteBit(GPIOB, GPIO_Pin_7, digit[0]);
GPIO_SetBits(GPIOB, GPIO_Pin_1); // 选择数码管2
GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
GPIO_WriteBit(GPIOB, GPIO_Pin_7, digit[1]);
GPIO_SetBits(GPIOB, GPIO_Pin_2); // 选择数码管3
GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
GPIO_WriteBit(GPIOB, GPIO_Pin_7, digit[2]);
GPIO_SetBits(GPIOB, GPIO_Pin_3); // 选择数码管4
GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
GPIO_WriteBit(GPIOB, GPIO_Pin_7, digit[3]);
GPIO_SetBits(GPIOB, GPIO_Pin_4); // 选择数码管5
GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
GPIO_WriteBit(GPIOB, GPIO_Pin_7, digit[4]);
GPIO_SetBits(GPIOB, GPIO_Pin_5); // 选择数码管6
GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_7);
GPIO_WriteBit(GPIOB, GPIO_Pin_7, digit[5]);
GPIO_SetBits(GPIOB, GPIO_Pin_6); // 选择数码管7
GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7);
GPIO_WriteBit(GPIOB, GPIO_Pin_7, digit[6]);
GPIO_SetBits(GPIOB, GPIO_Pin_7); // 选择数码管8
GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6);
GPIO_WriteBit(GPIOB, GPIO_Pin_7, digit[7]);
}
void delay_ms(int ms)
{
TIM_SetCounter(TIM2, 0);
while (TIM_GetCounter(TIM2) < ms);
}
int main(void)
{
GPIO_Configuration();
TIM_Configuration();
while (1)
{
display(cnt); // 数码管记录红外感应信号感应次数
}
}
```
该代码使用了定时器和中断的方式,能够实现同时检测红外感应信号和定时循环响应蜂鸣器。数码管的显示使用了二进制转换的方式,能够记录红外感应信号感应次数。