|
|
51hei圖片_20251113211640_183_9.png (110.63 KB, 下載次數(shù): 0)
下載附件
2025-11-13 21:16 上傳
代碼如下
- #include <reg51.h>
- // 數(shù)碼管段碼定義(共陰極,0-9)
- unsigned char code seg_code[] = {
- 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F // 0-9
- };
- // 數(shù)碼管位選定義(低電平有效)
- sbit dig1 = P2^0; // 千位
- sbit dig2 = P2^1; // 百位
- sbit dig3 = P2^2; // 十位
- sbit dig4 = P2^3; // 個位
- // 按鍵與IO口定義
- sbit key_reset = P1^0; // 重置按鍵
- sbit key_high = P1^1; // 高水位按鍵
- sbit key_normal = P1^2; // 正常水位按鍵
- sbit key_low = P1^3; // 低水位按鍵
- sbit key_add = P1^4; // 加10圈按鍵
- sbit key_sub = P1^5; // 減10圈按鍵
- sbit motor = P1^7; // 電機控制(水泵)
- // LED與IO口定義(狀態(tài)互斥)
- sbit led_reset = P3^0; // 重置狀態(tài)燈
- sbit led_low = P3^1; // 低水位紅燈
- sbit led_normal = P3^2; // 正常水位綠燈
- sbit led_high = P3^3; // 高水位黃燈
- sbit led_150 = P3^4; // 150圈提示燈
- sbit led_300 = P3^5; // 300圈提示燈
- sbit led_450 = P3^6; // 450圈提示燈
- sbit motor_pulse = P3^7; // 電機脈沖輸入
- // 全局變量
- #define MAX_COUNT 9990 // 最大圈數(shù)(10的倍數(shù),避免個位非0)
- #define DEFAULT_TARGET 450 // 默認(rèn)目標(biāo)圈數(shù)(抽滿水)
- unsigned int target_count = DEFAULT_TARGET; // 目標(biāo)圈數(shù)(10的倍數(shù))
- unsigned int current_count = 0; // 當(dāng)前已轉(zhuǎn)圈數(shù)
- bit is_running = 0; // 水泵運行標(biāo)志
- bit timer_flag = 0; // 0.5秒定時標(biāo)志
- unsigned int timer_cnt = 0; // 定時器計數(shù)
- // 函數(shù)聲明
- void update_leds(void);
- void timer0_init(void);
- void delay_ms(unsigned int ms);
- void display_scan(void);
- void key_scan(void);
- void motor_run_one_circle(void);
- void clear_status_leds(void);
- // 定時器0初始化(0.5秒定時)
- void timer0_init() {
- TMOD &= 0xF0;
- TMOD |= 0x01;
- TH0 = 0x4C;
- TL0 = 0x00;
- ET0 = 1;
- EA = 1;
- TR0 = 0;
- }
- // 定時器0中斷服務(wù)函數(shù)
- void timer0_isr() interrupt 1 {
- TH0 = 0x4C;
- TL0 = 0x00;
- timer_cnt++;
- if (timer_cnt >= 10) { // 10*50ms=500ms(每圈時間)
- timer_cnt = 0;
- timer_flag = 1;
- }
- }
- // 毫秒級延時
- void delay_ms(unsigned int ms) {
- unsigned int i, j;
- for (i = 0; i < ms; i++)
- for (j = 0; j < 112; j++); // 11.0592MHz晶振下約1ms
- }
- // 數(shù)碼管動態(tài)掃描
- void display_scan() {
- unsigned char units, tens, hundreds, thousands;
- unsigned int disp_num = current_count;
- if (disp_num > MAX_COUNT) disp_num = MAX_COUNT;
- // 提取各位數(shù)字
- units = disp_num % 10;
- tens = (disp_num / 10) % 10;
- hundreds = (disp_num / 100) % 10;
- thousands = (disp_num / 1000) % 10;
- // 個位顯示
- dig1 = 1; dig2 = 1; dig3 = 1; dig4 = 1;
- P0 = seg_code[units];
- delay_ms(1);
- dig4 = 0;
- delay_ms(2);
- dig4 = 1;
- // 十位顯示
- dig1 = 1; dig2 = 1; dig3 = 1; dig4 = 1;
- P0 = seg_code[tens];
- delay_ms(1);
- dig3 = 0;
- delay_ms(2);
- dig3 = 1;
- // 百位顯示
- dig1 = 1; dig2 = 1; dig3 = 1; dig4 = 1;
- P0 = seg_code[hundreds];
- delay_ms(1);
- dig2 = 0;
- delay_ms(2);
- dig2 = 1;
- // 千位顯示
- dig1 = 1; dig2 = 1; dig3 = 1; dig4 = 1;
- P0 = seg_code[thousands];
- delay_ms(1);
- dig1 = 0;
- delay_ms(2);
- dig1 = 1;
- }
- // 清除所有狀態(tài)燈(P3.0-P3.3)
- void clear_status_leds(void) {
- led_reset = 0;
- led_low = 0;
- led_normal = 0;
- led_high = 0;
- }
- // 更新LED狀態(tài)(圈數(shù)提示燈)
- void update_leds(void) {
- led_150 = (current_count >= 150) ? 1 : 0;
- led_300 = (current_count >= 300) ? 1 : 0;
- led_450 = (current_count >= 450) ? 1 : 0; // 450圈提示(默認(rèn)滿水)
- }
- // 按鍵掃描(核心:加/減10圈邏輯)
- void key_scan() {
- // 重置按鍵:恢復(fù)默認(rèn)450圈目標(biāo),計數(shù)清零
- if (key_reset == 0) {
- delay_ms(10); // 消抖
- if (key_reset == 0) {
- current_count = 0;
- target_count = DEFAULT_TARGET; // 重置為默認(rèn)450圈
- motor = 0;
- is_running = 0;
- TR0 = 0;
- clear_status_leds();
- led_reset = 1;
- update_leds();
- while (key_reset == 0) display_scan();
- }
- }
- // 低水位按鍵:啟動水泵
- if (key_low == 0) {
- delay_ms(10);
- if (key_low == 0) {
- is_running = 1;
- motor = 1;
- TR0 = 1;
- clear_status_leds();
- led_low = 1;
- while (key_low == 0) display_scan();
- }
- }
- // 正常水位按鍵:停止水泵
- if (key_normal == 0) {
- delay_ms(10);
- if (key_normal == 0) {
- motor = 0;
- is_running = 0;
- TR0 = 0;
- clear_status_leds();
- led_normal = 1;
- while (key_normal == 0) display_scan();
- }
- }
- // 高水位按鍵:停止水泵
- if (key_high == 0) {
- delay_ms(10);
- if (key_high == 0) {
- motor = 0;
- is_running = 0;
- TR0 = 0;
- clear_status_leds();
- led_high = 1;
- while (key_high == 0) display_scan();
- }
- }
- // 加按鍵:每次增加10圈(限制不超過最大值)
- if (key_add == 0) {
- delay_ms(10);
- if (key_add == 0) {
- if (target_count + 10 <= MAX_COUNT) {
- target_count += 10; // 加10圈
- }
- while (key_add == 0) display_scan(); // 等待釋放,避免連加
- }
- }
- // 減按鍵:每次減少10圈(限制不低于0)
- if (key_sub == 0) {
- delay_ms(10);
- if (key_sub == 0) {
- if (target_count >= 10) { // 確保不低于0
- target_count -= 10; // 減10圈
- }
- while (key_sub == 0) display_scan(); // 等待釋放,避免連減
- }
- }
- }
- // 電機每轉(zhuǎn)一圈處理
復(fù)制代碼
|
評分
-
查看全部評分
|