2401_85319949 2025-04-08 23:42 采纳率: 0%
浏览 5

keil,C语言编程,单片机,蓝桥杯

img


用keil写,C语言编程,怎么写才能运行出来呀,我主要问题温度不变,一直显示53,数码管一直在闪,按键9按的过程中会停止闪锁,显示53.55,再按一次显示53.5,但是松手就会一直闪,根本看不清是什么

  • 写回答

3条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-04-08 23:44
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析
      - 温度显示固定不变,一直为53,说明温度采集部分或者数据更新到显示的流程有问题。
      - 数码管一直在闪,可能是数码管驱动程序不稳定,或者显示刷新频率设置不当。
      - 按键9按下过程中能正确显示53.55和53.5,但松手后又恢复闪烁看不清,这表明按键处理逻辑存在缺陷,没有正确保存和维持按键按下时的显示状态。
    2. 解决方案
      - 温度采集与显示更新
      • 首先检查温度传感器的驱动代码,确保能够正确采集到实时温度数据。例如,如果使用DS18B20温度传感器,代码如下:
    #include <reg51.h>
    sbit DQ = P3^7;
    
    void delay(unsigned int time) {
        unsigned int i, j;
        for(i = time; i > 0; i--)
            for(j = 110; j > 0; j--);
    }
    
    unsigned char ReadOneChar(void) {
        unsigned char i, dat = 0;
        for(i = 8; i > 0; i--) {
            DQ = 0;
            dat >>= 1;
            DQ = 1;
            if(DQ) dat |= 0x80;
            delay(5);
        }
        return(dat);
    }
    
    void ReadTemp(void) {
        unsigned char a, b;
        DQ = 1;
        DQ = 0;
        delay(10);
        DQ = 1;
        delay(40);
        if(DQ == 0) {
            a = ReadOneChar();
            b = ReadOneChar();
            temp = ((a << 4) | (b >> 4));
            if(temp > 127) {
                temp = ~temp + 1;
                flag = 1;
            } else flag = 0;
        }
    }
    
     - 采集到温度数据后,要确保正确更新显示部分的代码。比如将温度值转换为适合数码管显示的格式(假设数码管显示为整数部分和小数部分分开显示)。
    
    // 假设已经采集到温度值temp,数码管显示函数
    void DisplayTemp() {
        unsigned char tens = temp / 10;
        unsigned char units = temp % 10;
        // 显示十位
        // 根据数码管驱动方式进行相应操作,假设数码管段码存储在code数组中
        P0 = code[tens];
        P2 = 0x01;
        delay(1);
        P2 = 0x00;
        // 显示个位
        P0 = code[units];
        P2 = 0x02;
        delay(1);
        P2 = 0x00;
    }
    
    • 数码管闪烁问题
      • 检查数码管扫描频率是否合适。如果扫描频率过高,人眼看起来就会像闪烁。例如,假设数码管扫描周期为10ms,代码如下:
    void Timer0_ISR(void) interrupt 1 {
        static unsigned char digit = 0;
        TH0 = (65536 - 10000) / 256;
        TL0 = (65536 - 10000) % 256;
        switch(digit) {
            case 0:
                P0 = code[0];
                P2 = 0x01;
                break;
            case 1:
                P0 = code[1];
                P2 = 0x02;
                break;
            // 依次类推,设置其他数码管位
        }
        digit++;
        if(digit >= 8) digit = 0;
        P2 = 0x00;
    }
    
     - 适当调整扫描频率,比如将扫描周期延长到20 - 50ms,以减少闪烁感。
    
    • 按键处理逻辑
      • 对于按键9的处理,要使用状态机来保存按键按下时的显示状态。例如:
    sbit KEY9 = P1^0;
    bit key9_pressed = 0;
    unsigned char display_state = 0; // 0:正常显示,1:按键按下显示特定值
    
    void KeyScan() {
        if(KEY9 == 0) {
            delay(20); // 消抖
            if(KEY9 == 0) {
                while(!KEY9); // 等待按键释放
                key9_pressed = 1;
                if(display_state == 0) {
                    display_state = 1;
                    // 显示53.55
                } else {
                    display_state = 0;
                    // 恢复正常显示
                }
            }
        } else {
            key9_pressed = 0;
        }
    }
    
    void Display() {
        if(display_state == 0) {
            DisplayTemp();
        } else {
            // 显示53.55或53.5的代码
            unsigned char tens = 53 / 10;
            unsigned char units = 53 % 10;
            P0 = code[tens];
            P2 = 0x01;
            delay(1);
            P2 = 0x00;
            P0 = code[units];
            P2 = 0x02;
            delay(1);
            P2 = 0x00;
            // 显示小数部分
            tens = 5 / 10;
            units = 5 % 10;
            P0 = code[tens];
            P2 = 0x04;
            delay(1);
            P2 = 0x00;
            P0 = code[units];
            P2 = 0x08;
            delay(1);
            P2 = 0x00;
        }
    }
    
    1. 多种解决方案优缺点
      - 优点
      • 上述代码逻辑清晰,按照温度采集、显示更新、数码管闪烁处理和按键处理的顺序分别进行优化,易于理解和维护。
      • 通过状态机处理按键逻辑,可以准确保存和恢复按键按下时的显示状态,解决了松手后显示异常的问题。
      • 缺点
      • 代码相对较为繁琐,尤其是数码管显示部分,需要针对不同的数码管位进行单独设置。
      • 如果硬件电路有变动,例如数码管的连接方式改变,可能需要对数码管驱动代码进行较大修改。
    2. 总结
      - 针对温度显示固定、数码管闪烁和按键处理问题,分别对温度采集与显示更新、数码管扫描频率以及按键处理逻辑进行了优化。通过正确采集温度数据并更新显示,合理调整数码管扫描频率减少闪烁,以及利用状态机完善按键处理逻辑,有望解决当前程序中出现的问题,使数码管能够稳定、正确地显示温度值,并且按键功能正常。

    需要注意的是,以上代码是基于常见的51单片机和基本的硬件假设编写的,实际应用中可能需要根据具体硬件电路和需求进行调整。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月8日