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

📄 ad.c

📁 pic单片机工程
💻 C
字号:
/*
   2006。10。19      line         原因:           修改:

*/

#include <pic.h>
#include <stdio.h>
#include "inc\globals.h"
#include "inc\util_mc.h"
#include "inc\main.h"
#include "inc\eeprom.h"

typedef union 
{
    int y1;
    unsigned char adre[2];
}adres;
bank1 adres  adresult; //定义一个共用体,用于存放A/D 转换的结果

//unsigned char i_ad;
//unsigned int j_ad;


static char flagperend=0;
//static unsigned int adconvert = 0;
//static bank1 unsigned int  ACaverage = 0;

bank1 int gCurVolt;
bank1 unsigned char gCurTemp;


extern bank1 unsigned char gOffLineCnt;  //离线计数器,与中心断开的时间
//A/D 转化初始化子程序
void adinitial()
{
	//ADCON0=0x51; //选择A/D 通道为RA2,打开A/D 转换器
	             //在工作状态,且使A/D 转换时钟为8tosc
    ADCON0=0x41;  //钟欣改 
	//ADCON1=0X84; //转换结果右移,及ADRESH 寄存器的高6 位为"0"
	             //且把RA2 口设置为模拟量输入方式 ra0 1 3为模拟输入
    ADCON1=0X84;//RA0 RA1 为AD输入
	PIE1=0X00;
	PIE2=0X00;
    ADIF=0;
	ADIE=1; //A/D转换中断允许
	PEIE=1; //外围中断允许
    //TRISA2=1;//设置RA2 为输入方式
    TRISA0=3;//钟欣改
    ei();
	//系统各I/O 口初始化子程序
    //TRISD=0X00; //D口为输出
	//ad0=0x00;
	ADGO=1; //启动A/D 转换
	
	flagperend = 0;
    gCurVolt = 0;
}

//中断服务程序
//等待中断,在中断中循环检测外部电压
void interrupt adint(void)
{
   
   if(TMR1IE&&TMR1IF)
   {
      TMR1IF=0;
      //delaycount--;
   }
   if(EEIE&&EEIF)
   {
      EEIF=0;
      //flagwrite=1;
   }
   if (T0IF) 
   {
        tc++;
        if(tc>1000)
        {
        	  tc = 0;
            if(gOffLineCnt<MAX_OFFLINE)
            	  gOffLineCnt++;
        }
        TMR0=255;  //装入初值
        T0IF = 0;   //清除中断位
   }
   if(ADIE&&ADIF)//ADIF = 1 表示转换完成
   {
        ADIF=0;
        adresult.adre[0]=ADRESL;
		adresult.adre[1]=ADRESH; //读取并存储A/D 转换结果,A/D 转换的结果通过共
		//用体的形式放入了变量y1 中
		if(adresult.y1>0x400)
		{
			//alarm(); //如果输入的模拟量大于2.5V(对应数字量
			//0X200h),则调用报警子程序
			//delay(); //调用延时子程序,使电压检测不要过于频繁
	        asm("nop"); 
	    }
        asm("nop");   
		asm("nop");
		asm("nop");
		asm("nop");
	    //else PORTD=0XF0 ; //如果输入的模拟量小于2.5V,则与D 口相连的
	    //8个发光二极管的低4 个发亮,表示系统正常
	    //ADGO=1; //启动下一次A/D 转换
        flagperend=1;
   }
}

void AdcRead(char channel,int *adcvaule)
{
    flagperend=0;
	ADCON0 = (channel << 3) | 0x41;		// enable ADC
	asm("nop");   
	asm("nop");
	asm("nop");
  DelayF(1);//捕捉时间约200多us
	ADGO = 1;
	while(flagperend=0);	// wait for conversion complete
	*adcvaule = adresult.y1;
}


//bank1  float ac_input;

/*
   (Vac*12/220-M)*N*1.54/11.97 = Vdc   
   M = 整流压降 N = 滤波参数 
   1.54/11.97 = 电阻分压
*/
/*
int ac_get(void) 
{
   unsigned char i;
   unsigned int sum=0;
   int temp1;
   float ac_input;
   int temp;
   //220V电压检测
   //均值滤波
   for(i=0; i<10; i++)
   {
      AdcRead(0,&temp);
      sum=sum+temp;
   }
   //sum /=10;
   ACaverage=(float)sum*5/10240;//average浮点型,sum为unsigned char型
   temp = (unsigned int)ACaverage;
   temp1 = (unsigned int)(ACaverage*100)%100;
   //printf("ACaverage = %4d.%2d\n",temp,temp1);
   ac_input=(int)(float)(96.5517*ACaverage)+(float)(13.5173);
   gCurVolt = (int)ac_input;
   //printf("ac_input = %d\n",sum);
   return (int)ac_input;
}
*/
char checkVolt(void)
{
	  if((gCurVolt<gMin_Volt) || (gCurVolt > gMax_Volt))
	  	  return -1;
	  else
	  	  return 0;
}

int temp_get(void)
{
/*   unsigned char i;
   unsigned int sum=0;
   unsigned int temp;
   //温度检测
   //均值滤波
   for(i=0; i<10; i++)
   {
      AdcRead(1,&temp);
      sum=sum+temp;
   }*/
   //sum /=10;
   /*ACaverage=(float)sum*5/10240;//average浮点型,sum为unsigned char型
   temp = (unsigned int)ACaverage;
   temp1 = (unsigned int)(ACaverage*100)%100;
   printf("ACaverage = %4d.%2d\n",temp,temp1);
   ac_input=(float)(96.5517*ACaverage)+(float)(13.5173);
   sum = ac_input;
   printf("ac_input = %d\n",sum);*/
}

⌨️ 快捷键说明

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