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

📄 1超声波程序.c

📁 超声测距精确度相当高!超声波测距电路设计+测量距离30-1000cm
💻 C
字号:
/********************************************************
    功能:超声波测距 
	测量范围:30~100cm
	测量误差:1cm
	时间;2008-10-4
********************************************************/


#include<iom16v.h>
#define uchar unsigned char
#define uint unsigned int
  uchar T0ocr=0x91;
  unsigned long int icdata=0;	
  uchar count=0;	
  uchar flag=0,flag1=0;
  uchar ledbuf[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字0~9
  uchar ledbufd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//数字0.~9.
  uchar scanline[]={0x10,0x20,0x40}; 
  
 /********************延时函数**************************/
  
    void delay(int n)  //延时n(0.45us)
	 {
	 while(n--);
	 } 
	 
 /****************************************************
     功能:显示函数
	 函数的参数:Data是显示的数据 dot是小数点的位置
  *****************************************************/	  
	void display1(uint Data,uchar dot) 
	{
	uchar i,k;
	uchar dData[4];
    dData[0]=Data%1000%100%10;
	dData[1]=Data%1000%100/10;
	dData[2]=Data%1000/100;
	for(i=0;i<3;i++)
	  {
	   k=dData[i];
	   if(i!=dot)
	    {
	   PORTC=scanline[i];
	   PORTA=ledbuf[k];
	    }
	   else
	   {
	    PORTC=scanline[i];
	    PORTA=ledbufd[k];
	   }
       delay(1000);	
	}
	}
	
 /****************************************************
     功能:显示小数
	 函数的参数:led是显示的数值
	 显示的范围:0.00~9.99
  ***************************************************/	 
 void displays(uint led)
  {
  int n;
  if(led<1000)
   n=3;
  if(led<100)
   n=2;
  if(led<10)
   n=1; 
  switch(n)
           {	   
	   case 1:  display1(led,2);
			  break;  				
	   case 2: display1(led,2);
			  break;					
	   case 3:display1(led,2);
			  break;  				
	  default :display1(999,5);
		   }
     }
	 
/*******************38k脉冲发射***********************/

 void sent()
  {  
   PORTD &=0XDf; 
   OCR0=0X67;               //T0设置
   TCCR0=0X19;              //比较输出模式 无分频  OC0取反 
   TCCR1B=TCCR1B|0X81;
   delay(400);  
   TCCR0=0x00;
   delay(50);
   count=0;
   TIMSK |=0X04;          //T1 溢出中断 
   TIFR |=(1<<ICF1); 
   TIMSK=TIMSK|0X20;      //开输入捕获中断     
   } 
   
/****************************************************
  功能:向EEPROM写一字节数据
  参数:Data是写入的的数据 address是写入数据的地址
 ***************************************************/ 
void write_EEPROM(uchar Data,uint address)
 {
 if(EECR&0X02)
 delay(10000);
 EEARH=address>>8;
 EEARL=address&0x00ff;
 EEDR=Data;
 EECR=EECR|0X04;
 EECR=EECR|0X02;
 delay(10000); 
 }
 
 /**************************************************
  功能:读一字节EEPROM数据
  参数:addess是数据的地址
  **************************************************/
 uchar read_EEPROM(uint address)
  {
  uchar i;
  if(EECR&0X01)
  delay(10000);
  EEARH=address>>8;
  EEARL=address&0x00ff;
  EECR=EECR|0X01;
  delay(10000);
  i=EEDR;
  return(i);
  }
 
/*************************************************
  功能:写4字节数据
  参数:Data是要写入的数据
 ************************************************/
 void write_4data( unsigned long int Data)
  {uchar i;
   uchar write_data[4]; 
   write_data[0]=Data>>24;
   write_data[1]=Data>>16;
   write_data[2]=Data>>8;
   write_data[3]=Data&0xff;
   for(i=0;i<4;i++)
   write_EEPROM(write_data[i],i);
  }
  
/**********************************************
  功能:读四字节数据
  参数;
 *********************************************/ 
 unsigned long int read_4data()
  {
  uchar i;
  unsigned long int ICdata;
  uchar read_data[4];
  for(i=0;i<4;i++){
  read_data[i]=read_EEPROM(i);
  ICdata=(ICdata<<8)|read_data[i];
  }
  return(ICdata);
  }	  
	  
	  
   #pragma interrupt_handler catch:6 
 void catch() 
  { 
    uint ct1;
	SREG &=0X7f;           //关总中断
	TIMSK &=0XDF;          //关输入捕获中断
	TIMSK &=0Xfb;          // T1 溢出中断                
    icdata=65536*count+ICR1;       
	TCCR1B=0X00;           //关定时器T1
    TCNT1=0X0000;
	TCNT2=0X00; 	
	PORTD |=0X20;	         
	SREG |=0x80;                   
  }
  
  #pragma interrupt_handler function1:2  
  void function1()               //功能选择                   
  {
  delay(1000);
  flag=1;
  TCCR2=0X00;
  TIMSK &=0Xbf;
  }
     
  #pragma interrupt_handler function2:3
  void function2()
  {
  delay(1000);
  flag=2;
  TCCR2=0X07;
  TIMSK |=0X40;
  }
  
 #pragma interrupt_handler counter:9
 void counter()
  {
  count++;
  } 
   
 #pragma interrupt_handler repeat:5   
 void repeat()   //T2中断
 { 
 flag1++;
 if(flag1==100)
   {
   flag1=0;
   sent();
   } 
  }
   
  void init()
   {
    DDRA=0XFF;    //端口初始化
	PORTA=0XFF;  
    DDRB |=0x88;
	PORTB=0xff;
	DDRC=0xf0;
	PORTC |=0xf0;
	DDRD |=0X3C;
	PORTD=0xFF;
	PORTD &=0XEF;
	SREG |=0x80;    //开总中断	
	MCUCR &=0XF0;   // 开INT0 INT1 低电平有效
    GICR |=0XC0;
	GIFR |=0XC0;
   }
   
   void main()
{
  unsigned long int DATA;
  init(); 
  if(PINB==(PINB&~(1<<PINB7)))
   {
   sent();
   delay(15000);
   write_4data(icdata);
   } 
  while(PINB==(PINB&~(1<<PINB7)))
   {
   displays(100); 
    }
  DATA=read_4data(); 
  
  while(1)
  {
   while(flag==0)       //显示模式
   {  
  displays(100*icdata/DATA);
   }
 	  
   if(flag==1)          //手动模式
   {
   sent();
   flag=0;
   }  
  while(flag==2)        //自动模式  
   { 
  displays(100*icdata/DATA);
   }
 }	
} 

⌨️ 快捷键说明

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