}
/*********************定时器0、定时器1初始化******************/ void time_init() {
EA = 1; //开总中断
TMOD = 0X11; //定时器0、定时器1工作方式1 ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时 ET1 = 1; //开定时器1中断 TR1 = 1; //允许定时器1定时 }
/****************按键处理数码管显示函数***************/ void key_with() {
if(key_can == 1) { menu_1 ++; if(menu_1 >= 2) { menu_1 = 0; } if(menu_1 == 0) { menu_shudu = 20; dis_smg[0] = smg_du[distance % 10]; dis_smg[1] = smg_du[distance / 10 % 10] ; dis_smg[2] = smg_du[distance / 100 % 10] & 0x7f; smg_i = 3; } if(menu_1 == 1) { menu_shudu = 1; dis_smg[0] = smg_du[set_d % 10]; dis_smg[1] = smg_du[set_d / 10 % 10]; dis_smg[2] = smg_du[set_d / 100 % 10] & 0x7f ; dis_smg[3] = 0x88; smg_i = 4; } }
if(menu_1 == 1) //设置高温报警 {
第 17 页 共 23 页
if(flag_lj_3_en == 0) //三次连加之后速度加快 menu_shudu = 10 ; //500ms 加减一次 else menu_shudu = 1; //250ms 加减一次 if(key_can == 2) { set_d ++ ; //按键按下未松开自动加三次 if(set_d > 350) set_d = 350; dis_smg[0] = smg_du[set_d % 10]; //取小数显示 dis_smg[1] = smg_du[set_d / 10 % 10] ; //取个位显示 dis_smg[2] = smg_du[set_d / 100 % 10] & 0x7f; //取十位显示 dis_smg[3] = 0x88; //a } if(key_can == 3) { set_d -- ; //按键按下未松开自动加三次 if(set_d <= 1) set_d = 1; dis_smg[0] = smg_du[set_d % 10]; //取小数显示 dis_smg[1] = smg_du[set_d / 10 % 10] ; //取个位显示 dis_smg[2] = smg_du[set_d / 100 % 10] & 0x7f ; //取十位显示 dis_smg[3] = 0x88; //a }
// write_eepom(); } }
/****************报警函数***************/ void clock_h_l() {
static uchar value; if(distance <= set_d) { value ++; //消除实际距离在设定距离左右变化时的干扰 if(value >= 5) { beep = ~beep; //蜂鸣器报警 } } else { value = 0;
第 18 页 共 23 页
beep = 1; //取消报警 } }
/****************按键按下蜂鸣器响下**********************/ void key_beep() {
static uint value;
if((flag_key_b_en == 1) && (flag_key_set_en == 1)) { beep = 0; //打开蜂鸣器 value ++; if(value > 800) { value = 0; flag_key_b_en = 0; beep = 1;//关闭蜂鸣器 } } }
void main() {
send_wave(); //测距离函数
smg_display(); //处理距离显示函数 time_init();
init_eepom(); //读eepom数据 while(1) { if(flag_300ms == 1) { flag_300ms = 0; clock_h_l(); //报警函数 send_wave(); //测距离函数 if(menu_1 == 0) smg_display(); //处理距离显示函数 if(zd_break_en == 1) //自动退出设置界面程序 { zd_break_value ++; //每300ms加一次 if(zd_break_value > 100) //30秒后自动退出设置界面 { menu_1 = 0; // smg_i = 3;
第 19 页 共 23 页
zd_break_en = 0; zd_break_value = 0; } } } key(); //按键函数 if(key_can < 10) { key_with(); //按键处理函数 } } }
/*********************定时器0中断服务程序 用做超声波测距的************************/ void time0_int() interrupt 1 { set_d ++; // TH0 TL0 到65536后溢出中断 }
/*********************定时器0中断服务程序************************/ void time1_int() interrupt 3 {
static uchar value; //定时10ms中断一次 TH1 = 0xf8;
TL1 = 0x30; //2ms display(); //数码管显示函数 value++;
if(value >= 150) { value = 0; flag_300ms = 1; }
if(value % 25 == 0) { if(flag_lj_en == 1) //按下按键使能 50ms { key_time ++; if(key_time >= menu_shudu) //500ms { key_time = 0; key_500ms = 1; //500ms flag_value ++;
第 20 页 共 23 页
if(flag_value >= 3) { flag_value = 10; flag_lj_3_en = 1; //3次后1.5秒后连加大些 } } } } }
附件3:元件清单
Comment 10K 电阻 10uF 电容 12M 晶振 D 指示灯 DS04 数码管 Header 2 电源接口 sw-灰色 电源开关 U1 单片机 蜂鸣器 8550 三极管 20 电容 Header 4 超声波接口 SW-PB 独立按键 8550 三极管 R14 C1 Y1 D1 DS1 P2 SW1 U1 B1 Q5 C2, C3 J1, P1 S1, S2, S3, S4 Q1, Q2, Q3, Q4 R4, R5, R6, R7, R13, 2K 电阻 R15 R1, R2, R3, R8, R9, 200 电阻 R10, R11, R12 RES2 8 RES2 6 Designator LibRef RES2 Cap Pol1 16M D DS04 Header 2 sw-灰色 U1 BELL 2N3906 CAP Header 4 SW-PB 2N3906 Quantity 1 1 1 1 1 1 1 1 1 1 2 2 4 4
第 21 页 共 23 页
附件4:实物图
第 22 页 共 23 页