📄 ceshi1.c
字号:
#include "PL3105.h"
#define uchar unsigned char
#define uint unsigned int
/****** I/O 口设置 ********/
sbit pulse_bz = P1^5; //标准脉冲采样
sbit pulse_dz = P1^6; //电子脉冲采样
sbit pulse_jx = P1^7; // 机械脉冲采样
sbit beep = P1^4; // 峰鸣器驱动
sbit relay = P3^0; // 继电器驱动
sbit an_set_dz = P3^3; // 电子表常数设置
sbit an_set_jx = P3^2; // 机械表常数设置
sbit an_start = 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; //电子表脉冲计数器
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; // 打开数码管显示
}
}
/**************************************************************************************
*
* FUNCTION: timeint0
*
* DESCRIPTION: 定时器0中断程序,5ms 发生一次中断,
* 对延时变量进行减1处理
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void timeint0(void) interrupt 1
{
pulse_bz=1;pulse_dz=1;pulse_jx=1; //<<<<<<<<<读取脉冲
pulse_bz_pb<<= 1; //标准表脉冲
if(pulse_bz==1)
{
pulse_bz_pb++;
}
if(pulse_bz_pb==0x03)
{
pulse_bz_flag='M';
}
pulse_dz_pb<<= 1; //待测电子表脉冲
if(pulse_dz==1)
{
pulse_dz_pb++;
}
if(pulse_dz_pb==0x03)
{
pulse_dz_flag='M';
}
pulse_jx_pb<<= 1; //待测机械表脉冲
if(pulse_jx==1)
{
pulse_jx_pb++;
}
if(pulse_jx_pb==0x03)
{
pulse_jx_flag='M';
} //>>>>>
//<<<<<<<<按键
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)
{
an_set_dz=1;an_set_jx=1;an_start=1;
if(an_set_dz==0) //电子表按下常数设置按键.
{an_set_dz_cn++;}
if(an_set_jx==0) //机械表按下常数设置按键.
{an_set_jx_cn++;}
if(an_start==0) //按下开始按键.
{an_start_cn++;}
}
if((an_set_dz==1)&(an_set_jx==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]];
led_show_list[4]=0x00;
led_show_list[5]=0x00;
led_show_flag='S';
current_type='D'; //当前待测表为电子表
// lamp_cs=0; //常数指示灯
// lamp_wc=1; //误差指示灯
}
if(an_set_jx_cn >= 5 )
{
an_set_jx_cn=0;
key_time=200;
if(showing=='J')
{jx_cs_cn++;
}
else
{showing='J';
}
if(jx_cs_cn >= 8)
{jx_cs_cn=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -