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

📄 application.c

📁 AVR单片机C语言程序设计实例精粹
💻 C
字号:


#include <iom16v.h>
#include <macros.h>
#include "define.h"
#include "initial.h"
#include "pdiusbd12.h"
#include "descriptor.h"
#include "endpointfun.h"
#include "chap9.h"
#include "application.h"




void timer0_init(void)
{
 TCCR0 = 0x00; //stop
 TCNT0 = 0xF1; //set count
 OCR0  = 0x0F;  //set compare
 //TCCR0 = 0x04; //start timer
 TIMSK |= 0x01;
}

#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
 TCNT0 = 0xF1; 
}

void  spi_init(void)
{	
 	  DDRB= (1<<DDB4)|(1<<DDB5)|(1<<DDB7);//SPI端口初始化
	  PORTB |=0xf0;  //conect R
	  SPSR=0x01;//SPI状态寄存器初始化,时钟倍速,close interrupt_spi
   	  SPCR=0x58; //SPI enable,MSB first ,Master Mode,
}


void adc_init(void)
{

   DDRA = 0x00; 	
   PORTA =0x00;   
   ACSR =(1<<ACD);
   ADMUX=0x00;
   ADCSRA = 0x00;  
   SFIOR = 0x80;     
   ADCSRA=(1<<ADEN)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2) ;

   
 }


#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{

	enqueue(&sq,ADCL);  
	enqueue(&sq,ADCH);  
	
}


void adc_dac(uchar volatile *ppt)
{
 	 uchar temp8;

	
  if (*ppt==0x55) 
	{
	  	

           switch (*(ppt+1))
             {
                case 0x05:  
        			 IO_out(*(ppt+3),*(ppt+2));	
                     break;
                case 0x04:  
          			 temp8=IO_in(*(ppt+2));
                       	abc1[0]=temp8; 
                     break;
                case 0x01:
				      channel_change(*(ppt+2));
					  TCCR0 = 0x04; 
					  break;
				case 0x02: 
				     TCCR0 = 0x00;				 
					 break;
				case 0x03: 
				     channel_change(*(ppt+2));
					 break;
                case 0x10:
                      DAC_5617_10(*(ppt+3),*(ppt+4),*(ppt+2));	
        			break;  
        	    case 0x11:
            		 DAC_5617_10(*(ppt+3),*(ppt+4),*(ppt + 2));	
                 	 asm("NOP");
                     TCCR0 = 0x04; 
                     break;
			    
        		default:break;
             }	 
	     }



} 


void channel_change (unsigned char adc_channel)
{
  switch (adc_channel)
       {
           case 0x00: 
               ADMUX=0x00;
			   NOP();
			   NOP();

               break;   
          case 0x01:  
               ADMUX=0x01;
			   NOP();
			   NOP();

		       break; 
          case 0x02:  
               ADMUX=0x02;
			   NOP();
			   NOP();

		       break;  
          case 0x03:  
               ADMUX=0x03;
			   NOP();
			   NOP();
          
		       break;         	
       	   default:break;
       	}
}  

void DAC_5617_10(unsigned char dac_dataH,unsigned char dac_dataL,unsigned char dac_channel)
{     
     unsigned char TempL,TempH;
	 if(dac_channel==0x00)  
	    {
	     set_cs;
	     TempH=0x00;
	     TempL=0x00;
	     TempH|=((dac_dataH<<2)|(dac_dataL>>6))&0x0F;
		 TempH|=0xc0;
	     TempL|=(dac_dataL<<2);
	     clr_cs;
	     SPI_Transmit(TempH);
	     SPI_Transmit(TempL);
	     set_cs;
		}
	 else if (dac_channel==0x01) 
	   {
	     set_cs;
	     TempH=0x40;
	     TempL=0x00;
	     TempH|=(dac_dataH<<2)|(dac_dataL>>6);
	     TempL|=(dac_dataL<<2);
	     clr_cs;
	     SPI_Transmit(TempH);
	     SPI_Transmit(TempL);
	     set_cs;
	   }
	 
	else  
	 { 
	    asm("NOP");
	  }
}

