智能灭火机器人设计第程序(编辑修改稿)内容摘要:

IRQ4(void) __attribute__ ((ISR))。 void IRQ4(void) { if(*P_INT_Ctrl amp。 C_IRQ4_1KHz) { *P_INT_Clear |=C_IRQ4_1KHz。 dd++。 if(dd=100) //100ms检测一次 { dd=0。 biya()。 } 9 } if(*P_INT_Ctrl amp。 C_IRQ4_2KHz) { *P_INT_Clear |=C_IRQ4_2KHz。 } else { *P_INT_Clear |=C_IRQ4_4KHz。 } } //***************IRQ5中断 *********************// void IRQ5(void) __attribute__ ((ISR))。 void IRQ5(void) { if(*P_INT_Ctrl amp。 C_IRQ5_4Hz) { //IRQ5_4HZ *P_INT_Clear |=C_IRQ5_4Hz。 bizhan()。 //避障 } else { //IRQ5_2HZ *P_INT_Clear |=C_IRQ5_2Hz。 hf()。 //比较检测到 AD的最小值 if(xp=0xc8)workstate=1。 // AD 值达到 200 以内就认为发现火源。 workstate=1进入检测范围 } } //***************A/D转换 *********************// void get_AD(void) { unsigned int ak[15]。 unsigned int i,j,temp,k,sum。 unsigned int Line,AD_Data。 *P_ADC_Ctrl=0x01。 //允许转换 for(Line=1。 Line7。 Line++) { *P_ADC_MUX_Ctrl=Line。 //选择通道 AD_Data=*P_ADC_MUX_Data。 //启动转换 for(i=0。 i15。 i++) { while(!(*P_ADC_MUX_Ctrlamp。 0x8000))。 //没有转换完则继续等待 AD_Data=*P_ADC_MUX_Data。 //读转换后的数据 10 AD_Data =AD_Data8。 //右移 8位,只取 8高位数据 ak[i]=AD_Data。 } for(i=0。 i15。 i++) //从小到大排序 { for(j=i+1。 j15。 j++) if(ak[i]ak[j]){temp=ak[i]。 ak[i]=ak[j]。 ak[j]=temp。 } } sum=0。 for(k=5。 k10。 k++) {sum=sum+ak[k]。 } chdata[Line] =sum/5。 *P_Watchdog_Clear=0x01。 } } /***********************************************************/ void hf(void) { unsigned int i,j,temp。 get_AD()。 for(i=1。 i=6。 i++) paixu[i]=chdata[i]。 for(i=1。 i=6。 i++) { for(j=i+1。 j=6。 j++) if(paixu[i]paixu[j]){temp=paixu[i]。 paixu[i]=paixu[j]。 paixu[j]=temp。 } } min=paixu[1]。 //min 为单前这次检测到的最低值 xp =xpmin ? xp:min。 //xp 为检测到的历史最低值 if(0xC9xp amp。 amp。 xp=0xFF) mm=1。 if(0xA0xp amp。 amp。 xp=0xC9) mm=2。 if(0x90xp amp。 amp。 xp=0xA0) mm=3。 if(0x7Fxp amp。 amp。 xp=0x90) mm=4。 if(0x67xp amp。 amp。 xp=0x7F) mm=5。 if(0x50xp amp。 amp。 xp=0x67) mm=6。 if(0x3Fxp amp。 amp。 xp=0x50) mm=7。 if(0x0Fxp amp。 amp。 xp=0x3F) mm=8。 if(0x0Cxp amp。 amp。 xp=0x0F) mm=9。 if(0x08xp amp。 amp。 xp=0x0C) mm=10。 if(0x00xp amp。 amp。 xp=0x08) mm=11。 } /******************避崖程序 *********************************/ void biya(void ) { 11 if(!(*P_IOB_Data amp。 0x8000)) //q1 1000 { stop()。 backward(20,20)。 turn_left(21)。 } if(!(*P_IOB_Data amp。 0x4000)) //q2 0100 { stop()。 backward(20,20)。 turn_left(21)。 } if(!(*P_IOB_Data amp。 0xc000)) //q12 1100 { stop()。 backward(20,20)。 turn_left(21)。 } if(!(*P_IOB_Data amp。 0x2020)) //h1 0010 { stop()。 forward(15,15)。 turn_left(10)。 } if(!(*P_IOB_Data amp。 0x1000)) //h2 0001 { stop()。 forward(15,15)。 turn_left(10)。 } if(!(*P_IOB_Data amp。 0x3000)) //h1 2 0011 { stop()。 forward(15,15)。 turn_left(10)。 } else。 } /******************避障程序 ******************************/ void bizhan(void ) { if(Get_IOA_Data(12)==0 amp。 amp。 Get_IOA_Data(11) ==1 ) //zuobing { 12 backward(15,15)。 while(Get_IOA_Data(12)==0) { turn_right(30)。 forward(20,20)。 turn_left(21)。 } } if(Get_IOA_Data(11)==0 amp。 amp。 Get_IOA_Data(12) ==1 ) //youbing { backward(15,15)。 while(Get_IOA_Data(11)==0) { turn_left(21)。 forward(20,20)。 turn_right(30)。 } } if(Get_IOA_Data(11)==0 amp。 amp。 Get_IOA_Data(12) ==0) { backward(15,15)。 turn_left(21)。 forward(20,20)。 turn_right(30)。 } } /******************延时子程序 ******************************/ void delay_s(unsigned int t ) // s级延时程序 { unsigned int i。 for(i=0。 it。 i++) delay_ms(1000)。 } void delay_ms(unsigned int t) // ms级延时程序 { Delaynumber=0。 while(Delaynumber=10*t)*P_Watchdog_Clear=0x01。 //没有延时完则继续等待 } 13 附录 2 .DEFINE P_INT_Ctrl 0x7010。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。