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

📄 antisepsis_ark.c

📁 消毒柜产品,用VDF显示温度、消毒时间
💻 C
字号:
///////////2007-05调试成功第二次代消毒柜////////////
////////MCS-89c2051,18b20温度采集,cs16312驱动VFD显示
/////////18b20采集不到温度时报警声响///////
#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

sbit sb20=P3^5;//////18b20温度采集I/O
sbit dat=P3^0;///////cs16312数据I/O
sbit clk=P3^1;///////cs16312时钟I/O
sbit stb=P1^7;///////cs16312选通I/O
sbit fmq=P3^4;///////蜂鸣器I/O
sbit zxd=P3^3;///////紫外杀菌I/O
sbit gxd=P3^2;///////高温消毒I/O

void delay(uchar x);///////延时
void vfd_zxd();////////////VFD紫外杀菌显示
void vfd_gxd();////////////VFD高温消毒显示
void kbscan(void);/////////键盘扫描
void wrd(uchar disno,bit lei);////16312写一个字节的命令或者数据
void wrvfd(uchar addr,uchar dat,uchar dat0);///向驱动VFD的16312指定地址写数据

uchar code tumg11[]={0xe3,0x73,0x6b,0x47,0x7f};/////紫外杀菌闪烁彩灯
uchar code tumg12[]={0x00,0x01,0x02,0x04,0x08};/////保洁指示闪灯
uchar code tumg31[]={0x00,0x01,0x02,0x07,0x0f,0x1f,0xbf,0xff};////高温消毒闪烁彩灯L
uchar code tumg32[]={0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff};////高温消毒闪烁彩灯H
uchar code tumg51[]={0x98,0xb0,0xd0,0x98,0xb0,0xd0};////////////保温指示闪灯
uchar code tumg52[]={0x0a,0x09,0x0c,0x0a,0x09,0x0c};////////////自动指示闪灯1
uchar code tumg522[]={0x0c,0x09,0x0a,0x0c,0x09,0x0a};////////////自动指示闪灯2
uchar code tumg53[]={0x10,0x30,0x50,0x90,0xf0,0xf0};///////////消毒指示闪灯
uchar code tumgh24[]={0x7f,0x03,0x23,0x23,0x0b,0x29,0x29,0x23,0x2b,0x2b,//00~9
                      0x2f,0x07,0x27,0x27,0x0f,0x2d,0x2d,0x27,0x2f,0x2f,//10~19
                      0x6f,0x47,0x67,0x67,0x4f,0x6d,0x6d,0x67,0x6f,0x6f,//20~29
                      0x6f,0x47,0x67,0x67,0x4f,0x6d,0x6d,0x67,0x6f,0x6f,//30~39
                      0x3f,0x17,0x37,0x37,0x1f,0x3d,0x3d,0x37,0x3f,0x3f,//40~49
                      0x7b,0x53,0x73,0x73,0x5b,0x79,0x79,0x73,0x7b,0x7b,//50~59
                      0x7b,0x53,0x73,0x73,0x5b,0x79,0x79,0x73,0x7b,0x7b,//60~69
                      0x6f,0x47,0x67,0x67,0x4f,0x6d,0x6d,0x67,0x6f,0x6f,//70~79
                      0x7f,0x57,0x77,0x77,0x5f,0x7d,0x7d,0x77,0x7f,0x7f,//80~89
                      0x7f,0x57,0x77,0x77,0x5f,0x7d,0x7d,0x77,0x7f,0x7f};//90~99从0到99的字形码H
uchar code tumgl24[]={0x3f,0x04,0x51,0x45,0x44,0x45,0x55,0x04,0x55,0x45,//00~9
                      0x1d,0x0c,0x59,0x4d,0x4c,0x4d,0x5d,0x0c,0x5d,0x4d,//10~19
                      0xb7,0xa6,0xf3,0xe7,0xe6,0xe7,0xf7,0xa6,0xf7,0xe7,//20~29
                      0x9f,0x8e,0xdb,0xcf,0xce,0xcf,0xdf,0x8e,0xdf,0xcf,//30~39
                      0x9d,0x8c,0xd9,0xcd,0xcc,0xcd,0xdd,0x8c,0xdd,0xcd,//40~49
                      0x9f,0x8e,0xdb,0xcf,0xce,0xcf,0xdf,0x8e,0xdf,0xcf,//50~59
                      0xbf,0xae,0xfb,0xef,0xee,0xef,0xff,0xae,0xff,0xef,//60~69
                      0x1d,0x0c,0x59,0x4d,0x4c,0x4d,0x5d,0x0c,0x5d,0x4d,//70~79
                      0xbf,0xae,0xfb,0xef,0xee,0xef,0xff,0xae,0xff,0xef,//80~89
                      0x9f,0x8e,0xdb,0xcf,0xce,0xcf,0xdf,0x8e,0xdf,0xcf};//90~99从0到99的字形码L
uchar key,key0,key1,key2,key3,//返回键值/总键开关/消毒/保温/自动
      kk,qq,   //长按键//(消毒/保温/自动)三次按键
	  count1,count2,point0,point1,point2,///彩灯闪烁标志位
	  second,num0,result, /////秒/高温分/杀菌分
	  dite,dite1;/////////起动杀菌计时标志位/起动高温计时标志位
static uchar temp1,temp2,temp3,temp4,temp5,temp0;////温度变量
bit pbit;

////////读写ds18b20驱动程序
void delay15()/////延时15us
{uchar i;
  for(i=0;i<8;i++);
}

void delay60()//////延时60us
{uchar i;
 for(i=0;i<30;i++);
}

void write0ts()////////写bit0
{sb20=1;
 sb20=0;
 delay15();
 delay15();
 delay15();
 delay15();
 sb20=1;
 _nop_();
 _nop_();
}

void write1ts()///////写bit1
{sb20=1;
 sb20=0;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 sb20=1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 delay15();
 delay15();
 delay15();
}

bit readts()///////读取数据位
{bit b;
 sb20=1;
 sb20=0;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 sb20=1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 b=sb20;
 delay15();
 delay15();
 delay15();
 _nop_();
 _nop_();
 return b;
}

void resetts()///////复位
{uchar i;
   sb20=1;
   sb20=0;
   for(i=0;i<8;i++)
   delay60();
   sb20=1;
   for(i=0;i<10;i++)
   {
   if(sb20==0){pbit=1;goto t;}
   else pbit=0;
   }
 t: for(i=0;i<8;i++)
    delay60();
}

void writebts (uchar byte)//////写一字节
{uchar i;
 for(i=0;i<8;i++)
  {if(byte&0x01)     //最低bit为1否?
   write1ts();
   else
   write0ts();
   byte=byte>>1;   //字节右移1位
   }
}

uchar readbts()////////读一字节
{uchar i,j;
 bit b;
 j=0;
 for(i=0;i<8;i++)
  {b=readts();        //读取1bit
  if(b)               //为1否?
  j+=1;
  j=_cror_(j,1);      //循环右移1位
 }
 return j;
}

void scan1820 (void)//获得温度,2字节数据分别放在temp1,temp2中
{   resetts();        //复位总线
    writebts(0xcc);   //忽略ROM匹配操作
    writebts(0x44);   //温度转换命令
    delay(100);       //延时100ms
    resetts();        //复位
    writebts(0xcc);   //忽略ROM匹配操作
    writebts(0xbe);   //读取寄存器
    temp2=readbts();  //读取第1字节
    temp1=readbts();  //读取第2字节
    temp1=temp1<<4;
    temp1+=(temp2&0xf0)>>4;//获得温度值整数部分
}

