求解決:在顯示距離同時可以按鍵調整小車速度
完整程序如下:
#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;
}
} |