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

📄 复件 new400_c.c

📁 实现了蓄电池电压与电流采集的16f873a 程序!!!
💻 C
📖 第 1 页 / 共 2 页
字号:
#include  "pic.h"
#include  "pic1687x.h"
#include  "math.h"

//__CONFIG (XT & PROTECT & PWRTEN & BOREN & WDTDIS);
//unsigned char get_code(uchar i);

void delay_1ms(unsigned int i);
void to_74hc164(unsigned char dd);
void tmr1_init(void);
void port_init(void);
void led_display(void);
void buzzer(void);
void ad_change(void);
void run_scan(void);
void stop_scan(void);
void shift_scan(void);
void bodong(void);
void to_bcd_to_display_ram(void);
void  interrupt ISR(void);
void average_real_vol(void);
void average_real_cur(void);
//----------------------------------------------
unsigned char  ram8;// @ 0x20; 
unsigned char  flag;//
unsigned char  shift,average;
unsigned char  one_second,one_minute;
unsigned char  i,dd,j,k,temp,ad_channel,ii,ad_delay;
unsigned long  long_temp;

unsigned short average_temp;//平均次数和 平均累计值
unsigned short set_dcur,set_dvol,vol_mid1,vol_mid2,vol_mid3,vol_mid4,vol_mid5;
unsigned short real_ccur,real_dcur,real_cvol,real_dvol,real_time,set_dtime;
unsigned char ram1,ram2,ram3,ram4,ram5,ram6,ram7;//
//----------------------------------------------
bit  from_4051 @ (unsigned)&PORTA*8+0;
bit  ad_real_1_4_vol  @ (unsigned)&PORTA*8+1;
bit  set_work     @ (unsigned)&PORTA*8+2;//用于工作\设置模式切换
bit  three        @ (unsigned)&PORTA*8+4;  //three key all输入
//bit  ad_real_cur  @ (unsigned)&PORTA*8+5;

bit  ln_con       @ (unsigned)&PORTB*8+0; //220v  继电器控制端  
bit  dischar_con  @ (unsigned)&PORTB*8+1; //放电控制端 
bit  beep         @ (unsigned)&PORTB*8+2; //buzzer 
bit  a_4052       @ (unsigned)&PORTB*8+4;    // 
bit  auto_manual  @ (unsigned)&PORTB*8+5; //手动自动模式设置
bit  mid4_enable  @ (unsigned)&PORTB*8+6;//1-4节分电压4052使能端
bit  mid5_enable  @ (unsigned)&PORTB*8+7;//第5节分电压4052使能端

bit  a_138    @ (unsigned)&PORTC*8+0; //a-138
bit  b_138    @ (unsigned)&PORTC*8+1; //b-138
bit  c_138    @ (unsigned)&PORTC*8+2; //c-138
bit  e_138    @ (unsigned)&PORTC*8+3; //ENABLE——
bit  pwr_up   @ (unsigned)&PORTC*8+4; //pwr_up  口线上电接通+12V输入控制端,

bit  b_4052        @ (unsigned)&PORTC*8+5; //a-4051
bit  clk_164       @ (unsigned)&PORTC*8+6; //run_stop i/o
bit  data_164      @ (unsigned)&PORTC*8+7; //run_stop i/o
bit  eep_run,flag_run,flag_stop,flag_shift,flag_second,mode_flag;	
//---------------------------
//以下定义为指示灯位标记地址!!!
/*
bit  b_dis   @  (unsigned)&ram8*8+7; 
bit  b_char  @  (unsigned)&ram8*8+6;
bit  b_pulse @  (unsigned)&ram8*8+5;
bit  b_time @  (unsigned)&ram8*8+4; 
bit  b_vol  @  (unsigned)&ram8*8+3;
bit  b_cur  @  (unsigned)&ram8*8+2; 
*/ 
//--------------------------------------------------------       
const unsigned char dispcode[14]={0x04,0xc7,0x88,0x81,0x43,
             0x21,0x20,0x87,0x00,0x01,0xff,0x1c,0xff,0x1c};
//常数型 数组 0123456789段码
//const unsigned char *point;
//unsigned char dispbuf[6]={0,0,0,0,0,0};//缓冲数组
union{ 
     unsigned int  set_dtime; 
     unsigned char set_dtimeh,set_dtimel;	 
     }time; 
//--------------------------------
union{
struct {    
      unsigned b0:1;     
	  unsigned b_mid5:1;
	  unsigned b_cur:1; //3
      unsigned b_vol:1; //5 
      unsigned b_mid1:1;     
      unsigned b_mid2:1;//6 
      unsigned b_mid3:1;
 	  unsigned b_mid4:1;   
        }led;
       unsigned char ram8;
      }bits;        
//**************中断SERVICE程序****************************
void  interrupt ISR(void) //中断服务程序 
{ 
   if (T0IE && T0IF)   //
   { 
   T0IF = 0;    //清      
   } 
   if (TMR1IE && TMR1IF) //
   { 
   TMR1IF = 0;   //清
   TMR1H = 0x3c; 
   TMR1L = 0xaf; //15535;
   if (one_second!=0){one_second=one_second-1;return;}
        else {one_second=20;}     
   if (one_minute!=0){one_minute=one_minute-1;return;}
         else {one_minute=60;}//60;
        real_time=real_time+1;  
        flag_second=1;//one time occuppy    	
        //CLRWDT();
        /*
        EEPGD =0;  
	    EEADR  = 0x30;
        EEADRH = 0x00;
	    EEDATA=0X20;//real_time; //;写入时间 
	    WREN   = 1;	    
	    EECON2 = 0x55;
	    EECON2 = 0xaa;
	    WR = 1;    
	    while(WR == 1);
	    WREN  = 0;	    
        TMR1IF = 0;//清
        return;    */  
   } 
}
//-------------------------------------
void to_74hc164(unsigned char dd)//
{
    //int j; //局部变量i
    for (j=0;j<8;j++) 
     {   
      data_164=(bit)(dd&0x01);   
      clk_164=1;
      asm("nop");asm("nop"); 
      clk_164=0;
      asm("nop");asm("nop"); 
      dd=dd>>1;   
     }   
}    
//****************1ms延时程序******************
void delay_1ms(unsigned int i)
{
unsigned char j;
for(;i!=0;i--)
for(j=141;j!=0;j--);
}
///****************按键检测*********************
//-----------------------------------
//以下开始扫描按扭
//-----------------------------------
void shift_scan(void)
{
asm("nop");
temp=0x7f;
to_74hc164(temp);
delay_1ms(3);
if (three==0)
  {
  if (flag_shift==1) 
     {
     flag_shift=0;     
     buzzer();
     shift=shift+1;  
     }       
  } 
 else 
 {
 flag_shift=1;
 }
//-----------------------------------------
 if (shift>=8) shift=1;   
  {
       bits.ram8=0xff;
       switch (shift)
       {
       case 1:
			  {			
               if(set_work==0)//判断是否处于工作/设置电流模式
                {
                 long_temp=real_dcur;
                }
                else
                {                
                 long_temp=set_dcur;
                }               
               to_bcd_to_display_ram();
               bits.led.b_vol=0;    break;//*1*/	
     		  }           
	   case 2:
			  { 
               if(set_work==0)//判断是否处于工作/设置电流模式
                {
                 long_temp=real_dvol;
                }
                else
                {                
                 long_temp=set_dvol;
                }                     
			   to_bcd_to_display_ram();	
               bits.led.b_cur=0;    break;//*2*/	 
              }             
	   case 3:
			  {
               long_temp=vol_mid1;
			   to_bcd_to_display_ram();
               bits.led.b_mid1=0;   break; 
              }         
	   case 4:
              {
		       long_temp=vol_mid2;
			   to_bcd_to_display_ram();
			    bits.led.b_mid2=0;   break; 
			  }
	   case 5:
			  {
			   long_temp=vol_mid3;
               to_bcd_to_display_ram();
               bits.led.b_mid3=0;   break;
              }                   
	   case 6:
			  {
               long_temp=vol_mid4;
               to_bcd_to_display_ram();
               bits.led.b_mid4=0;   break;
              }
      case 7:
			  {
               long_temp=vol_mid5;
               to_bcd_to_display_ram();
               bits.led.b_mid5=0;   break;
              }                            
       default:   break;      
	   }
   return;  
  }        
}
//---------------
void  run_scan(void)
{
temp=0xdf;
to_74hc164(temp);
delay_1ms(3);
if (three==0) 
  {
       eep_run=0; 
     if(flag_run==1)
       {         
       flag_run=0; //只有在非充电时间设置模式,蜂鸣和按钮弹起才使能
       buzzer(); 
       if(auto_manual==1)
         {
          if(mode_flag==1)   
            {            
             dischar_con=0;    //放电控制端关闭
             ln_con=0;         //开始220v充电            
	         real_time=0;
	         T1CON|=0x01;      //TMR1ON=1; //tmr0 run; 
	         TMR1ON=1;         //TIMER run
	         TMR1IE=1;
	         GIE=1;
	         return;
            }        
         }
       else 
         {  
          if(mode_flag==0)   
            {    
             ln_con=1;         //开始关闭220v充电                
             dischar_con=1;    //放电控制端开启                 
	         real_time=0;
	         T1CON|=0x01;      //TMR1ON=1; //tmr0 run; 
	         TMR1ON=1;         //TIMER run
	         TMR1IE=1;
	         GIE=1;
	         return;
            }  
         }        
       } 
  }
else 
  {
   flag_run=1;    
  } 
}
//---------------
void  stop_scan(void)
{
temp=0xbf;
to_74hc164(temp);
delay_1ms(3);
if (three==0) 
  {
  if(flag_stop==1)
   {         
    flag_stop=0; //只有在非充电时间设置模式,蜂鸣和按钮弹起才使能
    buzzer();
    //ln_con=1;//220V 继电器关闭
    dischar_con=0;//放电控制端开启关闭
    TMR1ON=0;         //TIMER run
    TMR1IE=0;
    //GIE=1;
   }
  } 
else 
  {
   flag_stop=1;   
  }    
} 
//-----------------------------------------
//以下为拨动开关状态检测函数
void bodong(void)
{
  if(auto_manual==1)
    {
     if(mode_flag==0)  //表示已经发生过开关扳动  
      {
       mode_flag=1;
       ln_con=1;         //关闭220v充电  
       delay_1ms(3);
       dischar_con=0;//放电控制端停止     	         
	   TMR1ON=0;     //tmr0 run;           
       return;
      }
     else
      {
       return;
      }
    } 
  else 
    {
      if(mode_flag==1)  //表示已经发生过开关扳动  
      {
       mode_flag=0;
       ln_con=1;         //关闭220v充电  
       delay_1ms(3);
       dischar_con=0;//放电控制端停止       
	   TMR1ON=0;     //tmr0 run;           
       return;
      }
     else
      {
       return;
      }
    }
}
//==========================================
//-----------5次平均实际电流处理-------
void average_real_cur(void)
{     asm("nop");
      if(average<10)
       {
        average=average+1;//五次平均累加
        average_temp=(average_temp+long_temp);		
        return;
       }       
      else 
       {
        average=0;
        real_ccur=real_dcur=(average_temp/10);
        average_temp=0;
       }
}
//--------------5次平均实际电流电压处理----
void average_real_vol(void)
{     asm("nop");
      if(average<10)
       {
        average=average+1;//五次平均累加
        average_temp=(average_temp+long_temp);		
        return;
       }       
      else 
       {
        average=0;
        real_cvol=real_dvol=(average_temp/10);
        average_temp=0;
       }
}
//==========================================
void buzzer(void)
{
   asm("nop");
   beep=1;
   delay_1ms(12);   
   beep=0;
}
//============================================
void led_display(void)
{      
   asm("nop");  
   asm("nop");   
   e_138=1;//enable  74hc138 select    
   temp=dispcode[ram4];
   temp|=0x10;
   to_74hc164(temp);
   e_138=0;a_138=0;b_138=0;c_138=0;
   delay_1ms(2);     //延

⌨️ 快捷键说明

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