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

📄 csb.c

📁 一个用AVR单片机做的超声波测距程序,可测量0.1--3米的距离
💻 C
字号:
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.1d Standard
Automatic Program Generator
?Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.ro
e-mail:office@hpinfotech.ro

Project : 
Version : 
Date    : 2005-8-27
Author  : HAI                             
Company :                                 
Comments: 


Chip type           : AT90LS4433
Clock frequency     : 8.000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
*****************************************************/

#include <90s4433.h>  
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
#include <delay.h>
#include<math.h>
#include<stdlib.h>             

#define ADEN ADCSR.7
#define ADSC ADCSR.6
#define LED PORTD.1
#define EA SREG.7    
#define TXEN UCSRB.3
#define RXEN UCSRB.4

#define ADC_VREF_TYPE 0x00 
#define PTT PORTB.5    
#define KEY PORTD.5 

//*********************LCD**************************//
#define LCD_E    PORTB.0
#define LCD_RW   PORTB.2
#define LCD_RS   PORTB.1   
#define LCD_VO   PORTB.4   
#define P0 PORTD
//**************************************************//
// Declare your global variables here
uint time=0; 
uint dat[3][2];
uchar mess1[]={" BD7QX@163.COM "};
uchar mess2[]={"  TEST OVER>>> "};





/*****************LCD 函数******************/
uchar read_lcd(uchar rs)
{
  uchar temp;
  LCD_E=1;
  delay_us(100);
  P0=0x0ff;
  DDRD=0x00;
  if (rs==1)
    LCD_RS=1;
  else
    LCD_RS=0;
  LCD_RW=1;
  delay_us(100);
  LCD_E=1;
  delay_us(100);
  temp=PIND;
  delay_us(100);
  LCD_E=0;
  delay_us(100);
  return temp;
}

void write_lcd(uchar datt,uchar RS)
{
  uchar tepm;
  LCD_E=1;
  delay_us(100);
  DDRD=0xFF;
  P0=datt;
  if (RS==1)
    LCD_RS=1;
  else
    LCD_RS=0;
  delay_us(10);
  LCD_RW=0;
  delay_us(100);

  LCD_E=1;
  delay_us(100);

  P0=datt;
  delay_us(100);
  LCD_E=0;
  delay_us(10);
  LCD_RW=1;
}

void write_com(uchar com)
{
 uchar in;
 while(1)
 {
  in=read_lcd(0);
  if ((in&0x80)==0) break;
 }
  write_lcd(com,0);
}

void write_data(uchar dat)
{
  uchar in,ladd;
  write_lcd(dat,1);
  while(1)
  {
    in=read_lcd(0);
    if ((in&0x80)==0)
         break; 
  }
}

void lcd_init(void)
{  
  LCD_VO=0;
  write_com(0x3c);     //置显示
  write_com(0x0c);     //置
  write_com(0x06);     //置输入模式
  write_com(0x01);     //清屏
}


void prin(uchar line,uchar *str)
{
 uchar i;
 if (line==1)
 {
   write_com(0x80);
   for (i=0;i<24;i++) write_data(' ');
   write_com(0x80);
 }
 else
 {
   write_com(0x0c0);
   for (i=0;i<24;i++) write_data(' ');
   write_com(0x0c0);
  }
   i=0;
   do {write_data(str[i]);i++;}
   while (str[i]!='\0');
}


void test_lcd(void)
{
 uchar i;
 prin(1,mess1);
 write_com(0x0c0);
 for(i=0;i<10;i++) write_data(i+0x30);
 prin(2,mess2);
}






//uchar T1H=0xfc,T1L=0x18;
bit t1ov=0;

#define ADC_VREF_TYPE 0x40
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSR|=0x40;
// Wait for the AD conversion to complete
while ((ADCSR & 0x10)==0);
ADCSR|=0x10;
return ADCW;
}
          
  
//TIME1  INT
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
  t1ov=1;TCCR1B=0x00;
}
  

