#include <STC15F2K60S2.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit reseve=P1^0; //数据传回
sbit trade=P1^1; //使能信号
sbit RS=P3^5; //数据、命令选择
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; //液晶屏数据传输用的是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) //向液晶屏写入数据
{
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);//显示关闭
write_com(0x01);delay(5);//显示清屏
write_com(0x06);delay(5);//显示光标移动
write_com(0x0c);delay(5);//显示光标设置
}
void vioce_inin() //T0定时器初始化
{
TMOD|=0x01; //16位计时
TH0=0;
TL0=0;
ET0=1; //T0中断打开
EA=1; //总中断打开
}
void voice_data()
{
trade=1; //触发测距,给至少 10us 的高电平信号
delay(50);
trade=0;
while(!reseve);//高电平持续的时间就是超声波从发射到返回的时间
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(); //显示
}
}
|