proteus仿真-单片机-超声波测距报警

一、需求

1、用HCSR04超声波传感器测量距离,测量范围0~170cm,精确到小数点后一位。
2、用LCD1602显示测量到的距离:显示屏第一行显示“distance:***.*cm”。
3、当距离大于120cm时,绿色LED灯亮;
当距离在50-120cm之间,蜂鸣器间断发声“滴 滴 滴 ”提示,黄色LED灯亮。
当距离低于50cm时,蜂鸣器持续报警,红色LED灯亮,并在LCD1602第二行显示“warning”并闪烁。
4、临界值默认50和120cm,可以用按键调节临界值,需满足下限值<上限值。

二、效果

1.仿真展示
proteus仿真-单片机-超声波测距报警_第1张图片
2.主要代码展示

void Conut(void)
{
	 StartModule();
	 while(!Echo);		//当RX为零时等待
	 TR0=1;			    //开启计数
	 while(Echo);			//当RX为1计数并等待
	 TR0=0;				//关闭计数
	 time=TH0*256+TL0;
	 TH0=0;
	 TL0=0;
	 
	 DIstance =(time*1.7)/100;     //算出来是CM
	 S = DIstance+1;
	 if((S>=170)||flag==1) //超出测量范围显示“-”
	 {	 
	  flag=0;
	 
	  DisplayOneChar(0, 1, '0');
	  DisplayOneChar(1, 1, '.');	//显示点
	  DisplayOneChar(2, 1, '0');
	  DisplayOneChar(3, 1, '0');
	  DisplayOneChar(4, 1, 'C');	//显示C
		DisplayOneChar(5, 1, 'M');	//显示M
	 }
	 else if(S>=50 && S<170)
	 {

		 DisplayListChar(0,1,"normal-");
	  DisplayOneChar(9, 0, (char)(S/100+'0')); //百位
	  //DisplayOneChar(1, 1, '.');	//显示点
	  DisplayOneChar(10, 0, (char)(S/10%10+'0')); //十位
	  DisplayOneChar(11, 0, (char)(S%10+'0'));    //个位
		DisplayOneChar(12, 0, '.');	//显示点
		DisplayOneChar(13, 0, '0');	//显示点
	  DisplayOneChar(14, 0, 'C');	//显示C
		DisplayOneChar(15, 0, 'M');	//显示M
		 
	 }
	 else
	 {
		
	  DisplayOneChar(9, 0, (char)(S/100+'0')); //百位
	  //DisplayOneChar(1, 1, '.');	//显示点
	  DisplayOneChar(10, 0, (char)(S/10%10+'0')); //十位
	  DisplayOneChar(11, 0, (char)(S%10+'0'));    //个位
		DisplayOneChar(12, 0, '.');	//显示点
		DisplayOneChar(13, 0, '0');	//显示点
	  DisplayOneChar(14, 0, 'C');	//显示C
		DisplayOneChar(15, 0, 'M');	//显示M
	 }
	
	 if(S <= L)
	 {	
		 delay_ms(100);
		 DisplayListChar(0,1,"warning");
		 //LcdWriteCom(0x01);  //清屏
		 LEDGREEN = 1;
		 LEDYELLOW = 1;
		 delay_ms(100);
		 DisplayListChar(0,1,"       ");
	   LEDRED = 0;                //红灯亮		
     BUZZER = 0;	                  //蜂鸣器响
	 }
	 else if(S>L && S<= H)
	 {
		LEDYELLOW = 0;           //黄灯亮
		 LEDGREEN = 1;
		 LEDRED = 1;
		 BUZZER = 1;
		 delay_ms(100);
		 BUZZER = 0;												//蜂鸣器 嘀~嘀~嘀
		 delay_ms(100);
		 BUZZER = 1;	
		 delay_ms(100);
	 }		   
	 else if(S > H)
	 {
		 LEDGREEN = 0 ;               //绿灯亮
		 LEDYELLOW = 1;
		 LEDRED = 1;
		 BUZZER = 1;                              //蜂鸣器
	 }
	 
}
void zd0() interrupt 1 		 //T0中断用来计数器溢出,超过测距范围
{
    flag=1;							 //中断溢出标志
}
void Sr04_Init()
{
	 TMOD=0x01;		   //设T0为方式1,GATE=1;
	 TH0=0;
	 TL0=0;          
	 ET0=1;          //允许T0中断
	 EA=1;			   //开启总中断	
}

void main()
{
	BUZZER = 1;  //蜂鸣器不运转
	Sr04_Init();
	LcdInit();
	DisplayListChar(0,0,"distance:");
	while(1)
	{
		key_set();
		Conut();
	}
}

整体仿真和代码链接如下:

请点击这里

你可能感兴趣的:(proteus超声波测距报警,单片机,proteus,嵌入式硬件)