Я пытаюсь отобразить расстояние на моем ЖК-дисплее, но на нем отображаются нежелательные данные
Шаги программирования
Микроконтроллер PIC18F4520 должен передать как минимум 10-кратный импульс запуска на HC-SR04 Trig Pin.После получения триггерного импульса, HC-SR04 автоматически отправляет восемь звуковых волн 40 кГц и ожидает выхода с передним фронтом на выводе Echo.Когда захват переднего фронта происходит на выводе Echo, который подключен к входу PIC18F4520, запустите таймер PIC18F4520 и снова дождитесь падения фронта на выводе Echo.Как только на выводе Echo фиксируется задний фронт, микроконтроллер считывает счетчик таймера.Этот счетчик времени используется для расчета расстояния до объекта.Расчет (расстояние в см)
Скорость звука = 343 м / с = 34300 см / с = 34,3 см / мс = 0,0343 см / usec
Расстояние = скорость * время
= (34300 * ТАЙМЕР) / 2 = 17150 * (ТАЙМЕР) = 17150xT (сек) = 0,01715xT (usec) = 17,15 xT (мсек)
Я пытался по-разному, но не смог отобразить правильное расстояниевот мой код
#include<p18f4520.h>
#include<string.h>
void delay_ms(int ms);
void delay_us(int us);
void Data(char Value);
void Cmd(char Value);
void Send2Lcd(const char Adr,rom const char *Lcd);
void main()
{
char Dist_Array1[5];
int Time=0,j=0;
int Distance;
TRISB=0XFF;
TRISC=0X00; /* (RC1,RC0 - >O/P Setting by Zero) */
TRISD=0X00; /* PORTD (0 - 7)pins Config as Output */
delay_ms(15); /* Minimum
Delay To Power On LCD Module To Recieve Mode*/
Cmd(0X30); delay_ms(5); /* LCD Specification Commands */
Cmd(0X30); delay_ms(1); /* LCD Specification Commands */
Cmd(0X30); delay_ms(2); /* LCD Specification Commands */
Cmd(0X38); /* LCD Double Line Display Command */
Cmd(0X06); /* LCD Auto Increment Location Address Command */
Cmd(0X01); /* LCD Display Clear Command */
Cmd(0X0C); /* LCD Display ON Command */
Send2Lcd(0x80," Distance");
Send2Lcd(0xc0,"Measurement");
delay_ms(3);
delay_ms(1000);
TMR1H=0; TMR1L=0; /* Load Timer1 with 0*/
OSCCON=0x72; /* Use internal oscillator frequency */
while(1)
{
Cmd(0x01);
PORTCbits.RC3=0; // trigger OFF
delay_us(2);
PORTCbits.RC3=1; // trigger ON
delay_us(10);
PORTBbits.RB1=0; // trigger OFF
while(PORTBbits.RB0==0 ); // RB0 is connected to Echo pin
T1CONbits.TMR1ON=1;
TMR1H=0;
TMR1L=0; /* Load Timer1 with 0*/
while(PORTBbits.RB0==1 );
T1CONbits.TMR1ON=0;
Time = (TMR1L | (TMR1H<<8));
Distance = (int)(Time/58.2);
Cmd(0x01);
for(j=0;j<=2;j++)
{
Dist_Array1[j]=Distance%10+'0';
Distance=Distance/10;
}
Cmd(0x80);
for(j=2;j>=0;j--)
{
Data(Dist_Array1[j]);
delay_ms(100);
}
}
Cmd(0x01);
}
void Cmd(char Value){
PORTD=Value;
PORTCbits.RC1=0; /* RC1=0(RS=0) [Command Registr Selection]) */
PORTCbits.RC0=0; /* RC0=0(R/W=0) [Write Process]) */
PORTCbits.RC2=1; /* RC2=1(Enable=1) [Enable Line ON] */
delay_ms(4); /* Minimun Delay For Hold On Data */
PORTCbits.RC2=0; /*
RC2=0(Enable=0) [Enable Line OFF] */
}
void Data(char Value){
PORTD=Value;
PORTCbits.RC1=1; /* RC1=1(RS=1) [Data Registr Selection]) */
PORTCbits.RC0=0; /* RC0=0(R/W=0) [Write Process]) */
PORTCbits.RC2=1; /* RC2=1(Enable=1) [Enable Line ON] */
delay_ms(4); /* Minimun Delay For Hold On Data */
PORTCbits.RC2=0; /* RC2=0(Enable=0) [Enable Line OFF] */
}
void Send2Lcd(const char Adr,rom const char *Lcd)
{
Cmd(Adr);
while(*Lcd!='\0')
{
Data(*Lcd);
Lcd++;
}
}
void delay_ms(int ms)
{
int i,count;
for(i=1;i<=ms;i++)
{
count=498;
while(count!=1)
{
count--;
}
}
}
void delay_us(int us)
{
us=us>>1;
while(us!=1)
us--;
}