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

📄 getpower_m8.c

📁 感应取电的控制
💻 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 + -