|
發(fā)布時(shí)間: 2020-5-5 14:12
正文摘要:我在做用JQ8400放音樂(lè)讓小車跳舞,現(xiàn)在為什么按鍵切換到case4后,就停不下來(lái)了,可以從case1切換到case4,但是case4到case1就不行,能幫我看看嗎void wudao(void) { tingzh ... |
| 程序有bug,仿真看一下哪里有問(wèn)題就知道了 |
濫情 發(fā)表于 2020-5-14 17:16 unsigned char getkey(void) { unsigned char result=0; if(key == 0) { delay_nms(10); if(key == 0) { result++; while(!key); } } if(result > 4) { result = 1; } return result; } unsigned char DelayWaitKey(unsigned int Delayms) { unsigned char tmpkey; z=0; TR1=1; while (z<(Delayms/50)) { tempkey=getkey(); if (tempkey!=0) { TR1=0; z=0; return tempkey; } } TR1=0; z=0; return 0; } unsigned char wudao(void) { unsigned char tmpResult; tingzhi(); tmpResult=DelayWaitKey(1000); if (tmpResult>0) return tmpResult; qianjin(); tmpResult=DelayWaitKey(3000); if (tmpResult>0) return tmpResult; tingzhi(); tmpResult=DelayWaitKey(150); if (tmpResult>0) return tmpResult; youzhuan(); tmpResult=DelayWaitKey(150); if (tmpResult>0) return tmpResult; tingzhi(); tmpResult=DelayWaitKey(150); if (tmpResult>0) return tmpResult; qianjin(); tmpResult=DelayWaitKey(300); if (tmpResult>0) return tmpResult; tingzhi(); tmpResult=DelayWaitKey(150); if (tmpResult>0) return tmpResult; youzhuan(); tmpResult=DelayWaitKey(150); if (tmpResult>0) return tmpResult; tingzhi(); tmpResult=DelayWaitKey(150); if (tmpResult>0) return tmpResult; qianjin(); tmpResult=DelayWaitKey(3000); if (tmpResult>0) return tmpResult; tingzhi(); tmpResult=DelayWaitKey(150); if (tmpResult>0) return tmpResult; youzhuan(); tmpResult=DelayWaitKey(150); if (tmpResult>0) return tmpResult; tingzhi(); tmpResult=DelayWaitKey(150); if (tmpResult>0) return tmpResult; qianjin(); tmpResult=DelayWaitKey(3000); if (tmpResult>0) return tmpResult; tingzhi(); return 0; } //------------------------------------------------------------------------------------------------------- void main() //主程序入口 { // bit RunFlag=0; //定義小車運(yùn)行標(biāo)志位 bit IsMusicFlag=0; // LedFlash=3000; //對(duì)閃燈數(shù)據(jù)進(jìn)行初始化 EX1=1; //同意開(kāi)啟外部中斷1 IT1=1; //設(shè)定外部中斷1為低邊緣觸發(fā)類型 EA=1; //總中斷開(kāi)啟 // ET1=1; tingzhi(); //初始化小車運(yùn)行狀態(tài) Timer1Init();//定時(shí)器1初始化 while(1) //程序主循環(huán) { if (!IsMusicFlag) { temp=getkey(); } switch(temp) { case 1: IsMusicFlag=0; tingzhi(); //forward(); Stop_Music(); break; case 2: IsMusicFlag=0; Robot_Avoidance(); EX1 = 0; break; case 3: IsMusicFlag=0; EX1 = 1; break; case 4: IsMusicFlag=1; temp=Star_Music(); break; }//switch }//while(1) }//main 理解下。。 |
| 中斷那里出了優(yōu)先級(jí)問(wèn)題,別把wudao函數(shù)寫入中斷,程序執(zhí)行不到吧 |
carpcarey 發(fā)表于 2020-5-14 09:56 我用定時(shí)器寫了舞蹈但是還是為什么還是caes4切換不到case沒(méi)有做用,樓下是我的代碼能幫我看看嗎,還有就是為什么我用注釋的wudao()而不是現(xiàn)在這個(gè)wudao()的時(shí)候,放音樂(lè)的時(shí)候小車不轉(zhuǎn)。是if語(yǔ)句用的不對(duì)嗎 |
|
#include <REGX52.H> //包含51單片機(jī)相關(guān)的頭文件 #include <intrins.h> sbit LeftIR=P3^5; //定義前方左側(cè)紅外探頭端口 sbit RightIR=P3^4; //定義前方右側(cè)紅外探頭端口 sbit IN1=P1^2; //定義左側(cè)電機(jī)驅(qū)動(dòng)A端 sbit IN2=P1^3; //定義左側(cè)電機(jī)驅(qū)動(dòng)B端 sbit IN3=P1^4; //定義右側(cè)電機(jī)驅(qū)動(dòng)A端 sbit IN4=P1^5; sbit EN1=P1^6; sbit EN2=P1^0; sbit Beep=P2^3; //定義蜂鳴器端口 sbit IRIN=P3^3; //定義紅外接收端口 sbit p00=P0^0; //LED sbit p01=P0^1; //LED sbit p02=P0^2; //LED sbit p03=P0^3; //LED sbit p04=P0^4; //LED sbit p05=P0^5; //LED sbit p06=P0^6; //LED sbit p07=P0^7; //LED sbit sda=P1^1; sbit key=P3^2; #define Left_moto_pwm P1_6 //PWM信號(hào)端 #define Right_moto_pwm P1_7 //PWM信號(hào)端 #define Left_moto_go {P1_2=1,P1_3=0;} //左電機(jī)向前走 #define Left_moto_back {P1_2=0,P1_3=1;} //左邊電機(jī)向后轉(zhuǎn) #define Left_moto_Stop {P1_2=0,P1_3=0;} //左邊電機(jī)停轉(zhuǎn) #define Right_moto_go {P1_4=1,P1_5=0;} //右邊電機(jī)向前走 #define Right_moto_back {P1_4=0,P1_5=1;} //右邊電機(jī)向后走 #define Right_moto_Stop {P1_4=0,P1_5=0;} //右邊電機(jī)停轉(zhuǎn) unsigned char pwm_val_left =0;//變量定義 unsigned char push_val_left =0;// 左電機(jī)占空比N/20 unsigned char pwm_val_right =0; unsigned char push_val_right=0;// 右電機(jī)占空比N/20 unsigned char code RecvData[]={0x19,0x18,0x52,0x5A,0x08,0x1C,0x16,0x45,0x46,0x47,0x0D,0x0E,0x00,0x0F}; unsigned char temp = 1; unsigned char IRCOM[7];//接收數(shù)據(jù)緩沖區(qū) unsigned int z; bit Right_moto_stop=1; bit Left_moto_stop =1; unsigned int time3=0; /*********************************************************************/ void tingzhi(void) { P1_2 = 0; P1_3 = 0; P1_4 = 0; P1_5 = 0; } void qianjin(void) { push_val_left=3; //速度調(diào)節(jié)變量 0-20。。。0最小,20最大 push_val_right=3; Left_moto_go ; //左電機(jī)往前走 Right_moto_go ; //右電機(jī)往前走 } void houtui() { push_val_left=12; //速度調(diào)節(jié)變量 0-20。。。0最小,20最大 push_val_right=12; Left_moto_back ; //左電機(jī)往前走 Right_moto_back ; //右電機(jī)往前走 } void zuozhuan() { push_val_left=6; push_val_right=12; Right_moto_go ; //右電機(jī)往前走 Left_moto_back ; //左電機(jī)后走 } void youzhuan() { push_val_left=12; push_val_right=6; Left_moto_go ; //左電機(jī)往前走 Right_moto_back ; //右電機(jī)往后走 } /************************************************************************/ /* PWM調(diào)制電機(jī)轉(zhuǎn)速 */ /************************************************************************/ /* 左電機(jī)調(diào)速 */ /*調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比 */ void pwm_out_left_moto(void) { if(Left_moto_stop) { if(pwm_val_left<=push_val_left) { Left_moto_pwm=1; } else { Left_moto_pwm=0; } if(pwm_val_left>=20) pwm_val_left=0; } else { Left_moto_pwm=0; } } /******************************************************************/ /* 右電機(jī)調(diào)速 */ void pwm_out_right_moto(void) { if(Right_moto_stop) { if(pwm_val_right<=push_val_right) { Right_moto_pwm=1; } else { Right_moto_pwm=0; } if(pwm_val_right>=20) pwm_val_right=0; } else { Right_moto_pwm=0; } } /***************************************************/ ///*TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)*/ void timer0()interrupt 1 using 2 { TH0=0xFc; TL0=0X18; time3++; pwm_val_left++; pwm_val_right++; pwm_out_left_moto(); pwm_out_right_moto(); } void Timer1Init() //50毫秒@11.0592MHz { // AUXR &= 0xBF; //定時(shí)器時(shí)鐘12T模式 TMOD &= 0x0F; //設(shè)置定時(shí)器模式 TMOD |= 0x10; //設(shè)置定時(shí)器模式 TL1 = 0x00; //設(shè)置定時(shí)初值 TH1 = 0x4C; //設(shè)置定時(shí)初值 TF1 = 0; //清除TF1標(biāo)志 EA=1; ET1=1; TR1 = 1; //定時(shí)器1開(kāi)始計(jì)時(shí) } void Timer1() interrupt 3//晶振頻率是11.0592M { TH1=0X00; //給定時(shí)器賦初值,定時(shí)50ms TL1=0x4C; z++; } void Delay1ms(unsigned int i) { unsigned char j,k; do{ j = 10; do{ k = 50; do{ _nop_(); }while(--k); }while(--j); }while(--i); } void delay_nus(unsigned int i) //延時(shí):i>=12 ,i的最小延時(shí)單12 us { i=i/10; while(--i); } void delay_nms(unsigned int n) //延時(shí)n ms { n=n+1; while(--n) delay_nus(900); //延時(shí) 1ms,同時(shí)進(jìn)行補(bǔ)償 } void delayms(unsigned char x) //0.14mS延時(shí)程序 { unsigned char i; //定義臨時(shí)變量 while(x--) //延時(shí)時(shí)間循環(huán) { for (i = 0; i<13; i++) {} //14mS延時(shí) } } void delay5(unsigned int i) //延時(shí)程序 {while(i--);} void Delay1us ( int T ) { while(T!=0) { _nop_(); T--; } } void led_delay(void) { unsigned char i,j; for(i=0;i<220;i++) for(j=0;j<220;j++); } /* void wudao(void) { Timer1Init(); while(1) { if(z>=3){ z=0; tingzhi(); } if(z>=60){ z=0; qianjin(); } if(z>=3){ z=0; tingzhi(); } if(z>=3){ z=0; youzhuan(); } if(z>=3){ z=0; tingzhi(); } if(z>=60){ z=0; qianjin(); } if(z>=3){ z=0; tingzhi(); } if(z>=3){ z=0; youzhuan(); } if(z>=3){ z=0; tingzhi(); } if(z>=60){ z=0; qianjin(); } if(z>=3){ z=0; tingzhi(); } if(z>=3){ z=0; youzhuan(); } if(z>=3){ z=0; tingzhi(); } if(z>=3){ z=0; qianjin(); } tingzhi(); } } */ void wudao(void) { Timer1Init();//定時(shí)器1初始化 while(1) { tingzhi(); TR1=1; while(z!=3); TR1=0; z=0; qianjin(); TR1=1; while(z!=60); TR1=0; z=0; tingzhi(); TR1=1; while(z!=3); TR1=0; z=0; youzhuan(); TR1=1; while(z!=3); TR1=0; z=0; tingzhi(); TR1=1; while(z!=3); TR1=0; z=0; qianjin(); TR1=1; while(z!=6); TR1=0; z=0; tingzhi(); TR1=1; while(z!=3); TR1=0; z=0; youzhuan(); TR1=1; while(z!=3); TR1=0; z=0; tingzhi(); TR1=1; while(z!=3); TR1=0; z=0; qianjin(); TR1=1; while(z!=60); TR1=0; z=0; tingzhi(); TR1=1; while(z!=3); TR1=0; z=0; youzhuan(); TR1=1; while(z!=3); TR1=0; z=0; tingzhi(); TR1=1; while(z!=3); TR1=0; z=0; qianjin(); TR1=1; while(z!=60); TR1=0; z=0; tingzhi(); } } void forward(void)//兩邊 { P0=0x7e; led_delay(); P0=0xbd; led_delay(); P0=0xdb; led_delay(); P0=0xe7; led_delay(); P0=0xe7; led_delay(); P0=0xdb; led_delay(); P0=0xbd; led_delay(); P0=0x7e; led_delay(); } void Alter(void)//交替 { P0=0xaa; led_delay(); P0=0x55; led_delay(); } void backward(void) { P0=0x7f; led_delay(); P0=0xbf; led_delay(); P0=0xdf; led_delay(); P0=0xef; led_delay(); P0=0xf7; led_delay(); P0=0xfb; led_delay(); P0=0xfd; led_delay(); P0=0xfe; led_delay(); } void blink(void) { P0=0xff; led_delay(); P0=0x00; led_delay(); } void deng1() //流水燈 {p00=0; p01=0; delay5(5000); p02=0; p03=0; delay5(5000); p04=0; p05=0; delay5(5000); p06=0; p07=0; delay5(5000); p07=1; p06=1; delay5(5000); p05=1; p04=1; delay5(5000); p03=1; p02=1; delay5(5000); p01=1; p00=1; delay5(5000);} void deng2() //流水燈 {p00=0; p01=1; delay5(5000); p02=0; p03=1; delay5(5000); p04=0; p05=1; delay5(5000); p06=0; p07=1; delay5(5000); p07=0; p06=1; delay5(5000); p05=0; p04=1; delay5(5000); p03=0; p02=1; delay5(5000); p01=0; p00=1; delay5(5000);} void deng3() //流水燈 {p00=0; p01=0; delay5(5000); p02=0; p03=0; delay5(5000); p04=0; p05=0; delay5(5000); p06=0; p07=0; delay5(5000); p07=1; p06=1; delay5(5000); p05=1; p04=1; delay5(5000); p03=1; p02=1; delay5(5000); p01=1; p00=1; delay5(5000);} void deng4() //流水燈 {p00=1; p01=1; p02=1; p03=1; p04=1; p05=1; p06=1; p07=1; } void Robot_Avoidance() //機(jī)器人避障子程序 { if(LeftIR==1&&RightIR ==1) //LeftIRBZ RightIRBZ { deng1(); qianjin(); delay_nms (10); // SB1=1; } else { if(LeftIR==1&&RightIR ==0) //右邊檢測(cè)到紅外信號(hào) { deng4(); youzhuan(); //右轉(zhuǎn) delay_nms (300); //停止300MS 防止電機(jī)反相電壓沖擊 導(dǎo)致系統(tǒng)復(fù)位 deng1(); } if(RightIR ==1&&LeftIR==0) //左邊檢測(cè)到紅外信號(hào) { deng4(); zuozhuan(); //左轉(zhuǎn) delay_nms (300); //停止300MS 防止電機(jī)反相電壓沖擊 導(dǎo)致系統(tǒng)復(fù)位 deng1(); } if(RightIR==0&&LeftIR==0) //兩邊傳感器同時(shí)檢測(cè)到紅外 { // SB1=0; deng4(); tingzhi(); //停止 delay_nms (300); //停止300MS 防止電機(jī)反相電壓沖擊 導(dǎo)致系統(tǒng)復(fù)位 houtui(); //調(diào)用電機(jī)后退函數(shù) delay_nms (300); //后退50毫秒 youzhuan(); //調(diào)用電機(jī)右轉(zhuǎn)函數(shù) delay_nms (400); deng1(); } } qianjin(); } void ControlCar_yaokong(unsigned char ConType) //定義電機(jī)控制子程序 (紅外遙控單獨(dú)設(shè)置一個(gè) switch case 語(yǔ)句 ) { tingzhi(); switch(ConType) //判斷用戶設(shè)定電機(jī)形式 { case 1: //前進(jìn) //判斷用戶是否選擇形式1 { tingzhi(); //進(jìn)入前進(jìn)之前 先停止一段時(shí)間 防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位 Delay1ms(150); // LeftLed = 0 ; qianjin(); break; } case 2: //后退 //判斷用戶是否選擇形式2 { tingzhi(); //進(jìn)入后退之前 先停止一段時(shí)間 防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位 Delay1ms(150); // LeftLed = 1 ; houtui(); //M2電機(jī)反轉(zhuǎn) break; } case 3: //右轉(zhuǎn) //判斷用戶是否選擇形式3 { tingzhi(); //進(jìn)入左轉(zhuǎn)之前 先停止一段時(shí)間 防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位 Delay1ms(150); youzhuan(); //M2電機(jī)正轉(zhuǎn) break; } case 4: //左轉(zhuǎn) //判斷用戶是否選擇形式4 { tingzhi(); //進(jìn)入右轉(zhuǎn)之前 先停止一段時(shí)間 防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位 Delay1ms(150); zuozhuan(); //M1電機(jī)正轉(zhuǎn) //M2電機(jī)反轉(zhuǎn) break; } case 5: //停止 //判斷用戶是否選擇形式8 { tingzhi(); break; //退出當(dāng)前選擇 } case 6: //左轉(zhuǎn) //判斷用戶是否選擇形式4 { //進(jìn)入右轉(zhuǎn)之前 先停止一段時(shí)間 防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位 Robot_Avoidance(); break; } case 7: //停止 //判斷用戶是否選擇形式8 { deng2(); break; //退出當(dāng)前選擇 } case 8: //停止 //判斷用戶是否選擇形式8 { deng4(); break; //退出當(dāng)前選擇 } } } //----------紅外遙控------------------------------------------------------------- void IR_IN() interrupt 2 using 0 //定義INT2外部中斷函數(shù) { unsigned char j,k,N=0; //定義臨時(shí)接收變量 EX1 = 0; //關(guān)閉外部中斷,防止再有信號(hào)到達(dá) delayms(15); //延時(shí)時(shí)間,進(jìn)行紅外消抖 if (IRIN==1) //判斷紅外信號(hào)是否消失 { EX1 =1; //外部中斷開(kāi) return; //返回 } while (!IRIN) //等IR變?yōu)楦唠娖剑^(guò)9ms的前導(dǎo)低電平信號(hào)。 { delayms(1); //延時(shí)等待 } for (j=0;j<4;j++) //采集紅外遙控器數(shù)據(jù) { for (k=0;k<8;k++) //分次采集8位數(shù)據(jù) { while (IRIN) //等 IR 變?yōu)榈碗娖剑^(guò)4.5ms的前導(dǎo)高電平信號(hào)。 { delayms(1); //延時(shí)等待 } while (!IRIN) //等 IR 變?yōu)楦唠娖?br /> { delayms(1); //延時(shí)等待 } while (IRIN) //計(jì)算IR高電平時(shí)長(zhǎng) { delayms(1); //延時(shí)等待 N++; //計(jì)數(shù)器加加 if (N>=30) //判斷計(jì)數(shù)器累加值 { EX1=1; //打開(kāi)外部中斷功能 return; //返回 } } IRCOM[j]=IRCOM[j] >> 1; //進(jìn)行數(shù)據(jù)位移操作并自動(dòng)補(bǔ)零 if (N>=8) //判斷數(shù)據(jù)長(zhǎng)度 { IRCOM[j] = IRCOM[j] | 0x80; //數(shù)據(jù)最高位補(bǔ)1 } N=0; //清零位數(shù)計(jì)錄器 } } if (IRCOM[2]!=~IRCOM[3]) //判斷地址碼是否相同 { EX1=1; //打開(kāi)外部中斷 return; //返回 } for(j=0;j<10;j++) //循環(huán)進(jìn)行鍵碼解析 { if(IRCOM[2]==RecvData[j]) //進(jìn)行鍵位對(duì)應(yīng) { // ControlCar(j); ControlCar_yaokong(j); //數(shù)碼管顯示相應(yīng)數(shù)碼 } } EX1 = 1; //外部中斷開(kāi) } void SendData ( unsigned char addr ) { unsigned char i; // EA = 0;/*發(fā)送時(shí)關(guān)掉中斷,防止中斷影響時(shí)序 */ sda = 1;/*開(kāi)始拉搞 */ Delay1us ( 1000 ); sda = 0;/*開(kāi)始引導(dǎo)碼*/ Delay1us ( 3000 );/*此處延時(shí)最少要大于2ms,此參數(shù)延時(shí)為310ms */ for ( i = 0; i < 8; i++ ) /*總共8位數(shù)據(jù) */ { sda = 1; if ( addr & 0x01 ) /*3:1表示數(shù)據(jù)位1,每個(gè)位用兩個(gè)脈沖表示 */ { Delay1us ( 500 ); sda = 0; Delay1us ( 210 ); } else /*1:3表示數(shù)據(jù)位0 ,每個(gè)位用兩個(gè)脈沖表示 */ { Delay1us ( 210 ); sda = 0; Delay1us ( 500 ); } addr >>= 1; } sda = 1; // EA = 1; } void Stop_Music() { SendData(0x0a); SendData(0x13); } void Star_Music() { SendData(0x0a); SendData(0x03); SendData(0x0b); wudao(); } //------------------------------------------------------------------------------------------------------- void main() //主程序入口 { // bit RunFlag=0; //定義小車運(yùn)行標(biāo)志位 // LedFlash=3000; //對(duì)閃燈數(shù)據(jù)進(jìn)行初始化 EX1=1; //同意開(kāi)啟外部中斷1 IT1=1; //設(shè)定外部中斷1為低邊緣觸發(fā)類型 EA=1; //總中斷開(kāi)啟 // ET1=1; tingzhi(); //初始化小車運(yùn)行狀態(tài) while(1) //程序主循環(huán) { if(key == 0) { delay_nms(10); if(key == 0) { temp++; while(!key); } } if(temp > 4) { temp = 1; } switch(temp) { case 1:tingzhi(); //forward(); Stop_Music(); break; case 2: Robot_Avoidance();EX1 = 0;break; case 3: EX1 = 1;break; case 4: Star_Music(); break; } } } |
| 中斷那里出了問(wèn)題,優(yōu)先級(jí) |
濫情 發(fā)表于 2020-5-10 22:58 我說(shuō)的很明白,不要把wudao函數(shù)寫入中斷啊。 |
EDGClearlove7 發(fā)表于 2020-5-11 10:11 那要切換的話該怎么做呢?用定時(shí)器寫延時(shí)嗎?寫的話是要把wudao()里面的全部寫進(jìn)去嗎?不太會(huì)寫 |
| case語(yǔ)句中執(zhí)行玩wudao()才break |
carpcarey 發(fā)表于 2020-5-9 10:06 是要把wudao()這部分全寫入中斷里嗎?不太會(huì)寫啊 |
濫情 發(fā)表于 2020-5-8 17:16 Delay10000ms();用定時(shí)器做。wudao里的Delay10000ms()改為:?jiǎn)?dòng)定時(shí)器,看是不是到定時(shí)時(shí)間了,如果沒(méi)到,看是不是有按鍵被按下了?沒(méi)有的話繼續(xù)看是不是到定時(shí)時(shí)間了。。如果有按鍵被按下了,那是不是停止?是停止鍵,那就停止播放,退出wudao函數(shù)。 |
| 非常有趣! 我希望我有空的時(shí)候可以嘗試一下。 |
carpcarey 發(fā)表于 2020-5-6 17:20 這個(gè)我是是根據(jù)歌曲時(shí)間確定的,但是我想要讓它隨時(shí)能夠切換該怎么辦呢 |
| 你的wudao()函數(shù)耗時(shí)很長(zhǎng)啊,至少30秒時(shí)間,也就是說(shuō),進(jìn)入wudao()后,至少30秒才能返回主函數(shù)。當(dāng)然這30秒就不會(huì)接受你按鍵處理了啊。 |
| 怎么,沒(méi)人呢 |
Powered by 單片機(jī)教程網(wǎng)