单片机——实现交通信号灯管理
随便写写,汇总一下,就一个单片机,没有模拟软件,什么都没有~
点阵、数码管、led同时点亮
#include <reg52.h>sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;// 交通灯控制引脚定义
sbit A_Red = P0^0;
sbit A_Yellow = P0^1;
sbit A_Green = P0^2;
sbit B_Red = P0^3;
sbit B_Yellow = P0^4;
sbit B_Green = P0^5;unsigned char code LedChar[] = { // 数码管显示字符转换表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char flag1s = 0; // 1秒定时标志// 交通灯状态变量
unsigned char current_state = 0; // 0:A绿灯 1:A黄灯 2:B绿灯 3:B黄灯
unsigned char count_down = 27; // 当前倒计时
bit yellow_blink = 0; // 黄灯闪烁标志
unsigned int timer_count = 0; // 定时器计数// LED流水灯变量
static unsigned char j = 0;
static unsigned int shift1 = 0x01;
static unsigned int shift2 = 0x80;
static unsigned char dir1 = 0;void main()
{EA = 1; // 开启总中断TMOD = 0x11; // 使用定时器0和定时器1// 定时器0初始化(2ms,用于1秒定时)TH0 = 0xFC;TL0 = 0x67;ET0 = 1;TR0 = 1;// 定时器1初始化(1ms,用于数码管扫描)TH1 = 0xFC;TL1 = 0x67;ET1 = 1;TR1 = 1;// 初始状态:A绿灯,B红灯A_Green = 0;B_Red = 0;A_Red = B_Green = B_Yellow = A_Yellow = 1;while (1){if (flag1s == 1) // 每秒触发一次{flag1s = 0;// 交通灯状态机处理if(count_down > 0) count_down--;if(count_down == 0) {switch(current_state) {case 0: // A绿灯结束current_state = 1;count_down = 3;A_Green = 1;A_Yellow = 0;break;case 1: // A黄灯结束current_state = 2;count_down = 17;A_Yellow = 1;B_Red = 1;B_Green = 0;break;case 2: // B绿灯结束current_state = 3;count_down = 3;B_Green = 1;B_Yellow = 0;break;case 3: // B黄灯结束current_state = 0;count_down = 27;B_Yellow = 1;A_Red = 1;A_Green = 0;break;}}// 更新数码管显示(显示倒计时)LedBuff[0] = LedChar[count_down % 10]; // 个位LedBuff[1] = LedChar[count_down / 10]; // 十位// 其余位保持熄灭LedBuff[2] = LedBuff[3] = LedBuff[4] = LedBuff[5] = 0xFF;}}
}// 定时器1中断服务函数(1ms,用于数码管扫描和LED流水灯)
void Timer1_ISR() interrupt 3
{static unsigned char index = 0;TH1 = 0xFC;TL1 = 0x67;// 黄灯闪烁处理(500ms间隔)if(++timer_count % 250 == 0 && (current_state == 1 || current_state == 3)) {yellow_blink = ~yellow_blink;if(current_state == 1) A_Yellow = yellow_blink;else B_Yellow = yellow_blink;}// 数码管动态扫描P0 = 0xFF; // 消隐ENLED = 0;ADDR3 = 1; // 选择数码管switch(index) {case 0: ADDR2=0; ADDR1=0; ADDR0=0; P0=LedBuff[0]; break;case 1: ADDR2=0; ADDR1=0; ADDR0=1; P0=LedBuff[1]; break;default: P0 = 0xFF; // 其余位不显示}index = (index >= 1) ? 0 : index+1;// LED流水灯控制(复用case 6)if(index == 0) { // 每轮扫描结束后处理LEDADDR3 = 1; // 选择LED控制地址ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;j++;if (j >= 200) { // 每200ms改变一次LED位置j = 0;if (dir1 == 0) { // 从左向右移动shift1 <<= 1;shift2 >>= 1;if (shift1 == 0x80 && shift2 == 0x01)dir1 = 1; // 改变方向} else { // 从右向左移动shift1 >>= 1;shift2 <<= 1;if (shift1 == 0x01 && shift2 == 0x80)dir1 = 0; // 改变方向}}P0 = ~(shift1 | shift2); // 输出LED状态}
}// 定时器0中断服务函数(2ms,用于1秒定时)
void Timer0_ISR() interrupt 1
{static unsigned int sec_count = 0;TH0 = 0xFC;TL0 = 0x67;if(++sec_count >= 500) { // 500 * 2ms = 1秒sec_count = 0;flag1s = 1;}
}
红绿灯熄灭
实现30秒绿灯倒计时熄灭,20秒倒计时红灯熄灭
#include <reg52.h>sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;// 交通灯控制引脚定义
sbit A_Red = P0^0;
sbit A_Yellow = P0^1;
sbit A_Green = P0^2;
sbit B_Red = P0^3;
sbit B_Yellow = P0^4;
sbit B_Green = P0^5;unsigned char code LedChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};volatile unsigned char flag1s = 0;
volatile unsigned int timer_count = 0;
unsigned char current_state = 0; // 0:A绿灯 1:A黄灯 2:B绿灯 3:B黄灯
unsigned char count_down = 27; // 当前倒计时
bit yellow_blink = 0; // 黄灯闪烁标志void main() {EA = 1;TMOD = 0x11;// 定时器0初始化(2ms)TH0 = 0xFC;TL0 = 0x67;ET0 = 1;TR0 = 1;// 定时器1初始化(1ms)TH1 = 0xFC;TL1 = 0x67;ET1 = 1;TR1 = 1;// 初始状态:A绿灯,B红灯A_Green = 0;B_Red = 0;A_Red = B_Green = B_Yellow = A_Yellow = 1;while(1) {if(flag1s) {flag1s = 0;// 状态机处理if(count_down > 0) count_down--;if(count_down == 0) {switch(current_state) {case 0: // A绿灯结束current_state = 1;count_down = 3;A_Green = 1;A_Yellow = 0;break;case 1: // A黄灯结束current_state = 2;count_down = 17;A_Yellow = 1;B_Red = 1;B_Green = 0;break;case 2: // B绿灯结束current_state = 3;count_down = 3;B_Green = 1;B_Yellow = 0;break;case 3: // B黄灯结束current_state = 0;count_down = 27;B_Yellow = 1;A_Red = 1;A_Green = 0;break;}}// 更新数码管显示LedBuff[0] = LedChar[count_down % 10]; // 个位LedBuff[1] = LedChar[count_down / 10]; // 十位}}
}// 定时器1中断(数码管扫描)
void Timer1_ISR() interrupt 3 {static unsigned char index = 0;TH1 = 0xFC;TL1 = 0x67;// 黄灯闪烁处理(500ms间隔)if(++timer_count % 250 == 0 && (current_state == 1 || current_state == 3)) {yellow_blink = ~yellow_blink;if(current_state == 1) A_Yellow = yellow_blink;else B_Yellow = yellow_blink;}// 数码管动态扫描P0 = 0xFF;ENLED = 0;ADDR3 = 1;switch(index) {case 0: ADDR2=0; ADDR1=0; ADDR0=0; P0=LedBuff[0]; break;case 1: ADDR2=0; ADDR1=0; ADDR0=1; P0=LedBuff[1]; break;default: P0 = 0xFF;}index = (index >= 1) ? 0 : index+1;
}// 定时器0中断(1秒定时)
void Timer0_ISR() interrupt 1 {static unsigned int sec_count = 0;TH0 = 0xFC;TL0 = 0x67;if(++sec_count >= 500) { // 500 * 2ms=1秒sec_count = 0;flag1s = 1;}
}
红绿灯跳转
当绿灯30秒剩余三秒时跳转至黄灯,当黄灯3秒后 跳转红灯,红灯20秒后继续跳转
#include <reg52.h>sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;unsigned char code LedChar[] = { // 数码管显示字符转换表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char flag1s = 0;
unsigned char countDownPhase = 0; // 倒计时阶段:0=30->0, 1=20->0
unsigned long sec = 30; // 初始值设为30
bit countDownFinished = 0; // 倒计时结束标志void main()
{char j;unsigned char buf[6];EA = 1; // 开启总中断TMOD = 0x01; // 只使用定时器0// 定时器0初始化(T0)TH0 = 0xFC; // 定时1msTL0 = 0x67;ET0 = 1; // 使能定时器0中断TR0 = 1; // 启动定时器0// 初始化显示30buf[0] = sec%10; // 个位buf[1] = sec/10%10; // 十位buf[2] = 0; buf[3] = 0; buf[4] = 0; buf[5] = 0; // 高位补0// 高位消零处理for (j=5; j>=1; j--){if (buf[j] == 0)LedBuff[j] = 0xFF; // 不显示前导零elsebreak;}// 显示有效数字for (; j>=0; j--){LedBuff[j] = LedChar[buf[j]];}while (1){if (flag1s == 1) // 每秒触发一次{flag1s = 0;if (!countDownFinished) // 如果倒计时未结束{if (sec > 0){sec--; // 秒计数器减1// 分解秒数为单个数字buf[0] = sec%10; // 个位buf[1] = sec/10%10; // 十位buf[2] = sec/100%10;buf[3] = sec/1000%10;buf[4] = sec/10000%10;buf[5] = sec/100000%10;// 高位消零处理for (j=5; j>=1; j--){if (buf[j] == 0)LedBuff[j] = 0xFF; // 不显示前导零elsebreak;}// 显示有效数字for (; j>=0; j--){LedBuff[j] = LedChar[buf[j]];}}else{countDownFinished = 1; // 倒计时结束// 切换到下一阶段countDownPhase++;if (countDownPhase == 1) {// 进入20->0阶段sec = 20;countDownFinished = 0; // 重置结束标志// 更新显示buf[0] = sec%10;buf[1] = sec/10%10;buf[2] = 0; buf[3] = 0; buf[4] = 0; buf[5] = 0;for (j=5; j>=1; j--){if (buf[j] == 0)LedBuff[j] = 0xFF;elsebreak;}for (; j>=0; j--){LedBuff[j] = LedChar[buf[j]];}}else if (countDownPhase >= 2) {// 所有阶段完成,重置到第一阶段countDownPhase = 0;sec = 30;countDownFinished = 0;// 更新显示buf[0] = sec%10;buf[1] = sec/10%10;buf[2] = 0; buf[3] = 0; buf[4] = 0; buf[5] = 0;for (j=5; j>=1; j--){if (buf[j] == 0)LedBuff[j] = 0xFF;elsebreak;}for (; j>=0; j--){LedBuff[j] = LedChar[buf[j]];}}}}}}
}// 定时器0中断服务函数(修改LED控制部分)
void Timer0_ISR() interrupt 1
{ static unsigned char j = 0;static unsigned char i = 0;static unsigned int cnt = 0;static unsigned int shift1 = 0x01;static unsigned int shift2 = 0x80;static unsigned char dir1 = 0;TH0 = 0xFC; // 重新加载初值TL0 = 0x67;P0 = 0xFF; // 显示消隐ENLED = 0; // 使能显示ADDR3 = 1; // 选择数码管和LED// 数码管动态扫描(保持不变)switch (i){case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break;case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break;case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break;case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; break;case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; break;case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=LedBuff[5]; break;case 6: // LED控制(修改部分)ADDR2=1; ADDR1=1; ADDR0=0;// 根据倒计时阶段控制LEDif (countDownPhase == 0) {// 30秒倒计时阶段,点亮第一个LED(P0.0)P0 = 0xFE; // 二进制 1111 1110,仅P0.0为低电平} else {// 20秒倒计时阶段,熄灭所有LEDP0 = 0xFF; // 二进制 1111 1111,所有LED熄灭}i = 0;break;default: break;}// 1秒定时处理(保持不变)cnt++;if (cnt >= 1000) // 1000ms = 1s{cnt = 0;flag1s = 1; // 设置1秒标志}
}
增加B车道
30秒阶段LED 逻辑:
30 秒→4 秒:点亮 LED2和 LED7
3 秒→0 秒:点亮 LED3和 LED
20 秒阶段 LED 逻辑:
20 秒→4 秒:点亮 LED4和 LED5
3 秒→0 秒:点亮 LED4和 LED6
#include <reg52.h>sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;unsigned char code LedChar[] = { // 数码管显示字符转换表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char flag1s = 0;
unsigned char countDownPhase = 0; // 倒计时阶段:0=30秒阶段, 1=20秒阶段
unsigned long sec = 30; // 初始值设为30
bit countDownFinished = 0; // 倒计时结束标志void main()
{char j;unsigned char buf[6];EA = 1; // 开启总中断TMOD = 0x01; // 只使用定时器0// 定时器0初始化(T0)TH0 = 0xFC; // 定时1msTL0 = 0x67;ET0 = 1; // 使能定时器0中断TR0 = 1; // 启动定时器0// 初始化显示30buf[0] = sec%10; // 个位buf[1] = sec/10%10; // 十位buf[2] = 0; buf[3] = 0; buf[4] = 0; buf[5] = 0; // 高位补0// 高位消零处理for (j=5; j>=1; j--){if (buf[j] == 0)LedBuff[j] = 0xFF; // 不显示前导零elsebreak;}// 显示有效数字for (; j>=0; j--){LedBuff[j] = LedChar[buf[j]];}while (1){if (flag1s == 1) // 每秒触发一次{flag1s = 0;if (!countDownFinished) // 如果倒计时未结束{if (sec > 0){sec--; // 秒计数器减1// 分解秒数为单个数字buf[0] = sec%10; // 个位buf[1] = sec/10%10; // 十位buf[2] = sec/100%10;buf[3] = sec/1000%10;buf[4] = sec/10000%10;buf[5] = sec/100000%10;// 高位消零处理for (j=5; j>=1; j--){if (buf[j] == 0)LedBuff[j] = 0xFF; // 不显示前导零elsebreak;}// 显示有效数字for (; j>=0; j--){LedBuff[j] = LedChar[buf[j]];}}else{countDownFinished = 1; // 倒计时结束// 切换到下一阶段countDownPhase++;if (countDownPhase == 1) {// 进入20->0阶段sec = 20;countDownFinished = 0; // 重置结束标志// 更新显示buf[0] = sec%10;buf[1] = sec/10%10;buf[2] = 0; buf[3] = 0; buf[4] = 0; buf[5] = 0;for (j=5; j>=1; j--){if (buf[j] == 0)LedBuff[j] = 0xFF;elsebreak;}for (; j>=0; j--){LedBuff[j] = LedChar[buf[j]];}}else if (countDownPhase >= 2) {// 所有阶段完成,重置到第一阶段countDownPhase = 0;sec = 30;countDownFinished = 0;// 更新显示buf[0] = sec%10;buf[1] = sec/10%10;buf[2] = 0; buf[3] = 0; buf[4] = 0; buf[5] = 0;for (j=5; j>=1; j--){if (buf[j] == 0)LedBuff[j] = 0xFF;elsebreak;}for (; j>=0; j--){LedBuff[j] = LedChar[buf[j]];}}}}}}
}// 定时器0中断服务函数(修改LED控制部分)
void Timer0_ISR() interrupt 1
{ static unsigned char j = 0;static unsigned char i = 0;static unsigned int cnt = 0;TH0 = 0xFC; // 重新加载初值TL0 = 0x67;P0 = 0xFF; // 显示消隐ENLED = 0; // 使能显示ADDR3 = 1; // 选择数码管和LED// 数码管动态扫描switch (i){case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break;case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break;case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break;case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; break;case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; break;case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=LedBuff[5]; break;case 6: // LED控制部分ADDR2=1; ADDR1=1; ADDR0=0;// 根据倒计时阶段和剩余秒数控制LEDif (countDownPhase == 0) {// 30秒倒计时阶段if (sec > 3) {// 前27秒:LED1(P0.0)和LED6(P0.5)亮P0 = 0xDE; // 二进制 1101 1110 (P0.0和P0.5低电平)} else if (sec > 0) {// 后3秒:LED2(P0.1)和LED6(P0.5)亮P0 = 0xDD; // 二进制 1101 1101 (P0.1和P0.5低电平)} else {// 倒计时结束:熄灭所有LEDP0 = 0xFF;}} else if (countDownPhase == 1) {// 20秒倒计时阶段if (sec > 3) {// 前17秒:LED3(P0.2)和LED4(P0.3)亮P0 = 0xF3; // 二进制 1111 0011 (P0.2和P0.3低电平)} else if (sec > 0) {// 后3秒:LED3(P0.2)和LED5(P0.4)亮P0 = 0xEB; // 二进制 1110 1011 (P0.2和P0.4低电平)} else {// 倒计时结束:熄灭所有LEDP0 = 0xFF;}} else {// 其他阶段:熄灭所有LEDP0 = 0xFF;}i = 0;break;default: break;}// 1秒定时处理cnt++;if (cnt >= 1000) // 1000ms = 1s{cnt = 0;flag1s = 1; // 设置1秒标志}
}
按键控制led灯的10秒定时亮灭
#include <reg52.h>// 引脚定义(补充完整矩阵按键输出和输入引脚)
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY_OUT_1 = P2^3; // 矩阵按键输出引脚(完整定义)
sbit KEY_OUT_2 = P2^2;
sbit KEY_OUT_3 = P1^2; // 假设KEY_OUT_3连接到P1^2(避免与ADDR2冲突)
sbit KEY_OUT_4 = P1^3; // 假设KEY_OUT_4连接到P1^3(避免与ADDR3冲突)
sbit KEY_IN_1 = P2^4; // 矩阵按键输入引脚(完整定义)
sbit KEY_IN_2 = P2^5;
sbit KEY_IN_3 = P2^6;
sbit KEY_IN_4 = P2^7;
sbit LED1 = P0^0; // K2控制的LED(原LED)
sbit LED4 = P0^3; // K1控制的LED4(假设连接到P0^3)// 状态变量
unsigned char KeySta[4][4] = { // 按键状态数组(使用[0][0]对应K1,[0][1]对应K2){1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}
};
unsigned int Timer10s_LED1 = 0; // LED1的10秒计时计数器
unsigned int Timer10s_LED4 = 0; // LED4的10秒计时计数器
bit Led1Active = 0; // LED1激活标志
bit Led4Active = 0; // LED4激活标志// 定时器0参数(1ms定时)
#define TIMER0_RELOAD_H 0xFC // 1ms初值高位
#define TIMER0_RELOAD_L 0x67 // 1ms初值低位void main()
{// 硬件初始化ENLED = 0; // 使能LED控制ADDR3 = 1; // 选择LED所在电路(共阳连接)ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;LED1 = 1; // 初始熄灭LED1LED4 = 1; // 初始熄灭LED4// 定时器0初始化TMOD = 0x01; // 模式1(16位定时器)TH0 = TIMER0_RELOAD_H;TL0 = TIMER0_RELOAD_L;ET0 = 1; // 使能定时器中断EA = 1; // 使能总中断TR0 = 1; // 启动定时器// 矩阵按键初始化KEY_OUT_1 = 1; // 初始拉高所有行KEY_OUT_2 = 1;KEY_OUT_3 = 1;KEY_OUT_4 = 1;while (1){// 检测K1按键状态(矩阵坐标[0][0],第1行第1列)if (KeySta[0][0] == 0 && !Led4Active) // K1按下且LED4未激活{LED4 = 0; // 点亮LED4Led4Active = 1; // 标记LED4激活Timer10s_LED4 = 0; // 重置LED4计时器while (KeySta[0][0] == 0); // 等待K1释放}// 检测K2按键状态(矩阵坐标[0][1],第1行第2列)if (KeySta[0][1] == 0 && !Led1Active) // K2按下且LED1未激活{LED1 = 0; // 点亮LED1Led1Active = 1; // 标记LED1激活Timer10s_LED1 = 0; // 重置LED1计时器while (KeySta[0][1] == 0); // 等待K2释放}}
}/* 定时器0中断服务函数(1ms执行一次) */
void InterruptTimer0() interrupt 1
{static unsigned char keyout = 0; // 矩阵行扫描索引static unsigned char keybuf[4][4] = { // 按键消抖缓冲区{0xFF, 0xFF, 0xFF, 0xFF},{0xFF, 0xFF, 0xFF, 0xFF},{0xFF, 0xFF, 0xFF, 0xFF},{0xFF, 0xFF, 0xFF, 0xFF}};// 重新加载定时器初值TH0 = TIMER0_RELOAD_H;TL0 = TIMER0_RELOAD_L;// 扫描第1行(KEY_OUT_1)KEY_OUT_1 = 0; // 拉低第1行KEY_OUT_2 = 1; // 拉高其他行KEY_OUT_3 = 1;KEY_OUT_4 = 1;// 读取K1和K2的按键值(第1行第1、2列)keybuf[0][0] = (keybuf[0][0] << 1) | KEY_IN_1; // K1(第1列)keybuf[0][1] = (keybuf[0][1] << 1) | KEY_IN_2; // K2(第2列)// K1消抖逻辑if ((keybuf[0][0] & 0x0F) == 0x00) {KeySta[0][0] = 0; // 标记K1按下}else if ((keybuf[0][0] & 0x0F) == 0x0F){KeySta[0][0] = 1; // 标记K1释放}// K2消抖逻辑if ((keybuf[0][1] & 0x0F) == 0x00) {KeySta[0][1] = 0; // 标记K2按下}else if ((keybuf[0][1] & 0x0F) == 0x0F){KeySta[0][1] = 1; // 标记K2释放}// LED1计时逻辑if (Led1Active){Timer10s_LED1++;if (Timer10s_LED1 >= 10000) {LED1 = 1;Led1Active = 0;}}// LED4计时逻辑if (Led4Active){Timer10s_LED4++;if (Timer10s_LED4 >= 10000) {LED4 = 1;Led4Active = 0;}}
}
按下按键暂停红绿灯时间
#include <reg52.h>// 引脚定义
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY_OUT_1 = P2^3;
sbit KEY_OUT_2 = P2^2;
sbit KEY_OUT_3 = P1^2;
sbit KEY_OUT_4 = P1^3;
sbit KEY_IN_1 = P2^4; // K1按键输入
sbit KEY_IN_2 = P2^5; // K2按键输入// 数码管显示
unsigned char code LedChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};// 状态变量
unsigned char flag1s = 0;
unsigned char flag10ms = 0;
unsigned char countDownPhase = 0; // 0=30秒阶段, 1=20秒阶段
unsigned long sec = 30;
bit countDownFinished = 0;// 按键状态和LED控制
unsigned char KeySta[4][4] = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}
};
bit K1_Pressed = 0; // K1按键按下标志
bit K2_Pressed = 0; // K2按键按下标志
bit LED_SpecialMode = 0; // 特殊LED模式标志
unsigned int SpecialModeTimer = 0; // 特殊模式计时器(10秒)
unsigned int secCnt = 0; // 秒计数器
bit SpecialModeType = 0; // 0=K1模式, 1=K2模式void main()
{char j;unsigned char buf[6];// 初始化EA = 1;TMOD = 0x01;TH0 = 0xFC;TL0 = 0x67;ET0 = 1;TR0 = 1;// 初始化显示30buf[0] = sec%10;buf[1] = sec/10%10;buf[2] = 0; buf[3] = 0; buf[4] = 0; buf[5] = 0;for (j=5; j>=1; j--){if (buf[j] == 0)LedBuff[j] = 0xFF;elsebreak;}for (; j>=0; j--){LedBuff[j] = LedChar[buf[j]];}while (1){// 检测K1按键状态(30秒阶段)if (countDownPhase == 0 && KeySta[0][0] == 0 && !K1_Pressed && sec > 3){K1_Pressed = 1;LED_SpecialMode = 1;SpecialModeTimer = 0;SpecialModeType = 0; // K1模式while (KeySta[0][0] == 0); // 等待释放}else if (KeySta[0][0] == 1){K1_Pressed = 0;}// 检测K2按键状态(20秒阶段)if (countDownPhase == 1 && KeySta[0][1] == 0 && !K2_Pressed && sec > 3){K2_Pressed = 1;LED_SpecialMode = 1;SpecialModeTimer = 0;SpecialModeType = 1; // K2模式while (KeySta[0][1] == 0); // 等待释放}else if (KeySta[0][1] == 1){K2_Pressed = 0;}// 特殊模式计时if (flag10ms && LED_SpecialMode) {SpecialModeTimer++;if (SpecialModeTimer >= 1000) { // 1000*10ms = 10秒LED_SpecialMode = 0;}}// 倒计时处理if (flag1s == 1){flag1s = 0;if (!countDownFinished){if (sec > 0){sec--;buf[0] = sec%10;buf[1] = sec/10%10;buf[2] = 0; buf[3] = 0; buf[4] = 0; buf[5] = 0;for (j=5; j>=1; j--){if (buf[j] == 0)LedBuff[j] = 0xFF;elsebreak;}for (; j>=0; j--){LedBuff[j] = LedChar[buf[j]];}}else{countDownFinished = 1;countDownPhase++;LED_SpecialMode = 0; // 阶段切换时重置特殊模式if (countDownPhase == 1) {sec = 20;countDownFinished = 0;buf[0] = sec%10;buf[1] = sec/10%10;buf[2] = 0; buf[3] = 0; buf[4] = 0; buf[5] = 0;for (j=5; j>=1; j--){if (buf[j] == 0)LedBuff[j] = 0xFF;elsebreak;}for (; j>=0; j--){LedBuff[j] = LedChar[buf[j]];}}else if (countDownPhase >= 2) {countDownPhase = 0;sec = 30;countDownFinished = 0;buf[0] = sec%10;buf[1] = sec/10%10;buf[2] = 0; buf[3] = 0; buf[4] = 0; buf[5] = 0;for (j=5; j>=1; j--){if (buf[j] == 0)LedBuff[j] = 0xFF;elsebreak;}for (; j>=0; j--){LedBuff[j] = LedChar[buf[j]];}}}}}}
}// 定时器0中断服务函数
void Timer0_ISR() interrupt 1
{ static unsigned char i = 0;static unsigned int cnt = 0;static unsigned char keyout = 0;static unsigned char keybuf[4][4] = {{0xFF, 0xFF, 0xFF, 0xFF},{0xFF, 0xFF, 0xFF, 0xFF},{0xFF, 0xFF, 0xFF, 0xFF},{0xFF, 0xFF, 0xFF, 0xFF}};TH0 = 0xFC;TL0 = 0x67;// 按键扫描(仅扫描第1行)KEY_OUT_1 = 0;KEY_OUT_2 = 1;KEY_OUT_3 = 1;KEY_OUT_4 = 1;keybuf[0][0] = (keybuf[0][0] << 1) | KEY_IN_1; // K1keybuf[0][1] = (keybuf[0][1] << 1) | KEY_IN_2; // K2// K1消抖if ((keybuf[0][0] & 0x0F) == 0x00)KeySta[0][0] = 0;else if ((keybuf[0][0] & 0x0F) == 0x0F)KeySta[0][0] = 1;// K2消抖if ((keybuf[0][1] & 0x0F) == 0x00)KeySta[0][1] = 0;else if ((keybuf[0][1] & 0x0F) == 0x0F)KeySta[0][1] = 1;// 数码管显示和LED控制P0 = 0xFF;ENLED = 0;ADDR3 = 1;switch (i){case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break;case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break;case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break;case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; break;case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; break;case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=LedBuff[5]; break;case 6:ADDR2=1; ADDR1=1; ADDR0=0;if (countDownPhase == 0) {// 30秒阶段if (sec > 3) {// 前27秒if (LED_SpecialMode && !SpecialModeType) {P0 = 0xD7; // LED1(P0.0)和LED4(P0.3)亮 (11010111)} else {P0 = 0xDE; // 默认:LED1(P0.0)和LED6(P0.5)亮 (11011110)}} else if (sec > 0) {// 后3秒P0 = 0xDD; // LED2(P0.1)和LED6(P0.5)亮 (11011101)} else {P0 = 0xFF; // 熄灭所有}} else if (countDownPhase == 1) {// 20秒阶段if (sec > 3) {// 前17秒if (LED_SpecialMode && SpecialModeType) {P0 = 0xF6; // LED1(P0.0)和LED4(P0.3)亮 (11110110)} else {P0 = 0xF3; // 默认:LED3(P0.2)和LED4(P0.3)亮 (11110011)}} else if (sec > 0) {// 后3秒P0 = 0xEB; // LED3(P0.2)和LED5(P0.4)亮 (11101011)} else {P0 = 0xFF; // 熄灭所有}} else {P0 = 0xFF;}i = 0;break;default: break;}// 定时处理cnt++;if (cnt >= 10) { // 10mscnt = 0;flag10ms = 1;secCnt++;if (secCnt >= 100) { // 100*10ms = 1ssecCnt = 0;flag1s = 1;}} else {flag10ms = 0;}
}
基于STC89C52单片机的交通灯控制系统设计
用单片机控制一个交通信号灯系统,设 A 车道与 B 车道交叉组成十字路口, A 是主车道, B 是支车道。具体要求如下:(1)用发光二极管模拟交通信号灯, A 、 B 车道各三盏灯,分别代表红、黄、绿;用
按键开关模拟车辆检测信号。(2)
正常情况下, A 、 B 辆车道轮流放行, A 车道放行30s,其中3s用于警告; B 车道放行20s,其中3s用于警告。
(3)
在交通繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥挤状况。在 B 车道放行期间,若 A 车道有车而 B 车道无车,按下开关K1使 A 车道放行10s;在 A 车道放行期间,若 B 车道有车而 A 车道无车,按下开关K2使 B 车道放行10s。(4)有紧急车辆通过时,按下K3开关使 A 、 B 车道均为红灯,禁行15s。
#include <reg52.h>sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;// 矩阵按键引脚定义
sbit KEY_IN_1 = P2^4; // 第1列
sbit KEY_IN_2 = P2^5; // 第2列
sbit KEY_IN_3 = P2^6; // 第3列
sbit KEY_IN_4 = P2^7; // 第4列
sbit KEY_OUT_1 = P2^3; // 第1行
sbit KEY_OUT_2 = P2^2; // 第2行
sbit KEY_OUT_3 = P2^1; // 第3行
sbit KEY_OUT_4 = P2^0; // 第4行unsigned char code LedChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char flag1s = 0;
unsigned char countDownPhase = 0; // 0=30秒阶段, 1=20秒阶段
unsigned long sec = 30;
bit countDownFinished = 0;// 按键和LED控制变量
bit K1_pressed = 0; // K1按下标志(第1行第1列)
bit K2_pressed = 0; // K2按下标志(第1行第2列)
unsigned char K1_holdTime = 0; // K1按下保持时间
unsigned char K2_holdTime = 0; // K2按下保持时间
bit LED_override = 0; // LED覆盖标志
unsigned char overrideLEDState = 0xFF; // 覆盖的LED状态
unsigned char normalLEDState = 0xFF; // 正常LED状态void KeyScan();
void UpdateLEDs();void main()
{char j;unsigned char buf[6];EA = 1;TMOD = 0x01;TH0 = 0xFC;TL0 = 0x67;ET0 = 1;TR0 = 1;// 初始化显示30buf[0] = sec%10;buf[1] = sec/10%10;buf[2] = 0; buf[3] = 0; buf[4] = 0; buf[5] = 0;for (j=5; j>=1; j--) {if (buf[j] == 0) LedBuff[j] = 0xFF;else break;}for (; j>=0; j--) {LedBuff[j] = LedChar[buf[j]];}while(1) {KeyScan();if (flag1s == 1) {flag1s = 0;// 处理K1按下后的10秒计时if (K1_pressed) {K1_holdTime++;if (K1_holdTime >= 10) {K1_pressed = 0;K1_holdTime = 0;LED_override = 0; // 恢复正常LED状态}}// 处理K2按下后的10秒计时if (K2_pressed) {K2_holdTime++;if (K2_holdTime >= 10) {K2_pressed = 0;K2_holdTime = 0;LED_override = 0; // 恢复正常LED状态}}// 正常倒计时处理if (!countDownFinished) {if (sec > 0) {sec--;// 更新数码管显示buf[0] = sec%10;buf[1] = sec/10%10;for (j=5; j>=1; j--) {if (buf[j] == 0) LedBuff[j] = 0xFF;else break;}for (; j>=0; j--) {LedBuff[j] = LedChar[buf[j]];}// 更新正常LED状态if (countDownPhase == 0) { // 30秒阶段if (sec > 3) normalLEDState = 0xDE; // LED1&6else if (sec > 0) normalLEDState = 0xDD; // LED2&6else normalLEDState = 0xFF;} else if (countDownPhase == 1) { // 20秒阶段if (sec > 3) normalLEDState = 0xF3; // LED3&4else if (sec > 0) normalLEDState = 0xEB; // LED3&5else normalLEDState = 0xFF;}} else {// 倒计时结束,切换到下一阶段countDownFinished = 1;}} else {// 阶段切换处理countDownPhase++;if (countDownPhase == 1) { // 切换到20秒阶段sec = 20;countDownFinished = 0;normalLEDState = 0xF3; // LED3&4} else if (countDownPhase >= 2) { // 循环回到30秒阶段countDownPhase = 0;sec = 30;countDownFinished = 0;normalLEDState = 0xDE; // LED1&6}// 更新数码管显示buf[0] = sec%10;buf[1] = sec/10%10;for (j=5; j>=1; j--) {if (buf[j] == 0) LedBuff[j] = 0xFF;else break;}for (; j>=0; j--) {LedBuff[j] = LedChar[buf[j]];}}}}
}void KeyScan()
{static unsigned char keyDebounceK1 = 0;static unsigned char keyDebounceK2 = 0;// 扫描第1行KEY_OUT_1 = 0; // 选通第1行KEY_OUT_2 = 1;KEY_OUT_3 = 1;KEY_OUT_4 = 1;// 检测K1 (第1行第1列)if (KEY_IN_1 == 0) { keyDebounceK1++;if (keyDebounceK1 >= 5 && !K1_pressed && countDownPhase == 0 && sec >= 10) {K1_pressed = 1;K1_holdTime = 0;LED_override = 1;overrideLEDState = 0xF3; // LED3和LED4亮}} else {keyDebounceK1 = 0;}// 检测K2 (第1行第2列)if (KEY_IN_2 == 0) { keyDebounceK2++;if (keyDebounceK2 >= 5 && !K2_pressed && countDownPhase == 1 && sec >= 10) {K2_pressed = 1;K2_holdTime = 0;LED_override = 1;overrideLEDState = 0xDE; // LED1和LED6亮}} else {keyDebounceK2 = 0;}
}void Timer0_ISR() interrupt 1
{static unsigned char i = 0;static unsigned int cnt = 0;TH0 = 0xFC;TL0 = 0x67;P0 = 0xFF;ENLED = 0;ADDR3 = 1;// 数码管动态扫描switch(i) {case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break;case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break;case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break;case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=LedBuff[3]; break;case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=LedBuff[4]; break;case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=LedBuff[5]; break;case 6:ADDR2=1; ADDR1=1; ADDR0=0;// LED控制if (LED_override) {P0 = overrideLEDState; // 使用覆盖的LED状态} else {P0 = normalLEDState; // 正常LED状态}i = 0;break;default: break;}// 1秒定时cnt++;if (cnt >= 1000) {cnt = 0;flag1s = 1;}
}
相关文章:
单片机——实现交通信号灯管理
随便写写,汇总一下,就一个单片机,没有模拟软件,什么都没有~ 点阵、数码管、led同时点亮 #include <reg52.h>sbit ADDR0 P1^0; sbit ADDR1 P1^1; sbit ADDR2 P1^2; sbit ADDR3 P1^3; sbit ENLED P1^4;// 交通灯控制引…...

数据结构 -- 交换排序(冒泡排序和快速排序)
冒泡排序 基于“交换”的排序:根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置 //交换 void swap(int &a,int &b){int temp a;a b;b temp; }//冒泡排序 void BubbleSort(int A[],int n){for(int i0;i<n-1;i){bool flag false; …...

【算法】: 前缀和算法(利用o(1)的时间复杂度快速求区间和)
前缀和算法:高效处理区间求和的利器 目录 引言什么是前缀和前缀和的基本实现前缀和的作用前缀和的典型应用场景前缀和的优缺点分析实战例题解析 引言 区间求和问题的普遍性暴力解法的时间复杂度问题前缀和算法的核心思想 什么是前缀和 前缀和的数学定义 通俗来…...

macOS 安装 PostgreSQL
文章目录 安装安装信息 验证GUI 工具下载 安装 最简单的方式是通过 brew 安装 brew install postgresql17该版本在 brew 上的详情页:https://formulae.brew.sh/formula/postgresql17 你也可以根据需要,搜索 安装更新版本 如果你没有安装 brew…...
打破传统范式,线上 3D 画展彰显多元亮点
(一)沉浸式体验,身临其境赏画 线上 3D 画展运用先进的 3D 建模和虚拟现实(VR)技术,高度还原了真实的展厅环境 。展厅内的布局、灯光,甚至墙壁的质感都被完美复刻,让观众仿佛置身于…...

Linux系统:基础命令之 ls~pwd~cd
文章目录 前言一、ls命令📘 命令简介:🧠 基本语法:演示ls🔧 常用选项:-l选项-a选项-h选项 小结 ls 二、pwd命令📘 命令简介:何为绝对路径!何为相对路径!&…...
MuJoCo安装记录
一、Anaconda安装 1. 下载安装包:https://repo.anaconda.com/archive/Anaconda3-2021.11-Linux-x86_64.sh 2. 进入下载界面执行以下命令安装 sudo chmod x Anaconda3-2021.11-Linux-x86_64.sh ./Anaconda3-2021.11-Linux-x86_64.sh 3. 如果安装anaconda之后打开…...
软件工程(八):UML类图的几种关系
依赖(Dependency) 定义:一个类使用到了另一个类(例如作为参数、局部变量等)。表示:虚线箭头,箭头指向被依赖的类。关键词:uses、depends on。示例:类 A 的某个方法使用类…...
python定时删除指定索引
脚本 import logging from datetime import datetime, timedelta from elasticsearch import Elasticsearch# 配置日志记录 logging.basicConfig(filenamedelete_uat_indices.log,levellogging.INFO,format%(asctime)s - %(levelname)s - %(message)s )# Elasticsearch 集群的…...

基于OAuth2-proxy和Keycloak为comfyui实现SSO
背景 comfyui无认证被漏扫后易被rce挖矿 攻击过程 https://www.oschina.net/news/340226 https://github.com/comfyanonymous/ComfyUI/discussions/5165 阿里云漏洞库关于comfyui的漏洞 https://avd.aliyun.com/search?qcomfyui×tamp__1384n4%2BxBD0GitGQ0QD8ID%2F…...

