打印
[AVR单片机]

基于atmega16与HC-SR04超声波传感器的测距,想让看看对不对

[复制链接]
1192|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Haley203|  楼主 | 2015-3-7 15:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*-----------------------------------------------------------------------------
  PB0--Trig
  PD2--Echo
------------------------------------------------------------------------------*/

#include<iom16v.h>
#include<macros.h>

#include "usart.h"
#pragma interrupt_handler int0:2
//#pragma data:code
const char table[]="L=  . cm";  //整数部分显示三位,小数部分显示两位
const char table1[10]="0123456789";
uchar ge,shi,bai,qian,zh,L;//自定义寄存器 zh=测量成功标志

const char ACSLL[]="0123456789";

//*************************************************************延时函数
//延时ms级
void delay(uint ms)
{
         uint i,j;
         for(i=0;i<ms;i++)
           {
            for(j=0;j<1141;j++);
           }
}
//1us延时函数
void delay_1us(void)
  {
   asm("nop");
  }
//延时20us
void delay_20us()
{  uchar bt ;
    for(bt=0;bt<20;bt++);
}



/*-----------------------------------------------------------液晶显示
//写指令
void write_zl(uchar zl)
{
         PORTC&=~BIT(0);   //RS写指令
         PORTC&=~BIT(1);   //写操作
         PORTA=zl;
         PORTC|=BIT(2);    //E抬高
         delay(1);
         PORTC&=~BIT(2);   //E置零
}
//写数据
void write_sj(uchar sj)
{
         PORTC|=BIT(0);    //RS写指令
         PORTC&=~BIT(1);   //写操作
         PORTA=sj;
         PORTC|=BIT(2);    //E抬高
         delay(1);
         PORTC&=~BIT(2);   //E置零
}
//初始化
void csh(const char i[])
{
     uchar a;          //a作为循环计数
     PORTC&=~BIT(2);   //E置零
         write_zl(0X38);   //显示模式
            delay(5);
         write_zl(0x01);   //清屏
            delay(5);
         write_zl(0X0C);   //开显示
            delay(5);
         write_zl(0X06);   //指针加一
            delay(5);
         write_zl(0X80+0X00);   //第一行显示位置
            delay(5);
         for(a=0;a<8;a++)      
            {
                    write_sj(i[a]);         //显示"L=  . cm"
                  delay(5);
            }
}
//1602液晶显示
void yejing()
{   
         write_zl(0x80+0x02);       //测量数据的整数位
         delay(5);
         write_sj(table1[bai]);
     delay(5);
     write_zl(0x80+0x03);       //测量数据的整数位
         delay(5);
         write_sj(table1[shi]);
     delay(5);
         write_zl(0x80+0x05);        //测量数据的小数位
         delay(5);
         write_sj(table1[ge]);
         delay(500);
}
----------------------------------------------*/
//**************************外部中断
void int0()
{     uint distance_data;
          TIMSK|=(1<<TOIE1);            //溢出中断使能
          TCNT1=0;                                //计数初值
          SREG&=~BIT(7);     //关总中断
          while(PIND&0X04);
          
          
          distance_data=TCNT1H;                //测量结果的高8位
      distance_data<<=8;                   //放入16位的高8位
          distance_data=distance_data|TCNT1L;  //与低8位合并成为16位结果数据
      /*distance_data*=256;                  //自己设定分频256
      distance_data/=58;
            */
          //distance_data=TCNT1L+256*TCNT1H;      
          //distance_data=distance_data*346/31250/2*100;
          
         // distance_data=distance_data*1.7/150;         
         

         
         

          qian=(distance_data/1000);
      bai=(distance_data%1000/100);              
          shi=(distance_data%1000%100/10);
          ge=(distance_data%10);
          
           L=qian*1000+bai*100+shi*10+ge;
       
          //USART_Transmit(ACSLL[0]);
          //delay(50);
          //USART_Transmit(ACSLL[0]);
          //delay(50);
          //USART_Transmit(ACSLL[0]);
          //delay(50);
          //USART_Transmit('\t');
          
          USART_Transmit(ACSLL[qian]);
          //delay(50);
      USART_Transmit(ACSLL[bai]);
          //delay(50);
          USART_Transmit(ACSLL[shi]);
          //delay(50);
          USART_Transmit(ACSLL[ge]);
          //delay(50);
          USART_Transmit('\t');
          delay(100);
          //yejing();
          zh=1;
}
//***********************************************************主函数
void main()
{          

     DDRA=0XFF;    //PA0~PA7作为提供显示数据的I/O口
     DDRB=0XFF;    //PB0作为超声波传感器的Trig端
         DDRD=0XFF;
         PORTD=0X00;
         DDRC=0XFF;    //PC0~PC2作为控制显示的I/O口
     DDRD=0X00;    //PD2(INT0)作为超声波传感器的Echo端  回响信号
         //====csh(table);     //1602液晶显示初始化
     PORTB&=~BIT(0);     //首先拉低脉冲输入引脚
         MCUCR=0X03;      //上升沿产生中断请求-
         GICR=0X40;       //使能外部中断0-
         TCCR1A=0X00;                        //设置为普通模式
         TCCR1B|=(1<<CS12);//|(1<<CS11); //开启输入捕捉口的噪声抑制器,下降沿捕捉;(CS12,CS11,CS10:)
                                         //001无分频;010,8;011,64;100,256;101,1024;
         TIMSK|=(1<<TOIE1);            //溢出中断使能
         usart_Init();
         TCNT1=0;                                //计数初值       
         while(1)
         {   zh=1;
            
             PORTB|=BIT(0);      
                 delay_20us();
                 PORTB&=~BIT(0);      //产生一个20us的脉冲,在Trig引脚
                 SREG|=BIT(7);     //开总中断
                 while(zh==1);   //等待Echo回波引脚变高电平
                 
                 
                 
         }
}









