本帖最后由 ximuyuudachi 于 2022-2-11 17:08 編輯
#include"COMMON.h"
#include"LCD1602.h"
#include"Delay.h"
#include"HC-SR04.h"
#define uchar unsigned char
#define uint unsigned int
uchar time;
uint temp;
sbit KEY1=P1^7;
sbit KEY2=P1^6;
sbit KEY3=P1^5;
sbit PWM=P1^0;
sbit IN1=P1^1;
sbit IN2=P1^2;
sbit IN3=P1^3;
sbit IN4=P1^4;
sbit K1=P3^2; //車子行動總開關
sbit GD=P3^3; //單獨一個紅外傳感器的避障接口
sbit SS1 = P2^5;
sbit SS2 = P2^4;
sbit SS3 = P2^3;
sbit SS4 = P2^2;
sbit SS5 = P2^1;
//超聲波數據顯示定義
unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','-','C','M'};
static unsigned char DisNum = 0; //顯示用指針
unsigned int chaoshengbotime = 0;//time表示時間緩存變量
unsigned long S = 0;//距離緩存變量
bit flag = 0;
unsigned char disbuff[4] = { 0,0,0,0,};// 放置一個空的段碼,可以存儲數據
void qianjin()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
void houtui()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
void tingzhi()
{
IN1=1;
IN2=1;
IN3=1;
IN4=1;
}
void youxiao()
{
IN1=1;
IN2=0;
IN3=1;
IN4=1;
}
void youda()
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
}
void zuoxiao()
{
IN1=1;
IN2=1;
IN3=1;
IN4=0;
}
void zuoda()
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
}
void xunji()
{
if(SS1==1&&SS2==1 &&SS4==0&&SS5==1) //線在車的右側小
{
youxiao();
}
if(SS1==1&&SS2==1 &&SS4==1&&SS5==0) //線在車的右側大
{
youda();
}
if(SS1==1&&SS2==0 &&SS4==1&&SS5==1) //線在車的左右側小
{
zuoxiao();
Delay(70);
}
if(SS1==0&&SS2==1 &&SS4==1&&SS5==1) //線在車的做側大
{
zuoda();
Delay(70);
}
if(SS1==1&&SS2==1 &&SS4==1&&SS5==1) //線在車的做側大
{
qianjin();
}
if(SS1==0&&SS2==0 &&SS4==0&&SS5==0) //線在車的做側大
{
tingzhi();
}
}
void Timer1_Init()//0-65536,每隔1us計數加1 超聲波不需要定時
{
TMOD|=0x10;//讓定時器0和定時器1工作在(16位定時器/計數器,TH1,TL1,TH0,TL0全用)0001 0001,TOMD為不可位尋址(只能整體賦值)
TH1 = 0;
TL1 = 0;
ET1=0;
TR1=0;
}
void Conut(void)//超聲波計數和LCD1602顯示距離
{
chaoshengbotime = TH1*256+TL1; //得到的時間(等于TH0的8位左移8位再或TL0,合成16位數)
TH1 = 0; //定時計數器清零
TL1 = 0;
S=(chaoshengbotime*1.7)/100; //算出來是CM(空氣中的聲速是每秒340米。一微妙時間聲波傳輸的距離是340×0.000001=0.00034米=0.034厘米,除以2就是所測距離:0.017=1.7/100)
if((S<=2||S>=700)||flag==1) //超出一定的測量范圍顯示“-”
{
flag=0;
LCD_ShowChar(2,7,ASCII[10]); //顯示-
LCD_ShowChar(2,8,ASCII[10]); //顯示-
LCD_ShowChar(2,9,ASCII[10]); //顯示-
LCD_ShowChar(2,10,ASCII[11]); //顯示C
LCD_ShowChar(2,11,ASCII[12]); //顯示M
}
else
{
disbuff[0]=(S/100)%10;//百位(給段碼幅值的過程)
disbuff[1]=(S/10)%10;//十位(給段碼幅值的過程)
disbuff[2]=S%10;//百位(給段碼幅值的過程)
LCD_ShowChar(2,7,ASCII[disbuff[0]]);
LCD_ShowChar(2,8,ASCII[disbuff[1]]);
LCD_ShowChar(2,9,ASCII[disbuff[2]]);
LCD_ShowChar(2,10,ASCII[11]); //顯示C
LCD_ShowChar(2,11,ASCII[12]); //顯示M
}
}
void main()
{
LCD_Init();
LCD_ShowString(1,3," Ultrasonic ");
PWM=1;
TMOD|=0x01;
PWM=0;
TH0=(65536-250)/256;
TL0=(65536-250)%256;
ET0=1;
EA=1;
TR0=1;
time=0;
temp=50;
Timer1_Init();
while(1)
{
if(K1==0)
{
if(GD==1)
{
xunji();
}
if(GD==0)
{
tingzhi();
}
}
if(K1==1)
{
tingzhi();
}
StartModule();
while(!Echo); //當RX為零時等待
TR0=1; //開啟計數
while(Echo); //當RX為1計數并等待
TR0=0; //關閉計數
Conut(); //計算
Delay(500); //測量周期盡量在60ms以上(參考手冊)
}
}
void Timer0_Rountine(void) interrupt 1
{
TR0=0
if(KEY1==0)
{
temp=85;
}
if(KEY2==0)
{
temp=65;
}
if(KEY3==0)
{
temp=45;
}
time++;
if(time>=100)
{time=0;}
if(time<=temp)
{PWM=1;}
if(time>temp)
{PWM=0;}
TH0=(65536-250)/256;
TL0=(65536-250)%256;
TR0=1;
}
void Timer1_Rountine() interrupt 3 //T0中斷用來計數器溢出,超過測距范圍
{
flag=1; //中斷溢出標志
}
求大佬看一下程序上的問題,我測試了一下,如果開兩個定時器,小車也不動了!
|