/
- 蓝桥杯单片机比赛代码模板完整实现
- 基于博客内容: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) {
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/256214.html