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

📄 01.c

📁 基于单片机超声波的防盗窗设计
💻 C
字号:
/*2012.1.8 编写完毕 BY:CMY*/

#include "reg51.h"
#include <intrins.h>
#define uchar 	unsigned char
#define uint 	unsigned int
#define ulong 	unsigned long
sbit transfer=P1^0;
sbit receiver=P3^2;
sbit speak	 =P2^0;
/*数码管位选控制*/
sbit ledwei0=P2^4;
sbit ledwei1=P2^5;
sbit ledwei2=P2^6;
sbit ledwei3=P2^7;
sbit	m=P1^5;
sbit	n=P1^6;
uchar 	TimerH,TimerL,temp,a,b;            
ulong  	realTimer;               	//存放真测量时间
ulong   real_dis;               	//存放测量距离
uint  	dis_flag;                 	//距离计算标志位

uint 	wei0,wei1,wei2,wei3;
uchar 	ledflag=0;                	//数码管标志位,用于刷新 
uchar 	send_flag=0; 
uchar 	count=0;                  	//定时器T0计数
uchar 	ledcode[11]={        
		0x18,/*0*/
        0x7B,/*1*/
        0x2C,/*2*/
        0x29,/*3*/
        0x4B,/*4*/
        0x89,/*5*/
        0x88,/*6*/
        0x3B,/*7*/
        0x08,/*8*/
        0x09,/*9*/};

/*延时函数*/
void delay(uint count)	
{	
	while(count--);
}

/*超声波发送函数--40KHZ*/
void CLK40K()
{	
	uchar i=4;         //发送的波形数量=(i/2)
	TR0=1;				//START TIME0,同时发送40KHZ方波
	do
	{
	transfer=~transfer;
		_nop_ (); 
		_nop_ (); 
		_nop_ ();
 		_nop_ (); 
		_nop_ (); 
		_nop_ (); 
		_nop_ ();
		_nop_ (); 
		_nop_ ();
 	}
   while(--i);
}

/*距离测量函数*/
void distance(void)
{
 	realTimer=TimerH*256+TimerL;
 	real_dis=realTimer*164/10000;              //单位cm
	wei0=real_dis%10;
	wei1=(real_dis/10)%10;
	wei2=(real_dis/100)%10;
	wei3=real_dis/1000;
}

/*显示刷新函数函数*/
void display(void)
{
	switch(ledflag)
      {
	   case 0:P0=ledcode[wei0];ledwei0=0;ledwei1=1;ledwei2=1;ledwei3=1;break;
	   case 1:P0=ledcode[wei1];ledwei0=1;ledwei1=0;ledwei2=1;ledwei3=1;break;
	   case 2:P0=ledcode[wei2];ledwei0=1;ledwei1=1;ledwei2=0;ledwei3=1;break;
	   case 3:P0=ledcode[wei3];ledwei0=1;ledwei1=1;ledwei2=1;ledwei3=0;break;	 	
	  }
 
 		ledflag++;
 		if(ledflag==4)
 		ledflag=0;
// 		delay(0x80);//768us=0.768ms//520次
}

/*报警处理函数*/
void alarm(void)
{
	long int i;
	if(real_dis>=100)
         for(i=1;i<800;i++)
		{	 
			if(i<400)
			{m=1;n=0;}
		    if(i>400)
			{m=0;n=1;}
			 P0=0xff;
		 	 speak^=1;
			 delay(500);
		}
	else
	{
		speak=1;
	}
}
/*系统初始化程序*/
void init()//系统初始化
{
	temp=0xff;
	P1=temp;
	TMOD=0X11;	//初始化定时器T0,T1用于产生40hz发射波
	TH0=0x00;
	TL0=0x00;
	TH1=0x00;
	TL1=0x00;
	TF1=0;
	PX0=1;
	ET1=1;
	EA=1;
	TR1=1;		//启动定时器1
	IT0=0;		//外部低电平触发方式
}


void int0(void) interrupt 0  //关闭计数器,存计数值,置标志
{
 
  EA=0; 	   	//关闭中断
  EX0=0;       		//关外部中断
  TimerL=TL0;  		//读取数值
  TimerH=TH0;
  TR0=0;       		//关闭定时器0
  TH0=0x00;
  TL0=0x00;
  dis_flag=1;  		//距离计算标志
} 

void time1(void) interrupt 3
{	
	TF1=0;
	TH0=0x00;
	TL0=0x00;
	TH1=0x00;
	TL1=0x00;	
	send_flag=1;  			//开启接收回波中断	
} 

/*系统主函数*/
void main()
{	
//	unsigned int i,j;
	init();      		 	//系统初始化
	real_dis=90;			//y预设初值,防止开机未发射超声波,电机锁死
	delay(0x40);
	while(1)
	{
		if(send_flag==1)
		{		    
			send_flag=0;
			CLK40K();
			delay(0x40);		//延时,避开发射的直达声波信号,可以调节测量的最小距离
	    	EX0=1;
		}
		if(dis_flag==1)
		{
		 	 dis_flag=0;
			 distance();
			 EA=1;
		}
    display();    //调用显示函数   
	if(real_dis>=100)
		delay(300);
		display();    //调用显示函数
    alarm();
	}
}

⌨️ 快捷键说明

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