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

📄 复件 new400_c.c

📁 实现了蓄电池电压与电流采集的16f873a 程序!!!
💻 C
📖 第 1 页 / 共 2 页
字号:
   e_138=1;//a_138=1;b_138=1;c_138=1;
   temp=dispcode[ram3]; 
   if(shift==2)temp|=0x10;  
   to_74hc164(temp);
   e_138=0;a_138=1;b_138=0;c_138=0;
   delay_1ms(2);     //
   e_138=1;//a_138=1;b_138=1;c_138=1;
   temp=dispcode[ram2];
   if(shift!=2)temp|=0x10; 
   to_74hc164(temp);
   e_138=0;a_138=0;b_138=1;c_138=0;
   delay_1ms(2);     //
   e_138=1;//a_138=1;b_138=1;c_138=1;
   temp=dispcode[ram1];
   temp|=0x10;
   to_74hc164(temp);
   e_138=0;a_138=1;b_138=1;c_138=0;
   delay_1ms(2);     //
   e_138=1;//a_138=1;b_138=1;c_138=1;
//--------------------
   if(flag_second==1)//此处完成实际时间显示的转换
    {
      flag_second==0;
      long_temp=real_time;
      to_bcd_to_display_ram();
      ram5=ram1;
      ram6=ram2;
      ram7=ram3;
    }
//---------------------
   temp=dispcode[ram7];
   temp|=0x10;
   to_74hc164(temp);
   e_138=0;a_138=0;b_138=0;c_138=1;
   delay_1ms(2);     //
   e_138=1;//a_138=1;b_138=1;c_138=1;
   temp=dispcode[ram6];
   temp|=0x10;
   to_74hc164(temp);
   e_138=0;a_138=1;b_138=0;c_138=1;
   delay_1ms(2);     //
   e_138=1;//a_138=1;b_138=1;c_138=1;
   temp=dispcode[ram5];
   temp|=0x10;
   to_74hc164(temp);
   e_138=0;a_138=0;b_138=1;c_138=1;
   delay_1ms(2);     //
   e_138=1;//a_138=1;b_138=1;c_138=1; 
//-----------------------

