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

📄 1.c

📁 在车头有4个光敏电阻做的寻找光源的小车程序 具有笔战功能 ICC-AVR ATmega16L 做的控制器 找到光源后停车
💻 C
字号:
//ICC-AVR application builder : 2008-5-15 14:12:28
// Target : M16
// Crystal: 8.0000Mhz

#include <iom16v.h>
#include <macros.h>
#include "lcd.h"
#define Vref   2560         //参考电压值

#define uchar   unsigned char
#define uint    unsigned int
uchar miao=0;

unsigned int adc_rel;//AD转换结果
unsigned char adc_mux;//AD通道
unsigned int voltage;
unsigned int adc_old;
unsigned int V0,V1,V2,V3;

uint adc_x;
uint adc_y;


void get_adc();
/*				微秒级延时程序	  		*/
void delay_us(uint time)
	 {     
  	  do
	  	{
		 time--;
		}	
  	  while (time>1);
	 }	  
 
/*****************************************/
void delay_ms(uint time)
    {
    while(time!=0)
	  	  {		
		   delay_us(1000);
		   time--;
		  }
    } 




//端口初始化
void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x0f; //m103 output only
 DDRC  = 0x0f;
 PORTD = 0xff;
 DDRD  = 0x00;
}


//定时T1初始化
void timer1_init(void)
{
 TCCR1B = 0x00;//停止定时器
 TIMSK |= 0x04;//中断允许
 TCNT1H = 0xFC; //重装值高位
 TCNT1L = 0x2F; //重装值低位

 TCCR1A = 0x00;
 TCCR1B = 0x05;//启动定时器
}


//定时器T1溢出中断服务程序
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
TCNT1H = 0xFC; //重装值高位
 TCNT1L = 0x2F; //重装值低位
 CLI();
		 adc_rel=0;
		 adc_old=0;
		  if(adc_mux<3)
			    adc_mux++;//递增
		     else
			    adc_mux=0;	
		SEI();			
miao++;
if(miao==350)
 
    //LCD_write_string(9,1,Format(miao,"00")); 
	{stop();
	   TCCR1B = 0x00;//停止定时器
} 
}



void adc_init(void)
{
 //adc转换初始化
 ADCSRA	= 0x00;	//禁止AD转换
 //ADMUX	= 0xC1; //通道1    1100 0001
 ADMUX =(1<<REFS1)|(1<<REFS0)|(adc_mux&0x1f);//选择内部AVCC为基准
 SFIOR |= 0x00;
 ACSR	= 0x80; //禁止模拟比较器
 ADCSRA	|= 0xEE;  //1110 1110
  ADCSRA|=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分频
}


//ADC结果转换成电压值
void ADCtoBCD(unsigned int temp)
 {
  unsigned char i;
   
  temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/0x3ff);
  voltage=temp;
switch(adc_mux)
      {
		case 0:V0=temp;break;
		case 1:V1=temp;break;
		case 2:V2=temp;break;
	    case 3:V3=temp;break;
	 } 
  LCD_write_shu(0,0,temp);

 }


#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
 //转换完成后中断处理
   adc_rel=ADC&0x3ff;  //
  ADMUX =(1<<REFS1)|(1<<REFS0)|(adc_mux&0x1f);
    ADCSRA|=(1<<ADSC);//启动AD转换//启动AD转换

}



void init_devices(void)
{
 CLI(); //禁止所有中断
 MCUCR  = 0x00;
 MCUCSR = 0x80;//禁止JTAG
 GICR   = 0x00;
 port_init();
 timer1_init();
 adc_init();
 SEI();//开全局中断
}

void qianjin()
 {
 //PORTC|=0x80;
 PORTC=0x8A;     //1010前进
 LCD_write_string(0,1,"qianjin  ");
}
void houtui()
{
PORTC=0x85;     //0101后退
LCD_write_string(0,1,"houtui   ");
}

void zuozhuan()
{
 PORTC=0x82;     //0010  左传
 LCD_write_string(0,1,"zuozhuan");
} 
void youzhuan()
{
 PORTC=0x88;      //1000右转
 LCD_write_string(0,1,"youzhuan");
}
void stop()
{
 PORTC=0x80;
  LCD_write_string(0,1,"stop   ");
}