#define  uchar unsigned char
#define  uint  unsigned int
#define MCLK 8000000
#pragma interrupt_handler usart_rx:12  
                                                                             //接受中断使能
uchar rdata,flag=0;
void wait_ms(uint msec)   //误差 0us
{
   uint c,count;
   for(count = 0; count < msec; count++)
   {
        for(c=1333;c>0;c--);/////////////////////////////////////////////
        }
}


void USART_init(uint baud)
{
   UCSRB=0x00;
   UCSRA=0x00;                     
   //控制寄存器清零
   UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);  
   //选择UCSRC,异步模式,禁止校验,1位停止位,8位数据位                                                   
   baud=MCLK/16/baud-1;          
   //波特率最大为65K
   UBRRL=baud;                                                        
   UBRRH=baud>>8;   
   //设置波特率
   UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
   //接收、发送使能,接收结束中断使能
   DDRD|=0X02;                        
   //配置TX为输出(很重要)
}

void USART_Transmit(uchar data)
{
         while(!(UCSRA&(1<<UDRE)) );
         //等待发送缓冲器为空
         UDR = data;
         //将数据放入缓冲器,发送数据*******************
         
}

void usart_rx()
{
        UCSRB&=~BIT(RXCIE);
        rdata=UDR;
        flag=1;
        UCSRB|=BIT(RXCIE);
}

void usart_Init()
{
    USART_init(9600);//中断??
        SREG = BIT(7);
}       







#define  uchar unsigned char
#define  uint  unsigned int

void delay_ms(uint ms)
{
         uint i,j;
         for(i=0;i<ms;i++)
           {
            for(j=0;j<1141;j++);                  
           }
}



void delay_1us(void)               
  {
   asm("nop");
  }

  
  
void delay_20us()
{  uchar bt ;
    for(bt=0;bt<20;bt++);
}

void delay_us(uint us)
{
    int i,j;
        us = 2*us;
        for(i=0;i<us;i++);
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