锅炉自动给水系统烧录程序课程设计祥解文档格式.docx
《锅炉自动给水系统烧录程序课程设计祥解文档格式.docx》由会员分享,可在线阅读,更多相关《锅炉自动给水系统烧录程序课程设计祥解文档格式.docx(25页珍藏版)》请在冰点文库上搜索。
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>
j--);
}
/*********************************函数声明*****************************************************/
/*********************************************18B20相关函数****************************************/
voiddsreset(void)//复位
{
uinti;
DS1=0;
i=103;
while(i>
0)i--;
DS1=1;
i=4;
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)//读取一位数据
bitdat;
i++;
dat=DS1;
i=8;
while(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
ucharj;
bittestb;
for(j=1;
j<
j++)
testb=dat&
0x01;
dat=dat>
1;
if(testb)//写0
i++;
else
{//写1
voidtempchange(void)//DS18B20开始转换函数
dsreset();
delayxms
(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
uintgettemp()//获得温度数值
floattt;
uchara,b;
tempwritebyte(0xbe);
a=tempreadbyte();
b=tempreadbyte();
temp=b;
temp<
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;
voidwrite_date(uchardate)//写数据函数
P1=date;
rs=1;
voidinit()//初始化函数
wr=0;
write_com(0x38);
write_com(0x0f);
write_com(0x06);
write_com(0x01);
voidlcd02()//LCD1602函数
chara;
init();
write_com(0x80+17);
for(a=0;
a<
9;
a++)
write_date(table1[a]);
16;
write_com(0x18);
}
}
/****************************12864函数***************************************/
bitlcd_busy()
{
bitresult;
rs=0;
wr=1;
delayNOP();
result=(bit)(P1&
0x80);
return(result);
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
wr=0;
lcden=0;
_nop_();
P1=cmd;
lcden=1;
voidlcd_wdat(uchardat)
rs=1;
P1=dat;
voidlcd_init()
//LCD_PSB=1;
//并口方式
lcd_wcmd(0x34);
//扩充指令操作
lcd_wcmd(0x30);
//基本指令操作
lcd_wcmd(0x0C);
//显示开,关光标
lcd_wcmd(0x01);
//清除LCD的显示内容
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(测控一班)
lcd_pos(1,0);
while(dis2[i]!
)//“当前值”
lcd_wdat(dis2[i]);
lcd_pos(1,7);
while(dis3[i]!
)//"
lcd_wdat(dis3[i]);
}*/
dis4[4]=ge+'
0'
//实际温度给数组dis4[]
dis4[3]='
.'
dis4[2]=shi+'
dis4[1]=bai+'
dis4[0]=qian+'
lcd_pos(1,3);
i=0;
while(dis4[i]!
)//显示实际温度
lcd_wdat(dis4[i]);
chuli1(sheding*10);
//设定温度给数组dis8[]
dis8[4]=ge1+'
dis8[3]='
dis8[2]=shi1+'
dis8[1]=bai1+'
dis8[0]=qian1+'
/*lcd_pos(2,0);
while(dis5[i]!
)//“设定值”
lcd_wdat(dis5[i]);
lcd_pos(2,7);
}*/
/*dis4[4]=ge+'
*/
lcd_pos(2,3);
while(dis8[i]!
)//温度设定值
lcd_wdat(dis8[i]);
/*lcd_pos(3,0);
while(dis6[i]!
)//显示指导教师
lcd_wdat(dis6[i]);
}*/
voiddisplayjing()
delayxms(5);
lcd_init();
lcd_pos(0,2);
}
lcd_pos(3,0);
lcd_pos(2,0);
}
/**********************************************************数码管显示函数*****************************************************************
voiddisplay()//数码管显示函数
{
wei1=0;
//开位选,送段选数据,延时,关位选。
。
P1=table[ge];
wei1=1;
wei2=0;
P1=tablepoint[shi];
wei2=1;
wei3=0;
P1=table[bai];
wei3=1;
wei4=0;
P1=table[qian];
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<
/***********************************************************按键子程序************************************************************/
voidkeyscan()//按键子程序
if(key1==0)//KEY1按下,则十位加一
delayxms
(2);
if(key1==0)
{
shedingshi=sheding/10+1;
}
if(key2==0)//KEY2按下,则个位加一
if(key2==0)
shedingge=sheding%10+1;
sheding=shedingshi*10+shedingge;
if(key3==0)//K3加水(此时应该要进入手动状态)
if(key3==0)
while(key3==0&
&
upkey==0)
{KIN=1;
KOUT=0;
wendu();
//读取温度数值
if(temp<
sheding*10)//如果实际值小于设定值,则加热
KHOT=1;
//KHOT=0;
elseKHOT=0;
lcd64();
if(key1==0)//KEY1按下,则十位加一
if(key2==0)//KEY2按下,则个位加一
}}
if(key4==0)
if(key4==0)//K4放水
{while(key4==0&
downkey==0)
{KIN=0;
KOUT=1;
if(temp<
lcd64();
}
/**************************************************************限位检测************************************************************/
voidxianwei()
if(downkey==!
0)//检查是否空锅炉,若是则加水,一直到超过水位下限
//KIN=0;
KIN=1;
KOUT=0;
while(downkey==1);
elseif(upkey==0)//检查水是否满状态,如不满,则加水
elseKIN=0;
wendu();
/**************************************************************主函数**************************************************************/
voidmain()
displayjing();
KIN=0;
KOUT=0;
KHOT=0;
delayxms(2000);
while
(1)