////////////主程序///////////
void main(void)
{ uchar i,j,x;
  scan1820();     
  temp0=temp1;     //读取第一次温度存处给temp0
  TMOD=0x01;/////////定时器0工作在方式1
  TH0=0x3c;
  TL0=0xb0;//////////定时器0初始值,定时50ms.
  EA=1;ET0=1;TR0=1;///开定时器0中断
  wrd(0x01,0);        //}
  stb=1;
  wrd(0x40,0);
  stb=1;
  wrd(0xc0,0);
  for(i=0;i<10;i++)
  wrd(00,1);
  stb=1;
  wrd(0x80,0);
  stb=1;             //}VFD全部清0
  fmq=0;/////////////蜂明器响开始
  delay(250);
  delay(200);
  fmq=1;
  key=key0=key1=0;   //键值清0
  result=80;
  num0=0;
 while(1)
   {
    kbscan();         //键盘扫描取回键值,无键按下返回值为0
    if(key==0)kk=0;   //控制长按键
    if(key0==0)       //无总键按下
	 { zxd=1;gxd=1;
       key1=key2=key3=qq=0;
	   wrd(0x01,0);        //}
       stb=1;
       wrd(0x40,0);
       stb=1;
       wrd(0xc0,0);
	   for(i=0;i<10;i++)
       wrd(00,1);
       stb=1;
       wrd(0x8f,0);
       stb=1;              //}清0-VFD不显示
	   dite=dite1=0;
       result=80;
	   num0=0;
	   EA=0;               //关中断
	   scan1820();
       temp0=temp1;        //读取温度
	   EA=1;
	  }
	 
	 else                   //有总键按下        
	 {scan1820();
     if(pbit==0)x++;
     else x=0;
     if(x==5)goto q;
 	 if(temp1>temp0)                         //}
	  {if((temp0+30)<temp1)temp1=temp0;}
     if(temp1<temp0)
	   {if((temp1+30)<temp0)temp1=temp0;}    //}如果温突然变化大于30,则视为错误值
	 temp0=temp1;                 //保存温度
	 temp5=temp1;
	  vfd_zxd();               //紫外杀菌VFD显示
      vfd_gxd();               //高温消毒VFD显示
	 } 
   }
 q: 
    wrd(0x01,0);        //}
    stb=1;
    wrd(0x40,0);
    stb=1;
    wrd(0xc0,0);
	for(i=0;i<10;i++)
    wrd(00,1);
    stb=1;
    wrd(0x80,0);
    stb=1; 
	zxd=1;gxd=1;
    for(j=0;j<5;j++)
    {fmq=0;/////////////蜂明器响开始
     delay(250);
     delay(200);
     fmq=1;
     delay(250);
     delay(200);}
}

/////////////////////
////////紫外杀菌VFD显示
void vfd_zxd()
{if(result<=60&result!=0)             ///杀菌工作
  {wrvfd(0xc6,tumgl24[result],tumgh24[result]);
   wrvfd(0xc8,tumg11[point0],tumg12[point0]);}
 else                                ///不工作
  {wrvfd(0xc6,tumgl24[0],tumgh24[0]);
   wrvfd(0xc8,0x23,0x00);}
   if(result==0){dite=0;zxd=1;result=70;}
   if(result==70){fmq=0;delay(250);delay(200);fmq=1;result=80;}//杀菌工作结束蜂鸣器报警
}

