鍩轰簬鍗曠墖鏈虹殑瓒呭0娉㈡祴璺濈郴缁熻璁″疄楠屾姤鍛? - 閲?- 鐧惧害鏂囧簱 联系客服

发布时间 : 星期二 文章鍩轰簬鍗曠墖鏈虹殑瓒呭0娉㈡祴璺濈郴缁熻璁″疄楠屾姤鍛? - 閲?- 鐧惧害鏂囧簱更新完毕开始阅读008fb77fb4daa58da0114af8

/*******************按键处理数函数***************************/ void key_with() { if(key_can == 1) //得到k2键值(设定键) { menu_1 ++; if(menu_1 >= 2) { menu_1 = 0; } if(menu_1 == 0) //退出设定界面 { menu_ljsd = 10; //连加速度控制变量(复位为500ms) dis_smg[0] = smg_duan[distance % 10]; //测量值显示用 dis_smg[1] = smg_duan[distance / 10 % 10] ; dis_smg[2] = smg_duan[distance / 100 % 10] & 0x7f; smg_i = 3; } if(menu_1 == 1) //设置界面 { menu_ljsd = 1; //连加速度变量(50ms) dis_smg[0] = smg_duan[set_d % 10]; //设定值显示用 dis_smg[1] = smg_duan[set_d / 10 % 10]; dis_smg[2] = smg_duan[set_d / 100 % 10] & 0x7f ; dis_smg[3] = 0x88; smg_i = 4; //A,设定值修改标识符 } } if(menu_1 == 1) //设置报警值 { if(flag_lj_3_en == 0) //三次连加之后速度加快 menu_ljsd = 10 ; //500ms 加减一次 else menu_ljsd = 1; //50ms 加减一次 if(key_can == 2) //得到k3键值(加) { set_d ++ ; if(set_d > 350) set_d = 350; dis_smg[0] = smg_duan[set_d % 10]; //设定值显示 dis_smg[1] = smg_duan[set_d / 10 % 10] ; dis_smg[2] = smg_duan[set_d / 100 % 10] & 0x7f; dis_smg[3] = 0x88;

22

} if(key_can == 3) //得到k4键值(减) { set_d -- ; if(set_d <= 1) set_d = 1; dis_smg[0] = smg_duan[set_d % 10]; //设定值显示 dis_smg[1] = smg_duan[set_d / 10 % 10] ; dis_smg[2] = smg_duan[set_d / 100 % 10] & 0x7f ; dis_smg[3] = 0x88; //a } } }

/*********************定时器0、定时器1初始化******************/ void time_init() { EA = 1; //开总中断 TMOD = 0X11; //定时器0、定时器1工作方式1 ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时 ET1 = 1; //开定时器1中断 TR1 = 1; //允许定时器1定时 }

/****************延迟函数(10us,超声波发射需要)********************/ void delay() {

int i=10; for(i;i>=0;i--) {

_nop_(); //执行一条_nop_()指令就是1us } }

/*********************超声波测距程序*****************************/ void send_wave() { long temp = 888; c_send = 1; //10us的高电平触发 delay(); c_send = 0; TH0 = 0; //给定时器0清零 TL0 = 0;

23

TR0 = 0; //关定时器0定时 flag_hc_value = 0; while(!c_recive); //当c_recive为零时等待 TR0=1; while(c_recive) //当c_recive为1计数并等待 { flag_time0 = TH0 * 256 + TL0; if((flag_hc_value > 1) || (flag_time0 > 21000)) //当超声波超过测量范围时,显示3个888 { TR0 = 0; flag_csb_juli = 2; temp = 888; flag_hc_value = 0; break ; } else { flag_csb_juli = 1; } } if(flag_csb_juli == 1) //距离处理 { TR0=0; //关定时器0定时 EA = 0; temp = TH0; //读出定时器0的时间 temp = temp * 256 + TL0; temp /= 59; //HC-SR04超声波模块 距离(厘米)=T*uS/58.823 EA = 1; if(temp > 380) //如果大于3.8m就超出超声波的量程 { temp = 888; } } EA = 0; distance = temp; //距离 EA = 1; }

/****************冒泡排序(最大值沉底)**************************/ int iBuff[5];

void choise(int *a,int n) //选择法排序 {

24

int i,j,k,temp; for(i=0;ia[j]) k=j; //是k总是指向最小元素*/ if(i!=k) { //当k!=i是才交换,否则a[i]即为最小 temp=a[i]; a[i]=a[k]; a[k]=temp; } } }

/*******************测量距离处理及显示函数**********************/ void smg_display() { int Buff[5]; char i; if(distance == 95)return; //95去掉 iBuff[4] = iBuff[3]; iBuff[3] = iBuff[2]; iBuff[2] = iBuff[1]; iBuff[1] = iBuff[0]; iBuff[0] = (int)distance; for(i = 0; i<5; i++) Buff[i] = iBuff[i]; choise(Buff,5); //调用choise函数,冒泡排序 distance = (long)Buff[2]; //取得排序后5值的中间值,以消弱误触,稳定测量结果 EA = 0; //关中断 dis_smg[0] = smg_duan[distance % 10]; //取百分位(厘米级) dis_smg[1] = smg_duan[distance / 10 % 10]; //取十分位(分米级) dis_smg[2] = smg_duan[distance / 100 % 10] & 0x7f; //取个 位(米级) EA = 1; //开中断 }

/*********************报警函数****************************************/ void clock_h_l() { static uchar value; if(distance <= set_d) { value ++; //多次检测,消除实际距离在设定距离左右变化时的干扰

25