SmartSoftHelp 之 SQL Server 数据库安全备份与安全还原详解---深度优化版:SmartSoftHelp DeepCore XSuite
SmartSoftHelp 菜单之 DBMS 数据库备份与还原 (DBBackRest) 使用实例 SQL Server 数据库备份与还原详解 SQL Server 数据库的备份与还原是管理数据库的核心任务之一,涉及本地与远程操作、大小监控及目录管理等多个方面。以下是详细说明: 一、数据库…...

Spring 代理与 Redis 分布式锁冲突:一次锁释放异常的分析与解决
Spring 代理与 Redis 分布式锁冲突:一次锁释放异常的分析与解决 Spring 代理与 Redis 分布式锁冲突:一次锁释放异常的分析与解决1. 问题现象与初步分析2 . 原因探究:代理机制对分布式锁生命周期的干扰3. 问题复现伪代码4. 解决方案࿱…...

【数据结构】队列的完整实现
队列的完整实现 队列的完整实现github地址前言1. 队列的概念及其结构1.1 概念1.2 组织结构 2. 队列的实现接口一览结构定义与架构初始化和销毁入队和出队取队头队尾数据获取size和判空 完整代码与功能测试结语 队列的完整实现 github地址 有梦想的电信狗 前言 队列&…...
2025 全球优质 AI 产品深度测评:从通用工具到垂直领域的技术突围 —— 轻量聚合工具篇
在 AI 技术爆发式增长的 2025 年,全球范围内涌现出大量兼具技术创新与场景价值的优质产品。本文从通用对话、多模态生成、开发者工具、企业级方案及垂直领域深耕五个维度,深度解析 18 款国内外标杆产品,附独家对比数据与选型策略,…...
Python爬虫实战:获取天气网最近一周北京的天气数据,为日常出行做参考
1. 引言 随着互联网技术的发展,气象数据的获取与分析已成为智慧城市建设的重要组成部分。天气网作为权威的气象信息发布平台,其数据具有较高的准确性和实时性。然而,人工获取和分析天气数据效率低下,无法满足用户对精细化、个性化气象服务的需求。本文设计并实现了一套完整…...