///////////////高温消毒VFD显示
////////////////////////////
void vfd_gxd()
{if(key3!=0)////总键开
 {switch(key3)
   {case 1:{if(key1==1)wrvfd(0xc0,0x00,tumg522[point1]);
            else wrvfd(0xc0,0x00,tumg53[point1]);
			if(temp5==120){second=0;dite1=1;}
			if(temp5>=125)gxd=1;
            if(temp5<=120)gxd=0;}break;///case 1 key3=1为消毒,显示消毒;如同时key1=1为自动,显示自动
    case 2:{if(key1!=1)wrvfd(0xc0,tumg51[point1],0x00);
            else wrvfd(0xc0,0x00,tumg52[point1]);
	    if(temp5>=35)gxd=1;
	    if(temp5<=30)gxd=0;}break;///case 2 key3=2为保温,显示保温;如同时key1=1为自动,显示自动
    default:break;
   }
   wrvfd(0xc4,tumg31[point2],tumg32[point2]);
  }
  else ///总键关
    {wrvfd(0xc0,0x80,0x18);
	 wrvfd(0xc4,0x00,0x00);
	}
//////////当温度上到120时高温度消毒,达到20分后关掉加热
//////////如是消毒档蜂鸣器响,自动则不响
	if(key3==1)
	  {if(num0==20)
	    {if(key1==1)key3=2;
         else 
		   {fmq=0;delay(250);delay(250);
		    fmq=1;key3=0;}
		dite1=0;num0=0;gxd=1;}
	  }
//////////////////////////////////////////////  
///////当温度上到100时显示第三位的处理///////
   if(temp1>=100){temp1=temp1-100;
                 if((0<=temp1)&&(temp1<=9))
				    {temp3=(tumgh24[temp1]|0xd4);
				     temp4=(tumgl24[temp1]|0x2a);}
                 else {temp3=(tumgh24[temp1]|0x80);
				       temp4=tumgl24[temp1];}
			     }
  else {temp3=tumgh24[temp1];temp4=tumgl24[temp1];}
  wrvfd(0xc2,temp4,temp3);      //温度显示
  
}

///////////////////////////////
/////////键扫描////////////////
void kbscan(void)
{
 if((P1&0x78)!=0x78)
  {delay(10);
    if((P1&0x78)!=0x78)
     {key=P1&0x78;
	  switch(key)
       {case 0x40:{if(kk!=key){key0=~key0;kk=key;}}break;//总键
        case 0x08:{if(key0!=0){result=30;second=0;dite=1;zxd=0;}kk=key;}break;//杀菌30分键
        case 0x10:{if(key0!=0){result=60;second=0;dite=1;zxd=0;}kk=key;}break;//杀菌60分键
        case 0x20:{if(kk!=key)qq++;
                    switch(qq)
                      {case 1:{kk=key;if(key0!=0){key3=1;key1=0;num0=0;gxd=0;}}break;//消毒
                       case 2:{if(key0!=0){key3=2;key1=0;dite1=0;}kk=key;}break;//保温
		               case 3:{if(key0!=0){key3=1;key1=1;num0=0;gxd=0;}kk=key;}break;//自动
                       case 4:{key3=0;kk=key;qq=0;key1=0;gxd=1;}break;
                       }
                   }break;///消毒/保温/自动
		default:break;
       }
     }
   }
   else key=0;
}

////定时器0中断程序////////////////
void time(void) interrupt 1 using 3
{ TH0=0x3c;
  TL0=0xb0;
  count1++;count2++;/////2次中断清零计数器50ms*2=100ms
  if(count2==6)
    {point0++;if(point0==5)point0=0;
	 point1++;if(point1==6)point1=0;
     point2++;if(point2==8)point2=0;count2=0;}
  if(count1==20)
    {count1=0;++second;}//////50ms*2*10=1s
  if(second==60)
    {second=0;
	if(dite1==1)num0++;
	if(dite==1)result--;}

}

/////////////////////////////
void wrd(uchar disno,bit lei)  //写一个字节的命令或者数据(由LEI控制是写数据还是写命令)
{
  uchar a;
  if(lei)
  goto s;
  stb=1;
  stb=1;
  stb=0;
 s:  for(a=0;a<8;a++)
    {
     clk=1;
     clk=1;
	 clk=0;
     clk=0;
      if(disno&0x01)
        dat=1;
      else
        dat=0;
        disno=disno>>1;
        clk=1;
        clk=1;
		clk=1;
        clk=1;
     }
}

 /////////////////////////////************以下为主程序*************************//////////////////////
void wrvfd(uchar addr,uchar dat,uchar dat0) //向VFD指定地址写数据
  {
  wrd(0x01,0);
  stb=1;
  wrd(0x40,0);
  stb=1;
  wrd(addr,0);
  wrd(dat,1);
  wrd(dat0,1);
  stb=1;
  wrd(0x89,0);
  stb=1;
  }

///延时函数/////////////////////
void delay(uchar x)
{uchar k;
 while(x--)
      for(k=0;k<125;k++);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -