📄 ceshi2.c
字号:
#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 + -