2026年蓝桥杯单片机代码模板[源码]

蓝桥杯单片机代码模板[源码]蓝桥杯单片机比赛代码模板完整实现 基于博客内容 https blog csdn net szq0909 article details include reg52 h include intrins h P4 端口定义 reg52 h 中没有 需要手动定义 sfr

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。

/

  • 蓝桥杯单片机比赛代码模板完整实现
  • 基于博客内容:https://blog.csdn.net/szq0909/article/details/ */

#include "reg52.h" #include "intrins.h"

// P4 端口定义(reg52.h 中没有,需要手动定义) sfr P4 = 0xC0;

// LED 灯定义 sbit L1 = P0^0; sbit L2 = P0^1; sbit L3 = P0^2; sbit L4 = P0^3; sbit L5 = P0^4; sbit L6 = P0^5; sbit L7 = P0^6; sbit L8 = P0^7;

// 独立按键定义 sbit S7 = P3^0; sbit S6 = P3^1; sbit S5 = P3^2; sbit S4 = P3^3;

// 矩阵按键定义(4x4) sbit R1 = P3^0; sbit R2 = P3^1; sbit R3 = P3^2; sbit R4 = P3^3; sbit C1 = P4^4; sbit C2 = P4^2; sbit C3 = P3^5; sbit C4 = P3^4;

// 超声波模块 sbit TX = P1^0; sbit RX = P1^1;

// DS18B20 温度传感器 sbit DQ = P1^4;

// DS1302 实时时钟 sbit SCK = P1^7; sbit SDA_DS1302 = P2^3; sbit RST_DS1302 = P1^3;

// I2C 总线(PCF8591、24C02) sbit sda = P2^1; sbit scl = P2^0;

// 全局变量定义 bit SMG_flash = 1; // 数码管闪烁标志 bit LED_off_on = 0; // LED 开关标志 bit LED_k = 0; // LED 定时开关标志 bit LED_f = 0; // LED 闪烁标志 bit k4 = 0; // S4 按键按下标志 bit PWM_f = 1; // PWM 输出标志

unsigned int LED_count = 0; unsigned int SMG_count = 0; unsigned int LED_c = 0; unsigned int count = 0; unsigned int PWM_c = 0; unsigned char PWM_t = 20; // 占空比 20% unsigned char SMG_stat = 0; unsigned char k5 = 0; unsigned char k7 = 0;

// 计时器数组(秒、分、时) unsigned char Timer[3] = {0x55, 0x59, 0x23};

// 温度变量 unsigned int temper = 0;

// 光敏电阻电压 unsigned int lingt = 0;

// 可变电阻电压 unsigned int rb2 = 0;

// 超声波测距 unsigned int distance = 0;

// 串口接收数据 unsigned char urdat;

// 数码管段码(共阳极) // 0 1 2 3 4 5 6 7 8 9 A B C D E F - . unsigned char code SMG_duanma[18] = {

0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x80, 0xc6, 0xc0, 0x86, 0x8e, 0xbf, 0x7f 

};

// 带小数点的数码管段码 // 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. unsigned char code SMG_dot[10] = {

0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10 

};

/

  • 锁存器选择函数
  • channel: 4-LED, 5-蜂鸣器继电器,6-数码管位选,7-数码管段选,0-关闭 */ void selectHC573(unsigned char channel) { switch(channel) { case 4: P2 = (P2 & 0x1f) | 0x80; break; // 控制 LED 灯 case 5: P2 = (P2 & 0x1f) | 0xa0; break; // 控制蜂鸣器继电器 case 6: P2 = (P2 & 0x1f) | 0xc0; break; // 控制数码管显示位置 case 7: P2 = (P2 & 0x1f) | 0xe0; break; // 控制数码管显示数字 case 0: P2 = (P2 & 0x1f) | 0x00; break; // 关闭所有锁存器 } }

/

  • 系统初始化 */ void Init_system() { selectHC573(5); // 控制蜂鸣器与继电器 P0 = 0x00; // 关闭蜂鸣器和继电器

    selectHC573(4); // 控制 LED 灯 P0 = 0xff; // 关闭所有 LED 灯(低电平点亮)

    selectHC573(0); // 关闭锁存器 }

/

  • 普通延迟函数(int 类型,延迟时间长) */ void delay(unsigned int t) { while(t–); }

/

  • 短时延迟函数(char 类型,用于按键消抖) */ void delay_key(unsigned char t) { while(t–); }

/

  • 12us 延迟(用于超声波) */ void delay12us() { unsigned char i; nop(); nop(); i = 33; while(–i); }

/

  • LED 流水灯效果 */ void LEDrunning() { unsigned char i;

    // 依次熄灭 for(i = 0; i <= 8; i++) {

    selectHC573(4); P0 = 0xff << i; delay(60000); selectHC573(0); 

    }

    // 依次点亮 for(i = 0; i <= 8; i++) {

    selectHC573(4); P0 = ~(0xff << i); delay(60000); selectHC573(0); 

    } }

/

  • 数码管单个位显示
  • dat: 显示数据
  • pos: 显示位置 (0-7) */ void DisSMG_bit(unsigned char dat, unsigned char pos) { selectHC573(6); // 数码管位选 P0 = 0x01 << pos;

    selectHC573(7); // 数码管内容 P0 = dat;

    delay(500); // 动态显示延迟

    selectHC573(0); // 关闭锁存器 }

/

  • 数码管统一关闭 */ void DisSMG_all(unsigned char dat) { selectHC573(6); P0 = 0xff;

    selectHC573(7); P0 = dat;

    selectHC573(0); }

/

  • 数码管动态显示示例 */ void DisSMG() if(SMG_stat == 1) { DisSMG_bit(SMG_duanma[1], 0); } if(SMG_stat == 2) { DisSMG_bit(SMG_duanma[2], 0); } DisSMG_all(0xff); // 统一关闭数码管 }

/

  • 独立按键扫描 */ void scan_key()
     // 按键松开后的处理 if(SMG_stat == 0) { SMG_stat = 1; } else if(SMG_stat == 1) { k5 = 0; SMG_stat = 2; } else if(SMG_stat == 2) { SMG_stat = 0; } } 

    }

    // S6 按键 if(S6 == 0)

     // S6 按键处理逻辑 } 

    }

    // S5 按键 if(S5 == 0)

     // S5 按键处理逻辑 } 

    }

    // S4 按键(支持长按短按) if(S4 == 0)

     k4 = 0; if(count > 100) { // 长按操作(超过 1 秒) } else { // 短按操作 } } 

    } }

/

  • 4x4 矩阵键盘扫描 */ void scan_matrix_key()
     // 第一行第一列按键处理 } 

    } if(C2 == 0)

     // 第一行第二列按键处理 } 

    } if(C3 == 0)

     // 第一行第三列按键处理 } 

    } if(C4 == 0)

     // 第一行第四列按键处理 } 

    }

    // 扫描第二行 R2 = 0; R1 = R3 = R4 = 1; C1 = C2 = C3 = C4 = 1;

    if(C1 == 0)

     // 第二行第一列按键处理 } 

    } // … 其他行列类似处理 }

/

  • 定时器 0 初始化(0.01 秒中断) */ void Init_T0() { TMOD = 0x01; // 定时器 0,模式 1(16 位) TH0 = (65535 - 10000) / 256; // 0.01 秒 @12MHz TL0 = (65535 - 10000) % 256; EA = 1; // 总中断打开 ET0 = 1; // 定时中断使能 TR0 = 1; // 启动定时器 }

/

  • 定时器 0 中断服务函数 */ void Service_T0() interrupt 1
    } 

    }

    // 按键长按计数 if(k4 == 1) {

    count++; 

    }

    // PWM 控制 PWM_c++; if(PWM_c >= PWM_t) {

小讯
上一篇 2026-04-12 10:19
下一篇 2026-04-12 10:17

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/256214.html