//-----------------------
   temp=bits.ram8;
   if(set_work==0)
     {    
      if (TMR1ON==0)//实现 指示灯的运/停 亮暗;
         {        
          temp=0xff;
         }
      else
         {
         temp=bits.ram8;
         }
     } 
   to_74hc164(temp); 
   e_138=0;a_138=1;b_138=1;c_138=1;
   delay_1ms(2);     //   
   e_138=1;//a_138=1;b_138=1;c_138=1;
   to_74hc164(0xff);//送出数码管段选熄灭保护处理
} 
//---------------------------------
void ad_change(void)
{  
    asm("nop");
    asm("nop");
    if (ad_delay<7){ad_delay=ad_delay+1;return;}//ad_delay time   
       else   {ad_delay=0;}       
       switch (ad_channel)
       {//----RA,0通道中的4路set_cur,real_vol,real_cur,set_dvol
		case 1: ADCON0=0xc0;a_4052=0;b_4052=0;break;//;11 000/000 000
        case 2: ADCON0=0xc0;a_4052=1;b_4052=0;break;//;11 000/001 000
        case 3: ADCON0=0xc0;a_4052=0;b_4052=1;break;//RA5;实际电流通道
        case 4: ADCON0=0xc0;a_4052=1;b_4052=1;break;//RA5;实际电流通道
        //----RA,1通道中的5路分电压
		case 5: ADCON0=0xc8;mid4_enable=0;mid5_enable=1;a_4052=0;b_4052=0;break;//;11 000/010 000
        case 6: ADCON0=0xc8;mid4_enable=0;mid5_enable=1;a_4052=1;b_4052=0;break;// 
        case 7: ADCON0=0xc8;mid4_enable=0;mid5_enable=1;a_4052=0;b_4052=1;break;//
		case 8: ADCON0=0xc8;mid4_enable=0;mid5_enable=1;a_4052=1;b_4052=1;break;//
        case 9: ADCON0=0xc8;mid4_enable=1;mid5_enable=0;a_4052=0;b_4052=0;break;//
	    default: break;
       }  
    ADCON1=0x85;  //D VREF+ D A A      
    delay_1ms(9); // 
    ADON=1;   	
    ADFM=1;   //the ad results = adresh(2) + adresl(8);  
    ADIF=0;
    ADIE=0;   
    ADGO=1;   
    while(ADGO)//
       { 
       asm("nop");
       }  
    //e_4051=1;  
    long_temp=((ADRESH*256)+ADRESL);  
        switch (ad_channel)
       {//----RA,0通道中的4路set_cur,real_vol,real_dcur,set_dvol
        case 1: 
               {  
                long_temp=((long_temp*993)/1000);             
                set_dcur=long_temp;break;//                
               } 
        case 2:
			   {
                long_temp=((long_temp*820)/1000);	
                real_dvol=long_temp;break;//
               }  
        case 3: 
               { 
                long_temp=((long_temp*1339)/1000);               
                real_dcur=long_temp;break;//                
               } 
        case 4:
			   {
                long_temp=(((long_temp*248)/1000)+315);	
                set_dvol=long_temp;break;//
               }  
		case 5: 
               {
                if(long_temp>10)
                 {
                 long_temp=((long_temp*4337)/1000-794);
                 vol_mid1=long_temp;break;//
                 }
                else
                 {
                 vol_mid1=0;break;//
                 }
               }          
        case 6:
               {if(long_temp>10)
                 {                 
                 long_temp=((long_temp*3000)/1000-325);
                 vol_mid2=long_temp;break;//
                 }
                else
                 {
                 vol_mid2=0;break;//
                 }
               }          
        case 7:
               {
                if(long_temp>10)
                 {     
                 long_temp=((long_temp*2448)/1000-181);
                 vol_mid3=long_temp;break;//
                 }
                else 
                 {
                 vol_mid3=0;break;// 
                 }
               }          
		case 8:
               {
                if(long_temp>10)
                 {   
                 long_temp=((long_temp*2356)/1000-194);
                 vol_mid4=long_temp;break;//
                 }
                else
                 {
                 vol_mid4=0;break;// 
                 }
               }                           	
        case 9:
               {
                if(long_temp>10)
                 {   
                 long_temp=((long_temp*4337)/1000-794);
                 vol_mid5=long_temp;break;//
                  }
                else
                 {
                 vol_mid5=0;break;// 
                 }
               }                           	
        default:  break;
       }   
//---------------------------------
   if(average!=0){return;}//如果平均数一次取完;     
     
   if(ad_channel<9)//才允许通道数增加;
     {ad_channel=ad_channel+1;}
   else 
     {ad_channel=1;}      
   return;
}
//*******************to  bcd**********************
void  to_bcd_to_display_ram(void)
{ 
if (long_temp<1000)ram4=0;
       else  
            {
              ii=0;
              while(1)
              {
              long_temp=long_temp-1000;
              ii=ii+1;
              if (long_temp<1000)break;
              }   
              ram4=ii;             
            } 
    if (long_temp<100) ram3=0;
       else  {
                ii=0;
              while(1)
                {
                long_temp=long_temp-100;
                ii=ii+1;
                if (long_temp<100)break;
                }   
              ram3=ii;
             }

    if (long_temp<10) {ram2=0;ram1=long_temp;}
       else  {
                ii=0;
              while(1)
                {
                long_temp=long_temp-10;
                ii=ii+1;
                if (long_temp<10)break;
                }   
              ram2=ii;
              ram1=long_temp;
             }
             return;
} 
//***************端口初始化***********************
void port_init(void)
{
    asm("nop");   
	OPTION=0x07; 
	ADCON1=0x05;      //D VREF+ D A A
	TRISA=0x1f;      
	PORTA=0x00;        //A
	TRISB=0x20;       //
	PORTB=0x00;       //B
    ln_con=1;
	TRISC=0x00;       
	PORTC=0x00;       //C
	T1CON=0xc0;       //"11000000"   1:8 prescale value
	PIE1=0x01;
    ADIE=0;           //disable ad interrupt
    INTCON=0X40;

    TMR1ON=0;         //TIMER run  
	T0IF=0;           //clear 中断 flag   
	T0IE=0;           //enable  TMR0中断	
}
//***************TMR0初始****************
void tmr1_init(void)
{
GIE=1;                  //开启全局中断
//T0IF=0;                //清中断标志
//T0IE=0;                //允许TMR0中断
TMR1IF=0;
PIR1=0x00;
PIE1=0x01;
TMR1IE=1; 
TMR1ON=0;
}
//***************************************
//*************主程序********************
void main(void)
{
    asm("nop");
    asm("nop");
	asm("nop");
    ad_delay=0;
    real_time=0x0000;
    time.set_dtime=0x0000;
    real_dcur=1;real_dvol=2;
	set_dcur=3;set_dvol=4;
    
    ram1=1;ram2=0;ram3=0;ram4=0;ram5=0;ram6=0;ram7=0;
    bits.led.b_cur=0;bits.led.b_vol=1;// 
    bits.led.b_mid1=1;
    bits.led.b_mid2=1;
    bits.led.b_mid3=1;
    bits.led.b_mid4=1;     
    bits.led.b0=1; 
    bits.led.b_mid5=1;

    eep_run=0;    //动过充电设置时间需要写入eep标记
    ad_delay=0;   //ad 延时常数
    shift=2;      //首先SHIFT切换位置落在电流查看项;
    ad_channel=1; //AD通道首先从0开始;
    dischar_con=1;//首先关闭放电动作    
    one_second=20;//累计一秒 
    one_minute=60;//累计一分    
    GIE=0;        //disable all interrupt  
//------------------    
    port_init();    
    if(auto_manual==1)mode_flag=1;
     else mode_flag=0;  //此处率先采样自动——手动模式作为一个判断底数
//------------------
    buzzer(); 
//----以下为实际设置充电时间读出
    EEPGD =0;  
    EEADR = 0x69;
    RD    = 1;
    while(RD == 1);
    time.set_dtimeh=EEDATA;  //设置充电时间高字节 
    EEADR = 0x6A;
    RD    = 1;
    while(RD == 1);
    time.set_dtimel=EEDATA;  //设置充电时间低字节 

    if (time.set_dtimeh==0xff)
       {
	    //CLRWDT();
        EEPGD =0;  
        EEADRH = 0x00;
	    EEADR  = 0x69;
	    time.set_dtimeh=EEDATA=0x00;//;
	    WREN   = 1;
	    GIE    = 0;
	    EECON2 = 0x55;
	    EECON2 = 0xaa;
	    WR     = 1;    
	    while(WR == 1);
        EEADR  = 0x6A;
	    time.set_dtimel=EEDATA=60;//;
	    WREN   = 1;
	    GIE    = 0;
	    EECON2 = 0x55;
	    EECON2 = 0xaa;
	    WR     = 1;    
	    while(WR == 1);
	    WREN   = 0;	      
       } 
    else
//----以下为实际放电时间 掉电读出
    {
    //CLRWDT();
    EEPGD =0;   
    EEADR = 0x30;
    RD = 1;
    while(RD == 1);
    real_time=EEDATA; 
    if (real_time==0x00ff)
       {
	    //CLRWDT();
        EEPGD =0;  
	    EEADR  = 0x30;
	    real_time=EEDATA = 0;//0x3f;
	    WREN   = 1;
	    GIE    = 0;
	    EECON2 = 0x55;
	    EECON2 = 0xaa;
	    WR     = 1;    
	    while(WR == 1);
	    WREN   = 0;
        average=0x0;    
        average_temp=0x00;
	    GIE    = 0;   
       }      
    }   
//------------------
    delay_1ms(100);    //延	
    tmr1_init();   //tmr0 初始  
    pwr_up=1;      //开启上电小继电器
    pwr_up=1;      //开启上电小继电器 
    while(1)
	{
    asm("nop");
    ad_change();
//----------------
  /*  if((TMR1ON==1)&&(0))
       {
       dischar_con=1; //停止放电
       T1CON&=0xfe;//TMR1ON=0;//tmr0 stop
       buzzer();
       }   */   
//---------------- 
    asm("nop");   
    bodong();  //监测自动/手动模式拨动开关状态是否改变
    asm("nop");    
    shift_scan();      //
    asm("nop");   
	led_display();
    asm("nop");   
    run_scan();  
    asm("nop");   
    stop_scan();  
    }
}
//----------------
/*#asm
#endasm */

⌨️ 快捷键说明

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