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

📄 main.c

📁 0834实现数据的采集
💻 C
📖 第 1 页 / 共 3 页
字号:
//--------------------------------------------------------------------------//
//                                源程序                                     //
//                    (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 + -