非標準武術擂臺1V1機器人示例程式
阿新 • • 發佈:2019-01-31
/******************************************************************* ** 檔名:擂臺賽非標準平臺1V1程式_檢測原理AVR微控制器示例程式,詳細資料請購買產品後索要 ** Copyright (c) KXCT雷電科技 技術部 ** 建立人:KXCT ** 日 期:2015年11月 ** 修改人: ** 日 期: ** 描 述:僅供參考,擂臺機器人除錯能用的程式,包含了上臺、邊緣檢測、推棋子、檢測對手等功能 ** 版 本:V1.0.1 **********************************************************************/ #include<iom128v.h> #include<macros.h> #include<math.h> #define uint unsigned int #define uchar unsigned char #define IN1 {PORTC&=~BIT(0);} #define _IN1 {PORTC|=BIT(0);} #define IN2 {PORTC&=~BIT(1);} #define _IN2 {PORTC|=BIT(1);} int abs(int); char key=0,tim=0,dat,a; void delay_1ms(void) //1ms延時函式 { unsigned int i; for (i=0;i<1140;i++); } void delay(uint n) //N ms延時函式 { unsigned int i=0; for (i=0;i<n;i++) { delay_1ms(); if(key!=0)break; } } void delay_1(uint n) //N ms延時函式 { unsigned int i=0; for (i=0;i<n;i++) { delay_1ms(); if(key!=a)break; if((PIND&0x0f)==0) if(!((PINA&0x7f)==0x7f))break; } } void delay_2(uint n) //N ms延時函式 { unsigned int i=0; for (i=0;i<n;i++) { delay_1ms(); if(key!=0)break; if((PINA&0x7f)!=0x7f)break; } } void init(void) { DDRC|=0x03;//電機控制IO口初始化 DDRB|=0x60;//電機PWMIO口初始化 PORTB&=~0x60; DDRA&=0x80;//周邊紅外檢測IO輸入初始化 PORTA|=0x7f; DDRD&=0xf0;//紅外邊緣檢測IO輸入初始化 PORTD|=0x0f; DDRC&=~0xf0;//檢測棋子埠 PORTC|=0xf0; } void zhongduan_init(void)/***************外部中斷初始化****************/ { CLI(); //disable all interrupts EICRA = 0xFF; //extended ext ints EIMSK = 0x0F; SEI(); //re-enable interrupts } void Dj(int m,int n) { if((m)>0){IN1}//電機方向控制 else {_IN1} if((n)>0){IN2} else {_IN2} TCCR1A=0xa1; TCCR1B=0x09; m=abs(m); n=abs(n); OCR1A=m; OCR1B=n; } void bianyuan(void) { uint s2; s2=PIND|0xf0; switch(s2) { case 0xf1:Dj(-180,-90);//1檢測到;動作:右轉後退 delay(1000); Dj(180,-180); delay(800); break; case 0xf2:Dj(-90,-180);//2檢測到;動作:右轉後退 delay(1000); Dj(-180,180); delay(800); break; case 0xf4:Dj(180,100);//3檢測到;動作:右轉前進 delay(1000); Dj(-180,180); delay(800); break; case 0xf8:Dj(180,100);//4檢測到;動作:右轉前進 delay(1000); Dj(-180,180); delay(800); break; case 0xf3:Dj(-150,-150);//1、2檢測到;動作:後退 delay(1000); break; case 0xf9:Dj(180,100);//1、4檢測到;動作:右轉前進 delay(2000); break; case 0xfc:Dj(150,150);//3、4檢測到;動作:前進 delay(1000); break; case 0xf6:Dj(100,180);//2、3檢測到;動作:左轉前進 delay(2000); break; default :Dj(150,150); break; } } void qizi(void) { uint s3,n; s3=PINC&0xf0; if((PINC&0x30)!=0x30)//1或2檢測到;動作:全速前進 Dj(220,220); else if((PINC&0x40)!=0x40)//3檢測到;動作:右轉檢測 { Dj(-180,-180); for(n=150;n>0;n--) { if(key!=0)break; } Dj(220,-220); for(n=400;n>0;n--) { if((PINC&0x30)!=0x30)break; if(key!=0)break; delay_1ms(); } } else if((PINC&0x80)!=0x80)//4檢測到;動作:左轉檢測 { Dj(-180,-180); for(n=150;n>0;n--) { if(key!=0)break; } Dj(-220,220); for(n=400;n>0;n--) { if((PINC&0x30)!=0x30)break; if(key!=0)break; delay_1ms(); } } else Dj(200,200); } void qidong(void) { Dj(0,0); delay(200); Dj(-240,-240); delay(300); Dj(-200,-210); delay(300); Dj(-200,-220); delay(300); delay(300); delay(300); Dj(-210,-230); delay(300); Dj(-220,220); delay(300); Dj(180,180); } void ruanqidong(void) { uint s1; do { s1=PINA; s1=s1&0x20; }while(!(s1==0)); } int zhoubian_scan(void) { uint s1; s1=PINA; s1=s1&0x7f; if(s1==0x7f) return 0; else return 1; } #pragma interrupt_handler int0_isr:iv_INT0 void int0_isr(void) { uint s1; s1=PINA; s1=s1&0x7f; key=10; } #pragma interrupt_handler int1_isr:iv_INT1 void int1_isr(void) { uint s1; s1=PINA; s1=s1&0x7f; key=20; } #pragma interrupt_handler int2_isr:iv_INT2 void int2_isr(void) { uint s1; s1=PINA; s1=s1&0x7f; key=30; } #pragma interrupt_handler int3_isr:iv_INT3 void int3_isr(void) { uint s1; s1=PINA; s1=s1&0x7f; key=40; } void bianyuan_scan(void) { int s2; s2=PIND&0x0f; if(s2==0) key=0; } void main(void) { init(); delay(2000); ruanqidong(); qidong(); zhongduan_init(); while(1) { a=key; switch(key) { case 0 : qizi(); break; case 10://1產生中斷,四周未檢測到,執行動作:後退+轉向延時 Dj(-200,-200); delay(300); Dj(-180,180); delay(300); Dj(180,-180); delay(300); Dj(-200,-200); delay_1(200); Dj(200,-200); delay_1(300); Dj(150,150); bianyuan_scan(); break; case 20://2產生中斷,四周未檢測到,執行動作:後退+延時轉向 Dj(-200,-200); delay(300); Dj(180,-180); delay(300); Dj(-180,180); delay(300); Dj(-200,-200); delay_1(200); Dj(-200,200); delay_1(350); Dj(150,150); bianyuan_scan(); break; case 30://3產生中斷,四周未檢測到,執行動作:前進+延時左轉 Dj(200,200); delay_1(300); Dj(-200,200); delay_1(350); Dj(150,150); bianyuan_scan(); break; case 40://4產生中斷,四周未檢測到,執行動作:前進+延時轉向 Dj(200,200); delay_1(300); Dj(200,-200); delay_1(300); Dj(150,150); bianyuan_scan(); break; default : bianyuan(); qizi(); break; } } }
最後請允許我插入一則廣告,本人開的網店:KXCT雷電科技 主要經營機器人和智慧車相關的灰度感測器和直流電機以及直流電機驅動等相關配件,歡迎大家前來選購和交流。