📄 main.c
字号:
//--------------------------------------------------------------------------//
// 源程序 //
// (c) Copyright 2004-2005 sunzefeng //
// All Rights Reserved //
// V1.6 //
//--------------------------------------------------------------------------//
//标 题: KET-S1型输液泵 //
//文件名: KET.PRJ //
//版 本: V1.6(2006.04.04第6版) //
//修改人: sunzefeng E-mail:sunzefeng11@163.com //
//日 期: 05-03-23 //
//描 述: 带液滴检测器版 //
//声 明: //
//--------------------------------------------------------------------------//
#include <REG54.H>
#include <intrins.h>
#include <zk2.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long int
#define FLASE 0
#define TRUE 1
#define TH0DATA 0x15
#define TL0DATA 0xc0
#define POWER 0x03
#define SELECT 0x02
#define CLR 0x20
#define START 0x08
#define STOP 0x80
#define INC 0x04
#define INCC 0x01
#define DEC 0x40
#define DECC 0x10
#define ZHUHE 0x11
#define clrdata 10000
#define JingDuInit1 5000 //1000-901
#define JingDuInit2 5200 //900-801
#define JingDuInit3 5300 //800-701
#define JingDuInit4 5400 //700-601
#define JingDuInit5 5500 //600-501
#define JingDuInit6 5700 //500-401
#define JingDuInit7 6200 //400-301
#define JingDuInit8 6500 //300-201
#define JingDuInit9 7300 //200-101
#define JingDuInit10 8300 //100-1
#define qipaoconstant 150
#define yaliconstant 150
#define Warnaddr 20
#define canshuadr 8
#define canshuadr1 35
#define canshuadrh 11
#define QIPAODATA 0X01
#define PAIKONGDATA 0X02
#define ZHUSAIDATA 0X03
#define DOORDATA 0X04
#define OVERDATA 0X05
#define LOWBATDATA 0x09
#define SYSTEMTROUBLE 0x10
#define BATLOWSTOP 0x11
#define YEDISHIXIAO 0x12
#define INSTALLHINT 0x13
//======LED desin============
#define GLED1 0x60
#define GLED2 0x48
#define GLED3 0x50
#define RLED1 0x04
#define RLED2 0x02
#define RLED3 0x01
#define GFLED 0x78
#define RFLED 0x07
#define OFFLED 0x00
#define STOPLEDON 0XBF;
#define STOPLEDOFF 0X40;
#define CLRWDT WDT=0;WDT=0;WDT=0;WDT=0;WDT=1;
sbit Int1= P3^3;
sbit YEDIFlag= P1^7;
sbit ShutOff =P3^4;
sbit DoorFlag =P2^5;
sbit ACFlag =P2^1;
sbit EL_LCD =P1^0;
sbit KEY_POWER =P2^0;
sbit WDT =P1^5;
//=============外部函数声明==================
extern void LcmInition( void ); //液晶初始化
extern void LcmClear( void );
extern void Displayspeed(uchar col,uchar row,uchar hzcode);
extern void Displaytime(uchar col,uchar row,uchar hzcode);
extern void DisplayTotal(uchar col,uchar row,uchar hzcode);
extern void DisplayCanShu(uchar col,uchar row,uchar hzcode);
extern void Displayyedichar(uchar col,uchar row,uchar hzcode);//显示点滴计数值
extern void Displayonebmp3(uchar col,uchar row,uchar x,uchar y,uchar *adr);
extern void DisplayClear(uchar col,uchar row,uchar x,uchar y);
extern void DisplayOn(uchar x1,uchar y1,uchar x2,uchar y2);
extern void extbmp(uchar x0,uchar y0,uchar *bmp);
extern void Displayonebmp(uchar x,uchar y,uchar *adr);
extern void LcdDrawPoint(int x,int y,bit Point);
//============================================
extern uchar Key(void);
extern void StepperDrive0();
extern void StepperDrive1();
extern void StepperDrive2();
extern void StopMotor();
extern uchar ADConver(uchar n);
extern void KeySound(uchar num);
extern void Delay(unsigned int MS);
extern bit WriteEeprom(uchar *s, int addr,int len);
extern bit ReadEeprom(uchar *s,int addr,int len);
extern void HC164(uchar a);
//==============函数声明================================
void Interrput0();
void Time0();
void Time1();
void PowerKey();
void SelectKey();
void ClrKey();
void SetKey();
void StartKey();
void StopKey();
void InccKey();
void IncSet();
void DecSet();
void Display1(uchar a);
void Display2(uchar a);
void Display3();
void KeyAgain();
void Inition();
void QiPaoWarning();
void DrugEmptyWarning();
void ZhuSaiWarning();
void OpenDoorWarning();
void LowBatWarning();
void TransfusionOkWarning();
void YeDiWarning();
void JingDuSet();
void LedTurn();
void YeDiJingDuSet();
void MenuSet();
void DisplayRefurbish(); //显示刷新
void GetsAdData();
void JudgeWarn();
void WarnDisposal();
void TurnOffSystem();
void YeDiAdjust(); //液滴调整
void DisGlint(uchar i,uint n);
void ModeCover();
void DisplayCumulate(uint);
void MovPicture();
void DisplayBat();
//========全局变量设置====================================
uint idata yalistartcount;//压力起作用时间计时
ulong idata JingDuInt;
ulong idata speedset; //电机速度调节寄存器
uchar speedseth; //调速高位(1表示60MS)
uint speedsetl; //调速低位(单位为微秒)
uchar speedsetcount; //精度调整计数
uint idata cumulate; //累积量寄存器
uint idata cumulatedata;
uint idata cumulatecopy;
ulong idata cumulatereg;
uchar quicktotal;
uchar quicktotalcount;
uchar qipao; //气泡值寄存器
uint qipao_jing_value; //气泡精度存储器
uint qipao1flagcount;
uchar Adqipaocount11;
uchar yali; //压力值寄存器
//uchar jingdu; //输液精度寄存器
uchar jingducopy; //用于液滴计数方式精度调整
uchar Adqipao1; //气泡检测值1
uchar Adqipao2; //气泡检测值2
uchar qipaofirstvalue1;
uchar qipaofirstvalue2;
uchar seconddata2;
uchar minutedata2;
uchar hourdata2;
ulong idata cumulatedata2;
uchar Adyali; //压力检测值
uchar Adbat; //精度检测值
uchar AdbatBuff;
uchar KeyData; //
uchar KeyDataP;
uchar AdData; //
uchar clrcount; //清零键按下计时器
uchar dropspeed=0; //
uchar dropspeedcopy; //
uint Ex0Count=0; //
uchar shanshuocount; //闪烁速度计时
uchar selectdata; //输液及预置量选择
uchar buttoncount;
uchar buttonquickcount;//
uchar quickruncount; //起动键按下计时寄存器
uchar time; //
uchar second;
uchar minute;
uchar hour;
uchar second1;
uchar minute1;
uchar hour1;
uchar seconddata;
uchar minutedata;
uchar hourdata;
uchar timel;
uchar timeh;
uchar warndata;
uchar dropfactdata;
uchar sound;
uchar speedsethTT0;
uchar LEDSUBFF;
uchar Kvotime;
uchar Kvosecond;
uchar Kvominute;
uchar Kvohour;
uchar secondcopy;
uchar minutecopy;
uchar hourcopy;
uchar BatState;
uchar yedicountl;
uchar yedicounth;
uchar batlowglingcount;
uchar Adqipaocount1;
uint Adqipaocount2;
uint batlowtimecount;//电池低电压计时
uchar idata yedi_val;
uchar idata yeditime;
uchar idata yedidata;
uchar idata yedishiwei;
uchar idata yedigewei;
uchar idata batlowcount;
uint idata ledcount;
uchar idata led;
uchar idata Adyalicount;
uchar idata troublecount;
uchar idata troublecount2;
uchar idata Adbatcount;
uchar idata jingducopyset;
ulong idata t; //总时间,单位秒
ulong idata t1;
uchar idata jingdudata;
uint idata Keycount;
uchar qipao2hicount;
uchar YEDIFlagcount;
//======位变更声明================
bit QuickRunFlag; //快速冲洗标志
bit StartOnFlag; //起动键按下标志
bit buttonquickflag; //
bit glintreg; //闪烁设置寄存器
bit KeyOn; //
bit StartFlag; //电机起动标志
bit shanshuoflag; //闪烁标志
bit buttonflag; //按键按下标志
bit clrflag; //清零键按下标志
bit KvoFlag; //KVO标志
bit KeyRepeatFlag; //有重复输出键按下标志
bit yediflag;
bit warnflag;
bit batlowflag; //电池欠压标志
bit batlowflag1; //电池欠压标志
bit LEDFLAG; //LED闪烁标志
bit Elflag; //液晶背光控制
bit STOPFLAG; //停止指示灯标志
bit yaliseton; //压力开始标志
bit mode;
bit modecoverflag; //模式转换设置标志
bit MovFlag;
bit LOWFLAG;
bit QIPAO1FLAG;
bit QIPAO2FLAG;
//bit QIPAO22FLAG;
bit QIPAO12FLAG;
bit qipao2hiflag;
//bit YYYFLAG;
//=========联合变量声明===============
union time //定时器T0初值
{
uint T0data;
uchar T0D[2];
}TT0,TTKVO,TTRUN;
union f
{
uchar a[2]; //输液速度
uint b; //预输液量
}shudu,zhonglian;
uchar code QiPaoJD[13]= {20,10,2};//0.50V-1.7V
uchar code ZhuSaiLMD[3]={90,105,115};//1.0V-2.2V
uchar code ShuYeJD[13]={70,75,80,85,90,95,100,105,110,115,120,125,130};//-30%~30%
uchar code YeDiJD[5]={20,21,22,23,24};
uchar code date[7]={0,7,0,4,0,8,2}; //程序版本日期
//==========主程序开始=======================qqq
main()
{
Inition();
while(1)
{
CLRWDT;
ModeCover(); //模式转换
MenuSet(); //读取键值,判断是否进行参数设置
DisplayRefurbish(); //把液晶显示屏显示的数据刷新
GetsAdData(); //获取传感器各路数据
JudgeWarn(); //判断是否异常
WarnDisposal(); //报警处理
MovPicture();
}//while
}
//=========外部中断0,检测液滴================
void Interrupt1() interrupt 2
{
if(mode==1)
{
if(StartFlag==1)
{
yedicountl=0;
yedicounth=0;
yediflag=1;
EX1=0; //shut off interrupt 1
dropspeed++;
Int1=1;
LedTurn();
}
}
}
//==========定时器0,定时时MS=============
void Time0() interrupt 1
{
TH0=TH0DATA;
TL0=TL0DATA;
//==========判断步进电机是否运行================
if((StartFlag)||(KvoFlag))
{
speedsetcount++; //TIME OUT
if(KvoFlag==1)
{
if(speedsetcount>speedsethTT0) //KVO输液
{
speedsetcount=0;
TH0=TTKVO.T0D[0];
TL0=TTKVO.T0D[1];
StepperDrive0(); //步进一次(3.9度)
}
}
else if(QuickRunFlag==1) //快速冲洗600mL/h
{
TH0=TTRUN.T0D[0];
TL0=TTRUN.T0D[1];
StepperDrive0(); //步进一次(3.9度)
}
else
{
if(speedsetcount>speedseth)
{
speedsetcount=0;
TH0=TT0.T0D[0];
TL0=TT0.T0D[1];
if(shudu.b<60)
StepperDrive1(); //步进一次(3.9度)
else if(shudu.b<751)
StepperDrive1();
else
StepperDrive2();
if(mode==0)
{
ledcount++;
if(ledcount>400)
{
ledcount=0;
LedTurn();
}
}
}
}
}
}
//===========定时器1,定时时间为1MS===============
void Time1() interrupt 3
{
TH1=0x3c;
TL1=0xbe;
//===============秒信号计时=================================
if(StartFlag==1)
{
time++;
if(time>19)
{
time=0;
second++;
second1++;
if(second>59)
{
second=0;
minute++;
if(minute>59)
{
minute=0;
hour++;
}
}
if(second1>59)
{
second1=0;
minute1++;
if(minute1>59)
{
minute1=0;
hour1++;
}
}
}
}
}
void Time2() interrupt 5
{
TF2=0;
//==================================
if((yaliseton==0)&&(StartFlag==1))//压力承受开始计时
yalistartcount++;
//==========液滴计数判断=========================
if((mode==1)&&(StartFlag==1))
{
yedicountl++;
if(yedicountl>=50)
{
yedicountl=0;
yedicounth++;
if(yedicounth>yeditime)
{
yedicounth=0;
warndata=YEDISHIXIAO;
}
}
if(yediflag==1)
{
if(EX1==0)
{
Ex0Count++;
if(Ex0Count>5)
{
IE1=0;
Ex0Count=0;
EX1=1;
}
} //以上消除抖动
}
}
//-----------------------------------------
if(selectdata<3)
{
shanshuocount++;
if(shanshuocount>20)//闪烁时间计数
{
shanshuocount=0;
glintreg=1;
}
}
//====按键判断============================================
KeyDataP=Key();
if(KeyDataP!=0)
{
Elflag=0; //背光标志开启
KeyOn=1;
KeyData=KeyDataP;
}
else //一有按键松开,立即清零
{
KeyRepeatFlag=0; //重复按标志清零
clrflag=0; //清零键标志清零
buttonflag=0; //有键按下标志清零
buttonquickflag=0; //快加、减键标志清零
buttonquickcount=0;//快加减键计数器清零
buttoncount=0; //有键按下计数器清零
Keycount=0;
//========背光处理==============
}
if(buttonflag==1)
buttoncount++;
if(buttonquickflag==1)
buttonquickcount++;
//判断清零键是否一直按下
if(clrflag)
clrcount++;
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -