📄 mcu.c
字号:
#define _MCU_C_
#include <include.h>
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}
//Watchdog initialize
// prescale: 2048K
//复位时间2.2s
void watchdog_init(void)
{
//this prevents a timout on enabling
//这在使能的时候可以防止溢出
WDR();
//05.8.9先置位WDCE和WDE
WDTCR=(1<<WDCE)|(1<<WDE);
//WATCHDOG ENABLED - dont forget WDR
//看门狗启动 别忘了喂狗 WDR
WDTCR = 0x0F;
WDR();
}
void WDT_off(void)
{
WDR();
//置位WDCE和WDE
WDTCR=(1<<WDCE)|(1<<WDE);
//关闭WDT
WDTCR=0;
}
//TIMER1 initialize - prescale:1024
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Sec
// actual value: 1.000Sec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xD5; //setup
TCNT1L = 0xD1;
OCR1AH = 0x2A;
OCR1AL = 0x2F;
OCR1BH = 0x2A;
OCR1BL = 0x2F;
OCR1CH = 0x2A;
OCR1CL = 0x2F;
ICR1H = 0x2A;
ICR1L = 0x2F;
TCCR1A = 0x00;
TCCR1B = 0x05; //start Timer
}
//ADC initialize
// Conversion time: 2uS
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
ADMUX = 0x00; //select adc input 0
ACSR = 0x80;
ADCSRB = 0x00;
ADCSRA = 0x81;
}
//call this routine to initialize all peripherals
void Init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
watchdog_init();
timer1_init();
adc_init();
uartInit(0);
uartInit(1);
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x04; //timer interrupt sources
// Bit 2 – TOIE1: T/C1 溢出中断使能
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
uint8 Adc(uint8 channel)
{
//disable adc
//ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
//使能 开始 自动触发使能 中断标志 中断使能 分频因子5=32
ADCSRA = 0x00;
//REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
//外加滤波电容 左对齐 AD通道选择
ADMUX = channel + 0x60;
ADCSRA = 0x85;
ADCSRB = 0x00;
//启动
ADCSRA = ADCSRA|(1<<ADSC);
//等待转换结束
while(ADCSRA&(1<<ADSC))
WDR();
return ADCH;
}
void EEPROM_write(uint16 uiAddress, uint8 ucData)
{
//等待上次写操作结束 EEWE=0
//while 为真执行,为假跳出
while(EECR&(1<<EEWE))
;
//设置地址和数据寄存器
EEAR=uiAddress;
EEDR=ucData;
//置位EEMWE
EECR|=(1<<EEMWE);
//置位EEWE启动写操作
EECR|=(1<<EEWE);
}
uint8 EEPROM_read(uint16 uiAddress)
{
//等待上一次写操作结束
while(EECR&(1<<EEWE));
//设置读地址
EEAR=uiAddress;
//设置EERE启动读操作
EECR|=(1<<EERE);
return EEDR;
}
// actual value: 1.000Sec (0.0%)
#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0xD5; //reload counter high value
TCNT1L = 0xD1; //reload counter low value
// if(Flag_timer1_counter==1) // 在Delay1S(); 函数中应用
// Timer1_counter++;
DelCnt++; // 在定时1小时删除短信中应用
Sec_Counter++; // 秒计数加1
cmgl_cnt++; // 在每20秒发送,AT+CMGL中应用
if(Flag_alarm==1) // 在机箱外告警指示中使用
{
PORTA^=BIT(PA0); //告警指示灯
//PORTE^=BIT(PE6); //LGC
}
else
{
PORTA&=(~BIT(PA0));
//PORTE&=(~BIT(PE6));//LGC
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -