设计一个9秒倒计时,数码管从9每秒减一,到0后定时关,蜂鸣器响。

本文介绍了一个使用C语言编写的设计,通过数码管显示9秒倒计时,每秒递减1,直至0后停止定时器,并触发蜂鸣器响声。程序利用了中断和延时函数,适用于蓝桥杯竞赛或相关课程作业。
摘要由CSDN通过智能技术生成

#include<reg51.h>

sbit wela=P2^7;

sbit dula=P2^6;

unsigned char i=0;

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(int xms)

{

int o,u;

 for(o=xms;o>0;o--)  

 for(u=110;u>0;u--);

}

void ma

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个基本的程序代码,可以实现数码管显示10倒计时并触发蜂鸣器: ``` #include "stm32f4xx.h" // 定义数码管显示的GPIO引脚 #define DIGIT_1 GPIO_Pin_0 #define DIGIT_2 GPIO_Pin_1 #define DIGIT_3 GPIO_Pin_2 #define DIGIT_4 GPIO_Pin_3 #define SEG_A GPIO_Pin_4 #define SEG_B GPIO_Pin_5 #define SEG_C GPIO_Pin_6 #define SEG_D GPIO_Pin_7 #define SEG_E GPIO_Pin_8 #define SEG_F GPIO_Pin_9 #define SEG_G GPIO_Pin_10 #define SEG_DP GPIO_Pin_11 // 定义蜂鸣器的GPIO引脚 #define BUZZER GPIO_Pin_12 // 定义计时器的时钟频率和定时时间 #define TIM_CLOCK_FREQ 84000000 #define TIM_TIME_SEC 10 // 定义计时器的计数值 volatile uint32_t tim_count = TIM_TIME_SEC * TIM_CLOCK_FREQ; void delay_ms(uint32_t ms) { uint32_t i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 2000; j++); } } void init_gpio() { GPIO_InitTypeDef GPIO_InitStructure; // 启用GPIO时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 配置数码管控制GPIO引脚为输出 GPIO_InitStructure.GPIO_Pin = DIGIT_1 | DIGIT_2 | DIGIT_3 | DIGIT_4 | SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G | SEG_DP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置蜂鸣器控制GPIO引脚为输出 GPIO_InitStructure.GPIO_Pin = BUZZER; GPIO_Init(GPIOA, &GPIO_InitStructure); } void init_timer() { TIM_TimeBaseInitTypeDef TIM_InitStructure; // 启用定时器时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 配置定时器 TIM_InitStructure.TIM_Prescaler = TIM_CLOCK_FREQ / 1000000 - 1; TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_InitStructure.TIM_Period = TIM_TIME_SEC * 1000 - 1; TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_InitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, &TIM_InitStructure); // 启动定时器 TIM_Cmd(TIM2, ENABLE); } void update_display(uint32_t num) { uint32_t digit[4]; // 将数字拆分为每一位 digit[0] = num / 1000; digit[1] = (num % 1000) / 100; digit[2] = (num % 100) / 10; digit[3] = num % 10; // 显示每一位数字 GPIO_ResetBits(GPIOA, DIGIT_1 | DIGIT_2 | DIGIT_3 | DIGIT_4); GPIO_SetBits(GPIOA, DIGIT_1); GPIO_ResetBits(GPIOA, SEG_DP | SEG_E | SEG_F); GPIO_Write(GPIOA, (digit[0] == 0) ? 0xFF : ~(1 << (digit[0] - 1))); delay_ms(1); GPIO_ResetBits(GPIOA, DIGIT_1); GPIO_SetBits(GPIOA, DIGIT_2); GPIO_ResetBits(GPIOA, SEG_A | SEG_D | SEG_DP); GPIO_Write(GPIOA, (digit[1] == 0) ? 0xFF : ~(1 << (digit[1] - 1))); delay_ms(1); GPIO_ResetBits(GPIOA, DIGIT_2); GPIO_SetBits(GPIOA, DIGIT_3); GPIO_ResetBits(GPIOA, SEG_A | SEG_D | SEG_F | SEG_G | SEG_DP); GPIO_Write(GPIOA, (digit[2] == 0) ? 0xFF : ~(1 << (digit[2] - 1))); delay_ms(1); GPIO_ResetBits(GPIOA, DIGIT_3); GPIO_SetBits(GPIOA, DIGIT_4); GPIO_ResetBits(GPIOA, SEG_B | SEG_C | SEG_DP); GPIO_Write(GPIOA, (digit[3] == 0) ? 0xFF : ~(1 << (digit[3] - 1))); delay_ms(1); GPIO_ResetBits(GPIOA, DIGIT_4); } void update_buzzer() { static uint32_t count = 0; // 每100毫更新蜂鸣器状态 if (++count == 100) { GPIO_ToggleBits(GPIOA, BUZZER); count = 0; } } int main(void) { init_gpio(); init_timer(); while (1) { if (tim_count == 0) { // 倒计时结束,触发蜂鸣器 GPIO_SetBits(GPIOA, BUZZER); while (1) { update_buzzer(); } } else { // 更新数码管显示 update_display(tim_count / (TIM_CLOCK_FREQ / 1000)); tim_count--; } } } ``` 这里使用的定时器是TIM2,数码管蜂鸣器的GPIO引脚连接在GPIOA上。在初始化GPIO和定时器之后,程序进入一个无限循环中,在循环中更新数码管显示和蜂鸣器状态。当倒计时结束时,程序触发蜂鸣器,并进入一个死循环中,使程序停在此处不再执行其他操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值