#include "main.h" /* 变量声明区 */ uchar Key_Slow_Down; // 按键减速专用变量 uchar Seg_Buf[8] = {10, 10, 10, 10, 10, 10, 10, 10}; // 数码管显示数据存放数组 uchar Seg_Point[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // 数码管小数点数据存放数组 uchar Seg_Pos; // 数码管扫描专用变量 uint Seg_Slow_Down; // 数码管减速专用变量 uchar ucLed[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // Led显示数据存放数组 uchar Seg_show_mode; // 显示界面 0频率 1湿度 2测距 3参数 uchar celi_mode; // 参数界面 0频率 1湿度 2距离 /*时间*/ uint time_1s; uint time_up_1s; uchar time_100ms; uchar pwn_count; /*测量数据*/ uint freq; uchar humidity; uchar distance; uint freq_demo = 9000; uint humidity_demo = 40; uint dis_demo = 60; bit dis_flag; // 0为cm,1为m bit freq_flag; // 0为Hz,1为kHz bit reset_relay_flag; uchar relay_count; bit light_flag; void init_Seg_LED() // 初始化数码管和LED { uchar i; for (i = 0; i < 8; i++) { ucLed[i] = 0; Seg_Buf[i] = 10; Seg_Point[i] = 0; } } /* 键盘处理函数 */ void Key_Proc() { static uchar Key_Val, Key_Down, Key_Old, Key_Up; // 按键专用变量 if (Key_Slow_Down) return; Key_Slow_Down = 1; // 键盘减速程序 Key_Val = Key_Read(); // 实时读取键码值 Key_Down = Key_Val & (Key_Old ^ Key_Val); // 捕捉按键下降沿 Key_Up = ~Key_Val & (Key_Old ^ Key_Val); // 捕捉按键上降沿 Key_Old = Key_Val; // 辅助扫描变量 if (Key_Down == 4) { Seg_show_mode = (++Seg_show_mode) % 4; celi_mode = 0; init_Seg_LED(); } if (Seg_show_mode == 3 && Key_Down == 5) { celi_mode = (++celi_mode) % 3; init_Seg_LED(); } if (Key_Down == 6) { switch (Seg_show_mode) { case 2: dis_flag ^= 1; Seg_Point[5] = 0; break; case 3: /* 参数设置 */ switch (celi_mode) { case 0: /* 频率参数 */ freq_demo = (freq_demo + 500 > 12000) ? 1000 : freq_demo + 500; break; case 1: /*湿度参数*/ humidity_demo = (humidity_demo + 10 > 60) ? 10 : humidity_demo + 10; break; case 2: /*距离参数*/ dis_demo = (dis_demo + 10 > 120) ? 10 : dis_demo + 10; break; } break; } } if (Key_Down == 7) { switch (Seg_show_mode) { case 0: /* 频率显示 */ freq_flag ^= 1; Seg_Point[6] = 0; break; case 3: /* 参数设置 */ switch (celi_mode) { case 0: /* 频率参数 */ freq_demo = (freq_demo - 500 < 1000) ? 12000 : freq_demo - 500; break; case 1: /*湿度参数*/ humidity_demo = (humidity_demo - 10 < 10) ? 60 : humidity_demo - 10; break; case 2: /*距离参数*/ dis_demo = (dis_demo - 10 < 10) ? 120 : dis_demo - 10; break; } break; } } if (Key_Down == 7 && Seg_show_mode == 1) reset_relay_flag = 1; // 按下开始计时 else reset_relay_flag = 0; // 抬起检测 if (Key_Up == 7 && time_up_1s >= 1000) reset_relay_flag = 0; } /* 信息处理函数 */ void Seg_Proc() { uchar temp_freq, i, temp_dis; if (Seg_Slow_Down) return; Seg_Slow_Down = 1; // 数码管减速程序 humidity = Ad_Read(0x03) / 51.0 * 20; /*湿度处理*/ if (humidity > 80) Da_Write(255); else if (humidity < humidity_demo) Da_Write(51); else Da_Write(255 - 204 * (80 - humidity) / (80 - humidity_demo)); /*测距处理*/ distance = Ut_Wave_Data(); if (distance > dis_demo) { Relay(1); relay_count++; EEPROM_Write(&relay_count, 0, 1); } else { Relay(0); } switch (Seg_show_mode) { case 0: /* 频率显示 */ Seg_Buf[0] = 11; // F // KHz if (freq_flag) { temp_freq = freq / 100; Seg_Buf[3] = temp_freq / 10000 % 10; Seg_Buf[4] = temp_freq / 1000 % 10; Seg_Buf[5] = temp_freq / 100 % 10; Seg_Buf[6] = temp_freq / 10 % 10; Seg_Buf[7] = temp_freq % 10; Seg_Point[6] = 1; for (i = 3; i < 6; i++) { if (Seg_Buf[i] == 0) Seg_Buf[i] = 10; else break; } } // Hz else { Seg_Buf[3] = freq / 10000 % 10; Seg_Buf[4] = freq / 1000 % 10; Seg_Buf[5] = freq / 100 % 10; Seg_Buf[6] = freq / 10 % 10; Seg_Buf[7] = freq % 10; for (i = 3; i < 7; i++) { if (Seg_Buf[i] == 0) Seg_Buf[i] = 10; else break; } } break; case 1: /*湿度显示*/ Seg_Buf[0] = 12; // H Seg_Buf[6] = humidity / 10 % 10; Seg_Buf[7] = humidity % 10; break; case 2: /*测距*/ Seg_Buf[0] = 13; // A if (dis_flag) { Seg_Buf[5] = distance / 100; Seg_Buf[6] = distance / 10 % 10; Seg_Buf[7] = distance % 10; Seg_Point[5] = 1; } else { Seg_Buf[5] = (distance / 100 == 0) ? 10 : distance / 100; Seg_Buf[6] = distance / 10 % 10; Seg_Buf[7] = distance % 10; } break; case 3: /*参数*/ Seg_Buf[0] = 14; // P Seg_Buf[1] = celi_mode + 1; switch (celi_mode) { case 0: /* 频率 */ temp_freq = freq_demo / 100; Seg_Buf[5] = (temp_freq / 100 == 0) ? 10 : temp_freq / 100; Seg_Buf[6] = temp_freq / 10 % 10; Seg_Buf[7] = temp_freq % 10; Seg_Point[6] = 1; break; case 1: /* 湿度 */ Seg_Buf[6] = humidity_demo / 10; Seg_Buf[7] = humidity_demo % 10; break; case 2: /* 距离 */ temp_dis = dis_demo / 10; Seg_Buf[6] = temp_dis / 10; Seg_Buf[7] = temp_dis % 10; Seg_Point[6] = 1; break; } break; } } /* 其他显示函数 */ void Led_Proc() { switch (Seg_show_mode) { case 0: ucLed[0] = 1; break; case 1: ucLed[1] = 1; break; case 2: ucLed[2] = 1; break; case 3: ucLed[0] = (celi_mode == 0) ? light_flag : 0; ucLed[1] = (celi_mode == 1) ? light_flag : 0; ucLed[2] = (celi_mode == 2) ? light_flag : 0; break; } ucLed[3] = (freq > freq_demo); ucLed[4] = (humidity > humidity_demo); ucLed[5] = (distance > dis_demo); } /* 定时器0中断初始化函数 */ void Timer0Init(void) // 1毫秒@12.000MHz { AUXR &= 0x7F; // 定时器时钟12T模式 TMOD &= 0xF0; // 设置定时器模式 TMOD |= 0x05; // 设置定时器0为16位不重载 TL0 = 0; // 设置定时初始值 TH0 = 0; // 设置定时初始值 TF0 = 0; // 清除TF0标志 TR0 = 1; // 定时器0开始计时 } void Timer2_Init(void) // 1毫秒@12.000MHz { AUXR &= 0xFB; // 定时器时钟12T模式 T2L = 0x18; // 设置定时初始值 T2H = 0xFC; // 设置定时初始值 AUXR |= 0x10; // 定时器2开始计时 IE2 |= 0x04; // 开定时器2中断 EA = 1; // 总中断打开 } void Timer3_Init(void) // 100微秒@12.000MHz { T4T3M &= 0xFD; // 定时器时钟12T模式 T3L = 0x9C; // 设置定时初始值 T3H = 0xFF; // 设置定时初始值 T4T3M |= 0x08; // 定时器3开始计时 IE2 |= 0x20; // 开定时器3中断 EA = 1; // 总中断打开 } /* 定时器2中断服务函数 */ void Timer2Server() interrupt 12 { if (++Key_Slow_Down == 10) Key_Slow_Down = 0; // 键盘减速专用 if (++Seg_Slow_Down == 500) Seg_Slow_Down = 0; // 数码管减速专用 if (++Seg_Pos == 8) Seg_Pos = 0; // 数码管显示专用 if (++time_1s == 1000) { freq = TH0 << 8 | TL0; TH0 = 0; TL0 = 0; time_1s = 0; } if (reset_relay_flag) { if (++time_up_1s >= 1000) { time_up_1s = 1000; } } else { time_up_1s = 0; } if (++time_100ms == 100) light_flag ^= 1; Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos], Seg_Point[Seg_Pos]); Led_Disp(Seg_Pos, ucLed[Seg_Pos]); } void Timer3Server() interrupt 19 { if (++pwn_count == 10) pwn_count = 0; if (freq > freq_demo) MOTOR(pwn_count <= 8); else MOTOR(pwn_count <= 2); } void Delay750ms() //@12MHz { unsigned char i, j, k; _nop_(); _nop_(); i = 35; j = 51; k = 182; do { do { while (--k) ; } while (--j); } while (--i); } /* Main */ void main() { System_Init(); EEPROM_Read(&relay_count, 0, 1); Timer0Init(); Timer2_Init(); Timer3_Init(); while (1) { Key_Proc(); Seg_Proc(); Led_Proc(); } }