锅炉自动给水系统烧录程序课程设计祥解.docx
《锅炉自动给水系统烧录程序课程设计祥解.docx》由会员分享,可在线阅读,更多相关《锅炉自动给水系统烧录程序课程设计祥解.docx(25页珍藏版)》请在冰豆网上搜索。
锅炉自动给水系统烧录程序课程设计祥解
/***********************************************AUSTCKer**********************************************/
/***********************************************包含头文件及相关定义***********************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodedis1[]={"测控一班10"};
ucharcodedis2[]={"当前值"};
ucharcodedis3[]={"度"};
unsignedchardis4[8]="";
unsignedchardis8[8]="";
ucharcodedis5[]={"设定值"};
ucharcodedis6[]={"指导教师:
MLL"};
intsheding=22;
intshedingge,shedingshi;
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//共阳极无小数点编码
0x82,0xf8,0x80,0x90};
ucharcodetablepoint[]={0x40,0x79,0x24,0x30,0x19,//共阳极带小数点编码
0x12,0x02,0x78,0x00,0x10};
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
/*******************数码管要显示的数字的各个位值******************/
ucharge;
ucharshi;
ucharbai;
ucharqian;
uinttemp;
ucharge1;
ucharshi1;
ucharbai1;
ucharqian1;
uinttemp1;
/*******************四位数码管位选*******************
sbitwei1=P2^3;
sbitwei2=P2^2;
sbitwei3=P2^1;
sbitwei4=P2^0;
/*******************LEDDEFINE*****************/
sbitled1=P1^3;
sbitled2=P1^2;
sbitled3=P1^1;
sbitled4=P1^0;
/*******************18B20数据口和按键定义******/
sbitDS1=P0^5;
sbitkey1=P3^2;//温度设定按键1
sbitkey2=P3^3;//温度设定按键2
sbitkey3=P3^4;//加水按键
sbitkey4=P3^5;//放水按键
/*******************LCD接口定义****************/
sbitrs=P2^0;
sbitwr=P2^1;
sbitlcden=P2^2;
/*******************限位开关定义***************/
sbitupkey=P3^6;//上限位开关
sbitdownkey=P3^7;//下限位开关
/*******************继电器定义*****************/
sbitKIN=P2^5;
sbitKOUT=P2^6;
sbitKHOT=P2^7;
/*******************延时1ms函数******************/
voiddelayxms(intz)
{inti,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
/*********************************函数声明*****************************************************/
/*********************************************18B20相关函数****************************************/
voiddsreset(void)//复位
{
uinti;
DS1=0;
i=103;
while(i>0)i--;
DS1=1;
i=4;
while(i>0)i--;
}
voidchuli(uintm)//将数值转换成四位有效数字,取出个十百千
{
qian=m/1000;
bai=m/100%10;
shi=m%100/10;
ge=m%10;
}
voidchuli1(uintm)//将数值转换成四位有效数字,取出个十百千
{
qian1=m/1000;
bai1=m/100%10;
shi1=m%100/10;
ge1=m%10;
}
bittempreadbit(void)//读取一位数据
{
uinti;
bitdat;
DS1=0;i++;
DS1=1;i++;i++;
dat=DS1;
i=8;while(i>0)i--;
return(dat);
}
uchartempreadbyte(void)//读取一个字节
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
voidtempwritebyte(uchardat)//写一个字节数据给DS18B20
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写0
{
DS1=0;
i++;i++;
DS1=1;
i=8;while(i>0)i--;
}
else
{//写1
DS1=0;
i=8;while(i>0)i--;
DS1=1;
i++;i++;
}
}
}
voidtempchange(void)//DS18B20开始转换函数
{
dsreset();
delayxms
(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uintgettemp()//获得温度数值
{
floattt;
uchara,b;
dsreset();
delayxms
(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempreadbyte();
b=tempreadbyte();
temp=b;
temp<<=8;
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
returntemp;
}
/***************************************************1602相关函数*****************************************
voidwrite_com(ucharcom)//写指令函数
{
P1=com;
rs=0;
lcden=0;
delayxms
(2);
lcden=1;
delayxms
(2);
lcden=0;
}
voidwrite_date(uchardate)//写数据函数
{
P1=date;
rs=1;
lcden=0;
delayxms
(2);
lcden=1;
delayxms
(2);
lcden=0;
}
voidinit()//初始化函数
{
wr=0;
write_com(0x38);
delayxms
(2);
write_com(0x0f);
delayxms
(2);
write_com(0x06);
delayxms
(2);
write_com(0x01);
delayxms
(2);
}
voidlcd02()//LCD1602函数
{
chara;
init();
write_com(0x80+17);
delayxms
(2);
for(a=0;a<9;a++)
{
write_date(table1[a]);
delayxms
(2);
}
for(a=0;a<16;a++)
{
write_com(0x18);
delayxms
(2);
}
}
/****************************12864函数***************************************/
bitlcd_busy()
{
bitresult;
rs=0;
wr=1;
lcden=1;
delayNOP();
result=(bit)(P1&0x80);
lcden=0;
return(result);
}
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
rs=0;
wr=0;
lcden=0;
_nop_();
_nop_();
P1=cmd;
delayNOP();
lcden=1;
delayNOP();
lcden=0;
}
voidlcd_wdat(uchardat)
{
while(lcd_busy());
rs=1;
wr=0;
lcden=0;
P1=dat;
delayNOP();
lcden=1;
delayNOP();
lcden=0;
}
voidlcd_init()
{
//LCD_PSB=1;//并口方式
lcd_wcmd(0x34);//扩充指令操作
delayxms
(1);
lcd_wcmd(0x30);//基本指令操作
delayxms
(1);
lcd_wcmd(0x0C);//显示开,关光标
delayxms
(1);
lcd_wcmd(0x01);//清除LCD的显示内容
delayxms
(1);
}
voidlcd_pos(ucharX,ucharY)
{
ucharpos;
if(X==0)
{X=0x80;}
elseif(X==1)
{X=0x90;}
elseif(X==2)
{X=0x88;}
elseif(X==3)
{X=0x98;}
pos=X+Y;
lcd_wcmd(pos);//显示地址
}
voidlcd64()
{
uchari;
//delayxms(5);//延时
//lcd_init();//初始化LCD
/*lcd_pos(0,2);//设置显示位置为第一行的第3个字符开始
i=0;
while(dis1[i]!
='\0')
{//显示字符
lcd_wdat(dis1[i]);//dis1(测控一班)
delayxms
(1);
i++;
}
lcd_pos(1,0);
i=0;
while(dis2[i]!
='\0')//“当前值”
{
lcd_wdat(dis2[i]);
delayxms
(1);
i++;
}
lcd_pos(1,7);
i=0;
while(dis3[i]!
='\0')//"度"
{
lcd_wdat(dis3[i]);
delayxms
(1);
i++;
}*/
dis4[4]=ge+'0';//实际温度给数组dis4[]
dis4[3]='.';
dis4[2]=shi+'0';
dis4[1]=bai+'0';
dis4[0]=qian+'0';
lcd_pos(1,3);
i=0;
while(dis4[i]!
='\0')//显示实际温度
{
lcd_wdat(dis4[i]);
delayxms
(1);
i++;
}
chuli1(sheding*10);//设定温度给数组dis8[]
dis8[4]=ge1+'0';
dis8[3]='.';
dis8[2]=shi1+'0';
dis8[1]=bai1+'0';
dis8[0]=qian1+'0';
/*lcd_pos(2,0);
i=0;
while(dis5[i]!
='\0')//“设定值”
{
lcd_wdat(dis5[i]);
delayxms
(1);
i++;
}
lcd_pos(2,7);
i=0;
while(dis3[i]!
='\0')//"度"
{
lcd_wdat(dis3[i]);
delayxms
(1);
i++;
}*/
/*dis4[4]=ge+'0';
dis4[3]='.';
dis4[2]=shi+'0';
dis4[1]=bai+'0';
dis4[0]=qian+'0';*/
lcd_pos(2,3);
i=0;
while(dis8[i]!
='\0')//温度设定值
{
lcd_wdat(dis8[i]);
delayxms
(1);
i++;
}
/*lcd_pos(3,0);
i=0;
while(dis6[i]!
='\0')//显示指导教师
{
lcd_wdat(dis6[i]);
delayxms
(1);
i++;
}*/
}
voiddisplayjing()
{
uchari;
delayxms(5);//延时
lcd_init();//初始化LCD
lcd_pos(0,2);//设置显示位置为第一行的第3个字符开始
i=0;
while(dis1[i]!
='\0')
{//显示字符
lcd_wdat(dis1[i]);//dis1(测控一班)
delayxms
(1);
i++;
}
lcd_pos(1,0);
i=0;
while(dis2[i]!
='\0')//“当前值”
{
lcd_wdat(dis2[i]);
delayxms
(1);
i++;
}
lcd_pos(1,7);
i=0;
while(dis3[i]!
='\0')//"度"
{
lcd_wdat(dis3[i]);
delayxms
(1);
i++;
}
lcd_pos(3,0);
i=0;
while(dis6[i]!
='\0')//显示指导教师
{
lcd_wdat(dis6[i]);
delayxms
(1);
i++;
}
lcd_pos(2,0);
i=0;
while(dis5[i]!
='\0')//“设定值”
{
lcd_wdat(dis5[i]);
delayxms
(1);
i++;
}
lcd_pos(2,7);
i=0;
while(dis3[i]!
='\0')//"度"
{
lcd_wdat(dis3[i]);
delayxms
(1);
i++;
}
}
/**********************************************************数码管显示函数*****************************************************************
voiddisplay()//数码管显示函数
{
wei1=0;//开位选,送段选数据,延时,关位选。
。
。
P1=table[ge];
delayxms
(2);
wei1=1;
wei2=0;
P1=tablepoint[shi];
delayxms
(2);
wei2=1;
wei3=0;
P1=table[bai];
delayxms
(2);
wei3=1;
wei4=0;
P1=table[qian];
delayxms
(2);
wei4=1;
}
/*********************************************************温度显示函数(获取温度值并由数码管显示)*********************************************/
voidwendu()//温度子程序
{
tempchange();
chuli(gettemp());
//display();
}
/***********************************************************LED流水子程序********************************************************
voidled()//LED子程序
{
intk;
intdata1=0x01;
for(k=0;k<4;k++)
{
P1=~data1;
delayxms(500);
data1=data1<<1;
}
}
/***********************************************************按键子程序************************************************************/
voidkeyscan()//按键子程序
{
if(key1==0)//KEY1按下,则十位加一
{
delayxms
(2);
if(key1==0)
{
shedingshi=sheding/10+1;
}
}
if(key2==0)//KEY2按下,则个位加一
{
delayxms
(2);
if(key2==0)
{
shedingge=sheding%10+1;
}
}
sheding=shedingshi*10+shedingge;
if(key3==0)//K3加水(此时应该要进入手动状态)
{
delayxms
(2);
if(key3==0)
{
while(key3==0&&upkey==0)
{KIN=1;
KOUT=0;
wendu();//读取温度数值
if(temp{
KHOT=1;
//KHOT=0;
}
elseKHOT=0;
lcd64();
if(key1==0)//KEY1按下,则十位加一
{
delayxms
(2);
if(key1==0)
{
shedingshi=sheding/10+1;
}
}
if(key2==0)//KEY2按下,则个位加一
{
delayxms
(2);
if(key2==0)
{
shedingge=sheding%10+1;
}
}
}}
}
if(key4==0)
{
delayxms
(2);
if(key4==0)//K4放水
{while(key4==0&&downkey==0)
{KIN=0;
KOUT=1;
wendu();
if(temp{
KHOT=1;
//KHOT=0;
}
elseKHOT=0;
lcd64();
}
}
}
}
/**************************************************************限位检测************************************************************/
voidxianwei()
{
if(downkey==!
0)//检查是否空锅炉,若是则加水,一直到超过水位下限
{
//KIN=0;
KIN=1;
KOUT=0;
while(downkey==1);
}
elseif(upkey==0)//检查水是否满状态,如不满,则加水
{
KIN=1;
}
elseKIN=0;
wendu();//读取温度数值
if(temp{
KHOT=1;
//KHOT=0;
}
elseKHOT=0;
}
/**************************************************************主函数**************************************************************/
voidmain()
{
displayjing();
KIN=0;
KOUT=0;
KHOT=0;
delayxms(2000);
while
(1)
{