?? 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;
//=============外部函數(shù)聲明==================
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);//顯示點滴計數(shù)值
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);
//==============函數(shù)聲明================================
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(); //液滴調(diào)整
void DisGlint(uchar i,uint n);
void ModeCover();
void DisplayCumulate(uint);
void MovPicture();
void DisplayBat();
//========全局變量設(shè)置====================================
uint idata yalistartcount;//壓力起作用時間計時
ulong idata JingDuInt;
ulong idata speedset; //電機速度調(diào)節(jié)寄存器
uchar speedseth; //調(diào)速高位(1表示60MS)
uint speedsetl; //調(diào)速低位(單位為微秒)
uchar speedsetcount; //精度調(diào)整計數(shù)
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; //用于液滴計數(shù)方式精度調(diào)整
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; //輸液及預(yù)置量選擇
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; //閃爍設(shè)置寄存器
bit KeyOn; //
bit StartFlag; //電機起動標志
bit shanshuoflag; //閃爍標志
bit buttonflag; //按鍵按下標志
bit clrflag; //清零鍵按下標志
bit KvoFlag; //KVO標志
bit KeyRepeatFlag; //有重復(fù)輸出鍵按下標志
bit yediflag;
bit warnflag;
bit batlowflag; //電池欠壓標志
bit batlowflag1; //電池欠壓標志
bit LEDFLAG; //LED閃爍標志
bit Elflag; //液晶背光控制
bit STOPFLAG; //停止指示燈標志
bit yaliseton; //壓力開始標志
bit mode;
bit modecoverflag; //模式轉(zhuǎn)換設(shè)置標志
bit MovFlag;
bit LOWFLAG;
bit QIPAO1FLAG;
bit QIPAO2FLAG;
//bit QIPAO22FLAG;
bit QIPAO12FLAG;
bit qipao2hiflag;
//bit YYYFLAG;
//=========聯(lián)合變量聲明===============
union time //定時器T0初值
{
uint T0data;
uchar T0D[2];
}TT0,TTKVO,TTRUN;
union f
{
uchar a[2]; //輸液速度
uint b; //預(yù)輸液量
}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(); //模式轉(zhuǎn)換
MenuSet(); //讀取鍵值,判斷是否進行參數(shù)設(shè)置
DisplayRefurbish(); //把液晶顯示屏顯示的數(shù)據(jù)刷新
GetsAdData(); //獲取傳感器各路數(shù)據(jù)
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++;
//==========液滴計數(shù)判斷=========================
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)//閃爍時間計數(shù)
{
shanshuocount=0;
glintreg=1;
}
}
//====按鍵判斷============================================
KeyDataP=Key();
if(KeyDataP!=0)
{
Elflag=0; //背光標志開啟
KeyOn=1;
KeyData=KeyDataP;
}
else //一有按鍵松開,立即清零
{
KeyRepeatFlag=0; //重復(fù)按標志清零
clrflag=0; //清零鍵標志清零
buttonflag=0; //有鍵按下標志清零
buttonquickflag=0; //快加、減鍵標志清零
buttonquickcount=0;//快加減鍵計數(shù)器清零
buttoncount=0; //有鍵按下計數(shù)器清零
Keycount=0;
//========背光處理==============
}
if(buttonflag==1)
buttoncount++;
if(buttonquickflag==1)
buttonquickcount++;
//判斷清零鍵是否一直按下
if(clrflag)
clrcount++;
else
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -