📄 getpower_m8.c
字号:
//
/***********************************************************************************
Project: GetPower program (V0.6)
Filename: GetPower.c
Prozessor: Mega8 family
Compiler: ICCAVR Version 6.14
Autor: Dou
Copyrigth: (c) Sensirion AG
***********************************************************************************/
/////////////////////////////////////////////////////////////
/*
烟台国网中电自动化技术有限公司
雷击模块程序(ICCAVR)
作者:窦庚欣
*/
#include<iom8v.h>
#include <math.h>
#include<macros.h>
#include<eeprom.h>
#include<string.h>
#include<stdio.h>
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned int INT16U;
typedef signed int INT16S;
typedef unsigned long INT32U;
typedef signed long INT32S;
#define BIT_H(x) (1<<x)
#define BIT_L(x) (~(1<<x))
#define LED_H (PORTD |= BIT_H(PD3))
#define LED_L (PORTD &= BIT_L(PD3))
#define fosc 7372800
#define baud 115200
#define MS_COUNT fosc/1000/17 //延时计数
#define SR_NOP() asm("nop") //空指令
#define BYTE unsigned char
#define WORD unsigned int
volatile static WORD adc_val; //AD最终结果
volatile static int Power_Low; //电压低标志
static WORD adc_first; //第1次AD标志
void (*reset)(void)=0x0000;
/////////////////////////////////////////////////////////////////////////////////
void delay(WORD n)
{
while(--n){;}
}
//延时n毫秒
void sr_ms(WORD n)
{ //延时n毫秒
WORD i,j;
for(i=0; i<n; i++)
for(j=0; j<MS_COUNT;j++);
}
/////////////////////////////////////////////////////////////
void quarter_ms(WORD n)
{ //延时n毫秒
WORD i,j;
for(i=0; i<n; i++)
for(j=0; j<MS_COUNT/4;j++);
}
/////////////////////////////////////////////////////////////
void half_ms(WORD n)
{ //延时n毫秒
WORD i,j;
for(i=0; i<n; i++)
for(j=0; j<MS_COUNT/2;j++);
}
void ms(WORD n)
{ //延时n毫秒
WORD i,j;
for(i=0; i<n; i++){WDR();
for(j=0; j<MS_COUNT;j++);}
}
void us(WORD n)
{ //延时n毫秒
WORD i,j;
for(i=0; i<n; i++)
for(j=0; j<MS_COUNT/1000;j++);
}
/////////////////////////////////////////////////////////////
void delay_s(WORD n)
{
WORD i;
for ( i=0; i<10*n; i++ ) ms(100);
}
/////////////////////////////////////////////////////////////////////////////////
// ADC 初始化
void adc_init(void)
{
adc_first =1;
adc_val = 0;
DDRC&=0xFE;//设PC0口为高阻输入
PORTC&=0xFE;
// ADMUX=0x00;//选择外部2.47V为基准,ADC0通道
// ACSR =(1<<ACD);//关闭模拟比较器
// SFIOR&=(~(1<<ADHSM)); //低速AD模式
//64分频单次转换模式并开始第一次转换
ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
}
/////////////////////////////////////////////////////////////////////////////////
//ADC完成中断
#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void)
{
WDR();
if ( adc_first ){adc_first--;
}else{adc_val = ADC & 0x3ff; //取AD值
if(adc_val==0x3ff){
Power_Low=0;
DDRB|=(1<<PB1);
PORTB|=(1<<PB1);
ms(500);
PORTB&=(~(1<<PB1));
DDRB&=(~(1<<PB1));
}
}
}
/////////////////////////////////////////////////////////////////////////////////
//比较器 初始化
void AC_init(void)
{
DDRD&=0x3F;//设PD6,PD7口为高阻输入
PORTD&=0X3F;
ACSR|=(1<<ACIE)|(1<<ACIS1)|(1<<ACIS0);//比较器中断允许,输出上升沿触发
}
/////////////////////////////////////////////////////////////////////////////////
//比较器中断处理
#pragma interrupt_handler ac_isr:iv_ANA_COMP
void ac_isr(void)
{
Power_Low=1;
DDRB|=(1<<PB2);
PORTB|=(1<<PB2);
ms(500);
PORTB&=(~(1<<PB2));
DDRB&=(~(1<<PB2));
}
/////////////////////////////////////////////////////////////////////////////////
void wdt_init(void)
{
WDR();//喂狗
WDTCR|=(BIT(WDCE)|BIT(WDE));
WDTCR=BIT(WDP2)|BIT(WDP1)|BIT(WDP0)|BIT(WDE);
}
/////////////////////////////////////////////////////////////
void main(void)
{
CLI();
wdt_init();
adc_init();
AC_init();
WDR();
DDRD|=(1<<PD3);//Led指示
SEI();
ac_isr();
Power_Low=1;
while(1){
WDR();
LED_H;
ms(3000);
if(!Power_Low){NOP();}else{ADCSRA|=(1<<ADSC);}
LED_L;
ms(3000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -