📄 zong.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 + -