锅炉自动给水系统烧录程序课程设计祥解.docx

上传人:b****2 文档编号:2471700 上传时间:2023-05-03 格式:DOCX 页数:25 大小:18.33KB
下载 相关 举报
锅炉自动给水系统烧录程序课程设计祥解.docx_第1页
第1页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第2页
第2页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第3页
第3页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第4页
第4页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第5页
第5页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第6页
第6页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第7页
第7页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第8页
第8页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第9页
第9页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第10页
第10页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第11页
第11页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第12页
第12页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第13页
第13页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第14页
第14页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第15页
第15页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第16页
第16页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第17页
第17页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第18页
第18页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第19页
第19页 / 共25页
锅炉自动给水系统烧录程序课程设计祥解.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

锅炉自动给水系统烧录程序课程设计祥解.docx

《锅炉自动给水系统烧录程序课程设计祥解.docx》由会员分享,可在线阅读,更多相关《锅炉自动给水系统烧录程序课程设计祥解.docx(25页珍藏版)》请在冰点文库上搜索。

锅炉自动给水系统烧录程序课程设计祥解.docx

锅炉自动给水系统烧录程序课程设计祥解

/***********************************************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)

{

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2