多路温度采集系统.docx
- 文档编号:3405838
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:12
- 大小:76.03KB
多路温度采集系统.docx
《多路温度采集系统.docx》由会员分享,可在线阅读,更多相关《多路温度采集系统.docx(12页珍藏版)》请在冰豆网上搜索。
多路温度采集系统
小型多路温控采集系统设计
一.系统说明
本系统采用51单片机作为控制器,控制温度采集及显示。
温度传感器选用DS18B20,其单总线的通信方式可以减少系统的线路连接。
DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。
DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路。
内温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。
同时本系统选用LCD1602作为显示器件,能够同时显示16x02即32个字符(16列2行)。
其显示清晰,并可以显示阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,满足了系统要求。
二.系统电路图
三、程序流程图
四、程序解读
注:
程序分两部分。
可以先用程序二读出各个器件的序列号,再将序列号填入程序一的SN[4][8]数组中,若要加入更多的器件可以扩大数组,并在程序中增加读显的循环次数。
1.程序一:
已知各个器件序列号读取温度
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharTMP[4];//读取后的4个温度值
ucharSN[4][8]={{0x28,0x44,0x30,0xc5,0xb8,0x00,0x00,0x12},
{0x28,0x15,0x30,0xc5,0xb8,0x00,0x00,0x0b},
{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e},
{0x28,0x05,0x30,0xc5,0xb8,0x00,0x00,0x50}};//4个器件的序列号,先读出单个序列号后填上才可以读取温度
uintf[4];//结果是否为负温,“0”为正温,“1”为负温。
sbitDQ=P3^7;//ds18b20与单片机连接口
sbitRS=P3^0;
sbitRW=P3^1;
sbitEN=P3^2;
unsignedcharcodestr0[]={"temperature:
U"};
unsignedcharcodestr5[]={""};
uchardatadisdata[5];
uinttvalue;//温度值
uchartflag[4];//温度正负标志
/*************************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; P2=com; delay1ms (1); EN=1; delay1ms (1); EN=0; } voidwr_dat(unsignedchardat)//写数据// {delay1ms (1);; RS=1; RW=0; EN=0; P2=dat; 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(); wr_com(0x80); display(str0); wr_com(0xc0); display(str5); } /***************************************************************************** ******************************DS18B20程序***************************************/ voiddelay_18B20(unsignedinti)//延时1微秒 { while(i--); } voidds1820rst()/*ds1820复位*/ {unsignedcharx=0; DQ=1;//DQ复位 delay_18B20(4);//延时 DQ=0;//DQ拉低 delay_18B20(100);//精确延时大于480us DQ=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); } voidds1820wr(ucharwdata)/*写数据*/ {unsignedchari=0; for(i=8;i>0;i--) {DQ=0; DQ=wdata&0x01; delay_18B20(10); DQ=1; wdata>>=1; } } /*******************发送ds1820开始转换/**************************************************************************************/ tmstart(void)// {// ds1820rst();//复位// delay1ms (1);//延时// ds1820wr(0xcc);//跳过序列号命令,对所有器件有效// ds1820wr(0x44);//发转换命令44H,// } /*****************************************************************************/ read_temp()/*读取温度值并转换*/ {// uchari,j;// uchara,b;// for(j=0;j<4;j++)// {// ds1820rst();//复位// delay1ms (1);//延时// ds1820wr(0x55);//发送ROM匹配命令// for(i=0;i<8;i++)// {// ds1820wr(SN[j][i]);//发送64位序列号// }// ds1820wr(0xbe);//*读取温度*/ a=ds1820rd();//连续读取两位温度// b=ds1820rd();// tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0xf800) tflag[j]=0; else {tvalue=~tvalue+1; tflag[j]=1;} f[j]=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 } //return(f[4]); } /*******************************************************************/ voidds1820disp()//温度值显示 {ucharflagdat,i; for(i=0;i<4;i++) {tvalue=f[i]; disdata[0]=tvalue/1000+0x30;//百位数 disdata[1]=tvalue%1000/100+0x30;//十位数 disdata[2]=tvalue%100/10+0x30;//个位数 disdata[3]=tvalue%10/1+0x30;//小数位 if(tflag[i]==0) flagdat=0x20;//正温度不显示符号 else flagdat=0x2d;//负温度显示负号: - if(disdata[0]==0x30) {disdata[0]=0x20;//如果百位为0,不显示 if(disdata[1]==0x30) {disdata[1]=0x20;//如果百位为0,十位为0也不显示 } } if(i==0){wr_com(0x8d);//第一个传感器在LCD第一行第14字符显示“1” wr_dat('1');} if(i==1){wr_com(0x8d);//第二个传感器在LCD第一行第14字符显示“2” wr_dat('2');} if(i==2){wr_com(0x8d);//第三个传感器在LCD第一行第14字符显示“3” wr_dat('3');} if(i==3){wr_com(0x8d);//第四个传感器在LCD第一行第14字符显示“4” wr_dat('4');} wr_com(0xc0);//在LCD第二行第1个字符显示温度正负号 wr_dat(flagdat);//显示符号位 wr_com(0xc1);//在LCD第二行第2个字符显示百位温度值 wr_dat(disdata[0]);//显示百位 wr_com(0xc2);//在LCD第二行第3个字符显示十位温度值 wr_dat(disdata[1]);//显示十位 wr_com(0xc3);//在LCD第二行第4个字符显示个位温度值 wr_dat(disdata[2]);//显示个位 wr_com(0xc4);//在LCD第二行第5个字符显示小数点 wr_dat(0x2e);//显示小数点 wr_com(0xc5);//在LCD第二行第6个字符显示小数位温度值 wr_dat(disdata[3]);//显示小数位 delay1ms(1500); } } /********************主程序***********************************/ voidmain() {init_play();//初始化显示 while (1) { tmstart();//开始转换 read_temp();//读取温度 ds1820disp();//显示 } } / 2.程序二: 读取DS18B20序列号程序 注: 读ROM时,只能有一个器件与单片机通信。 可以逐个相连来读出其ROM #include #defineucharunsignedchar #defineuintunsignedint uintsn[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10}; sbitDQ=P3^7;//ds18b20与单片机连接口 sbitRS=P3^0; sbitRW=P3^1; sbitEN=P3^2; voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的) {unsignedinti,j; for(i=0;i for(j=0;j<100;j++); } voiddelay_18B20(unsignedinti)//延时1微秒 { while(i--); } voidds1820rst()/*ds1820复位*/ {unsignedcharx=0; DQ=1;//DQ复位 delay_18B20(4);//延时 DQ=0;//DQ拉低 delay_18B20(100);//精确延时大于480us DQ=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); } voidds1820wr(ucharwdata)/*写数据*/ {unsignedchari=0; for(i=8;i>0;i--) {DQ=0; DQ=wdata&0x01; delay_18B20(10); DQ=1; wdata>>=1; } } ////////////////////////读取器件序列号子程序//////////////////////////// rom(void) { ds1820rst();//复位// delay1ms (1);//延时// ds1820wr(0x33);//发送读序列号子程序// sn[0]=ds1820rd();//连续读出64位ROM sn[1]=ds1820rd();// sn[2]=ds1820rd();// sn[3]=ds1820rd();// sn[4]=ds1820rd();// sn[5]=ds1820rd();// sn[6]=ds1820rd();// sn[7]=ds1820rd();// } /********************主程序***********************************/ voidmain() { while (1) {rom();//调用读序列号子程序// } } 本文档部分内容来源于网络,如有内容侵权请告知删除,感谢您的配合!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 采集 系统