温控程序.docx
- 文档编号:26188510
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:14
- 大小:16.27KB
温控程序.docx
《温控程序.docx》由会员分享,可在线阅读,更多相关《温控程序.docx(14页珍藏版)》请在冰豆网上搜索。
温控程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P1^0;//ds18b20与单片机连接口
sbitDQ1=P1^1;//ds18b201与单片机连接口
sbitRS=P2^5;
sbitRW=P2^6;
sbitEN=P2^7;
sbitbeef=P3^4;
sbitP36=P3^6;
sbitP37=P3^7;
unsignedcharcodestr1[]={"1:
"};
unsignedcharcodestr2[]={"H:
"};
unsignedcharcodestr3[]={"2:
"};
unsignedcharcodestr4[]={"L:
"};
unsignedcharcodestr5[]={"23.5"};//最低温门限
unsignedcharcodestr6[]={"28.5"};//最高温门制
uchardatadisdata[4];
uchardatadisdata1[4];
uinttemp,temp1,tempL=23.5,tempH=28.5;
uinttvalue,tvalue1;//温度值
uchartflag,tflag1;//温度正负标志
/*************************lcd1602程序**************************/
voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的)
{unsignedinti,j;
for(i=0;i for(j=0;j<100;j++); } voidwr_com(unsignedcharcom)//写指令// {delay1ms (1); RS=0; RW=0; EN=0; P0=com; delay1ms (1); EN=1; delay1ms (1); EN=0; } voidwr_com1(unsignedcharcom1)//写指令// {delay1ms (1); RS=0; RW=0; EN=0; P0=com1; delay1ms (1); EN=1; delay1ms (1); EN=0; } voidwr_dat(unsignedchardat)//写数据// {delay1ms (1);; RS=1; RW=0; EN=0; P0=dat; delay1ms (1); EN=1; delay1ms (1); EN=0; } voidwr_dat1(unsignedchardat1)//写数据// {delay1ms (1);; RS=1; RW=0; EN=0; P0=dat1; delay1ms (1); EN=1; delay1ms (1); EN=0; } voidlcd_init()//初始化设置// {delay1ms(15); wr_com(0x38);delay1ms(5); wr_com(0x08);delay1ms(5); wr_com(0x01);delay1ms(5); wr_com(0x06);delay1ms(5); wr_com(0x0c);delay1ms(5); } voiddisplay(unsignedchar*p)//显示// { while(*p! ='\0') { wr_dat(*p); p++; delay1ms (1); } } init_play()//初始化显示 {lcd_init();//lcd_init wr_com(0x80); display(str1); wr_com(0x89); display(str2); wr_com(0xc0); display(str3); wr_com(0xc9); display(str4); return0; } /******************************ds1820程序***************************************/ voiddelay_18B20(unsignedinti)//延时1微秒 { while(i--); } voidds1820rst()/*ds1820复位*/ { DQ=1;//DQ复位 delay_18B20(4);//延时 DQ=0;//DQ拉低 delay_18B20(100);//精确延时大于480us DQ=1;//拉高 delay_18B20(40); } voidds1820rst1()/*ds1820复位*/ { DQ1=1;//DQ复位 delay_18B20(4);//延时 DQ1=0;//DQ拉低 delay_18B20(100);//精确延时大于480us DQ1=1;//拉高 delay_18B20(40); } uchards1820rd()/*读数据*/ { unsignedchari=0; unsignedchardat=0; for(i=8;i>0;i--) { DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } uchards1820rd1()/*读数据*///读第二个温度传感器// { unsignedcharj=0; unsignedchardat1=0; for(j=8;j>0;j--) { DQ1=0;//给脉冲信号 dat1>>=1; DQ1=1;//给脉冲信号 if(DQ1) dat1|=0x80; delay_18B20(10); } return(dat1); } voidds1820wr(ucharwdata)/*写数据*/ {unsignedchari=0; for(i=8;i>0;i--) {DQ=0; DQ=wdata&0x01; delay_18B20(10); DQ=1; wdata>>=1; } } voidds1820wr1(ucharwdata1)/*写数据*///写第二个温度传感器// {unsignedcharj=0; for(j=8;j>0;j--) { DQ1=0; DQ1=wdata1&0x01; delay_18B20(10); DQ1=1; wdata1>>=1; } } read_temp()/*读取温度值并转换*/ {uchara,b; ds1820rst(); ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0x44);//*启动温度转换*/ ds1820rst(); ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0xbe);//*读取温度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) tflag=0; else {tvalue=~tvalue+1; tflag=1; } tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 return(tvalue); } read_temp1()/*读取温度值并转换*///读第二个温度传感器// {ucharc,d; ds1820rst1(); ds1820wr1(0xcc);//*跳过读序列号*/ ds1820wr1(0x44);//*启动温度转换*/ ds1820rst1(); ds1820wr1(0xcc);//*跳过读序列号*/ ds1820wr1(0xbe);//*读取温度*/ c=ds1820rd1();//温度2进制低8位 d=ds1820rd1();//温度2进制高8位 tvalue1=d; tvalue1<<=8; tvalue1=tvalue1|c;//合并高低位 if(tvalue1<0x0fff) tflag1=0; else { tvalue1=~tvalue1+1; tflag1=1; } tvalue1=tvalue1*(0.625);//温度值扩大10倍,精确到1位小数 return(tvalue1); } /*******************************************************************/ voidds1820disp()//温度值显示 {ucharflagdat; disdata[0]=tvalue/1000+0x30;//百位数 disdata[1]=tvalue%1000/100+0x30;//十位数 disdata[2]=tvalue%100/10+0x30;//个位数 disdata[3]=tvalue%10+0x30;//小数位 temp=tvalue/10+tvalue%10; if(tflag==0) flagdat=0x20;//正温度不显示符号 else flagdat=0x2d;//负温度显示负号: - if(disdata[0]==0x30) {disdata[0]=0x20;//如果百位为0,不显示 if(disdata[1]==0x30) {disdata[1]=0x20;//如果百位为0,十位为0也不显示 } } wr_com(0x82); wr_dat(flagdat);//显示符号位 wr_com(0x83); wr_dat(disdata[0]);//显示百位 wr_com(0x84); wr_dat(disdata[1]);//显示十位 wr_com(0x85); wr_dat(disdata[2]);//显示个位 wr_com(0x86); wr_dat(0x2e);//显示小数点 wr_com(0x87); wr_dat(disdata[3]);//显示小数位 } voidds1820disp1()//温度值显示*************第二个温度传感器********************// {ucharflagdat1; disdata1[0]=tvalue1/1000+0x30;//百位数 disdata1[1]=tvalue1%1000/100+0x30;//十位数 disdata1[2]=tvalue1%100/10+0x30;//个位数 disdata1[3]=tvalue1%10+0x30;//小数位 temp1=tvalue1/10+tvalue1%10; if(tflag1==0) flagdat1=0x20;//正温度不显示符号 else flagdat1=0x2d;//负温度显示负号: - if(disdata1[0]==0x30) {disdata1[0]=0x20;//如果百位为0,不显示 if(disdata1[1]==0x30) {disdata1[1]=0x20;//如果百位为0,十位为0也不显示 } } wr_com1(0xc0+0x02); wr_dat1(flagdat1);//显示符号位 wr_com1(0xc0+0x03); wr_dat1(disdata1[0]);//显示百位 wr_com1(0xc0+0x04); wr_dat1(disdata1[1]);//显示十位 wr_com1(0xc0+0x05); wr_dat1(disdata1[2]);//显示个位 wr_com1(0xc0+0x06); wr_dat1(0x2e);//显示小数点 wr_com1(0xc0+0x07); wr_dat1(disdata1[3]);//显示小数位 } /**********************报警程序******************************/ voidalarm() { unsignedcharj; for(j=10;j>0;j--) { beef=1; delay1ms(20); beef=0; } } /********************主程序***********************************/ main() { P37=1; init_play();//初始化显示 while (1) { beef=0; delay1ms(400); read_temp1();//读取温度 ds1820disp1();//显示 read_temp();//读取温度 ds1820disp();//显示 wr_com(0xcb); display(str5); wr_com(0x8b); display(str6); if((temp { unsignedchari; for(i=20;i>0;i--) { alarm(); P37=0; P36=1; delay1ms(100); P36=0; } } else P37=1; } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温控 程序