《多个DS18B20温度测量程序(共9页).doc》由会员分享,可在线阅读,更多相关《多个DS18B20温度测量程序(共9页).doc(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上#include #include /nop函数 #include #include#define uchar unsigned char#define uint unsigned intsbit DS18B20_DQ=P27;sbit feng=P20;sbit deng=P10;#define LCD_data P0 /ch375数据端口 uchar count1,count2,count;sbit LCD_RS=P35;sbit LCD_RW=P36;/ch375的rw也是此口 sbit LCD_EN=P34;#includeuchar ds18b20_seri
2、al48=0x28,0x51,0x8c,0x9e,0x03,0x00,0x00,0xfd, /第1个18B20的ID 0x28,0x71,0x91,0x9e,0x03,0x00,0x00,0xdb, /第2个18B20的ID 0x28,0x43,0xa6,0x9a,0x03,0x00,0x00,0x83, /第3个18B20的ID 0x28,0xe3,0x8a,0x9e,0x03,0x00,0x00,0x08 /第4个18B20的ID;#includeuchar temp_num1;uchar temp_num2;uint temper=0,yushe1=325,yushe2=325,yush
3、e3=325,yushe4=325,piancha;/*函数:void Ds18b20_Delay(uint timer) 功能:STC单片机严格的us级延时函数 */void Ds18b20_Delay(uint timer) /uswhile(timer-) _nop_(); _nop_(); _nop_(); /*函数:void rest()功能:DS18B20芯片复位函数说明:复位时,MCU将数据线置为低电平,并且保持480uS-960uS,然后置为高电平, 延时一段时间后,然后由MCU接受DS18B20的响应信号。如果接受到了响应信号, 则完成了复位操作。*/uchar Reset(
4、void) /初始化18b20 uchar x; DS18B20_DQ=1; /复位脉冲 _nop_(); _nop_();DS18B20_DQ=0;Ds18b20_Delay(700); DS18B20_DQ=1;Ds18b20_Delay(40);/48usx=DS18B20_DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败while(!DS18B20_DQ);/等到存在脉冲的结束 return x;/*函数:uchar read_bit(void) 功能:从DS18B20读一个位 */uchar read_bit(void)/从DS18B20读一个位值 uchar bda
5、t=0;DS18B20_DQ=1;Ds18b20_Delay(4); /两次间隔大于1usDS18B20_DQ=0;Ds18b20_Delay(4); /读操作开始 DS18B20_DQ=1;Ds18b20_Delay(4);bdat=DS18B20_DQ;Ds18b20_Delay(45);/读时间最短为60us return(bdat); /*函数:void write_bit(uchar bitval) 功能:向DS18B20写一个位 */void write_bit(uchar bitval) /向DS18B20写一位DS18B20_DQ=1;Ds18b20_Delay(4);/jia
6、ngeDS18B20_DQ=0;Ds18b20_Delay(4); /写操作开始 DS18B20_DQ=bitval;Ds18b20_Delay(60);DS18B20_DQ=1; /*函数:uchar read_DS18B20()功能:DS18B20读取函数*/uchar read_byte(void)/从DS18B20读一个字节 uchar i; uchar temp= 0; for(i=0;i8;i+) temp|=(read_bit()i); return temp; /把读到的8位数据输出 /*函数:void ds1820wr(uchar wdata)功能:DS18B20写入函数说明
7、:DS18B20写入数据时, 1.数据线先置低电平0、延时确定的时间为15us 按从低位到高位的顺序发送数据(一次只发送一位)、延时时间为45us; 将数据线拉到高电平、重复上1到5步,知道发送完整个字节、最后将数据线拉高* */void write_byte(uchar dat)/向DS18B20写8位 unsigned char i; for(i=0;i8;i+) write_bit(dat&(1i); /*函数:void read_temp()功能:读取温度值*/uint gettemperature(uchar num)/读取温度 uchar i; uchar templ=0; uin
8、t temph=0; num=key_scan(); while(Reset(); write_byte(0x55);/匹配ROM指令 write_byte(0xcc);/跳过ROM for(i=0;i8;i+)write_byte(ds18b20_serialnumi); /发出64位ROM码 write_byte(0x44);/启动温度转换 Ds18b20_Delay(150); while(Reset(); write_byte(0x55); for(i=0;i8;i+)write_byte(ds18b20_serialnumi); write_byte(0xbe); /读取温度 tem
9、pl=read_byte(); temph=read_byte();/先低后高 为二进制的数值 temph=8; temper=(uint)(temph|templ)*0.0625*10+0.5); return(temper); /*函数:dis_temperature(void)功能:各个DS18B20温度显示、预设值改变和显示、偏差显示函数 */dis_temperature1(void) /SW_K6Init_12864();write_hanzi(0,0,str1);write_hanzi(2,0,str10);while(SW_K5=1&SW_K4=1&SW_K3=1&(key_s
10、can()!=26)&(key_scan()!=21)write_shuzi(1,2,gettemperature(0);/while(count12); /200ms钟更新一次显示 /count1=0;TR0=0;if(key_scan()=2)yushe1+=10;/write_shuzi2(3,0,yushe1);if(key_scan()=1)yushe1-=10;write_shuzi2(3,0,yushe1); /yushe为PID中的SetPointpiancha=gettemperature(0)-yushe1;write_shuzi2(3,5,abs(piancha);if(
11、yushe1gettemperature(0)feng=0;deng=0;else feng=1;deng=1;delay_x_ms(20);dis_serial1(uchar z)uchar i;Init_12864();for(i=0;i8;i+)if(i4)write_serial(i,0,ds18b20_serialzi);elsewrite_serial(i-4,4,ds18b20_serialzi);/*函数:void get_ser(void)功能:显示DS18B20的序列号 */dis_serial(void)/读取序列号 uchar i,temp;Init_12864();w
12、hile(Reset();write_byte(0x33);/读取光刻ROM中编码命令 3for(i=0;i8;i+) temp=read_byte();if(i4)write_serial(i,0,temp);elsewrite_serial(i-4,4,temp);/*12864程序模块*/#ifndef uchar#define uchar unsigned char#define uint unsigned int#endif uchar code str5=度;void delay_1ms(uint z)uint i,j;for(j=0;jz;j+)for(i=0;i110;i+);
13、/*写指令到指令寄存器 */void write_cmd(uint cmd) delay_1ms(1);LCD_RS=0;LCD_RW=0; /LCD_EN=0;LCD_data=cmd;LCD_EN=1;delay_1ms(1);LCD_EN=0;delay_1ms(1);/*写数据到指令寄存器 */void write_dat(uint dat) delay_1ms(1);LCD_RS=1;LCD_RW=0;LCD_EN=0;LCD_data=dat;LCD_EN=1;delay_1ms(1);LCD_EN=0;delay_1ms(1);/*12864初始化程序 */void Init_1
14、2864(void)write_cmd(0x30);/基本指令集设置 delay_1ms(5);write_cmd(0x0c);/整体显示开,游标关闭,游标不显示位置 delay_1ms(5);write_cmd(0x01);/清除显示 delay_1ms(5);/*set汉字位置及显示 */write_hanzi(uchar x,uchar y,uchar *p)uchar wei,num;num=0;switch(x)case 0:wei=0x80;break;case 1:wei=0x90;break;case 2:wei=0x88;break;case 3:wei=0x98;break
15、;write_cmd(wei+y);while(*(p+num)!=0)write_dat(*(p+num);num+; /*set数字位置及显示 */write_shuzi(uchar x,uchar y,uint temp)uchar bai,shi,ge,xiao;uchar wei,num;num=0;switch(x)case 0:wei=0x80;break;case 1:wei=0x90;break;case 2:wei=0x88;break;case 3:wei=0x98;break;write_cmd(wei+y);bai=temp/1000+0x30;shi=temp/10
16、0%10+0x30;ge=temp/10%10+0x30;xiao=temp%10+0x30;write_dat(bai);write_dat(shi);write_dat(ge);write_dat(.);write_dat(xiao);write_hanzi(1,5,str5);write_shuzi2(uchar x,uchar y,uint temp)uchar bai,shi,ge,xiao;uchar wei,num;num=0;switch(x)case 0:wei=0x80;break;case 1:wei=0x90;break;case 2:wei=0x88;break;ca
17、se 3:wei=0x98;break;write_cmd(wei+y);bai=temp/1000+0x30;shi=temp/100%10+0x30;ge=temp/10%10+0x30;xiao=temp%10+0x30;write_dat(bai);write_dat(shi);write_dat(ge);write_dat(.);write_dat(xiao); /*四个DS18B20序列号位置设定及显示 */write_serial(uchar x,uchar y,uint temp)uchar bai,shi,ge;uchar wei,num;num=0;switch(x)case 0:wei=0x80;break;case 1:wei=0x90;break;case 2:wei=0x88;break;case 3:wei=0x98;break;write_cmd(wei+y);bai=temp/100+0x30;shi=temp/10%10+0x30;ge=temp%10+0x30;write_dat(bai);write_dat(shi);write_dat(ge);/*函数:void main()功能:本程序主函数 */void main()Init_12864();while(1)根据情况编写,一般需添加按键选择哪一个DS18B20专心-专注-专业
限制150内