void get_adc()
{
if(adc_old!=adc_rel)
        {
	     adc_old=adc_rel;
	    ADCtoBCD(adc_old);
	 }
	  LCD_write_shu(0,1,voltage);
}
void shaomiao()
{unsigned int i;
   PORTC=0x89;
 //LCD_write_string(0,1,"shaomiao  ");
  
   for(i=1000;i>0;i--)
   {  
      get_adc();
	  if( adc_x!=voltage)
	  {
	  adc_x=voltage;
	   if(adc_y>adc_x)
		  
		     adc_y=adc_x;
		        else
		  continue;
		 } 
		  	
	   LCD_write_shu(7,1,adc_y); 	 
     

   }
 

}	
//响声函数:入口i:响声长度i*10ms,n:响声次数
void sound(uchar i,uchar n)
    {
 for(;n;n--)
     {
  uint a=i*10;
  for(;a;a--)
         {
   PORTC&=~(1<<7) ;    //开蜂鸣器
   delay_us(100);
   PORTC|=1<<7 ;  //定义蜂鸣器关  //关蜂鸣器
   delay_us(100);
   }
 
  }
 }
void bizhan()
{            sound(2,2);
      
                      if((PIND&0x07)==0)
	                     {
		                       houtui();
							    
	                          delay_ms(300);
	                         youzhuan();
							 
							 delay_ms(100);
		                  }
	                   if((PIND&0x01)==0)
	                        {
	                          houtui();
							  
	                          delay_ms(300);
							  youzhuan();
							  
	                           delay_ms(100);
		                     }
	               
	                  if ((PIND&0x02)==0)
	                       {  
	                        houtui();
							 
	                        delay_ms(300);
	                         zuozhuan();
							  
							  delay_ms(100);
							  if((PIND&0x10)==0)qianjin();
	                           }
	                  
		
	                  
	
	                  if((PIND&0x04)==0)
	                             {
		                            houtui();
	                              
	                                   delay_ms(300);
	                           zuozhuan();
							    
	                            delay_ms(100);
								
								if((PIND&0x10)==0)qianjin();
								 
	                     }
	
                      if((PIND&0x10)==0)
	                     {
	                        youzhuan();
	                      delay_ms(100);
	                         }
                       if((PIND&0x08)==0)
	                        {
	                          zuozhuan();
	                           delay_ms(100);
							   }
							   }
					   
							   

//主函数
void main(void)
{
 unsigned int k;
 adc_mux=0;
 //unsigned int  min_old;
 init_devices();
 //在这继续添加你的代码
 LCD_init();
 DDRC=0xFF;
  PORTC=0xff;
  DDRD=0x00;
  PORTD=0xff;
  delay_ms(100);
 LCD_write_command(0x01);  //清屏
  delay_ms(10);
 LCD_write_string(0,0,"Test RObot");
 delay_ms(100);
LCD_write_command(0x01);  //清屏
for(k=0;k<200;k++)
 
 adc_old=0;
 adc_rel=0; 
adc_y=2670;
 adc_x=voltage;

 shaomiao();
 LCD_write_command(0x01);  //清屏
 stop();
 delay_ms(300);
while(1)
 {    
 
        get_adc(); 
		//get_min();
	    if((PIND&0xFF)!=0xff)
	            {
	                delay_ms(10);
	                 if((PIND&0xFF)!=0xff)bizhan(); 
				 }
       
		 
       else if(voltage>(adc_y+80))
	          {
			  if((V0+200)<V3)
			  youzhuan();
			  else if ((V3+200)<V0)
			  zuozhuan();
			  else 
			    zuozhuan();
			  }
	          
	   else if (V2<(adc_y+80))
	         { 
			  if (voltage<adc_y)
			   adc_y=voltage;
			
			   qianjin();
			   }
	   else if (V1<(adc_y+80))
	         { 
			  if (voltage<adc_y)
			   adc_y=voltage;
			  
			   qianjin();
			   }		   
   }
   
 }



 

 

⌨️ 快捷键说明

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