weixin_55272653 2025-11-02 16:07 采纳率: 0%
浏览 3

如何使用stm32f103c6设计一个0-50的计数器,并且用一个led灯检测是否能被七整除?

#include "stm32f10x.h
const uint8_t seg_code[16] = {
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90, // 9
};
void delay_us(uint32_t us) {
for(uint32_t i = 0; i < us * 1; i++);
}

void display(uint8_t ten, uint8_t one) {

GPIOB->ODR |= 0x08;
GPIOA->ODR = seg_code[ten];
delay_us(100);
GPIOB->ODR &= ~0x08;


GPIOB->ODR |= 0x04;
GPIOA->ODR = seg_code[one];
delay_us(100);
GPIOB->ODR &= ~0x04;

}

int main(void) {
uint16_t count = 0;
uint16_t delay_cnt = 0;

RCC->APB2ENR |= (1 << 2);
GPIOA->CRL = 0x33333333;
GPIOA->ODR = 0xFF;


RCC->APB2ENR |= (1 << 3);
GPIOB->CRL &= 0xFFFF000F;
GPIOB->CRL |= 0x00003300;
GPIOB->ODR &= ~(0x04 | 0x08);


while(1) {
    uint8_t ten = count / 10;
    uint8_t one = count % 10;
    display(ten, one);
    
    delay_cnt++;
    if(delay_cnt >= 80000) {
        delay_cnt = 0;
        count++;
        if(count > 50) count = 0;
    }
}

}
这个代码烧录到proteus里只显示00不计数

  • 写回答

3条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-11-02 16:14
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案让您满意,请采纳、点赞、关注,非常感谢!
    .
    每日一句正能量,让它带给您好心情:把烦恼踩在脚下,让它成为你向上的阶梯。
    .

    根据您提供的代码,我分析出几个可能导致计数器不工作的原因。以下是完整的解决方案:

    问题分析

    1. LED显示扫描频率过高 - 当前代码中只有100us的延时,可能导致显示刷新过快
    2. 计数器延时逻辑可能不够准确
    3. 缺少LED灯检测能被7整除的功能

    修正后的完整代码

    #include "stm32f10x.h"
    
    
    const uint8_t seg_code[16] = {
        0xC0, // 0
        0xF9, // 1
        0xA4, // 2
        0xB0, // 3
        0x99, // 4
        0x92, // 5
        0x82, // 6
        0xF8, // 7
        0x80, // 8
        0x90, // 9
        0x88, // A
        0x83, // b
        0xC6, // C
        0xA1, // d
        0x86, // E
        0x8E  // F
    };
    
    
    void delay_us(uint32_t us) {
        for(uint32_t i = 0; i < us * 8; i++);
    }
    
    
    void delay_ms(uint32_t ms) {
        for(uint32_t i = 0; i < ms * 1000; i++) {
            delay_us(1);
        }
    }
    
    
    void display(uint8_t ten, uint8_t one) {
        // 显示十位
        GPIOB->ODR |= 0x08;
        GPIOA->ODR = seg_code[ten];
        delay_us(500);  // 增加显示延时
        GPIOB->ODR &= ~0x08;
    
    
        // 显示个位
        GPIOB->ODR |= 0x04;
        GPIOA->ODR = seg_code[one];
        delay_us(500);  // 增加显示延时
        GPIOB->ODR &= ~0x04;
    }
    
    
    int main(void) {
        uint16_t count = 0;
        uint32_t delay_cnt = 0;
        
        // 使能GPIOA时钟
        RCC->APB2ENR |= (1 << 2);
        // 配置GPIOA为推挽输出,50MHz
        GPIOA->CRL = 0x33333333;
        GPIOA->ODR = 0xFF;
        
        // 使能GPIOB时钟
        RCC->APB2ENR |= (1 << 3);
        // 配置GPIOB.2和GPIOB.3为推挽输出
        GPIOB->CRL &= 0xFFFF00FF;
        GPIOB->CRL |= 0x00003300;
        GPIOB->ODR &= ~(0x04 | 0x08);
        
        // 配置LED灯引脚(假设使用PB0)
        GPIOB->CRL &= 0xFFFFFFF0;
        GPIOB->CRL |= 0x00000003;
        GPIOB->ODR &= ~0x01;
    
    
        while(1) {
            uint8_t ten = count / 10;
            uint8_t one = count % 10;
            
            // 显示数字
            for(int i = 0; i < 100; i++) {
                display(ten, one);
            }
            
            delay_cnt++;
            if(delay_cnt >= 1000) {  // 调整延时计数
                delay_cnt = 0;
                count++;
                if(count > 50) count = 0;
                
                // 检查是否能被7整除,控制LED灯
                if(count % 7 == 0 && count != 0) {
                    GPIOB->ODR |= 0x01;  // LED亮
                } else {
                    GPIOB->ODR &= ~0x01; // LED灭
                }
            }
        }
    }
    

    主要修改点

    1. 增加显示扫描次数:在main循环中增加了显示循环,确保显示稳定
    2. 调整延时时间:增加了显示延时,避免刷新过快
    3. 添加LED控制逻辑:使用PB0控制LED,当数字能被7整除时LED亮起
    4. 优化延时函数:调整了延时函数的参数,确保时序准确

    硬件连接建议

    • 数码管段选:GPIOA 0-7
    • 数码管位选:GPIOB.2(个位), GPIOB.3(十位)
    • LED灯:GPIOB.0(可根据实际硬件调整)

    Proteus仿真注意事项

    1. 确保数码管类型与代码中的共阴/共阳设置匹配
    2. 检查GPIO引脚连接是否正确
    3. 确认STM32F103C6的时钟配置
    4. 如果仍然不显示,可以尝试进一步调整延时参数

    这个修正后的代码应该能够正常显示0-50的计数,并且在数字能被7整除时点亮LED灯。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月2日