|
發布時間: 2020-7-2 22:15
正文摘要:這段程序是超聲波1602顯示+按鍵調速的,但一起執行下面的調速就沒有用。如果把超聲波顯示給取消,調速就有用了。小白看了半天沒調出來,希望有大佬可以幫下忙。 |
| 哪就是超聲波顯示進入死循環了,可以聯調的話加入聯調機制,查看一下哪一步走不下去了 |
|
求解決:在顯示距離同時可以按鍵調整小車速度 完整程序如下: #include<reg52.h> #include<1602.h> #include<pwm.h> sfr T2MOD=0XC9; sbit Trig = P2^0; sbit Echo = P2^1; /*void UsartConfiguration(); unsigned char i; */ sbit IN1 = P3^7; sbit IN2 = P3^6; sbit IN3 = P3^5; sbit IN4 = P3^4; /************函數聲明**************/ void forword(); void back(); void right(); void left(); void stop(); unsigned char BiaoTi[]=" distance: "; unsigned char code ShuZiBiao[15] = {'0','1','2','3','4','5','6','7','8','9','.','C','M'}; unsigned char XianShi[7] ={ 0,0,0,0,0,0,0}; //2、設定發送時間 void Delay10us() { T2MOD = 0; //---- --00 初始化模式寄存器 默認向上計數 T2CON = 0; //0000 0000 初始化控制寄存器 一個中斷源,16位自動重裝模式 TL2 = (65536 - 10) / 256; //設置定時初值 TH2 = (65536 - 10) % 256; //設置定時初值 RCAP2L = (65536 - 10) / 256; //設置定時重載值 RCAP2H = (65536 - 10) % 256; //設置定時重載值 TR2 = 1; //定時器2開始計時 IE = 0xA0; //打開全局中斷,定時器2中斷 while(!TF2); TF2 = 0; /* TMOD |= 0x01; TH0 = 0xFF; TL0 = 0xF6; TR0 = 1; while(!TF0); TF0 = 0; */ } void Rstart() //啟動超聲波模塊,初始化 { Trig=0; Trig=1; Delay10us(); Trig=0; } //3、獲取時間和距離 int gettime()//獲取時間 { unsigned int time = 0; time = TH2<<8 | TL2; //TH0*256+TL0 return time; } int Getdis(unsigned int time) //獲取距離 { unsigned int distance;//整型的原因是方便后續LCD1602屏顯示 distance = (int)time * 0.085; TH2=0; TL2=0;//清空計時器· return distance; } void star() { TH2 = 0; TL2 = 0; TR2 = 1; } void end() { TR2 = 0; } void GetOnce() //獲取一次超聲波測距模塊的距離 { Rstart(); while(!Echo);//當Echo為零時等待 star(); while(Echo);//當Echo為1計數并等待 end(); } void delay() { int i; int j; for(i=0;i<50;i++) for(j = 0;j<1000;j++); } void main() { unsigned int time = 0; unsigned int i,j; unsigned int dis; timer0_init(); delayxms(5); /* UsartConfiguration(); //串口初始化 */ while(1) { GetOnce(); time = gettime(); dis = Getdis(time);//單位毫米,后面會用厘米顯示 XianShi[0]=dis/1000;//厘米的百位 XianShi[1]=(dis/100)%10;//厘米的十位 XianShi[2]=(dis/10)%10;//厘米的個位 XianShi[3]=10;//顯示小數點 XianShi[4]=dis%10;//厘米的小數點后一位 XianShi[5]=11;//顯示‘C’ XianShi[6]=12;//顯示'M' Lcd1602_init(); //初始化函數 Lcd1602_WriteCom(0x80); //0x80是第一行的第一個字符的地址 for (i=0;i<11;i++) { Lcd1602_WriteData(BiaoTi[i]); } Lcd1602_WriteCom(0x80+0x40); //0xc0是第二行的第一個字符的地址 for (j=0;j<7;j++) { Lcd1602_WriteData(ShuZiBiao[XianShi[j]]); } Motor_add_left(); Motor_dec_left(); Motor_add_right(); Motor_dec_right(); forword(); /* if(dis < 150) { back(); delay(); right(); } else {forword();} */ // 避障 /* i = SBUF; RI = 0; if(i == 'q') { forword(); } if(i == 'h') { back(); } if(i == 'z') { left(); } if(i == 'y') { right(); } if(i == 't') { stop(); } */ } } void forword() //前進函數 { //第一路電機 正轉 IN1 = 0; IN2 = 1; //第二路電機 正轉 IN3 = 0; IN4 = 1; } void back() //后退 { //第一路電機 反轉 IN1 = 1; IN2 = 0; //第二路電機 反轉 IN3 = 1; IN4 = 0; } void right() //右轉 { // 第一路正轉 IN1 = 0; IN2 = 1; // 第二路反轉 IN3 = 0; IN4 = 0; } void left() //左拐函數 { IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 1; } void stop() { IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 0; } /***********定時器0初始化***********/ void timer0_init() { TMOD=0x01; //定時器0工作于方式1 TH0=(65536-10)/256; TL0=(65536-10)%256; EA = 1; ET0=1; TR0=1; } /**************定時0中斷處理******************/ void timer0_int() interrupt 1 { TH0=(65536-10)/256; TL0=(65536-10)%256; TIME++; m1 = countA; m2 = countB; if(TIME < m1) //count為占空比 { ENA = 1; //輸出高電平 } else { ENA = 0; } if(TIME < m2) { ENB = 1; } else { ENB = 0; } if(TIME>=100) { TIME=0; } } |