⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sensor.c

📁 单片机超声波信号采集程序
💻 C
字号:
#include <reg52.h>
  
unsigned int count=0;    //保留定时器值
unsigned int count1=0;	 //1号传感器
unsigned int count2=0;   //2号传感器
unsigned int count3=0;	 //3号传感器
unsigned int count4=0;	 //4号传感器	
unsigned int count5=0;   //5号传感器
unsigned int count6=0;   //6号传感器
unsigned int count7=0;   //7号传感器
unsigned int count8=0;   //8号传感器
unsigned char flag=0;	 //定时中断溢出标志
unsigned char group=0;   //启动第几组传感器的标志位,0表示第一组
unsigned char sendchar;       //保留串口发送的字符串
unsigned char i; 
unsigned int temp;

/***************************************************************************/
//传感器使用管脚定义

sbit P1_0=P1^0;			//1号驱动管脚          
sbit P1_1=P1^1;			//2号驱动管脚
sbit P1_2=P1^2;			//3号驱动管脚 
sbit P1_3=P1^3;         //4号驱动管脚
sbit P1_4=P1^4;			//5号驱动管脚
sbit P1_5=P1^5;			//6号驱动管脚          
sbit P1_6=P1^6;			//7号驱动管脚
sbit P1_7=P1^7;         //8号驱动管脚

sbit P0_0=P0^0;			//1号传感器或门
sbit P0_1=P0^1;			//2号传感器或门
sbit P0_2=P0^2;			//3号传感器或门
sbit P0_3=P0^3;         //4号传感器或门
sbit P0_4=P0^4;			//5号传感器或门
sbit P0_5=P0^5;			//6号传感器或门
sbit P0_6=P0^6;			//7号传感器或门
sbit P0_7=P0^7;         //8号传感器或门

sbit P2_0=P2^0;			//1号传感器判断脚
sbit P2_1=P2^1;			//2号传感器判断脚
sbit P2_2=P2^2;			//3号传感器判断脚
sbit P2_3=P2^3;         //4号传感器判断脚

sbit P2_4=P2^4;			//5号传感器判断脚
sbit P2_5=P2^5;			//6号传感器判断脚
sbit P2_6=P2^6;			//7号传感器判断脚
sbit P2_7=P2^7;         //8号传感器判断脚

void sensor();
void pin_init();
void interrupt_init();
void sensor_display();
void value_init();

void main(void)
{
          
           pin_init();
           interrupt_init();
            while(1)
		   {
             sensor();
			 sensor_display();
             value_init();
           }
}

void value_init()
{
   count1=0;	 //1号传感器
   count2=0;     //2号传感器
   count3=0;	 //3号传感器
   count4=0;	 //4号传感器	
   count5=0;     //5号传感器
   count6=0;     //6号传感器
   count7=0;     //7号传感器
   count8=0;     //8号传感器
}

void pin_init()
{
            P0=0xff; 					//锁死8个或门
	        P1=0x00;				    //8驱动脚置低
	        P2=0xff;					//为读引脚作准备   
}

void interrupt_init()
{
            TCON=0x00;     //外部中断低电平触发
            TMOD=0x21;     //定时器1工作于16位模式
			TH1 = 0xFD;				// 波特率9600
	        TL1 = 0xFD;
	
	        SCON = 0x50;			// 设定串行口工作方式
	        PCON &= 0xef;			// 波特率不倍增
		
	        TR1 = 1;				// 启动定时器1
            IE=0x83;	   //允许定时器0,外部中断,开总中断,禁止定时器1中断 
}

void sensor()
{
            double dis=0; 	            //传感器距离值
            unsigned char i;
            TH0=0xb9;		
			TL0=0xd7;      //定时19.5毫秒
			TR0=1;			

			P1=0x0f;	   
			P1=0x0f;
			P1=0x00;      
//经示波器测量,P1.0输出4.4微秒脉冲,激活第一组(a,b,c,d)超声波传感器
			for(i=0;i<234;i++);   //延时766微秒
			P0&=0xf0;			   		//(a,b,c,d)或门打开
			while(1)	//第一组传感器(a,b,c,d)工作
				{
					
	               
						if(flag)
							{
								flag=0;
								group=1;
								P0|=0x0f;
								break;
							}
					
						
				}
				
			TH0=0xb9;		
			TL0=0xd7;      //定时19.5毫秒
		
			P1=0xf0;	   
			P1=0xf0;
			P1=0x00;      
//经示波器测量,P1.0输出4.4微秒脉冲,激活第二组(e,f,g,h)超声波传感器
			for(i=0;i<234;i++);	   //延时766微秒
			P0&=0x0f;			   		//(e,f,g,h)或门打开
			while(1)	//第二组传感器(e,f,g,h)工作
				{
					
				
					   if(flag)                                
						{
							flag=0;
							group=0;
							P0|=0xf0;
							break;
						}
				    
				   
				}
			TR0=0;
			//a sensor **************************************************
			count1=count1-0xB9D7-0x02B6;         //减去755微秒所用时间
			dis=count1*0.1866319;
			count1=(unsigned int)dis; 			        //计算距离 单位:mm
			//b sensor **************************************************
			count2=count2-0xB9D7-0x2B6;         //减去755微秒所用时间
			dis=count2*0.1866319;
			count2=(unsigned int)dis; 			        //计算距离 单位:mm
			//c sensor **************************************************
			count3=count3-0xB9D7-0x2B6;         //减去755微秒所用时间
			dis=count3*0.1866319;
			count3=(unsigned int)dis; 			        //计算距离 单位:mm
			// d sensor *************************************************
			count4=count4-0xB9D7-0x2B6;         //减去755微秒所用时间
			dis=count4*0.1866319;
			count4=(unsigned int)dis; 			        //计算距离 单位:mm
			// e sensor *************************************************
			count5=count5-0xB9D7-0x2B6;         //减去755微秒所用时间
			dis=count5*0.1866319;
			count5=(unsigned int)dis; 			        //计算距离 单位:mm
			// f sensor *************************************************
			count6=count6-0xB9D7-0x2B6;         //减去755微秒所用时间
			dis=count6*0.1866319;
			count6=(unsigned int)dis; 			        //计算距离 单位:mm
	        // g sensor *************************************************
			count7=count7-0xB9D7-0x2B6;         //减去755微秒所用时间
			dis=count7*0.1866319;
			count7=(unsigned int)dis; 			        //计算距离 单位:mm		
		   // h sensor *************************************************
			count8=count8-0xB9D7-0x2B6;         //减去755微秒所用时间
			dis=count8*0.1866319;
			count8=(unsigned int)dis; 			        //计算距离 单位:mm



}

