| #include <reg51.h> // 硬件定义 sbit K1 = P3^1; // 启动按键 sbit J1 = P1^5; // 主继电器 sbit J2 = P1^6; // 星接继电器 sbit J3 = P1^7; // 角接继电器 // 全局变量 unsigned int ms_count = 0; // 毫秒计数器(10ms/次) unsigned char sec_count = 0; // 秒计数器(100次10ms=1s) bit star_start_flag = 0; // 星型启动标志 bit delay_done_flag = 0; // 50s延时完成标志 bit switch_delay_flag = 0; // 200ms切换缓冲延时标志 // 定时器0初始化(10ms中断一次,12MHz晶振) void Timer0_Init(void) { TMOD &= 0xF0; // 清定时器0模式 TMOD |= 0x01; // 定时器0:16位定时模式 TH0 = (65536 - 10000) / 256; // 10ms初值(12MHz) TL0 = (65536 - 10000) % 256; ET0 = 1; // 使能定时器0中断 TR0 = 1; // 启动定时器0 EA = 1; // 开总中断 } // 定时器0中断服务函数(10ms触发一次) void Timer0_ISR(void) interrupt 1 { TH0 = (65536 - 10000) / 256; // 重装载10ms初值 TL0 = (65536 - 10000) % 256; // 1. 50s星型启动延时计数 if (star_start_flag && !switch_delay_flag) { ms_count++; if (ms_count >= 100) { // 100*10ms=1s ms_count = 0; sec_count++; if (sec_count >= 50) { // 累计50s sec_count = 0; delay_done_flag = 1; } } } // 2. 200ms切换缓冲延时计数(仅在切换阶段生效) if (switch_delay_flag) { ms_count++; if (ms_count >= 20) { // 20*10ms=200ms ms_count = 0; switch_delay_flag = 0; // 200ms延时完成 } } } // 按键消抖(稳定检测) bit Key_Scan(sbit key) { if (key == 0) { unsigned int i; for (i = 0; i < 2000; i++); // 20ms消抖 if (key == 0) return 1; } return 0; } void main(void) { Timer0_Init(); J1 = 1; J2 = 1; J3 = 1; // 初始状态:所有继电器断开 while (1) { // 检测启动按键,触发星型启动 if (Key_Scan(K1)) { star_start_flag = 1; delay_done_flag = 0; switch_delay_flag = 0; J1 = 0; // 主继电器闭合 J2 = 0; // 星接继电器闭合 while (Key_Scan(K1)); // 等待按键松开 } // 50s延时完成后,执行星→三角切换 if (star_start_flag && delay_done_flag) { J2 = 1; // 先断开星接继电器 switch_delay_flag = 1; // 启动200ms缓冲延时 ms_count = 0; // 清零毫秒计数器 // 等待200ms延时完成 while (switch_delay_flag); J3 = 0; // 闭合角接继电器(J1保持闭合) star_start_flag = 0; // 清零启动标志 } } } |
| 不好使 |
cycy1030 发表于 2020-12-16 13:24 我也想问有没有仿真图呀 |
| 有没有延时调节功能 |
| 谢谢,正需要实在太及时了 |
| 你好,请问有对应的proteus图吗 |
| 不错可以参考 |
| 正需要谢谢 |
| 好好好好好好好好 |
| 就是延时10~40秒切换交流接触器吧? |