|
#include <STC15F2K60S2.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit reseve=P1^0; //數(shù)據(jù)傳回
sbit trade=P1^1; //使能信號
sbit RS=P3^5; //數(shù)據(jù)、命令選擇
sbit RW=P3^6; //讀、寫選擇
sbit EN =P3^7; //使能信號
uint time=0;
unsigned int distance=0;
uchar SS;
uint ge,shi,bai,a,b;
void display();
void JISUAN();
void delay(unsigned int x);
void delay(unsigned int x)
{
uchar j,k,l;
for(j=0;j<x;j++)
{
for(k=0;k<60;k++)
for(l=0;l<11;l++);
}
}
void check() //液晶屏查忙
{
RS=0;
RW=1;
EN=1;
SS=P0; //液晶屏數(shù)據(jù)傳輸用的是P0口
EN=0;
RW=0;
RS=1;
}
void write_com(uchar com) //向液晶屏寫入命令
{
check();
RS=0;
RW=0;
EN=1;
P0=com;
delay(5);
EN=0;
RW=1;
}
void write_data(uchar dat) //向液晶屏寫入數(shù)據(jù)
{
check();
RS=1;
RW=0;
EN=1;
P0=dat;
delay(5);
EN=0;
RW=1;
}
void init() //液晶屏的初始化
{
RS=0;
write_com(0x38);delay(5); //不檢測查忙信號
write_com(0x38);delay(5);
write_com(0x38);delay(5);
write_com(0x38);delay(5);
write_com(0x08);delay(5);//顯示關(guān)閉
write_com(0x01);delay(5);//顯示清屏
write_com(0x06);delay(5);//顯示光標移動
write_com(0x0c);delay(5);//顯示光標設(shè)置
}
void vioce_inin() //T0定時器初始化
{
TMOD|=0x01; //16位計時
TH0=0;
TL0=0;
ET0=1; //T0中斷打開
EA=1; //總中斷打開
}
void voice_data()
{
trade=1; //觸發(fā)測距,給至少 10us 的高電平信號
delay(50);
trade=0;
while(!reseve);//高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間
TR0=1;
while(reseve);
TR0=0;
time = TH0;
time <<= 8;
time |= TL0; // 計算時間
TH0=0;
TL0=0;
distance = (unsigned int)(time*0.017)*1.15; //計算距離
if((distance>=900)||(TF0==1)) //如果超出距離就顯示999
{
TF0=0;
ge=9;
shi=9;
bai=9;
}
else //否則按實際距離顯示
{
bai=distance/100;
shi=distance/10%10;
ge=distance%10;
}
}
void display() //在液晶屏上顯示
{
write_com(0x83);delay(5);
write_data(0x30+bai);delay(5);
write_data(0x30+shi);delay(5);
write_data(0x30+ge);delay(5);
write_data(0x43);delay(5);
write_data(0x4d);delay(5);
}
void main()
{
init(); //液晶屏的初始化
vioce_inin(); //T0定時器初始化
while(1)
{
voice_data(); //測距
display(); //顯示
}
}
|
|