1.设计要求
使用单片机和超声波传感器,实现距离的测量,并在LCD上显示当前的距离。
2.硬件准备
STC89C52(其他51单片机也一样)。
HC-SR04超声波传感器。
LCD1602一块。
杜邦线若干。
至于连线,就不再赘述了,看我的程序,一目了然。
3.程序设计
话不多说,直接上程序:
#include#include#define uchar unsigned char #define uint unsigned int sbit RX=P1^1;//Echo sbit TX=P1^2;//Trig unsigned int time=0; unsigned int timer=0; unsigned char posit=0; unsigned long S=0; bit flag =0; unsigned int disbuff[4]={ 0,0,0,0,}; unsigned char code table[]="distance:"; unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'}; sbit dula=P2^6; sbit wela=P2^7; sbit rs=P3^5; sbit en=P3^4; void init(); void write_com(uchar com); void write_date(uchar date); void Count(); void Display(); void delay(uchar b); void main() {	TMOD=0x11;//同时设置定时器1和0工作在方式1	TH0=0;	TL0=0;//定时器0设置初值为0	TH1=0xf8;	TL1=0x30;//定时器装初值63536	ET0=1;	ET1=1;//允许定时器0和1开启	TR1=1;//开启定时器1	EA=1;//开总中断	init();	while(1)	{	while(!RX);//等待Echo端接收反射的声波	TR0=1;//反射回声波时开启定时器0	while(RX);//无反射信号时关闭定时器0	TR0=0;	Count();//计算距离	Display();	delay(100);	} } void Count() {	time=TH0*256+TL0;//从发射到接收到信号所用的时间	TH0=0;	TL0=0;//置空定时器0	S=(time*1.7)/100;//计算距离,单位厘米	/*if((S>=700)||(flag==1))//当距离大于7米时	{	flag=0;//标志为0	disbuff[0]=10;	disbuff[1]=10;	disbuff[2]=10;	}*/ //	else//距离有效时计算出百位十位个位 //	{	disbuff[0]=S%1000/100;	disbuff[1]=S%1000%100/10;	disbuff[2]=S%1000%100%10; //	} } void timer0()interrupt 1 {	flag=1;//定时器0溢出时设置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 Display() {	write_com(0x80);	for(posit=0;posit