void int0() interrupt 0
{
	count=TH0*256+TL0;
   
	if(!group)
	{
		if(!P2_0)
			{
				P0_0=1;
				count1=count;
				return;
			}
		if(!P2_1)
			{
				P0_1=1;
				count2=count;	
				return;
			}
		if(!P2_2)
			{
				P0_2=1;
				count3=count;
                return;
			}
        if(!P2_3)
			{
				P0_3=1;
				count4=count;   
			}
	}
	
	else
	{
		if(!P2_4)
			{
				P0_4=1;
				count5=count;
				return;
			}
		if(!P2_5)
			{
				P0_5=1;
				count6=count;
				return;
			}
		if(!P2_6)
			{
				P0_6=1;
				count7=count;
                return;
			}
        if(!P2_7)
			{
				P0_7=1;
				count8=count;                
			}
	}
}
void timer0() interrupt 1
{
	flag=1;

}

void uart_sendchar(unsigned char c)
{
    
	SBUF=c;
	while(TI==0);
    TI=0;
}

void sensor_display()
{  
	uart_sendchar(65);//发送桢的起始字符

	sendchar=(unsigned char)(unsigned char)(count1/10000);
    uart_sendchar(sendchar|0x30);   
	sendchar=((unsigned char)((count1%10000)/1000));
	uart_sendchar(sendchar|0x30); 
	sendchar=((unsigned char)((count1%1000)/100));
    uart_sendchar(sendchar|0x30);
	sendchar=((unsigned char)((count1%100)/10));
    uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)(count1%10);
    uart_sendchar(sendchar|0x30);
   	uart_sendchar(44);


    
	sendchar=(unsigned char)(unsigned char)(count2/10000);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count2%10000)/1000);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count2%1000)/100);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count2%100)/10);
    uart_sendchar(sendchar|0x30);   
	sendchar=(unsigned char)(count2%10);      
    uart_sendchar(sendchar|0x30);
    uart_sendchar(44);
	
	sendchar=(unsigned char)(unsigned char)(count3/10000);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count3%10000)/1000);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count3%1000)/100);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count3%100)/10);
    uart_sendchar(sendchar|0x30);   
	sendchar=(unsigned char)(count3%10);      
    uart_sendchar(sendchar|0x30);
	uart_sendchar(44);

	sendchar=(unsigned char)(unsigned char)(count4/10000);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count4%10000)/1000);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count4%1000)/100);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count4%100)/10);
    uart_sendchar(sendchar|0x30);   
	sendchar=(unsigned char)(count4%10);      
    uart_sendchar(sendchar|0x30);
	uart_sendchar(44);

	sendchar=(unsigned char)(unsigned char)(count5/10000);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count5%10000)/1000);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count5%1000)/100);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count5%100)/10);
    uart_sendchar(sendchar|0x30);   
	sendchar=(unsigned char)(count5%10);      
    uart_sendchar(sendchar|0x30);
	uart_sendchar(44);

	sendchar=(unsigned char)(unsigned char)(count6/10000);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count6%10000)/1000);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count6%1000)/100);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count6%100)/10);
    uart_sendchar(sendchar|0x30);   
	sendchar=(unsigned char)(count6%10);      
    uart_sendchar(sendchar|0x30);
	uart_sendchar(44);

	sendchar=(unsigned char)(unsigned char)(count7/10000);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count7%10000)/1000);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count7%1000)/100);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count7%100)/10);
    uart_sendchar(sendchar|0x30);   
	sendchar=(unsigned char)(count7%10);      
    uart_sendchar(sendchar|0x30);
	uart_sendchar(44);

    sendchar=(unsigned char)(unsigned char)(count8/10000);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count8%10000)/1000);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count8%1000)/100);       
	uart_sendchar(sendchar|0x30);
	sendchar=(unsigned char)((count8%100)/10);
    uart_sendchar(sendchar|0x30);   
	sendchar=(unsigned char)(count8%10);      
    uart_sendchar(sendchar|0x30);
	
	uart_sendchar(66);    //字符桢的结束

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -