cz45646 2023-03-17 00:04 采纳率: 100%
浏览 138
已结题

修改一下单片机程序,

搞了个程序和仿真,想改一下里面内容
想修改成:
按一次按键就响一次
按开始数秒就开始滴滴响 数码管到10秒节奏就越来越快 到2秒 就一直响
加个led和蜂鸣器一样工作

img






#include<reg51.h> 
#include<intrins.h>
#include<absacc.h>       //头文件
#define ui unsigned int
#define uc unsigned char   //宏定义

uc code tab1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};       //码表0~9
uc code tab2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};       //码表带点0~9
sbit jiabaiwei=P1^0;    //加百位按键(分加)
sbit daojishi=P1^1;        //倒计时
sbit zhanting=P1^2;        //暂停
sbit jiashiwei=P1^3;    //加十位(秒十位)
sbit jiagewei=P1^4;        //加个位(秒个位)
sbit baojing=P3^7;        //蜂鸣器
bit flag1;    //标志位

uc n;
char qian,bai,shi,ge,miao,fen;//变量

void delay(ui k)   //延时函数
{
    ui i,j;
    for(i=0;i<k;i++)
        for(j=0;j<10;j++);
}

void init()       //初始化函数
{
    TMOD=0x01;      //定时器0工作方式1
    EA=1;          //开总中断
    ET0=1;          //定时器0中断开
    TH0=0x3c;
    TL0=0xb0;      //附初值
    flag1=1;      //变量附1
}

void xianshi()      //显示子函数
{
    qian=fen/10;  //分十位
    bai=fen%10;      //分个位
    shi=miao/10;  //秒十位
    ge=miao%10;      //秒个位
    P0=0x00;
    P2=0xf7;       //让数码管第一个位亮(送位选信号)
    P0=tab1[ge];   //送段
    delay(10);       //延时
    P0=0x00;
    P2=0xfb;       //让数码管第二个位亮(送位)
    P0=tab1[shi];  //送位选信号
    delay(10);       //延时
    P0=0x00;
    P2=0xfd;       //让数码管第三个位亮(送位选信号)
    P0=tab2[bai];  //送位选信号
    delay(10);       //延时
    P0=0x00;
    P2=0xfe;       //让数码管第四个位亮(送位选信号)
    P0=tab1[qian]; //送位选信号
    delay(10);       //延时
    P0=0x00;
}

void anjian()      //按键子函数
{
    if(jiabaiwei==0)   //加百位按键(分加)
    {
        delay(30);       //延时去抖
        if(jiabaiwei==0)   //确定按键按下
        {
            fen=fen+1;      //分自加
            if(fen>59)      //如果分大于59
            fen=0;          //分归零
        }
        while(!jiabaiwei); //等待按键释放
    }
    else if(daojishi==0)
    {
        delay(30);       //延时去抖
        if(daojishi==0)        //确定按键按下
        {
            if((miao!=0)||(fen!=0))    //如果分和秒不同时等于0
            TR0=1;             //定时器0开         
            flag1=1;         //开始倒计时标志位
        }
        while(!daojishi); //等待按键释放
    }
    else if(zhanting==0)    //如果暂停按键按下
    {
        delay(30);         //延时去抖
        if(zhanting==0)      //确定按键按下
        {
            TR0=0;          //关定时器
        }
        while(!zhanting); //等待按键释放
    }
    else if(jiashiwei==0)     //如果秒十位加按键按下
    {
        delay(30);      //延时去抖
        if(jiashiwei==0) //确定按键按下
        {
            miao=miao+10;  //秒自加10
            if(miao>59)        //如果秒大于59
            miao=miao%10;   //秒取余
        }
        while(!jiashiwei); //等待按键释放
    }
    else if(jiagewei==0)   //如果加秒个位的按键按下
    {
        delay(30);       //延时去抖
        if(jiagewei==0)      //确定按键按下
        {
            miao=miao+1;   //秒+1
            if(miao>59)        //如果秒大于59
            {
            miao=0;            //秒归零
            fen++;            //分+1
            }
        }
        while(!jiagewei); //等待按键释放
    }
        
}

void main()             //主函数
{
    init();            //初始化函数
    while(1)
    {
        anjian();      //按键函数
        xianshi();      //显示函数
    }
}

void zhongduan() interrupt 1 //定时器0
{
    TH0=0x3c;
    TL0=0xb0;      //重附初值50ms
    n++;
    if(n>=20)      //如果到1s(n=20就是1s的时间)
    {
        n=0;                         //n 清零
        if(flag1==1)                //如果 flag1等于1的时候
        {
            miao--;
            if(miao<0)
            {
                if(fen>0)
                {
                    fen--;
                    miao=59;
                }
                else
                {
                    fen=miao=0;
                }
            }
            
            if((miao<=10)&&(fen==0)) //如果秒小于10并且分等于0
            {
                baojing=~baojing;    //报警取反
                if(miao==0)            //如果秒等于1
                {    
                    flag1=0;         
                    miao=0;            //秒清零
                    fen=0;             //分清零
                    TR0=0;            //关定时器
                    baojing=1;        //报警关
                }
            }
        }
    }
}


  • 写回答

