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

📄 ceshi2.c

📁 电能表误差测试仪的代码.为c语言编写.实现测量实时保存功能.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "PL3105.h"

#define uchar unsigned char
#define uint  unsigned int

/*常量定义*/
#define  CHECK_TIME  600   //3秒钟
#define  PULSE_DZ_CN 5    //电子表收到PULSE_DZ_CN个脉冲后,显示误差
#define  PULSE_JX_CN 4    //机械表收到PULSE_JX_CN个脉冲后,显示误差

/****** I/O 口设置 ********/

sbit  pulse_bz_input  = P1^5;    //标准脉冲采样
sbit  pulse_dz_input  = P1^6;    //电子脉冲采样
sbit  pulse_jx_input  = P1^7;    // 机械脉冲采样                
sbit  beep            = P1^4;    // 峰鸣器驱动                
sbit  relay           = P3^0;    // 继电器驱动
sbit  an_set_dz_input = P3^3;    // 电子表常数设置
sbit  an_set_jx_input = P3^2;    // 机械表常数设置                
sbit  an_start_input  = P3^4;    // 开始检表
sbit  lamp_cs         = P1^0;     // 显示常数指示灯
sbit  lamp_wc         = P1^1;     // 显示误差指示灯


uchar data   pulse_bz_pb;  //标准表脉冲判别
uchar data   pulse_jx_pb;  //机械表脉冲判别
uchar data   pulse_dz_pb;  //电子表脉冲判别

uchar data   pulse_bz_flag;  //标准表脉冲标志
uchar data   pulse_jx_flag;  //机械表脉冲标志
uchar data   pulse_dz_flag;  //电子表脉冲标志

uint  data   pulse_bz_cn;  //标准表脉冲计数器
uint  data   pulse_jx_cn;  //机械表脉冲计数器
uint  data   pulse_dz_cn;  //电子表脉冲计数器
uint  data   pulse_bz_time;  //标准表脉冲计时
uint  data   pulse_jx_time;  //机械表脉冲计时
uint  data   pulse_dz_time;  //电子表脉冲计时
uint  data   pulse_bz_t;  //标准表脉冲临时计时
uint  data   pulse_jx_t;  //机械表脉冲临时计时
uint  data   pulse_dz_t;  //电子表脉冲临时计时

uchar data   an_set_dz_cn;   //电子表常数设置按键按下的时间计数器(5毫秒的倍数)
uchar data   an_set_jx_cn;   //机械表常数设置按键按下的时间计数器(5毫秒的倍数)
uchar data   an_start_cn;    //开始按键按下的时间计数器(5毫秒的倍数)

uchar data  an_start_flag;   //开始检测按键按下的标志
uchar data  check_step;    //
uint  data  check_time;     //
uchar data  error;          //检查脉冲时出错
uchar data  check_pulse;       //检查脉冲
uchar data  sign_flag;           //+-符号
uchar data  current_type;    //当前待测表型号.'D'为电表;'J'为机械表.
uchar data  showing;        // 当前表常数正在显示.0隐藏,'D'正在显示电表常数,'J'正在显示机械表常数.
uchar data  dz_cs_cn;       //电子表常数序号 0:6400 1:3200 2:1600 3:800
uchar data  jx_cs_cn;       //机械表常数序号


uchar data  led_show_list[6];//数码管显示的数据 

uchar data  led_show_flag;       //可刷新数码管显示的标志   
uchar data  key_cn;          //按键按下的时间(5毫秒的倍数)
uchar data  key_time;        //按键屏蔽时间
uchar data  flash_flag;      //闪灯标志 
uchar data  flash_cn;        //闪灯计数器
uchar data  flash_time;      //闪烁节奏定时器
uchar data  flash_ok;        //允许闪

uchar data  watchdog_reset; //看门狗可清标志


