📄 antisepsis_ark.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 + -