根据YOLO数据集标签计算检测框内目标面积占比(YOLO7-10都适用)
程序: 路径改成自己的,阈值可以修改也可以默认 #zhouzhichao #25年5月17日 #计算时频图中信号面积占检测框面积的比值import os import numpy as np import pandas as pd from PIL import Image# Define the path to the directory containing the lab…...
Helm简介、安装、配置、使用!
一、简介 Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成, 能够将一组K8S资源打包统一管理, 是查找、共享…...

LLM笔记(九)KV缓存(2)
文章目录 1. 背景与动机2. 不使用 KV Cache 的情形2.1 矩阵形式展开2.2 计算复杂度 3. 使用 KV Cache 的优化3.1 核心思想3.2 矩阵形式展开3.3 计算复杂度对比 4. 总结5. GPT-2 中 KV 缓存的实现分析5.1 缓存的数据结构与类型5.2 在注意力机制 (GPT2Attention) 中使用缓存5.3 缓…...
开发 前端搭建npm v11.4.0 is known not to run on Node.js v14.18.1.
错误nodejs 和npm 版本不一致 ERROR: npm v11.4.0 is known not to run on Node.js v14.18.1. This version of npm supports the following node versions: ^20.17.0 || >22.9.0. You can find the latest version at https://nodejs.org/. ERROR: D:\softTool\node-v14…...

LVS 负载均衡集群应用实战
前提:三台虚拟机,有nginx,要做负载 1. LVS-server 安装lvs管理软件 [root@lvs-server ~]# yum -y install ipvsadm 程序包:ipvsadm(LVS管理工具) 主程序:/usr/sbin/ipvsadm 规则保存工具:/usr/sbin/ipvsadm-save > /path/to/file 配置文件:/etc/sysconfig/ipvsad…...

MySQL——基本查询内置函数
目录 CRUD Create Retrieve where order by limit Update Delete 去重操作 聚合函数 聚合统计 内置函数 日期函数 字符函数 数学函数 其它函数 实战OJ 批量插入数据 找出所有员工当前薪水salary情况 查找最晚入职员工的所有信息 查找入职员工时间升序排…...

Day34打卡 @浙大疏锦行
知识点回归: CPU性能的查看:看架构代际、核心数、线程数GPU性能的查看:看显存、看级别、看架构代际GPU训练的方法:数据和模型移动到GPU device上类的call方法:为什么定义前向传播时可以直接写作self.fc1(x) 作业 计算资…...
【Jitsi Meet】(腾讯会议的平替)Docker安装Jitsi Meet指南-使用内网IP访问
Docker安装Jitsi Meet指南-使用内网IP访问 下载官方代码配置环境变量复制示例环境文件并修改配置:编辑 .env 文件: 修改 docker-compose.yml 文件生成自签名证书启动服务最终验证 腾讯会议的平替。我们是每天开早晚会的,都是使用腾讯会议。腾…...

