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

📄 mega48--chaoshengbo2008.3.txt

📁 AVRmega48单片机实现远距离测距
💻 TXT
字号:
#include <iom48v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int

#define v 34600        //声速
unsigned long old=0;  //距离
unsigned long new=0;  // 时间
uint dian;            //小数点位

uint led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示符0,1,2,3,4,5,6,7,8,9
uchar led_buff[3]={0,0,0};     //选择显示

/////////////////////////////延时///////////////////////////////////////////
void delay_us(uint t)      //us
{
 do
 t--;
 while(t>1);
 t++;
 NOP();
}

void delay(uint t)               //ms
{
 while(t!=0)
 {
  delay_us(1000);
  t--;
 }
}

///////////////////////// //显示B口接数码管////////////////////////////
void display(void)         //////动态扫描///   
{
 int i;
 for(i=0;i<3;i++)
 {
  PORTB=led_buff[i];
  PORTC=(1<<(2-i));//三位位选
  delay_us(1500-12);
  PORTC|=0X00;
 }
}

void to(uint t)   //////////将数值变为显示值
{             
 int i;
 for(i=0;i<3;i++)
 {
  led_buff[i]=led[t%10];
  t=t/10;
  if(i==dian)led_buff[i]=led_buff[i]|0x80;          ////小数点
 }
}

////////////////////发射/////////////////////////////
void fa()
{
 int i;
 for(i=0;i<26;i++)                    /////////////发谢13个脉冲  40KHZ
 {
  PORTD^=0X40;//输出脉冲,PD6口
  delay_us(11);
 }
 PORTD=0xbf; 

 TCNT0=0x00;//计数器置0
 TCNT1 = 0x0000; //定时器归零
 TCCR1B = 0x04;//定时器开始计时
 TCCR0A=0X02;  
 TCCR0B = 0B00000110;//计数器开始计数
} 

/////////////////////////接收计数14个的中断处理//////////////////////////////////
/////////////////////////接收计数//////////////////////////////////
#pragma interrupt_handler timer0:15
void timer0()
{
 new=TCNT1;///存时间
 TCCR1B=0x00;///定时器停止计时
 TCNT1=0x0000;///定时器重新置0
 TCCR0A=0X02;
 TCCR0B = 0X00; // 计数器置0

 old=((unsigned long) v*((32*new)/2)/1000);//计算距离

 if(old<10000)old=10000;
 if(old>9999&old<100000)
 {
  dian=1;
  old=old/100;
 }
 if(old>99999&old<1000000)
 {
  dian=0;
  old=old/1000;
 }                                           //显示

 TCNT0=0x00;////////////计数器重新置0
 TCCR0A=0X02;
 TCCR0B = 0X00;						 
 TCNT1 = 0x0000; //定时器置0				 
}
          
///////////////////////////////计数用///////////////////////////////////////
void timer1_init(void)////////计数用
{
 TCCR0A=0X00;
 TCCR0B = 0x00; 
 TCNT0 = 0x00;
 OCR0A = 0X0e; 
 OCR0B = 0x05;
 TCCR0A = 0x02;
 TCCR0B = 0X00; 
 TIMSK0 = (1<<OCIE0A); 
}

 ////////////////// ////计时用//////////////////////////////////////
void timer0_init(void)
{
 TCCR1B = 0x00; 
 TCNT1 = 0X0000;
 TCCR1A = 0x00; 
 TCCR1B = 0x00;
 TIMSK1=0x00;
 SEI();
}

////////////////////////////超过定时归零
#pragma interrupt_handler timer1:14
void timer1()
{
 TCNT0 = 0x00;
}

///////////////////////主函数/////////////////////////////////////////
void main()
{
 DDRB=0XFF;
 DDRC=0Xff;
 PORTC=0XFF;
 DDRD=0xec;
 PORTD=0XFF;
 timer1_init();//定时器初始化
 timer0_init();//计数器初始化
 SEI();
 for(;;)
 {
  fa();//输出40KHZ
  to(old);
  display();//显示 
  display();display();display();display();
  display();display();display();display();
  display();display();display();display();
  display();display();display();display();
  display();display();display();display();
  display();display();display();display();
 }
}

⌨️ 快捷键说明

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