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

📄 m16pwm-led.c.bak

📁 电动车控制器
💻 BAK
字号:
////////////////////////////////////////////////////////////////////////////////
//ICC-AVR application builder : 2006-8-1 上午 08:05:37
// Target : M16
// Crystal: 8.0000Mhz
// ADc2采集转把信号
////////////////////////////////////////////////////////////////////////////////
#include <iom16v.h>
#include <macros.h>

#define fre 125
#define uchar     unsigned char
#define uint      unsigned int
unsigned char  kk;
int k;
uchar temp_data,hour_data,minut_data,second_data,second_flag;
uchar AdResult=0;
uchar LedTab[16]={0xEB,0x41,0xB3,0xBA,0x78,0xDA,0xDB,0xA8,0xFB,0xFA,
                             0xF9,0xFB,0xC3,0xEB,0xD3,0xD1};
uchar LedBuf[4]={0,0,0,0};	
uchar LedDp[4]={0,0,0,0};
uchar UartBuf[10],UartBufCount=0;						 


////////////////////////////////////////////////////////////////////////////////
//function declare
void port_init(void);
void uart0_init(void);
void uart0_rx_isr(void);
void uart0_tx(uchar tdata);
void timer1_init(void);
void timer1_comp_isr(void);
void led_display(uchar delay);
void ms_delay(uint delay);
void init_devices(void);
void adc_init(void);   
////////////////////////////////////////////////////////////////////////////////
void port_init(void)
{
 PORTA = 0xFF;
 DDRA  = 0xFB; //PA2=ADC2,输入
 PORTB = 0xFF;
 DDRB  = 0x0F; //数码管片选信号,低有效,常态为高
 PORTC = 0xFF; //m103 output only
 DDRC  = 0x01; //PC0=数码管的DP
 PORTD = 0xFF;
 DDRD  = 0x60;
}


//TIMER1 initialisation - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1mSec
// actual value:  1.000mSec (0.0%)
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xE0; //setup
 TCNT1L = 0xC0;
 OCR1AH = 0x1F;
 OCR1AL = 0x40;
 OCR1BH = 0x1F;
 OCR1BL = 0x40;
 //OCR1CH = 0x1F;
 //OCR1CL = 0x40;
 ICR1H  = 0x1F;
 ICR1L  = 0x40;
 TCCR1A = 0x00;
 TCCR1B = 0x01; //start Timer
}
/*************************************************************************** 
                                                  
****************************************************************************/ 
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 UCSRC = BIT(URSEL) | 0x06;
 UBRRL = 0x33; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi
 UCSRB = 0x98;
}
/*************************************************************************** 
                                                 
****************************************************************************/ 
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
 
 //uart has received a character in UDR
    UartBuf[UartBufCount]= UDR;
	if(++UartBufCount>3)
	{
	   UartBufCount=0;
	   //UartBuf[2]=Rev,Rev,Rev,Rev,Rev,Rev,LEFT_LED,RIGHT_LED
	   if( ((UartBuf[0]+UartBuf[1])==0xff)&& ((UartBuf[2]+UartBuf[3])==0xff) )
	   {
	       LedBuf[3]=((UartBuf[0]&0xf0)>>4)&0x0f;
           LedBuf[2]=UartBuf[0]&0x0f;		   
		   
	   }
	}   
}
/*************************************************************************** 
                                                    
****************************************************************************/ 
void uart0_tx(uchar tdata)
{
   while(!(UCSRA & (1<<UDRE) ));
   UDR = tdata;
}
/*************************************************************************** 
                                                    A/D初始化 
****************************************************************************/ 
void adc_init(void) 
{ 
 ADCSRA =0x0; //关闭AD 
 ADMUX = (1<<REFS0)|(1<<ADLAR)|(1<<MUX1); //选择外部参考电源 ADC2 左对齐 
 ACSR = (1<<ACD); //关闭模拟比较器 
 ADCSRA = (1<<ADEN)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0);//中断允许 32分频 
} 
/*************************************************************************** 
                                                    A/D中断处理 
****************************************************************************/ 
#pragma interrupt_handler Adc_isr:15
void Adc_isr(void) 
{ 
   AdResult=ADCH; //读取高位数据(左对齐)
   //OCR2 = 0xff - AdResult; //更新PWM参数  
   LedBuf[1]=((AdResult&0xf0)>>4)&0x0f;
   LedBuf[0]=AdResult&0x0f;
} 
#pragma interrupt_handler timer1_comp_isr:7
void timer1_comp_isr(void)
{
 //compare occured TCNT1=OCR1
 uchar tt;
 if(++k>=fre)
 {
    k=0;
	
	for(tt=0;tt<4;tt++)
	{
	   LedDp[tt]=0;//temp	   
	}
	//UartBufCount=0;
	uart0_tx(AdResult);
	uart0_tx(0xff-AdResult);
	uart0_tx(0x03);
	uart0_tx(0xfc);
	
	LedDp[second_data%4]=1;
    if(++second_data>=60)
    {
	    second_data=0;
        if(++minut_data>=60)
	    {
	        minut_data=0;
		    if(++hour_data>=24)	 
	        {
	            hour_data=0;
	        }
    	}
     }		    
     PORTD^=0x60; 
      
 }
}

//led display
void led_display(uchar delay)
{
  int j,k;
  for(j=0;j<4;j++)
  {
      //if(data>15)data=15;  
      PORTB = ~(0x08>>j);  
      PORTA = LedTab[(LedBuf[j]&0x0f)];  
	  if(LedDp[j])PORTC|=0x01;
	  else PORTC&=0xfe;
	  ms_delay(delay);
  }
}
void ms_delay(uint delay)
{
    int d1,d2;
	for(d1=0;d1<delay;d1++)
	{
	   for(d2=0;d2<1000;d2++);
	}
}
//call this routine to initialise all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 uart0_init();
 timer1_init();
 adc_init();
 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x10; //timer interrupt sources
 
 SEI(); //re-enable interrupts
 //all peripherals are now initialised
}

////////////////////////////////////////////////////////////////////////////////
void main()
{
  int i,adc,led;
  init_devices();
  PORTD=0x20;
  while(1)
  {
     
   //display second flag
     if(++led>500)
     {
     	PORTD ^=0x60;
        led=0;
     }
     if(++adc>=100)
     {
         ADCSRA |=(1<<ADSC);  //启动AD转换 
         adc=0;
     }
     led_display(1);
	  		 	 
  } 

}
////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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