#include #include "mywave.h" #include "display.h" #include "pcf8591.h" #include "eeprom.h" #include "intrins.h" void DisplaySMG_info(); void control_led_jdq(); sbit s4 = P3^3; sbit s5 = P3^2; sbit s6 = P3^1; sbit s7 = P3^0; code unsigned char Seg_dot[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; code unsigned char Seg_Table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; unsigned char count_200ms = 0; unsigned char count_1s = 0; unsigned int distance = 0;//距离值 unsigned int count_f = 0;//频率值 unsigned int adc_smg = 0; float adc_volt = 0; unsigned char humidity = 0;//湿度 unsigned char count_100ms = 0; unsigned char f_param = 90;//频率参数 unsigned char h_param = 40;//湿度参数 unsigned char dis_param = 6;//距离参数 unsigned char UI = 0;// 0-频率界面 1-湿度界面 2-测距界面 3-参数界面 unsigned char UI_param = 0;//0-频率参数 1-湿度参数 2-距离参数 unsigned char f_mode = 0;//0-Hz显示 1-KHz显示 unsigned char dis_mode = 0;//0-CM显示 1-M显示 unsigned int f_int = 0;//数码管显示KHz单位的频率 float f_temp = 0;//频率单位转KHz unsigned char stat_led = 0xff; unsigned char stat_jdq = 0x00; unsigned char count_01s = 0; unsigned char num_jdq = 0;//继电器开关次数 unsigned char count_s7 = 0;//长按计数 unsigned char stat_s7 = 0;//按键S7按下和松开的状态 unsigned char stat_on_off = 0;//防止继电器开计数多次频繁计数 unsigned char pwm = 0;//周期计数 unsigned char duty_pwm = 0;//占空比 unsigned char count_50ms = 0; unsigned char stat_on_off1 = 0;//防止继电器关计数多次频繁计数 void Delay20ms() //@12.000MHz { unsigned char i, j, k; _nop_(); _nop_(); i = 1; j = 234; k = 113; do { do { while (--k); } while (--j); } while (--i); } void Timer1Init(void) //200微秒@12.000MHz { AUXR &= 0xBF; //定时器时钟12T模式 TMOD &= 0x0F; //设置定时器模式 TMOD |= 0x10; //设置定时器模式 TL1 = 0x38; //设置定时初值 TH1 = 0xFF; //设置定时初值 TF1 = 0; //清除TF1标志 TR1 = 1; //定时器1开始计时 ET1 = 1; EA = 1; } void Sevice_timer1() interrupt 3 { EA = 0; TL1 = 0x38; //设置定时初值 TH1 = 0xFF; //设置定时初值 pwm++; if(pwm == duty_pwm) { stat_jdq &= 0xdf; } else if(pwm == 5) { pwm = 0; stat_jdq |= 0x20; } SelectHC573(5,stat_jdq); EA = 1; } void Init_timer0() { AUXR &= 0x7f; TMOD &= 0xf0; TMOD |= 0x05; TH0 = TL0 = 0; TR0 = 1; ET0 = 0; } void Init_timer2() { AUXR &= 0xf3; T2L = 0xf0; T2H = 0xd8; AUXR |= 0x10; IE2 |= 0x04; EA = 1; } void Sevice_timer2() interrupt 12 { DisplaySMG_info(); count_200ms++; count_1s++; count_100ms++; count_50ms++; if(count_50ms == 5) { count_50ms = 0; control_led_jdq(); } if(count_100ms == 5) { count_100ms = 0; adc_volt = read_myadc(); } if(count_1s == 100) { TR0 = 0; count_1s = 0; count_f = (TH0 100) { num_jdq = 0; save_data(0x00,num_jdq); count_s7 = 0; stat_s7 = 0; } } } void DisplaySMG_info() { switch(UI) { case 0: DisplaySMG_Bit(0,0x8e); if(f_mode == 0) { if(count_f > 99999) DisplaySMG_Bit(2,Seg_Table[count_f / 100000]); if(count_f > 9999) DisplaySMG_Bit(3,Seg_Table[count_f / 10000 % 10]); if(count_f > 999) DisplaySMG_Bit(4,Seg_Table[count_f / 1000 % 10]); if(count_f > 99) DisplaySMG_Bit(5,Seg_Table[count_f / 100 % 10]); if(count_f > 9) DisplaySMG_Bit(6,Seg_Table[count_f / 10 % 10]); DisplaySMG_Bit(7,Seg_Table[count_f % 10]); } else if(f_mode == 1) { f_temp = (float)count_f / 1000; f_int = f_temp * 10; if(f_int > 99999) DisplaySMG_Bit(2,Seg_Table[f_int / 100000]); if(f_int > 9999) DisplaySMG_Bit(3,Seg_Table[f_int / 10000 % 10]); if(f_int > 999) DisplaySMG_Bit(4,Seg_Table[f_int / 1000 % 10]); if(f_int > 99) DisplaySMG_Bit(5,Seg_Table[f_int / 100 % 10]); DisplaySMG_Bit(6,Seg_dot[f_int / 10 % 10]); DisplaySMG_Bit(7,Seg_Table[f_int % 10]); } break; case 1: DisplaySMG_Bit(0,0x89); DisplaySMG_Bit(6,Seg_Table[humidity / 10]); DisplaySMG_Bit(7,Seg_Table[humidity % 10]); break; case 2: DisplaySMG_Bit(0,0x88); if(dis_mode == 0) { if(distance > 99) DisplaySMG_Bit(5,Seg_Table[distance / 100]); if(distance > 9) DisplaySMG_Bit(6,Seg_Table[distance / 10 % 10]); DisplaySMG_Bit(7,Seg_Table[distance % 10]); } else if(dis_mode == 1) { DisplaySMG_Bit(5,Seg_dot[distance / 100]); DisplaySMG_Bit(6,Seg_Table[distance / 10 % 10]); DisplaySMG_Bit(7,Seg_Table[distance % 10]); } break; case 3: if(UI_param == 0) { DisplaySMG_Bit(0,0x8c); DisplaySMG_Bit(1,Seg_Table[1]); if(f_param > 99) DisplaySMG_Bit(5,Seg_Table[f_param / 100 % 10]); DisplaySMG_Bit(6,Seg_dot[f_param / 10 % 10]); DisplaySMG_Bit(7,Seg_Table[f_param % 10]); } else if(UI_param == 1) { DisplaySMG_Bit(0,0x8c); DisplaySMG_Bit(1,Seg_Table[2]); DisplaySMG_Bit(6,Seg_Table[h_param / 10]); DisplaySMG_Bit(7,Seg_Table[h_param % 10]); } else if(UI_param == 2) { DisplaySMG_Bit(0,0x8c); DisplaySMG_Bit(1,Seg_Table[3]); DisplaySMG_Bit(6,Seg_dot[dis_param / 10]); DisplaySMG_Bit(7,Seg_Table[dis_param % 10]); } break; } } void scan_key() { if(s4 == 0) { Delay20ms(); if(s4 == 0) { if(UI == 0) { UI = 1; } else if(UI == 1) { UI = 2; } else if(UI == 2) { UI_param = 0; UI = 3; } else if(UI == 3) { UI = 0; } while(s4 == 0); } } else if(s5 == 0) { Delay20ms(); if(s5 == 0) { if(UI == 3) { if(UI_param == 0) { UI_param = 1; } else if(UI_param == 1) { UI_param = 2; } else if(UI_param == 2) { UI_param = 0; } } while(s5 == 0); } } else if(s6 == 0) { Delay20ms(); if(s6 == 0) { if((UI == 3) && (UI_param == 0)) { if(f_param == 120) { f_param = 10; } else { f_param += 5; } } else if((UI == 3) && (UI_param == 1)) { if(h_param == 60) { h_param = 10; } else { h_param += 10; } } else if((UI == 3) && (UI_param == 2)) { if(dis_param == 12) { dis_param = 1; } else { dis_param += 1; } } if(UI == 2) { if(dis_mode == 0) { dis_mode = 1; } else if(dis_mode == 1) { dis_mode = 0; } } while(s6 == 0); } } else if(s7 == 0) { Delay20ms(); if(s7 == 0) { if((UI == 3) && (UI_param == 0)) { if(f_param == 10) { f_param = 120; } else { f_param -= 5; } } else if((UI == 3) && (UI_param == 1)) { if(h_param == 10) { h_param = 60; } else { h_param -= 10; } } else if((UI == 3) && (UI_param == 2)) { if(dis_param == 1) { dis_param = 12; } else { dis_param -= 1; } } if(UI == 0) { if(f_mode == 0) { f_mode = 1; } else { f_mode = 0; } } if(UI == 1) { stat_s7 = 1; } while(s7 == 0); if(UI == 1) { stat_s7 = 2; } } } } void deal_data() { unsigned char dac_value = 0; if(adc_volt (f_param * 100)) { stat_led &= 0xf7; duty_pwm = 4; } else { stat_led |= 0x08; duty_pwm = 1; } if(humidity > h_param) { stat_led &= 0xef; } else { stat_led |= 0x10; } SelectHC573(5,stat_jdq); SelectHC573(4,stat_led); } void main() { Init_timer2(); Init_timer0(); SelectHC573(5,0x00); SelectHC573(4,0xff); DisplaySMG_All(0xff); Timer1Init(); while(1) { deal_data(); scan_key(); } }
需要完整工程可私信

(图片来源网络,侵删)

(图片来源网络,侵删)