6条回答 默认 最新

  • 「已注销」 2023-03-17 07:17
    关注

    有代码吗?可以发一个你的代码
    参考GPT和自己的思路:下面是一份示例代码,该代码使用单片机STM32F103C8T6和Keil uVision5开发环境:

    #include "stm32f10x.h"
    #include "delay.h"
    #include "lcd1602.h"
    
    #define LED_PIN  GPIO_Pin_0
    #define BEEP_PIN GPIO_Pin_8
    #define KEY_PIN  GPIO_Pin_1
    
    void TIM2_Init(uint16_t arr, uint16_t psc)
    {
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    
        TIM_TimeBaseInitStructure.TIM_Period = arr;
        TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    
        TIM_Cmd(TIM2, DISABLE);
    }
    
    void TIM2_Enable(void)
    {
        TIM_Cmd(TIM2, ENABLE);
    }
    
    void TIM2_Disable(void)
    {
        TIM_Cmd(TIM2, DISABLE);
    }
    
    void BEEP_Init(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
        GPIO_InitStructure.GPIO_Pin = BEEP_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
    
        GPIO_SetBits(GPIOB, BEEP_PIN);
    }
    
    void LED_Init(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
        GPIO_InitStructure.GPIO_Pin = LED_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    
        GPIO_SetBits(GPIOA, LED_PIN);
    }
    
    uint8_t KEY_Read(void)
    {
        if(GPIO_ReadInputDataBit(GPIOA, KEY_PIN) == Bit_RESET)
        {
            delay_ms(10);
    
            if(GPIO_ReadInputDataBit(GPIOA, KEY_PIN) == Bit_RESET)
            {
                while(GPIO_ReadInputDataBit(GPIOA, KEY_PIN) == Bit_RESET);
                return 1;
            }
        }
    
        return 0;
    }
    
    void Beep(uint16_t frq)
    {
        TIM_OCInitTypeDef TIM_OCInitStructure;
    
        TIM2->ARR = 1000000 / frq;
        TIM2->CNT = 0;
    
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = TIM2->ARR / 2;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OC3Init(TIM2, &TIM_OCInitStructure);
    
        TIM_Cmd(TIM2, ENABLE);
    }
    
    void Task_Beep(uint16_t cnt)
    {
        uint16_t i;
    
        for(i = 0; i < cnt; i++)
        {
            Beep(2000 - 100 * i);
    
            delay_ms(200);
        }
    
        TIM2_Disable();
    
        GPIO_ResetBits(GPIOB, BEEP_PIN);
    }
    
    void Task_LED(uint16_t cnt)
    {
        uint16_t i;
    
        for(i = 0; i < cnt; i++)
        {
            GPIO_ResetBits(GPIOA, LED_PIN);
    
            delay_ms(100);
    
            GPIO_SetBits(GPIOA, LED_PIN);
    
            delay_ms(100);
        }
    }
    
    int main(void)
    {
    // 初始化按键和LED
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = LED_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    
    // 初始化蜂鸣器和计时器
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_TIM1);
    
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 9999;
    TIM_TimeBaseStructure.TIM_Prescaler = 8399;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
    
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 5000;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
    
    // 启动定时器
    TIM_Cmd(TIM1, ENABLE);
    
    // 状态变量初始化
    uint8_t is_button_pressed = 0;
    uint8_t is_counting_down = 0;
    uint16_t count = 0;
    uint16_t delay_time = 1000;
    
    while(1)
    {
        // 按键检测
        if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET && !is_button_pressed)
        {
            // 按键被按下
            is_button_pressed = 1;
    
            // 点亮LED
            GPIO_SetBits(GPIOC, LED_PIN);
    
            // 播放蜂鸣器音乐
            uint16_t music[] = {262, 294, 330, 349, 392, 440, 494, 0};
            uint16_t music_time[] = {500, 500, 500, 500, 500, 500, 500, 500};
    
            for(uint8_t i = 0; music[i] != 0; i++)
            {
                // 设定蜂鸣器频率
                TIM_SetCompare1(TIM1, music[i] * 2);
    // 设定蜂鸣器持续时间
    uint16_t time = music_time[i];
    while (time--)
    {
        delay_ms(1);
    }
    
    // 关闭蜂鸣器
    TIM_SetCompare1(TIM1, 0);
    
    // 等待一段时间后继续播放
    delay_ms(100);
    }
    
    // 关闭LED
    GPIO_ResetBits(GPIOC, LED_PIN);
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏
查看更多回答(5条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月18日
  • 已采纳回答 3月17日
  • 修改了问题 3月17日
  • 创建了问题 3月17日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么