温度控制系统代码.docx
- 文档编号:11941145
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:27
- 大小:79.14KB
温度控制系统代码.docx
《温度控制系统代码.docx》由会员分享,可在线阅读,更多相关《温度控制系统代码.docx(27页珍藏版)》请在冰豆网上搜索。
温度控制系统代码
温度控制系统代码
#include
#include
#include
#include"math.h"
typedefunsignedcharBYTE;
typedefunsignedintWORD;
typedefbitBOOL;
/*-----------------------------DS1620管脚腿定义-------------------------*/
#defineDQP2_4
#defineCLKP2_3
#defineRSTP2_5
/****LCD1602define******/
#defineucharunsignedchar
#defineuintunsignedint
#defineLCD_DBP0
/*--------------------------------------------------------------------*/
sbitrs=P2^0;//LCD1602RS定义
sbitrw=P2^1;//LCD1602RW定义
sbitep=P2^2;//LCD1602EP定义
sbitDQ=P2^4;
unsignedintRead1620byte(void);//读取DS1620数值(10位的)
unsignedintDS1620StartConv(void);//DS1620转换温度
unsignedintDS1620ReadConf(void);//读取DS1620控制字
unsignedintDS1620read(void);//读取DS1620温度值
unsignedintset_temp();//设置预期温度值
voidInitDS1620(void);//初始化DS1620
voidDisplay_Temp();//显示温度值
voidPut1620byte(unsignedcharm);//向DS1620写数值
voidWrite1620byte(unsignedcharm);//向DS1620写数值(10位的)
unsignedintDS1620SetConf(unsignedcharval);//设置DS1620控制字
voidDS1620SetTemp(unsignedTH,unsignedTL);//设置TH、TL
voidPIDInit(structPID*pp);
/*----LCD1602显示声明函数---------*/
voidLCD_init(void);//初始化函数
voidLCD_write_command(uchardat);//LCD1602写指令函数
voidLCD_write_data(uchardat);//LCD1602写数据函数
voidLCD_disp_char(ucharx,uchary,uchardat);//LCD1602显示字符函数
voiddelay10ms(void);//延时10ms程序
BOOLLCD_check_busy(void);//检查忙函数
voidLCD_pos(BYTEpos);//位置显示函数
voidLCD_disp_temp();//显示“tem:
”
voidLCD_disp_num(unsignednum);//显示读取的数字
voidp27Twin();//灯p27闪烁程序
voidcompare_temper();
/********************************************************************/
/*---------------------------延时程序---------------------------------*/
voiddelay(intm)//m=20约为10ms
{
unsignedinti,j;
for(i=0;i for(j=0;j<253;j++); } voiddelay1(intm) { unsignedinti,j; for(i=0;i for(j=0;j<12253;j++); } voiddelay10ms(void) { unsignedinti,j,k; for(i=5;i>0;i--) for(j=4;j>0;j--) for(k=250;k>0;k--); } /*------------------------函数定义------------------------------------------*/ /*---------------GettempfromDS1620-----------------------------*/ /*-------------------------------------------------------------------------*/ /*从DS1620读字节函数*/ unsignedintGet1620byte(void) { unsignedintj,k,b; k=0;//k=valve b=1;//位移变量 RST=1; for(j=0;j<8;j++) { DQ=1; CLK=0; if(DQ)k|=b;/*Readbitandorif=1*/ CLK=1; b=(b<<1);/*Setupfornextreadandor*/ } delay10ms(); //RST=0; returnk; } /*----------------------------------------------------------------------*/ /*PuttemptoDS1620*/ /*对DS1620写字节函数*/ /*----------------------------------------------------------------------*/ voidPut1620byte(unsignedintm) { unsignedintk,b; b=1; RST=1;//高电平写 for(k=0;k<8;k++) { CLK=0;//上升沿有效 DQ=(m&b);/*Sendbitto1620*/ CLK=1; b<<=1;/*Setuptosendnextbit*/ //m=(m>>1); } //delay10ms(); //RST=0; return; } /*----------------------------------------------------------------------*/ /*readtempfromDS1620*/ /*DS1620读字节函数*/ //10位读取。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 /*----------------------------------------------------------------------*/ unsignedintRead1620byte(void) { unsignedintj,k,b;//临时变量 k=0; b=1;//移位变量赋初值 RST=1; for(j=0;j<10;j++) { CLK=0;//CLK低 if(DQ)k|=b;//输出数据 CLK=1;//CLK高 b=(b<<1);//移位b<<=1 } delay10ms(); //RST=0; returnk; } /*----------------------------------------------------------------------*/ /*writetempfromDS1620*/ /*DS1620函数*/ //写10位。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 /*----------------------------------------------------------------------*/ voidWrite1620byte(unsignedintm) { unsignedintk,b=1;//k为临时变量 RST=1;//RST高电平才能传输数据 for(k=0;k<10;k++) { CLK=0; DQ=(m&b);/*Sendbitto1620*/ CLK=1; b=(b<<1);/*Setuptosendnextbit*/ } delay10ms(); RST=0; return; } /*----------------------------------------------------------------------*/ /*转换温度函数*/ /*startconversion*/ /*----------------------------------------------------------------------*/ unsignedintDS1620StartConv(void) { RST=1;//RST高 Put1620byte(0xEE);//写命令字 delay10ms(); RST=0;//RST低 return0x00;//返回值 } /*----------------------------------------------------------------------*/ /*读取DS1620控制字*/ /*ReadConfigRegisterofDS1620*/ /*----------------------------------------------------------------------*/ unsignedintDS1620ReadConf(void) { unsignedinttemp;//返回值临时变量 RST=0; RST=1;//RST高 Put1620byte(0xAC);//写命令控制字0xAC为ReadConfig temp=Get1620byte();//读取控制寄存器值 delay10ms(); RST=0;//RST低 returntemp;//返回值 } /*----------------------------------------------------------------------*/ /*设置DS1620控制字*/ /*SettingConfigRegisterofDS1620*/ /*----------------------------------------------------------------------*/ unsignedintDS1620SetConf(unsignedintval) { RST=0; delay10ms(); RST=1; Put1620byte(0x0C);//写命令字 delay10ms(); Put1620byte(val);//写控制寄存器参数 delay10ms(); RST=0; return1; } /*----------------------------------------------------------------------*/ /*从DS1620读取温度值*/ /*ReadTempfromDS1620*/ /*----------------------------------------------------------------------*/ unsignedintDS1620read(void) { unsignedinttemp_and_half_bit;/*tempbyteandhalfbit*/ unsignedintsign_bit;/*signbit温度正负位*/ unsignedchark; doubletemp_c;/*temperatureindeg.C*/ doubletemp_f;/*temperatureindeg.F*/ doubletemp_read;/**/ unsignedintcount_remain;/*usedforgetting.1deg.*/ unsignedintcount_per_c;/*usedforgetting.1deg.*/ inttempi; DS1620StartConv(); for(tempi=0;tempi<100;tempi++) { delay10ms(); } RST=1; for(k=0;k<100;k++) { delay10ms(); } Put1620byte(0xAA);//写命令字 temp_and_half_bit=Get1620byte();//读取温度的第一个字节 sign_bit=Get1620byte();//读取温度的符号位,即正负位 RST=0; /*-----Getcountremain&countperCfor.1resolution------------*/ RST=1; Put1620byte(0xA0);//readcountremaining count_remain=Get1620byte();//read1stbyte count_remain+=Get1620byte()*256;//read2ndbyte RST=0; RST=1; Put1620byte(0x41);//loadslopeintocounter RST=0; RST=1; Put1620byte(0xA0);/*readslopeascount/c0xA0=ReadCounter*/ count_per_c=Get1620byte();//read1stbyte count_per_c+=Get1620byte()*256;//read2ndbyte RST=0; /*----------------------------------------------------------------------*/ /*Calculate? Cand? F*/ /*----------------------------------------------------------------------*/ if(count_per_c==0) count_per_c=1; temp_read=(temp_and_half_bit>>1); if(sign_bit! =0) temp_read=(temp_read-128); temp_c=(float)temp_read-0.25+(count_per_c-count_remain)/(float)count_per_c; //temp_c为真实摄氏温度值,上式为芯片手册给的转换公式 temp_f=temp_c*9/5+32;//转换为华氏度 returntemp_c; } /*----------------------------------------------------------------------*/ /*初始化DS1620*/ /*InitialDS1620*/ /*----------------------------------------------------------------------*/ voidInitDS1620(void) { DS1620SetConf(0x02);//设置初始化值位0x00 //DS1620SetTemp(0x50,0x14);//设置初始温度为TH=+40℃,TL=+10℃ } /*----------------------------------------------------------------------*/ /*--------设置TH,TL--------------*/ /*----------------------------------------------------------------------*/ voidDS1620SetTemp(TH,TL) { RST=1; Put1620byte(0x01); delay10ms(); Write1620byte(TH); delay10ms(); RST=0; delay(20); RST=1; Put1620byte(0x02); delay10ms(); Write1620byte(TL); delay10ms(); RST=0; return; } /*----------------------------------------------------------------------*/ /*显示温度函数*/ /*Display_Temp*/ /*----------------------------------------------------------------------*/ voidDisplay_Temp() { unsignedintRead_Temp; //unsignedinta,b,i,j; //unsignedshow_data; Read_Temp=0x00; DS1620StartConv();//转换温度 delay(50); Read_Temp=0x12; LCD_disp_num(Read_Temp); p27Twin(); /*if(Read_Temp==0) { j=0; while(dis1[j]! ='\0') { LCD_pos(0x40+j); LCD_write_data(dis1[j]); j++; } } else { i=0; while(temp[i]! ='\0')//显示字符“temp: ” { LCD_pos(i); LCD_write_data(temp[i]); i++; } } */ } /*--------------------------------------------------------------------*/ /*---LCD1602函数---------------*/ /*----------------------------------------------------------------------*/ /****初始化函数*****/ voidLCD_init(void) { LCD_write_command(0x38); delay (1); LCD_write_command(0x0c); delay (1); LCD_write_command(0x06); delay (1); LCD_write_command(0x01); delay (1); } /****LCD1602写指令函数*****/ voidLCD_write_command(uchardat) { while(LCD_check_busy()); rs=0; rw=0; ep=0; _nop_(); _nop_(); P0=dat; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; } /****LCD1602写数据函数*****/ voidLCD_write_data(uchardat) { while(LCD_check_busy()); rs=1; rw=0; ep=0; _nop_(); _nop_(); P0=dat; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; } /****LCD1602显示字符函数*****/ voidLCD_disp_char(ucharx,uchary,uchardat)//x(0-16),第几个字符开始显示;y(1-2),第几行显示 { ucharaddress; while(dat! ='\0') { if(y==1) address=0x80+x; else address=0xc0+x; LCD_write_command(address); LCD_write_data(dat); } } /********检查忙函数*********/ BOOLLCD_check_busy() { unsignedinti; for(i=0;i<10;i++) { BOOLresult; rs=0;//读忙信号 rw=1; ep=1; _nop_(); _nop_(); _nop_(); _nop_(); result=(BOOL)(P0&0x80); ep=0; returnresult; } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 控制系统 代码