ผมใช้ LCD16x2 ต่อกับPIC16f877 resonator 2O Mhz แล้วก็Sonarเพื่อวัดระยะอะครับ
ตอนแรกใช้LEDเช็คว่าถ้าวัดได้เกิน10cmให้LEDดวงนึงติดอีกดวงดับ ก็เช็คได้ปกติแต่มียางทีLEDกระพริบ
แต่พอต่อLCDติดปัญหาที่ค่าที่รับจากโซนาร์แสดงผิดปกติมันโชว์เป็น 000 แทนซะงั้นตอนแรกผมเขียนฟังก์ชันรับค่าโซนาร์เป็นฟังก์ชันแยกแล้วซิมก็ออกมาแบบนั้นแต่พอลงเอามาเป็นในMainเลยมันก็หายในซิมแต่พอต่อจริงมันยังเป็นอะครับ ในซิมผมใช้วิธีต่อเป็นกดพัลส์ด้วยPush button ธรรมดานะแค่ให้มัเปลี่ยน0->1->0ได้เหมือนรับEchoดูเฉยๆ
อันนี้ผมใช้MikroCเขียน Echo ต่อกับ C1 Trigger ต่อกับ C0
LCD
-VSSต่อ กราวด์
-VDDต่อ ไฟ 5V
-VEE ต่อ กราวด์
-RS ต่อ D0
-Eต่อ D1
R/W ต่อ กราวด์
D0-D3 ต่อกราวด์
D4-D7ก็ต่อกับD4-D7ของPicเลย
Code
char txt1[] = "Range = ";
char txt2[] = "CM";
char txt3[3];
#define echo portc.f1
#define trigger portc.f0
int range;
void trig(void);
void main()
{
TRISC=0x02;
Lcd_Config(&PORTD, 0, 1, 2, 7, 6, 5, 4);
Lcd_Cmd(LCD_CLEAR); // Clear display
Lcd_Out(1,1,txt1); // Write text in first row
Lcd_Out(1,13,txt2); // Write text in second row
while(1)
{
unsigned int a; //variable for initial function
tmr1h = 0x00; //initial timer1 counter set to zero
tmr1l = 0x00;
t1con &= 0x0f; //timer1 mode2 16 bit counter
t1con |= 0x10;
trigger = 0; //set logic low
echo = 1; //set logic low
trig(); //send to trigger
pir1.tmr1if = 0; //clear overflow
t1con.tmr1on = 0; //start timer1
while(!echo); //detect rising pulse
t1con.tmr1on = 1; //start counter timer1
while(echo); //detect falling pulse
t1con.tmr1on = 0; //stop timer1
pir1.tmr1if = 0; //clear overflow
a = tmr1h; //keep high byte
a <<= 8; //shift to high byte
a += tmr1l; //keep low byte
delay_ms(10); //delay 10 millisecond
range = (a/114); //return value cm distance 114
BytetoStr(range,txt3) ;
Lcd_Out(1,9,txt3);
Lcd_Cmd(LCD_CURSOR_OFF);
}
}
void trig(void){
trigger = 1;
delay_us(10);
trigger = 0;
}
ช่วยทีครับต่อ PIC16F877 กับ Sonar Srf05 และLCD แล้วมันไม่แสดงค่าที่วัด
ตอนแรกใช้LEDเช็คว่าถ้าวัดได้เกิน10cmให้LEDดวงนึงติดอีกดวงดับ ก็เช็คได้ปกติแต่มียางทีLEDกระพริบ
แต่พอต่อLCDติดปัญหาที่ค่าที่รับจากโซนาร์แสดงผิดปกติมันโชว์เป็น 000 แทนซะงั้นตอนแรกผมเขียนฟังก์ชันรับค่าโซนาร์เป็นฟังก์ชันแยกแล้วซิมก็ออกมาแบบนั้นแต่พอลงเอามาเป็นในMainเลยมันก็หายในซิมแต่พอต่อจริงมันยังเป็นอะครับ ในซิมผมใช้วิธีต่อเป็นกดพัลส์ด้วยPush button ธรรมดานะแค่ให้มัเปลี่ยน0->1->0ได้เหมือนรับEchoดูเฉยๆ
อันนี้ผมใช้MikroCเขียน Echo ต่อกับ C1 Trigger ต่อกับ C0
LCD
-VSSต่อ กราวด์
-VDDต่อ ไฟ 5V
-VEE ต่อ กราวด์
-RS ต่อ D0
-Eต่อ D1
R/W ต่อ กราวด์
D0-D3 ต่อกราวด์
D4-D7ก็ต่อกับD4-D7ของPicเลย
Code
char txt1[] = "Range = ";
char txt2[] = "CM";
char txt3[3];
#define echo portc.f1
#define trigger portc.f0
int range;
void trig(void);
void main()
{
TRISC=0x02;
Lcd_Config(&PORTD, 0, 1, 2, 7, 6, 5, 4);
Lcd_Cmd(LCD_CLEAR); // Clear display
Lcd_Out(1,1,txt1); // Write text in first row
Lcd_Out(1,13,txt2); // Write text in second row
while(1)
{
unsigned int a; //variable for initial function
tmr1h = 0x00; //initial timer1 counter set to zero
tmr1l = 0x00;
t1con &= 0x0f; //timer1 mode2 16 bit counter
t1con |= 0x10;
trigger = 0; //set logic low
echo = 1; //set logic low
trig(); //send to trigger
pir1.tmr1if = 0; //clear overflow
t1con.tmr1on = 0; //start timer1
while(!echo); //detect rising pulse
t1con.tmr1on = 1; //start counter timer1
while(echo); //detect falling pulse
t1con.tmr1on = 0; //stop timer1
pir1.tmr1if = 0; //clear overflow
a = tmr1h; //keep high byte
a <<= 8; //shift to high byte
a += tmr1l; //keep low byte
delay_ms(10); //delay 10 millisecond
range = (a/114); //return value cm distance 114
BytetoStr(range,txt3) ;
Lcd_Out(1,9,txt3);
Lcd_Cmd(LCD_CURSOR_OFF);
}
}
void trig(void){
trigger = 1;
delay_us(10);
trigger = 0;
}