#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define NOP() {_nop_();_nop_();_nop_();_nop_();}
//------LCD引腳-----
sbit LCD_RS=P4^5;
sbit LCD_RW=P5^5;
sbit LCD_EN=P5^4;
//------超聲波引腳---
sbit Tx=P1^0; //觸發控制信號輸入
sbit Rx=P3^2; //回響信號輸出
uchar code table[]="Distance:"; //LCD第一行顯示
uchar temp_dis[]="000.0cm"; //LCD第二行
uint t,distance;
uchar cache[4]={0,0,0,0};
//--------延時-------
void delay(uint ms)
{
uint t;
while(ms--)
for(t=0;t<120;t++);
}
//----------LCD寫指令----------
void lcd_write_com(uchar com)
{
LCD_RS=0;
LCD_RW=0;
P0=com;
LCD_EN=1;
delay(5);
LCD_EN=0;
}
//----------LCD寫數據----------
void lcd_write_data(uchar dat)
{
LCD_RS=1;
LCD_RW=0;
P0=dat;
LCD_EN=1;
delay(5);
LCD_EN=0;
}
//-------LCD初始化-------
void lcd_init()
{
LCD_EN=0;
lcd_write_com(0x38); //LCD顯示模式設置
lcd_write_com(0x0c); //LCD顯示開/關及光標設置
lcd_write_com(0x06); //當寫一個字符后地址指針加1,且光標加1
lcd_write_com(0x01); //顯示清屏
}
//---------液晶顯示程序----------
void lcd_print( )
{
uint num=0;
lcd_write_com(0x80);
while(table[num]!='\0')
{
lcd_write_data(table[num]);
num++;
delay(5);
}
num=0;
lcd_write_com(0xc0);
while(temp_dis[num]!='\0')
{
lcd_write_data(temp_dis[num]);
num++;
delay(5);
}
}
void hcsr04_Init()
{
delay(60);
Tx=1;//觸發脈沖
NOP();NOP();NOP();
Tx=0;
distance=1.7*t/100; //距離計算cm
}
void distance_convert( uint dat)
{
cache[0]=dat/100;
cache[1]=dat%100/10;
cache[2]=dat%10;
cache[3]=dat*10%10;
temp_dis[0]=cache[0]+'0';
temp_dis[1]=cache[1]+'0';
temp_dis[2]=cache[2]+'0';
temp_dis[4]=cache[3]+'0';
}
//------------主程序-----------
void main()
{
lcd_init();
delay(5);
TMOD=0x09;
EA=1; //開總中斷
TR0=1; //啟動定時器
EX0=1; //開外部中斷
// ET0=1; //開定時器中斷
IT0=1; //設置為下降沿中斷方式
while(1)
{
hcsr04_Init();
lcd_print();
distance_convert(distance);
}
}
//外部中斷0
void int0() interrupt 0
{
t=TH0*256+TL0; //計算高電平持續的時間,上升沿到來時候開始計時,
TH0=0; //下降沿到來進入外部中斷,關閉計時器,停止計時
TL0=0;
} |