AdGuard解锁高级版(Nightly)_v4.10.36 安卓去除手机APP广告
AdGuard解锁高级版(Nightly)_v4.10.36 安卓去除手机APP广告 AdGuard Nightly是AdGuard团队为及时更新软件而推出的最新测试版本,适合追求最新功能和愿意尝试新版本的用户。但使用时需注意其潜在的不稳定性和风险。…...

C++修炼:红黑树的模拟实现
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞,关注&am…...

基于Python+YOLO模型的手势识别系统
本项目是一个基于Python、YOLO模型、PyQt5的实时手势识别系统,通过摄像头或导入图片、视频,能够实时识别并分类不同的手势动作。系统采用训练好的深度学习模型进行手势检测和识别,可应用于人机交互、智能控制等多种场景。 1、系统主要功能包…...

自制操作系统day10叠加处理
day10叠加处理 叠加处理(harib07b) 现在是鼠标的叠加处理,以后还有窗口的叠加处理 涉及图层 最上面小图层是鼠标指针,最下面的一张图层用来存放桌面壁纸。移动图层的方法实现鼠标指针的移动以及窗口的移动。 struct SHEET { u…...
docker初学
加载镜像:docker load -i ubuntu.tar 导出镜像:docker save -o ubuntu1.tar ubuntu 运行: docker run -it --name mu ubuntu /bin/bash ocker run -dit --name mmus docker.1ms.run/library/ubuntu /bin/bash 进入容器:docke…...
## Docker 中 Elasticsearch 启动失败:日志文件权限问题排查与解决
好的,这是一份关于你遇到的 Docker Elasticsearch 启动报错问题的笔记,包含问题描述、我的分析判断以及最终的解决方案,适合用于整理成文章。 Docker 中 Elasticsearch 启动失败:日志文件权限问题排查与解决 在使用 Docker部署 E…...

鸿蒙Flutter实战:23-混合开发详解-3-源码模式引入
引言 在前面的文章混合开发详解-2-Har包模式引入中,我们介绍了如何将 Flutter 模块打包成 Har 包,并引入到原生鸿蒙工程中。本文中,我们将介绍如何通过源码依赖的方式,将 Flutter 模块引入到原生鸿蒙工程中。 创建工作 创建一个…...