/**************************************************************************************
 *
 * FUNCTION:    initsys
 *
 * DESCRIPTION: 初始化设置函数,
 *              进行系统初始化设置
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void initsys(void)
{
  CKCON=0X3F;                       // 控制看门狗喂狗时间长度为832ms (0x8EH)
  ALU_MOD=0;                        // 8位/16位运算模式选择位 ; 设置成8位运算模式 (D0H^1)

  LED_LCD =1;                       // 打开数码管显示

//载波通讯配置
  PLM_SSC=0;                           // (D8H)使能载波通讯PLM_SSC(EXT_CFG.0)=1
  EIE=0X00;                            // (A9H 使能INT2中断(EX2=1)
  IT2=1;                               // (C8H) 为边沿触发方式(IT2=1)。
  PLM_RS=0;                            // PLM_RS(EXT_CTRL.0)=1  为0时,载波处于接收状态

  // T0设置为定时方式
  TMOD=0x21;                        // 设 T/C1 为模式2,8 位自装载计数器 ;T/C0 为模式1, 定时方式,16 位计数器
  TH0=0xF8;                         // 定时器0中断配置
  TL0=0x30;                         // 定时 5ms 一个定时中断
  TR0 =1;                           // 启动 T0 定时器
  ET0 =1;                           // 允许定时器 T0 中断

  
  EA=1;                             // 开总中断


}


/**************************************************************************************
 *
 * FUNCTION:    initsys_ref
 *
 * DESCRIPTION: 初始化重置函数,
 *              进行系统初始化重置
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void initsys_ref(void)
{
   if(ALU_MOD!=0)
   {ALU_MOD=0;
   }
   //载波通讯重置

   if(PLM_SSC!=0)
   {PLM_SSC=0;
   }
   if (EIE!=0x00)
   {EIE=0x00;
   }                          // (A9H 使能INT2中断(EX2=0)

   // T0设置重置为定时方式
   if (TMOD!=0x21)                        // 设 T/C1 为模式2,8 位自装载计数器 ;T/C0 为模式1, 定时方式,16 位计数器
   {TMOD = 0x21;
   }
   if (TR0!=1)                            // 启动 T0 定时器
   {TR0 = 1;
   }
   if (ET0!=1)
   {ET0=1;
   }
   if (EA!=1)                             // 开中断
   {EA=1;
   }

   if(LED_LCD!=1)
   {LED_LCD=1;                         // 打开数码管显示
   }
   
   pulse_bz_input=1;pulse_dz_input=1;pulse_jx_input=1; 
   an_set_dz_input=1;an_set_jx_input=1;an_start_input=1;
}


/**************************************************************************************
 *
 * FUNCTION:    timeint0
 *
 * DESCRIPTION: 定时器0中断程序,5ms 发生一次中断,
 *              对延时变量进行减1处理
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void  timeint0(void) interrupt 1
{
	 if(check_pulse=='C')
	 {
      //<<<<<<<<<读取脉冲
     if(pulse_bz_flag=='M')
     {  pulse_bz_t++;
     }	 
     pulse_bz_pb<<= 1;                //标准表脉冲
     if(pulse_bz_input==1)
     {
        pulse_bz_pb++;
     }
     if(pulse_bz_pb==0x03)
     {
        pulse_bz_cn++;
        pulse_bz_time+=pulse_bz_t;
        pulse_bz_t=0x00;
        pulse_bz_flag='M';
        check_time=CHECK_TIME;
     }

     if(current_type=='D')
     {
     	  if(pulse_dz_flag=='M')
        {  pulse_dz_t++;
        }
        pulse_dz_pb<<= 1;                 //待测电子表脉冲
        if(pulse_dz_input==1)
        {
           pulse_dz_pb++;
        }
        if(pulse_dz_pb==0x03)
        {
           pulse_dz_cn++;
           pulse_dz_time+=pulse_dz_t;
           pulse_dz_t=0x00;           
           pulse_dz_flag='M';
           if(pulse_dz_cn >= PULSE_DZ_CN )
           {  check_pulse='F';          //脉冲检测完毕,通知计算显示误差
           }	
        }
     }
     
     if(current_type=='J')
     {
     	  if(pulse_jx_flag=='M')
        {  pulse_jx_t++;
        }
        pulse_jx_pb<<= 1;                 //待测机械表脉冲
        if(pulse_jx_input==1)
        {
           pulse_jx_pb++;
        }
        if(pulse_jx_pb==0x03)
        {
           pulse_jx_cn++;
           pulse_jx_time+=pulse_jx_t;
           pulse_jx_t=0x00;           
           pulse_jx_flag='M';
           if(pulse_jx_cn >= PULSE_JX_CN )
           {  check_pulse='F';          //脉冲检测完毕,通知计算显示误差
           }	
        }
     }     

   }                           //>>>>>
    //<<<<<<<<按键
   key_cn++;                     
   if(key_cn>10)
   {  key_cn=0;
      an_set_dz_cn=0;
	    an_set_jx_cn=0;
	    an_start_cn=0;
   }
   if(key_time!=0)
   {
      key_time--;
   }

   if(key_time==0)
   {
       if(an_set_dz_input==0)            //电子表按下常数设置按键.
       {an_set_dz_cn++;}
   
       if(an_set_jx_input==0)            //机械表按下常数设置按键.
       {an_set_jx_cn++;}

       if(an_start_input==0)            //按下开始按键.
       {an_start_cn++;}
   }
  
  
   if((an_set_dz_input==1)&(an_set_jx_input==1))            //电子表按下常数设置按键.
   {an_set_dz_cn=0;key_time=0;}

   flash_time--;
   if(flash_time==0)
   {
      flash_time=30;
	    flash_ok='F';
   }
 //>>>>>>>按键
   if(check_time!=0x00)
   {check_time--;
   }
   if(watchdog_reset==0x9a)
   {
      WDT_RST=0xa1;                         // 清看门狗
      watchdog_reset=0;
   }

   TH0=0xF8;                                // 置定时器计数   5ms 中断一次( 9.6/2 )
   TL0=0x30;

}
/**************************************************************************************
 *
 * FUNCTION:    LED_DIS_TEST
 *
 * DESCRIPTION:  数码管显示测试程序
 *               将数码管全部点亮,可以检查数码管是否有问题
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void led_dis_test()
{
  uchar i;
  for(i=0x10; i<0x1c; i++)
  {
     EXT_ADR=i;
     EXT_DAT=0xFF;
  }

}
/**************************************************************************************
 *
 * FUNCTION:    LCD_DIS_CLEAR
 *
 * DESCRIPTION:  数码管显示清屏程序
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void led_dis_clr()
{
  uchar i;
  for(i=0x10; i<0x1c; i++)
  {
    EXT_ADR=i;
    EXT_DAT=0x00;
  }
}

void led_dis_hello()
{
   EXT_ADR=0x10;
   EXT_DAT=0x3f;

   EXT_ADR=0x11;
   EXT_DAT=0x38;

   EXT_ADR=0x12;
   EXT_DAT=0x38;

   EXT_ADR=0x13;
   EXT_DAT=0x79;
   
   EXT_ADR=0x14;
   EXT_DAT=0x76;

   EXT_ADR=0x15;
   EXT_DAT=0x00;
}
/**************************************************************************************
 *
 * FUNCTION:    do_key
 *
 * DESCRIPTION:  按键处理,判断哪个按键按下了
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/ 
void do_key(void)
{
     uchar i;
     if(an_set_dz_cn >= 5 )
     {  
	     an_set_dz_cn=0;
	     key_time=200;
	     if(showing=='D')
	     {dz_cs_cn++;
	     }
	     else
	     {showing='D';
	     }
		   if(dz_cs_cn >= 4)
       {dz_cs_cn=0;
		   } 
		   i=dz_cs_cn+dz_cs_cn+dz_cs_cn+dz_cs_cn;
		   led_show_list[0]=encoder[dz_cs_list[i+3]];
		   led_show_list[1]=encoder[dz_cs_list[i+2]];
		   led_show_list[2]=encoder[dz_cs_list[i+1]];
		   led_show_list[3]=encoder[dz_cs_list[i]];

⌨️ 快捷键说明

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