void SPI_Transmit(unsigned char dac_data)
{	 
    unsigned char i;
	SPCR=0x58; 
 	SPDR=dac_data; 
	
	while(!SPSR&(1<<SPIF))
		;		
	 for (i=0;i<3;i++)
       {;} 
	
}   


void IO_out(unsigned char IO_data,unsigned char IO_channel)
{     
    
     switch (IO_channel)
       {
           case IO_PA4: 
               if (IO_data==0x00)
                   {
                   	DDRA |= (1<<DDA4);
                   	PORTA &=~(1<<4);
                   }
               else if (IO_data==0x01)
                  {
                        DDRA |= (1<<DDA4);
                   	PORTA |= (1<<4);//	
                  }

               break;   
          case IO_PA5:  
                if (IO_data==0x00)
                   {
                   	DDRA |= (1<<5);
                   	PORTA &=~(1<<5);
                   }
               else if (IO_data==0x01)
                  {
                        DDRA |= (1<<5);
                   	PORTA |= (1<<5);	
                  }
               else  
	 	         { 
	    	      asm("NOP");
				 }
		       break; 
          case IO_PA6: 
                if (IO_data==0x00)
                   {
                   	DDRA |= (1<<6);
                   	PORTA &=~(1<<6);;
                   }
               else if (IO_data==0x01)
                  {
                        DDRA |= (1<<6);
                   	PORTA |= (1<<6);
                  }
               else  
	 	        { 
	    	       asm("NOP");    
				 }   
		       break;  
          case IO_PA7:  
                if (IO_data==0x00)
                   {
                   	DDRA |= (1<<7);
                   	PORTA &= ~(1<<7);
                   }
               else if (IO_data==0x01)
                  {
                        DDRA |= (1<<7);
                   	PORTA |= (1<<7);
                  }
               else  
	 	         { 
	    	       asm("NOP");
				 }
		       break;  
	      	
       	   default:break;
       	}
	 
	
}
unsigned char IO_in(unsigned char IO_channel)
{
  unsigned char temp;

  switch (IO_channel)
       {
           case IO_PA4: 
           	{
                  DDRA &= ~(1<<4);
                  PORTA |= (1<<4);
                  asm("NOP");
               	  temp = PINA;
               	  temp =(temp>>4) & 0x01;
			}
               break;   
          case IO_PA5:  
                {
                  DDRA &= ~(1<<5);
                  PORTA |=(1<<5);
                  asm("NOP");
                  temp = PINA;
		  		  temp=(temp>>5)& 0x01;
		                 	  
                }
		       break; 
          case IO_PA6:  
                  {
                     DDRA &=~(1<<6);
                     PORTA |= (1<<PA6);
                     asm("NOP");	
               	     temp = PINA;
		     temp=(temp>>6)& 0x01;
               	 }     
		       break;  
          case IO_PA7:  
                {
                  DDRA &=~(1<<7);
                  PORTA |= (1<<PA7);
                  asm("NOP");
                  temp = PINA;
		  temp=(temp>>7)& 0x01;
               	 }
		       break;  
       	   default:break;
	 }
  return temp;
} 


void init(queue *sq) 
{
  sq->front = 0;
  sq->rear  = 0; 
  sq->fr    = MaxWid - 1;
  
  
}

elemtype enqueue(queue *sq,elemtype x)    
{
  if ( (sq->fr == (MaxWid - 1)) && (sq->rear + 1)%MaxLen == sq->front )   
    return 0;
  else
    { 
      if (sq->fr == MaxWid - 1)
         sq->rear = (sq->rear + 1)%MaxLen;
      sq->fr = (sq->fr + 1) % MaxWid;
      sq->data1[sq->rear][sq->fr] = x;
      return 1;
    }
}

elemtype outqueue(queue *sq,elemtype **x)   
{
  if ((sq->front == sq->rear) || ((sq->rear == (sq->front + 1)%MaxLen) && (sq->fr != MaxWid - 1)))        
    return 0;
  else
  {
    sq->front = (sq->front + 1)%MaxLen;
   *x = sq->data1[sq->front];
    return 1;
  }
}


        
		 

⌨️ 快捷键说明

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