void send_40k(uchar j)
{                
 uchar i;
  for (i=0;i<j;i++)
  {
    PTT=0; 
    PTT=0; 
    PTT=0; 
    PTT=0; 
    PTT=0; 
    PTT=0; 
    delay_us(11);
    PTT=1; 
    PTT=1; 
    PTT=1; 
    PTT=1; 
    PTT=1; 
    PTT=1; 
    delay_us(11);
  }
}   

void sort(void);






void main(void)
{       
 uchar gg[6];
 uint i,ad;
 float ff;
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0xFF;
DDRB=0xFF;

// Port C initialization
// Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0xFF;
DDRD=0xFF;

// UART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// UART Receiver: Off
// UART Transmitter: On
// UART Baud rate: 9600
UCSRB=0x08;
UBRR=0x33;

UBRRHI=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000.000 kHz
// Mode: Normal top=FFFFh
// OC1 output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0xF8;
TCNT1L=0x2F;
OCR1H=0x00;
OCR1L=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x80;

UBRRHI=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;

// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Bandgap Voltage Reference: Off
ADMUX=ADC_VREF_TYPE;
ADCSR=0x87;
// Global enable interrupts
#asm("sei")
   TXEN=1; 
   RXEN=1;
   //lcd_init();
while (1)
 {   
    
   ad=read_adc(03);
   
   ff=ad*1.220/1023;
   ftoa(ff,4,gg);
   //LED=0; 
    printf("V=%s\n",gg);
   //delay_ms(200);
   //prin(1,gg);
  // DDRD=0XFF;
   LED=~LED;
   delay_ms(100);


   //test_lcd();
/*
yy:    send_40k(2);
       TCCR1B=0x02;
       TCNT1=0;
       TCNT1H=0;
       TCNT1L=0;   //定时器2.058ms中断  检测35cm以内的距离  
       delay_us(60);
       t1ov=0;
       dat[i][0]=0;
       i=1;
       while(!t1ov)
       {                     //循环2.058ms
          time=TCNT1;
          ad=abs(ADCW-0x1d8);
          //ad=ADCW-0x1d8;
          if ((ad>120)&&(time<0x24d))
          { dat[i][0]=ad;dat[i][1]=time;}
          else
            if ((ad>100)&&(time<999))                         
              { dat[i][0]=ad;dat[i][1]=time;}
            else
              if ((ad>20)&&(time>1000))
                { dat[i][0]=ad;dat[i][1]=time;}
        }    
    
                 
    if (dat[1][0]>60)   //大于0.3V以上才要
    {  //ff=ad*5.00/1023;   
       dat[1][0]=0;
       ff=dat[1][1]/2*0.034;
       ftoa(ff,1,gg);
       //printf("time=%u  S0:%sCM\n",dat[1][1],gg);
       prin(1,gg);
       delay_ms(200);
       goto yy;
     }

       delay_ms(20); */
  /*
   for (i=0;i<3;i++)
   {
       send_40k(40);
       TCCR1B=0x02;
       t1ov=0;
       dat[i][0]=0;
       TCNT1=0;
       TCNT1H=0;
       TCNT1L=0;   //定时器12ms中断  检测35cm--408cm以内的距离  
       delay_us(5000);
       while(!t1ov)
       {                     //循环66ms
          time=TCNT1;
         ad=abs(read_adc(03)-0x1d8);
          //ad=ADCW-0x1d8;
           if (ad>dat[i][0])
        // if ((ad>8)&&(time>6000))
          { dat[i][0]=ad;dat[i][1]=time;}
       }
     }     
     
       sort();    
   
       if ((dat[1][0]>8)&&(dat[1][1]>5000))   //大于0.040V以上才要  3.4m--11m
       {  //ff=ad*5.00/1023;   
          ff=dat[1][1]/2*0.034;
          ftoa(ff,1,gg);
          //printf("time=%u  S1:%sCM\n",dat[1][1],gg);
          prin(2,gg);
       }  
       delay_ms(200); */
 } 
}       

 
void sort(void)
{
 uchar i,j;
 uint temp;
    for (i=0;i<2;i++)
       for (j=0;j<3;j++) 
          if (dat[j][1]>dat[j+1][1])
          { temp=dat[j+1][1];dat[j+1][1]=dat[j][1];dat[j][1]=temp;}
}  

⌨️ 快捷键说明

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