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

📄 zong.c

📁 ad7135的avr16的源程序
💻 C
字号:
//ICC-AVR application builder : 2009-3-19 15:44:36
// Target : M16
// Crystal: 8.0000Mhz

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


//***************************************************** 
//全局变量定义
//*****************************************************

unsigned char N=0;//用来区别是第一次外部中断还是第二次中断
unsigned int T1OVF_NUM=0;//用来计定时器T1的溢出次数
unsigned long int T1_NUM;//T1计的总时钟的个数
unsigned int VIN;//测到的电压,单位为mv


//***************************************************** 
//函数声明
//*****************************************************
//void port_init(void);
void timer0_125Kinit(void);
//void timer1_init(void)
//void timer2_250init(void);
void init_devices(void);
void usart_tx(unsigned char data);
void delay_1ms(void);
void delay_nms(unsigned int n);
void timer1_ovf_isr(void);
void int0_isr(void);
void data_display(unsigned int data);



void delay_1ms(void)
{    
	 unsigned int i;
	 for(i=1142;i>0;i--)    
     ;
}
//***************************************************** 
//函数名称:void DELAY_NMS(void)
//函数功能:延时Nms
//注意事项:
//*****************************************************
void delay_nms(unsigned int n)
{	 
	 for(;n>0;n--)
	      delay_1ms();
}


void port_init(void)
{
 PORTA = 0x01;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0xFF;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0xFF;
}

//TIMER0 initialize - prescale:Stop
// WGM: CTC
// desired value: 125KHz
// actual value: Out of range
void timer0_125Kinit(void)
{
 TCCR0 = 0x00; //stop
 TCNT0 = 0x00 /*INVALID SETTING*/; //set count
 OCR0  = 0x1F /*INVALID SETTING*/;  //set compare
 TIMSK&=~(1<<OCIE0);
 TCCR0 = 0x19;
 //TCCR0 = 0x08; //start timer
}

//TIMER2 initialize - prescale:Stop
// WGM: CTC
// desired value: 250Hz
// actual value: Out of range
void timer2_250init(void)
{
 TCCR2 = 0x00; //stop
 //ASSR  = 0x00; //set async mode
 TCNT2 = 0x00 /*INVALID SETTING*/; //setup
 OCR2  = 0xF9 /*INVALID SETTING*/;
 TIMSK&=~(1<<OCIE2);
 TCCR2 = 0x1C; 
 //TCCR2 = 0x08; //start
}



void timer1_init(void)
{
 TCCR1A=0x00;
 TCCR1B=0x00;
 TCNT1=0X0000;
 TIMSK|=(1<<TOIE1);
}


void int0_init(void)
{	 
	 MCUCR|=((1<<ISC01)|(1<<ISC00));
	 GICR|=(1<<INT0);
}





#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
 T1OVF_NUM++;
 
 //TIMER1 has overflowed
 //TCNT1H = 0x00 /*INVALID SETTING*/; //reload counter high value
 //TCNT1L = 0x00 /*INVALID SETTING*/; //reload counter low value
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
 UCSRB = 0x98; //disable while setting baud rate
 UCSRA = 0x20;
 UCSRC = 0x86;
 UBRRL = 0x33; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi
 //UCSRB = 0x00;
}


void usart_tx(unsigned char data)
{	 
	 UDR=data;
	 while(!(UCSRA&(1<<TXC)))
	 ;
	 delay_nms(1);
}

#pragma interrupt_handler usart_receive:12
void usart_receive(void)
{	 
	 unsigned char d;
	 d=UDR;
	 if(d==0x01)
	 {    
	 	  PORTB|=(1<<0);
		  SEI();
	 }
	 else
	 {    
	 	  PORTB&=~(1<<0);
		  CLI();
	 }
}

#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
   if(!N)
	 {    
	 	  TCCR1B=0X01;//开始内部计数
		  MCUCR=0X02;//设置外部中断0下降沿产生中断
		  N++;
	 }
	 else
	 {    
	 	  TCCR1B=0X00;//定时器t1停止工作
		  CLI();//关中断,进行数据处理
		  //数据处理
		  T1_NUM=T1OVF_NUM;
		  T1_NUM=(T1_NUM*65536+TCNT1);
		  T1_NUM/=64;
		  T1_NUM-=10001;
		  VIN=T1_NUM/10;
		  data_display(VIN);
		  //数据处理结束
		  T1OVF_NUM=0;
		  TCNT1=0X0000;
		  MCUCR|=((1<<ISC01)|(1<<ISC00));//设置外部上升沿中断
		  N=0;//
		  PORTB&=~(1<<0);//上位机发0x01,测量一次,停止ad
		  //SEI();先进行1次采样
	 }
















 //external interupt on INT0
}

void data_display(unsigned int data)
{	 
	 unsigned char temp[4],i;
	 temp[0]=data/1000;
	 temp[1]=(data/100)%10;
	 temp[2]=(data/10)%10;
	 temp[3]=data%10;
	 for(i=0;i<4;i++)
	 {
	      usart_tx(temp[i]);
		  delay_nms(1);
	 }
} 

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 //uart0_init();
 timer0_125Kinit();
 timer2_250init();
 uart0_init();
 timer1_init();
 int0_init();

 //MCUCR = 0x03;
 //GICR  = 0x40;
 //TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

void main(void)
{	 
	 CLI();
	 port_init();
	 init_devices();
	 //T0_250K();
	 //INT0_INIT();
	 //T1_INIT();
	 SEI();
	 //PORTB|=(1<<0);//开始进行ad采样,只采一次
	 while(1)
	 ;
}











⌨️ 快捷键说明

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