/***********************************************************************************************************/
//hc-sr04 超声波测距模块 DEMO 程序
//晶振:11。0592
//接线:模块TRIG接 P0.2 ECH0 接P0.1
//数码管:共阳数码管P1接数据口,P2.5 P2.4 P2.3接选通数码管
/***********************************************************************************************************/
#include <reg52.h> //器件配置文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RX = P1^3;
sbit TX = P1^4;
sbit wela = P2^7;
sbit dula = P2^6;
unsigned int time=0;
unsigned int timer=0;
unsigned long S=0;
bit flag =0;
sbit rw=P1^1;
sbit rs=P1^0;
sbit lcden=P2^5;
uchar disbuff[]={0,0,0,0};
uchar code table[]={"wrong"};
uchar code table1[]={"Welcome to use!"};
//液晶部分
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}
void write_com(uchar com) //写命令
{
rs=0;
lcden=0;
P0=com;
lcden=1;//只有在一个高脉冲下数据才被写入
delay(2);
lcden=0;
}
void write_date(uchar date)//写数据
{
rs=1;
lcden=0;
P0=date;
lcden=1;//只有在一个高脉冲下数据才被写入
delay(2);
lcden=0;
}
void display()//刷新显示函数
{
uchar k;
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出来是CM
if((S>=700)||flag==1) //超出测量范围显示“-”
{
write_com(0x80+0x40+6);
for(k=0;k<5;k++)
write_date(table[k]);
flag=0;
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
write_com(0x80+0x40+6);
write_date(0x30+disbuff[0]);
write_date(0x30+disbuff[1]);
write_date(0x30+disbuff[2]);
write_date('c');
write_date('m');
}
}
void yejininit()
{
uint p;
dula=1;
P0=0x00;
dula=0;
wela=1;
P0=0xff;
wela=0;
rw=0;
rs=0;
lcden=0;
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c); //开显示,不开光标,不闪动
write_com(0x06); //写一个字符后地址加1,不整屏移动
write_com(0x01); //显示清0;;市局指针清0
write_com(0x80);
for(p=0;p<15;p++)
write_date(table1[p]);
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
/********************************************************/
void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块
{
TH1=0xf8;
TL1=0x30;
timer++;
if(timer>=400)
{
timer=0;
TX=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}
/*********************************************************/
void main( void )
{
TMOD=0x11; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
TH1=0xf8; //2MS定时
TL1=0x30;
ET0=1; //允许T0中断
ET1=1; //允许T1中断
TR1=1; //开启定时器
EA=1; //开启总中断
yejininit();
while(1)
{
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0;
display(); //关闭计数
}
}
|