温度传感器ds1820的汇编程序

合集下载

DS18B20原理及程序编写

DS18B20原理及程序编写

DS18B20原理及程序编写(一)概述DS18B20为单总线12位(二进制)温度读数。

内部有64位唯一的ID编码。

工作电压从3.0~5.5V。

测量温度范围从-55℃~125℃。

最高±0.0625℃分辩率。

其内部结构如下图所示。

DS18B20的核心功能是直接数字温度传感器。

温度传感器可以配置成9、10、11和12位方式。

相应的精度分别为:0.5℃、0.25℃、0.125℃和0.0625℃。

默认的分辨率为12位。

DS18B20在空闲低功耗状态下加电(寄生电源工作方式)。

主机必须发出Convert T [44h]命令使其对测量温度进行A-D转换。

接下来进行采集转换,结果存于两字节高速温度寄存器并返回到空闲低功耗状态。

如果DS18B20在外部VDD供电方式下,单片机可以在发出Convert T 命令并总线为1时(总线为0表示正在转换)发出“read time slots”命令。

DS18B20芯片内部共有8字节的寄存器,其中地址编号0,1为温度寄存器,里面存储着DS18B20温度转换后的AD值,其格式如表1所示。

地址编号2,3为温度报警寄存器,里面为报警设定值,地址编号4为配置寄存器(这三个寄存器在读取之前请使用“重新调入EEPROM”命令将存储在EEPROM里的内容调出,同样,在向温度报警寄存器里写入内容后,也要使用“复制到存储器”命令48H将温度报警寄存器内的内容存入EEPROM当中,以免掉电丢失数据)。

DS18B20内部寄存器映射如下图所示。

配置寄存器的格式如表2和表3所示。

DS18B20内部寄存器映射表1 温度寄存器的格式表2 配置寄存器的格式表3 温度分辨率配置DS18B20使用单总线工作方式,其通信协议以电平的高平时间作为依据,其基本时序有复位时序,写时序、读时序。

//********************************************************************** //** 文件名:DS18B20.c//** 说明:DS18B20驱动程序文件//----------------------------------------------------------------------//** 单位://** 创建人:张雅//** 创建时间:2010-01-20//** 联系方式:QQ:276564402//** 版本:V1.0//----------------------------------------------------------------------//**********************************************************************//----------------------------------------------------------------------//** 芯片:AT89S52//** 时钟:11.0592MHz//** 其它:这个文档为18B20的驱动程序,引用了数码管的驱动。

DS18B20多路温度采集汇编程序

DS18B20多路温度采集汇编程序

4路DS18B20温度显示汇编程序(可设置上下限和分路查看)作者蔡雄略;操作说明:;------------------------------------------;功能说明:模式选择键按下后,选择循环显示、分路查看,上限设置,下限设置功能;每按一次模式键,对应的模式指示灯会亮起。

;循环显示模式时候,每秒显示一下各路温度状况;分路查看时界面冻结每按一次+或-键进行各路切换;上限设置时每按一次+或-键对各路上限报警进行设置;下限设置时每按一次+或-键对各路下限报警进行设置;------------------------------------------仿真效果图:程序如下:;------------------------------------------;功能说明:模式选择键按下后,选择循环显示、分路查看,上限设置,下限设置功能;循环显示模式时候,每秒显示一下各路温度状况;分路查看时界面冻结每按一次+或-键进行各路切换;上限设置时每按一次+或-键对各路上限报警进行设置;下限设置时每按一次+或-键对各路下限报警进行设置;------------------------------------------;主程序S0EQU30H;50ms计数寄存器MODE_CONT EQU S0+1;模式计数器DS18B20_CONT EQU S0+2HI_TMP_SET_IN EQU S0+3;进水口LOW_TMP_SET_IN EQU S0+4HI_TMP_SET_OUT EQU S0+5;出水口LOW_TMP_SET_OUT EQU S0+6HI_TMP_SET_FRONT EQU S0+7;前后点HI_TMP_SET_BACK EQU S0+8TMP_IN EQU S0+12TMP_OUT EQU S0+13TMP_FRONT EQU S0+14TMP_BACK EQU S0+15DISPLAY_DATA EQU P0;LED数据口KEY_PORT EQU P3;按键口COM_TEMPERL_L BIT P2.7COM_TEMPERL_H BIT P2.6COM_TEMPERH_L BIT P2.5COM_TEMPERH_H BIT P2.4COM_DS18B20_NUM BIT P2.2LED_LOW_SET BIT P3.0LED_HI_SET BIT P3.1LED_CHECK BIT P3.2LED_NORMAL BIT P3.3IN_LED_ALARM_HI BIT P1.1;ININ_LED_ALARM_LOW BIT P1.3OUT_LED_ALARM_HI BIT P1.0;INOUT_LED_ALARM_LOW BIT P1.2FRONT_LED_ALARM_HI BIT P2.0BACK_LED_ALARM_HI BIT P2.1FLAG1BIT20H.5;DS18B20存在标志位DQ1BIT P1.7DQ2BIT P1.6DQ3BIT P1.5DQ4BIT P1.4TEMPER_L EQU28HTEMPER_H EQU27H;------------------------------------------ORG0000HAJMP STARTORG000BH;T0入口LJMP T_INT;------------------------------------------;START初始化;------------------------------------------ORG100HSTART:MOV TEMPER_L,#00HMOV TEMPER_H,#00HMOV MODE_CONT,#00HMOV DS18B20_CONT,#00HMOV HI_TMP_SET_IN,#100;进水口MOV LOW_TMP_SET_IN,#10MOV HI_TMP_SET_OUT,#100;出水口MOV LOW_TMP_SET_OUT,#10MOV HI_TMP_SET_FRONT,#100MOV HI_TMP_SET_BACK,#100CLR TMP_INCLR TMP_OUTCLR TMP_FRONTCLR TMP_BACKMOV S0,#00HMOV TMOD,#01HMOV TH0,#3CH;定时器0,模式1,定时时常50mS MOV TL0,#0B0HMOV IE,#82HMOV KEY_PORT,#0F8HSETB TR0;运行T0LCALL INIT_18B20;------------------------------------------;主函数;------------------------------------------MAIN:LCALL KEYLCALL GET_TEMPER;获取各路温度LCALL DISPLAY;调用显示程序LJMP MAIN;------------------------------------------;T0中服程序,实现1秒一次切换,同时1秒一次的比较各路温度是否超标;------------------------------------------;T0中服程序T_INT:PUSH ACCPUSH PSWMOV TH0,#3CH;定时器0,模式1,定时时常50mSMOV TL0,#0B0H;------------------------------NEXT:INC S0MOV A,S0CJNE A,#14H,ZDMOV S0,#00H;到1S后进行切换INC DS18B20_CONTMOV A,DS18B20_CONTCJNE A,#04H,ZDMOV DS18B20_CONT,#00HLCALL CHECK1;判断各路温度是否超标ZD:POP PSWPOP ACCRETI;-------------------------------------------;ALARM_CHECK;判断各路温度是否超标;-------------------------------------------CHECK1:MOV R0,TMP_INMOV R1,HI_TMP_SET_INLCALL ALARM_CALJZ ALARM_HI_NORMALSETB IN_LED_ALARM_HIJMP CHECK2ALARM_HI_NORMAL:CLR IN_LED_ALARM_HICHECK2:MOV R0,TMP_INMOV R1,LOW_TMP_SET_INLCALL ALARM_CALJNZ CCSETB IN_LED_ALARM_LOWJMP DDCC:CLR IN_LED_ALARM_LOW DD:MOV R0,TMP_OUTMOV R1,HI_TMP_SET_OUTLCALL ALARM_CALJZ EESETB OUT_LED_ALARM_HIJMP DDDEE:CLR OUT_LED_ALARM_HI DDD:MOV R0,TMP_OUTMOV R1,LOW_TMP_SET_OUTLCALL ALARM_CALJNZ FFSETB OUT_LED_ALARM_LOWJMP GGFF:CLR OUT_LED_ALARM_LOW GG:MOV R0,TMP_OUTMOV R1,HI_TMP_SET_FRONTLCALL ALARM_CALJZ HHSETB FRONT_LED_ALARM_HIJMP IIHH:CLR FRONT_LED_ALARM_HI II:MOV R0,TMP_OUTMOV R1,HI_TMP_SET_BACKLCALL ALARM_CALJZ JJSETB BACK_LED_ALARM_HIJMP ALARM_RET1JJ:CLR BACK_LED_ALARM_HI ALARM_RET1:RET;------------------------------------------;R0=R1A=2,R0<R1A=0,R0>R1A=1 ;比较大小;------------------------------------------ALARM_CAL:;R0,R1MOV A,R0SUBB A,R1JC SMALLMOV A,#01HJMP COMP_RETSMALL:MOV A,#0HCOMP_RET:RET;------------------------------------------;显示子程序;时分秒显示;------------------------------------------DISPLAY:MOV DPTR,#TABMOV A,TEMPER_LMOV B,#10DIV ABMOV R4,AMOV R5,BMOV A,R5;温度低位MOVC A,@A+DPTR;显示输出MOV DISPLAY_DATA,ASETB COM_TEMPERL_LLCALL DELAY5MSCLR COM_TEMPERL_LMOV A,R4MOVC A,@A+DPTR;显示输出MOV DISPLAY_DATA,ASETB COM_TEMPERL_HLCALL DELAY5MSCLR COM_TEMPERL_HMOV A,TEMPER_H;温度高位MOV B,#10DIV ABMOV R4,AMOV R5,BMOV A,R5MOVC A,@A+DPTR;显示输出ANL A,#7FH;MOV DISPLAY_DATA,ASETB COM_TEMPERH_LLCALL DELAY5MSCLR COM_TEMPERH_LMOV A,R4MOVC A,@A+DPTRMOV DISPLAY_DATA,ASETB COM_TEMPERH_HLCALL DELAY5MSCLR COM_TEMPERH_HMOV A,DS18B20_CONTINC AMOVC A,@A+DPTR;显示输出MOV DISPLAY_DATA,ASETB COM_DS18B20_NUMLCALL DELAY5MSCLR COM_DS18B20_NUMRET;------------------------------------------;键盘扫描程序;------------------------------------------KEY:;KEY_PORT,#0FFHMOV A,KEY_PORTCPL AANL A,#0F0HJZ RET1LCALL DELAY10MSMOV A,KEY_PORTCPL AANL A,#0F0HJZ RET1JB ACC.7,MODE_CHANGEJB ACC.6,MODE_DEC_JJB ACC.5,MODE_ADD_JJB ACC.4,NUM_ADD_JRET1:RETMODE_DEC_J:LJMP MODE_DECRETMODE_ADD_J:LJMP MODE_ADDRETNUM_ADD_J:LJMP NUM_ADDRETMODE_CHANGE:INC MODE_CONTMOV A,MODE_CONTCJNE A,#04H,MODE_RETMOV MODE_CONT,#00HSETB TR0MODE_RET:LCALL MODE_DEL WAIT:LCALL DISPLAYJNB P3.7,WAITRETMODE_DEL:MOV A,MODE_CONTCJNE A,#00H,MOD_1CLR LED_LOW_SETCLR LED_HI_SETCLR LED_CHECKSETB LED_NORMALRETMOD_1:CJNE A,#01H,MOD_2CLR LED_LOW_SETCLR LED_HI_SETSETB LED_CHECKCLR LED_NORMALCLR TR0RETMOD_2:CJNE A,#02H,MOD_3CLR LED_LOW_SETSETB LED_HI_SETCLR LED_CHECKCLR LED_NORMALCLR TR0RETMOD_3:SETB LED_LOW_SETCLR LED_HI_SETCLR LED_CHECKCLR LED_NORMALCLR TR0RET;-----------------------------------;----------------------------------MODE_DEC:;模式0MOV A,MODE_CONTCJNE A,#00H,MODE_DEC_1 WAIT1:LCALL DISPLAYJNB P3.6,WAIT1RETMODE_DEC_1:;模式1CJNE A,#01H,MODE_DEC_2MOV A,DS18B20_CONTCJNE A,#00H,MODE_DEC_11MOV DS18B20_CONT,#03H WAIT2:LCALL DISPLAYJNB P3.6,WAIT2RETMODE_DEC_11:DEC DS18B20_CONTWAIT3:LCALL DISPLAYJNB P3.6,WAIT3RETMODE_DEC_2:;模式2IN口CJNE A,#02H,MODE_DEC_3MOV A,DS18B20_CONTCJNE A,#00H,MODE_DEC_21DEC HI_TMP_SET_INMOV A,HI_TMP_SET_OUTJNZ MODE_DEC_DELMOV HI_TMP_SET_IN,#64H MODE_DEC_DEL:MOV TEMPER_H,HI_TMP_SET_INMOV TEMPER_L,#00HJMP MODE_DEC_RETMODE_DEC_21:;OUT口MOV A,DS18B20_CONTCJNE A,#01H,MODE_DEC_22DEC HI_TMP_SET_OUTMOV A,HI_TMP_SET_OUTJNZ MODE_DEC_RET1MOV HI_TMP_SET_OUT,#64H MODE_DEC_RET1:MOV TEMPER_H,HI_TMP_SET_OUTMOV TEMPER_L,#00HJMP MODE_DEC_RETMODE_DEC_22:;前点CJNE A,#02H,MODE_DEC_23DEC HI_TMP_SET_FRONTMOV A,HI_TMP_SET_FRONTJNZ MODE_DEC_RET2MOV HI_TMP_SET_FRONT,#64H MODE_DEC_RET2:MOV TEMPER_H,HI_TMP_SET_FRONT MOV TEMPER_L,#00HJMP MODE_DEC_RETMODE_DEC_23:;后点DEC HI_TMP_SET_BACKMOV A,HI_TMP_SET_BACKJNZ MODE_DEC_XMOV HI_TMP_SET_BACK,#64H MODE_DEC_X:MOV TEMPER_H,HI_TMP_SET_BACK MOV TEMPER_L,#00HMODE_DEC_RET:WAIT4:LCALL DISPLAYJNB P3.6,WAIT4RET;------------------------------------;-----------------------------------MODE_DEC_3:;模式3MOV A,DS18B20_CONTCJNE A,#00H,MODE_DEC_21BDEC LOW_TMP_SET_INMOV A,LOW_TMP_SET_INJNZ MODE_DEC_DELBMOV LOW_TMP_SET_IN,#64H MODE_DEC_DELB:MOV TEMPER_H,LOW_TMP_SET_IN MOV TEMPER_L,#00HJMP MODE_DEC_RETBMODE_DEC_21B:;OUT口MOV A,DS18B20_CONTCJNE A,#01H,MODE_DEC_RETBDEC LOW_TMP_SET_OUTMOV A,LOW_TMP_SET_OUTJNZ MODE_DEC_RET1BMOV LOW_TMP_SET_OUT,#64H MODE_DEC_RET1B:MOV TEMPER_H,LOW_TMP_SET_OUT MOV TEMPER_L,#00HMODE_DEC_RETB:WAIT5:LCALL DISPLAYJNB P3.6,WAIT5RET;-----------------------------------;----------------------------------MODE_ADD:MOV A,MODE_CONTCJNE A,#00H,MODE_ADD_1WAIT6:LCALL DISPLAYJNB P3.5,WAIT6RETMODE_ADD_1:;模式1CJNE A,#01H,MODE_ADD_2MOV A,DS18B20_CONTCJNE A,#03H,MODE_ADD_11MOV DS18B20_CONT,#00HWAIT7:LCALL DISPLAYJNB P3.5,WAIT7RETMODE_ADD_11:INC DS18B20_CONTWAIT8:LCALL DISPLAYJNB P3.5,WAIT8RETMODE_ADD_2:;模式2IN口CJNE A,#02H,MODE_ADD_3MOV A,DS18B20_CONTCJNE A,#00H,MODE_ADD_21INC HI_TMP_SET_INMOV A,HI_TMP_SET_OUTCJNE A,#64H,MODE_ADD_DELMOV HI_TMP_SET_IN,#00H MODE_ADD_DEL:MOV TEMPER_H,HI_TMP_SET_IN MOV TEMPER_L,#00HJMP MODE_ADD_RETMODE_ADD_21:;OUT口MOV A,DS18B20_CONTCJNE A,#01H,MODE_ADD_22INC HI_TMP_SET_OUTMOV A,HI_TMP_SET_OUTCJNE A,#64H,MODE_ADD_RET1MOV HI_TMP_SET_OUT,#00H MODE_ADD_RET1:MOV TEMPER_H,HI_TMP_SET_OUTMOV TEMPER_L,#00HJMP MODE_ADD_RETMODE_ADD_22:;前点CJNE A,#02H,MODE_ADD_23INC HI_TMP_SET_FRONTMOV A,HI_TMP_SET_FRONTCJNE A,#64H,MODE_ADD_RET2MOV HI_TMP_SET_FRONT,#00H MODE_ADD_RET2:MOV TEMPER_H,HI_TMP_SET_FRONT MOV TEMPER_L,#00HJMP MODE_ADD_RETMODE_ADD_23:;后点INC HI_TMP_SET_BACKMOV A,HI_TMP_SET_BACKCJNE A,#64H,MODE_ADD_XMOV HI_TMP_SET_BACK,#00HMODE_ADD_X:MOV TEMPER_H,HI_TMP_SET_BACKMOV TEMPER_L,#00HMODE_ADD_RET:WAIT9:LCALL DISPLAYJNB P3.5,WAIT9RET;------------------------------------;-----------------------------------MODE_ADD_3:;模式3MOV A,DS18B20_CONTCJNE A,#00H,MODE_ADD_21BINC LOW_TMP_SET_INMOV A,LOW_TMP_SET_INCJNE A,#64H,MODE_ADD_DELBMOV LOW_TMP_SET_IN,#00H MODE_ADD_DELB:MOV TEMPER_H,LOW_TMP_SET_IN MOV TEMPER_L,#00HJMP MODE_ADD_RETBMODE_ADD_21B:;OUT口MOV A,DS18B20_CONTCJNE A,#01H,MODE_ADD_RETBINC LOW_TMP_SET_OUTMOV A,LOW_TMP_SET_OUTCJNE A,#64H,MODE_ADD_RET1BMOV LOW_TMP_SET_OUT,#64H MODE_ADD_RET1B:MOV TEMPER_H,LOW_TMP_SET_OUT MOV TEMPER_L,#00HMODE_ADD_RETB:WAIT71:LCALL DISPLAYJNB P3.5,WAIT71RET;----------------------------------;----------------------------------NUM_ADD:INC DS18B20_CONTMOV A,DS18B20_CONTCJNE A,#04H,NUM_ADD_RETMOV DS18B20_CONT,#00HNUM_ADD_RET:WAIT81:LCALL DISPLAYJNB P3.5,WAIT81RET;--------------------------------DELAY;延时程序;----------------------------------DELAY5MS:MOV R1,#2;5mS延时#5D1:MOV R2,#248D2:DJNZ R2,D2DJNZ R1,D1RET;------------------------------------------10MS DELAY DELAY10MS:MOV R3,#25;10mS延时D4:MOV R4,#200D3:DJNZ R4,D3DJNZ R3,D4RET;**********DS18B20复位程序***************** INIT_18B20:SETB DQ1SETB DQ2SETB DQ3SETB DQ4NOPNOPNOPNOPCLR DQ1CLR DQ2CLR DQ3CLR DQ4MOV R0,#0FBHTSR1:DJNZ R0,TSR1;延时SETB DQ1SETB DQ2SETB DQ3SETB DQ4MOV R0,#25HTSR2:JNB DQ1,TSR3JNB DQ2,TSR3JNB DQ3,TSR3JNB DQ4,TSR3DJNZ R0,TSR2TSR3:SETB FLAG1;置标志位,表明DS18B20存在AJMP TSR5TSR4:CLR FLAG1LJMP TSR7TSR5:MOV R0,#06BHTSR6:DJNZ R0,TSR6TSR7:SETB DQ1;表明不存在RET;********************设定DS18B20暂存器设定值************** RE_CONFIG:JB FLAG1,RE_CONFIG1RETRE_CONFIG1:MOV A,#0CCH;放跳过ROM命令LCALL WRITE_18B20MOV A,#4EHLCALL WRITE_18B20;写暂存器命令MOV A,#00H;报警上限中写入00HLCALL WRITE_18B20MOV A,#00H;报警下限中写入00HLCALL WRITE_18B20MOV A,#7FH;选择12位温度分辨率LCALL WRITE_18B20RET;*****************读转换后的温度值**************** GET_TEMPER:MOV A,MODE_CONTJZ GET_NEXT;只有模式零才GETCJNE A,#02H,AARETAA:CJNE A,#03H,GET_NEXTRETGET_NEXT:SETB DQ1SETB DQ2SETB DQ3SETB DQ4LCALL INIT_18B20JB FLAG1,TSS2RET;若不存在则返回TSS2:MOV A,#0CCH;跳过ROMLCALL WRITE_18B20MOV A,#44H;发出温度转换命令LCALL WRITE_18B20LCALL INIT_18B20MOV A,#0CCH;跳过ROMLCALL WRITE_18B20MOV A,#0BEH;发出读温度换命令LCALL WRITE_18B20MOV A,DS18B20_CONTCJNE A,#00H,READ_1LCALL READ2_18B20LCALL CHANGE1MOV TMP_IN,TEMPER_HRETREAD_1:MOV A,DS18B20_CONTCJNE A,#01H,READ_2LCALL READ2_18B20_2LCALL CHANGE1MOV TMP_OUT,TEMPER_HRETREAD_2:MOV A,DS18B20_CONTCJNE A,#02H,READ_3LCALL READ2_18B20_3LCALL CHANGE1MOV TMP_FRONT,TEMPER_HRETREAD_3:LCALL READ2_18B20_4;读两个字节的温度LCALL CHANGE1MOV TMP_BACK,TEMPER_HRET;**************************************;***************写DS18B20程序************ WRITE_18B20:MOV R2,#8CLR CWR1:CLR DQ1CLR DQ2CLR DQ3CLR DQ4MOV R3,#6DJNZ R3,$RRC AMOV DQ1,CMOV DQ2,CMOV DQ3,CMOV DQ4,CMOV R3,#23DJNZ R3,$SETB DQ1SETB DQ2SETB DQ3SETB DQ4NOPDJNZ R2,WR1SETB DQ1SETB DQ2SETB DQ3SETB DQ4RET;***********读18B20程序,读出两个字节的温度*********READ2_18B20:MOV R4,#2;低位存在29H,高位存在TEMPER_H MOV R1,#TEMPER_LRE00:MOV R2,#8RE01:CLR CSETB CNOPNOPCLR DQ1NOPNOPSETB DQ1MOV R3,#7DJNZ R3,$MOV C,DQ1MOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE01MOV@R1,ADEC R1DJNZ R4,RE00RET;***********读18B20_2程序,读出两个字节的温度********* READ2_18B20_2:MOV R4,#2;低位存在29H,高位存在TEMPER_H MOV R1,#TEMPER_LRE001:MOV R2,#8RE012:CLR CSETB CNOPCLR DQ2NOPNOPNOPSETB DQ2MOV R3,#7DJNZ R3,$MOV C,DQ2MOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE012MOV@R1,ADEC R1DJNZ R4,RE001RET;***********读18B20_3程序,读出两个字节的温度********* READ2_18B20_3:MOV R4,#2;低位存在29H,高位存在TEMPER_H MOV R1,#TEMPER_LRE002:MOV R2,#8RE013:CLR CSETB CNOPNOPCLR DQ3NOPNOPNOPSETB DQ3MOV R3,#7DJNZ R3,$MOV C,DQ3MOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE013MOV@R1,ADEC R1DJNZ R4,RE002RET;***********读18B20_3程序,读出两个字节的温度********* READ2_18B20_4:MOV R4,#2;低位存在29H,高位存在TEMPER_H MOV R1,#TEMPER_LRE003:MOV R2,#8RE014:CLR CSETB CNOPNOPCLR DQ4NOPNOPNOPSETB DQ4MOV R3,#7DJNZ R3,$MOV C,DQ4MOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE014MOV@R1,ADEC R1DJNZ R4,RE003RET;************读出的温度进行数据转换**************CHANGE1:MOV A,MODE_CONTJZ CHANGE1_NEXT;只有模式零和1才GETCJNE A,#02H,BBRETBB:CJNE A,#03H,CHANGE1_NEXTRETCHANGE1_NEXT:MOV A,TEMPER_LANL A,#0FHMOV B,#6HMUL ABMOV R0,AMOV A,TEMPER_LMOV C,TEMPER_H.0;将TEMPER_H中的最低位移入C RRC AMOV C,TEMPER_H.1RRC AMOV C,TEMPER_H.2RRC AMOV C,TEMPER_H.3RRC AMOV TEMPER_H,AMOV TEMPER_L,R0RET;***********************************D1MS:MOV R7,#80;1MS延时(按12MHZ算)DJNZ R7,$RET;*************************TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HEND;DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,0H;共阴极LED;END。

ds18b20温度计程序

ds18b20温度计程序

ORG 0000HAJMP MAINORG 0030HMAIN: MOV R5,#0FFHMAIN1:MOV P0,#00H ;系统自检。

自高位向低位带小数点显示8扫描256次CLR P2.4LCALL DELAYSETB P2.4CLR P2.5LCALL DELAYSETB P2.5CLR P2.6LCALL DELAYSETB P2.6CLR P2.7LCALL DELAYSETB P2.7DJNZ R5,MAIN1SETB P2.4 ;关显示SETB P2.5SETB P2.6SETB P2.7SJMP MAIN2DELAY:MOV R7 ,#05H //;延时LP8: MOV R6,#19HLP7:DJNZ R6,LP7DJNZ R7,LP8RET; DS18B20初始化汇编程序;*****************************************//MAIN2:LCALL DISP //;主程序SETB P3.2 // ;18B20DQ置1拉高LCALL INIT // ;调初始化MOV A,#0CCH //;跳过ROM匹配------0CCLCALL WRITE // ;调写DS18B20的程序MOV A,#44H // ;发出温度转换命令LCALL WRITE // ;调写DS18B20的程序MOV R6,#34H //;延时136微秒转换时间,写一个字约需70微秒。

DJNZ R6,$LCALL DISPLCALL INITMOV A,#0CCHLCALL WRITEMOV A,#0BEH // ;发出读温度命令LCALL WRITELCALL READCLR CLCALL CONVTEMPLCALL DISPBCDLCALL DISPSJMP MAIN2WRITE:MOV R0,#8 // ;写子程序CLR CWR1: CLR P3.2MOV 20H,#3 // ;延时17微秒DJNZ 20H,$RRC AMOV P3.2,CMOV 21H,#10 // ;发送后延时45微秒DJNZ 21H,$SETB P3.2NOPDJNZ R0,WR1 // ;8位未发送完转SETB P3.2RETREAD: MOV R6,#2 // ;读子程序CLR PSW.5 // ;清清标志F0RE0:MOV R2,#8RE1:CLR CSETB P3.2 // ;拉高DQNOP // ;延时2微秒CLR P3.2 // ;拉低DQSETB P3.2MOV 22H,#3RE2:DJNZ 22H,RE2MOV C,P3.2MOV 23H,#10RE3:DJNZ 23H,RE3RRC ADJNZ R2,RE1 //;8位未读完继续读CPL PSW.5JNB PSW.5,RE4 // ;高8位保存至28HMOV 29H,A // ;低8位及小数保存至29HRE4:MOV 28H,ADJNZ R6,RE0 //;高8位未读继续RETINIT:SETB P3.2 // ;初始化开始DQ置1(整个时隙和理论值不是很准确)NOP //;延时L0:CLR P3.2 // ;DQ拉低MOV 24H,#100 // ;延时400微秒DJNZ 24H,$SETB P3.2 // ;DQ拉高MOV 25H,#10 // ;置40微秒延时常数L01:JNB P3.2,L2 // ;有18B20响应转L2DJNZ 25H,L01 // ;无18B20响应等待40微秒SJMP L0 // ;无18B20重新初始化L2:MOV R7,#60 // ,延时240微秒L3:DJNZ R7,L3SETB P3.2 //;DQ拉高、退出RETCONVTEMP:MOV A,28H //;温度转换ANL A,#80H //;温度正负判别JZ TEMPC1 //;温度为正转CLR C // ;温度为负调整MOV A,29HCPL AADD A,#01HMOV 29H,AMOV A,28HCPL AADDC A,#00HMOV 28H,AMOV 26H,#0BH // ;温度为负26H内送#0BHSJMP TEMPC11TEMPC1:MOV 26H,#0AH //;温度为正26H内送#0AHTEMPC11:MOV A,26HSWAP AMOV 26H,A // ;26H高4位为温度符号MOV A,29H // ;取温度小数部分ANL A,#0FH ;去整数个位MOV DPTR,#DOTTABMOVC A,@A+DPTRMOV 27H,A // ;查表得小数值,并保存至27H单元MOV A,29H // ;温度整数部分拼装后暂时存入AANL A,#0F0H // ;留下整数个位SWAP AMOV 29H,AMOV A,28HANL A,#0FHSWAP AHEX2BCD1:MOV B,#64H // ;温度整数部分除100得整数百位,并存入R7中DIV ABMOV R7,A // ;R7中为百位,B中为十位和个位MOV A,#0AH // ;温度整数部分除10得整数十位和个位XCH A,B // ;除数与被除数交换DIV ABSWAP AORL A,BTEMPC10:MOV 29H,A // ;温度十位和个位存入29H单元中,十位在高4位,个位在低4位ANL A,#0F0H // ;取温度十位SWAP AORL A,26H //;十位加温度符号存入26H单元;高4位为符号MOV 26H,AMOV A,29HANL A,#0FH // ;取温度个位SWAP AORL A,27HMOV 27H,A // ;27H单元中高4位为个位,低4位为小数MOV A,R7JZ TEMPC12 // ;百位为0退出ANL A,#0FH // ;百位不为0即温度为正和十位重新拼装后存入26H,高4位为百位SWAP A // ;MOV R7,AMOV A,26HANL A,#0FH ; // ;去除26H单元的符号ORL A,R7 //;百位和十位拼装,放入26H单元高4位为百位MOV 26H,A // ;低4位为十位TEMPC12:RETDOTTAB:DB 00H,01H,01H,02H,03HDB 03H,04H,04H,05H,06HDB 06H,07H,08H,08H,09H,09HDISPBCD:MOV A,27H // ;BCD码转换ANL A,#0FHMOV 70H,A // ;取小数,并保存在70H中SWAP AANL A,#0FHMOV 71H,A // ;取整数个位,并保存在71H中MOV A,26HANL A,#0FHMOV 72H,A //;取整数十位,并保存在72H中MOV A,26HSWAP AANL A,#0FHMOV 73H,A // ;取整数百位,并保存在73H中MOV A,72H //;取整数十位ANL A,#0F0HCJNE A,#00H,DISPBCD2SJMP DISPBCD2DISPBCD0:MOV A,26H // ;取整数百位ANL A,#0F0HCJNE A,#00H,DISPBCD2 //;百位不等于0退出MOV A,26HSW AP AANL A,#0FH //;十位保留符号MOV 73H,#0AHMOV 72H,ADISPBCD2:RETDISP:MOV R1,#70H // ;显示子程序MOV R5,#11101111B // ;送Y4位码PLAY:MOV P0,#0FFH // ;关段码MOV A,R5 // ;取Yn位码MOV P2,A // ;送位码MOV A,@R1 //;取段码MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,A // ;送段码MOV A,R5JB ACC.5,LOOP1 // ;位码未指向Y2(整数个位)转CLR P0.7 ;;开小数点LOOP1:LCALL DL1MS //;调显示延时INC R1 // ;指向下一位显示段码MOV A,R5 ;取显示位码JNB ACC.7,ENDOUTRL A // ;向下一位位码MOV R5,AAJMP PLAYENDOUT:MOV P0,#0FFHMOV P3,#0FFHRETTAB: DB 0C0H,0F9H,0A4H,0B0HDB 99H,92H,82H,0F8HDB 80H,90H,0FFH,0BFHDL1MS:MOV R6,#14H // ;延时1mS DL1: MOV R7,#19HDL2: DJNZ R7,DL2DJNZ R6,DL1RETEND。

DS18B20温度传感器程序

DS18B20温度传感器程序

DS18B20温度传感器程序#include#include#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit beep=P2^3;uint temp;float f_temp;unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void dsreset() //DS18B20复位,初始化函数{uint i;ds=0;i=103;while(i>0) i--;ds=1;i=4;while(i>0) i--;}bit tempreadbit() //读1位字节uint i;bit dat;ds=0;i++; //i++起延时作用ds=1;i++;i++;dat=ds;i=8; while(i>0) i--;return(dat);}uchar tempread() //读一个字节数据函数{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tempreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前,这样刚好一个字节在dat里}return(dat);}tempwritebyte(uchar dat)//向DS18B20写一个字节数据函数{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb)ds=0;i++;i++;ds=1;i=8;while(i>0) i--;}else{ds=0;i=8;while(i>0) i--;ds=1;i++;i++;}}}tempchange() //DS18B20开始获取温度{dsreset();delay(1);tempwritebyte(0xcc); //写跳过读ROM指令tempwritebyte(0x44); //写温度转换指令}uint get_temp() //读取寄存器的温度数据{uchar a,b;dsreset();delay(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread(); //读底8位b=tempread(); //读高8位temp=b;temp<<=8; //两个字节组合为1个字节temp=temp|a;f_temp=temp*0.0625;//温度寄存器中为12位,分辨率为0.0625度temp=f_temp*10+0.5; //小数只取一位,加0.5为四舍五入f_temp=f_temp+0.05;return temp; //temp是整型}main(){while(1){tempchange();}}。

VHDL语言编写DS18B20温度传感器程序

VHDL语言编写DS18B20温度传感器程序

V H D L语言编写D S18B20温度传感器程序Revised on July 13, 2021 at 16:25 pm----------VHDL语言编写DS18B20温度传感器程序library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity ds18B20 isportclk : in std_logic; ---50MHzdq : inout std_logic;rst: in std_logic;LED : out std_logic;LED2 : out std_logic;LED3 : out std_logic;dataout1;dataout2;dataout3 : out std_logic_vector6 downto 0 ; --数end ds18B20;architecture Behavioral of ds18B20 isTYPE STATE_TYPE isRESET;CMD_CC;WRITE_BYTE;WRITE_LOW;WRITE_HIGH;READ_BIT; CMD_44;CMD_BE;WAIT800MS;GET_TMP;WAIT4MS;signal STATE: STATE_TYPE:=RESET;signal clk_temp : std_logic:='0';signal clk1m : std_logic; --分频后得到的1M时钟signal cp: std_logic; -- 1ms 时钟signal w : integer range 0 to 2 :=0; --- xian shi shun xusignal write_temp : std_logic_vector7 downto 0:="00000000";signal TMP : std_logic_vector11 downto 0;signal tmp_bit : std_logic;signal WRITE_BYTE_CNT : integer range 0 to 8:=0;signal WRITE_LOW_CNT : integer range 0 to 2:=0;signal WRITE_HIGH_CNT : integer range 0 to 2:=0;signal READ_BIT_CNT : integer range 0 to 3:=0;signal GET_TMP_CNT : integer range 0 to 13:=0;signal cnt : integer range 0 to 100_001:=0;----------******************************signal cnt2 : integer range 0 to 4000001:=0;signal temp : std_logic;signal data_temp0 : std_logic_vector15 downto 0;signal decimal0 : std_logic_vector15 downto 0;signal decimal1 : std_logic_vector15 downto 0;signal decimal2 : std_logic_vector15 downto 0;signal decimal3 : std_logic_vector15 downto 0;signal data_temp1 : std_logic_vector7 downto 0;signal integer0 : std_logic_vector7 downto 0;signal integer1 : std_logic_vector7 downto 0;signal integer2 : std_logic_vector7 downto 0;signal integer3 : std_logic_vector7 downto 0;signal integer4 : std_logic_vector7 downto 0;signal integer5 : std_logic_vector7 downto 0;signal integer6 : std_logic_vector7 downto 0;signal sign : std_logic_vector7 downto 0;signal count : integer range 0 to 51:=0;signal WRITE_BYTE_FLAG : integer range 0 to 4:=0; function disnum: std_logic_vector return std_logic_vector is begincase num iswhen "0000" => return "1000000"; --0when "0001" => return "1111001"; --1when "0010" => return "0100100"; --2when "0011" => return "0110000"; --3when "0100" => return "0011001"; --4when "0101" => return "0010010"; --5when "0110" => return "0000010"; --6when "0111" => return "1111000"; --7when "1000" => return "0000000"; --8when "1001" => return "0010000"; --9when "1010" => return "0001000"; --Awhen "1011" => return "0000011"; --bwhen "1100" => return "1000110"; --Cwhen "1101" => return "0100001"; --dwhen "1110" => return "0000110"; --Ewhen "1111" => return "0001110"; --Fwhen others => return "1111111"; --mieend case;end dis;begin----------@@@@@@@@@@@@@---------------- ClkDivider:process clk;clk_tempbeginif rising_edgeclk thenif count = 24 thencount <= 0;clk_temp<= not clk_temp;elsecount <= count +1;end if;end if;clk1m<=clk_temp;end Process;----------@@@@@@@@@@@@@----------------process clk1mvariable n: integer range 0 to 12000:=0;begin -----cp 1msif rising_edgeclk1m thenn:=n+1;if n>12000 then n:=0; cp<=not cp; end if;end if;end Process;STATE_TRANSITION:processSTATE;clk1mbeginif rising_edgeclk1m thenifrst='0' thenSTATE<=RESET;elsecase STATE iswhen RESET=>--**********LED2<='0';--*************-LED3<='0';--*********if cnt>=0 and cnt<500 then -- 500μs的复位低电平dq<='0';-- dq作为输出cnt<=cnt+1;STATE<=RESET;elsif cnt>=500 and cnt<510 then --高阻态再输入下一级电路的话;对下级电路无任何影响;和没接一样;高阻态可以应用在inout端口里面;这样在inout没有输出的时候就弄个高阻态;这样就其电平就可以由外面的输入信号决定了dq<='Z';cnt<=cnt+1;STATE<=RESET; --拉高dqelsif cnt>=510 and cnt<750 then -- 240μstemp<=dq; -- dq作为输入ifcnt=580 thentemp<=dq;iftemp='1' thenLED<='0';else LED<='1';end if;end if;cnt<=cnt+1;STATE<=RESET;elsif cnt>=750 thencnt<=0; --计数器清零STATE<=CMD_CC; --复位过程伴随着跳跃rom指令“CC”end if;when CMD_CC=> --跳跃rom指令“CC”LED2<='1';LED3<='0';STATE<=WRITE_BYTE;when WRITE_BYTE=>case WRITE_BYTE_CNT iswhen 0 to 7=>if write_tempWRITE_BYTE_CNT='0' thenSTATE<=WRITE_LOW;LED3<='1';elseSTATE<=WRITE_HIGH;end if;WRITE_BYTE_CNT<=WRITE_BYTE_CNT+1;when 8=>if WRITE_BYTE_FLAG=0 then -- 第一次写0XCC完毕STATE<=CMD_44;WRITE_BYTE_FLAG<=1;elsif WRITE_BYTE_FLAG=1 then --写0X44完毕写温度转换指令后没有读数据STATE<=RESET;WRITE_BYTE_FLAG<=2;elsif WRITE_BYTE_FLAG=2 then --第二次写0XCC完毕STATE<=CMD_BE;WRITE_BYTE_FLAG<=3;elsif WRITE_BYTE_FLAG=3 then --写0XBE完毕STATE<=GET_TMP;WRITE_BYTE_FLAG<=0;end if;WRITE_BYTE_CNT<=0;when others=>STATE<=RESET;end case;when WRITE_LOW=>LED3<='1';case WRITE_LOW_CNT iswhen 0=>dq<='0';if cnt=70 thencnt<=0;WRITE_LOW_CNT<=1;elsecnt<=cnt+1;end if;dq<='Z';if cnt=5 thencnt<=0;WRITE_LOW_CNT<=2;elsecnt<=cnt+1;end if;when 2=>STATE<=WRITE_BYTE;WRITE_LOW_CNT<=0;when others=>WRITE_LOW_CNT<=0; end case;when WRITE_HIGH=>case WRITE_HIGH_CNT iswhen 0=>dq<='0';if cnt=8 thencnt<=0;WRITE_HIGH_CNT<=1;elsecnt<=cnt+1;end if;when 1=>dq<='Z';if cnt=72 thencnt<=0;WRITE_HIGH_CNT<=2;elsecnt<=cnt+1;end if;when 2=>STATE<=WRITE_BYTE;WRITE_HIGH_CNT<=0;when others=>WRITE_HIGH_CNT<=0; end case;when CMD_44=>write_temp<="01000100";STATE<=WRITE_BYTE;when CMD_BE=>STATE<=WRITE_BYTE;----------------------------------when READ_BIT=>case READ_BIT_CNT isdq<='0'; --4μs的低电平if cnt=4 thenREAD_BIT_CNT<=1;cnt<=0;elsecnt<=cnt+1;end if;when 1=>dq<='Z'; --4μs的高电平if cnt=4 thenREAD_BIT_CNT<=2;cnt<=0;elsecnt<=cnt+1;end if;when 2=>dq<='Z';TMP_BIT<=dq; --12μs读出数据 ;就是最后一次赋值的结果.. if cnt=4 thenREAD_BIT_CNT<=3;cnt<=0;elsecnt<=cnt+1;end if;when 3=>---------------------dq<='Z'; --控制器拉高总线---------------------if cnt=50 then --读出数据后;等待50uscnt<=0;READ_BIT_CNT<=0;STATE<=GET_TMP;elsecnt<=cnt+1;end if;when others=>READ_BIT_CNT<=0;end case;-------#################--------------when GET_TMP=>case GET_TMP_CNT iswhen 0 =>STATE<=READ_BIT;GET_TMP_CNT<=GET_TMP_CNT+1;when 1 to 12=>STATE<=READ_BIT;TMPGET_TMP_CNT-1<=TMP_BIT;--将读出的每一位数据按顺序存进TMP0 to 11里面GET_TMP_CNT<=GET_TMP_CNT+1; --存的是读出的0到11位;第十二位没有存when 13=>GET_TMP_CNT<=0;STATE<=WAIT4MS;end case;when WAIT4MS=>if cnt>=4000 then--STATE<=WAIT4MS;STATE<=RESET;cnt<=0;elsecnt<=cnt+1;STATE<=WAIT4MS;end if;when others=>STATE<=RESET;LED<='0';LED2<='0';LED3<='0';end case;end if;end if;end process;-----------------------------------------------DISPLAY: process cp --------数码管动态显示温度值variable temp:std_logic_vector3 downto 0;begincase w iswhen 0 => temp:= TMP3 downto 0; dataout1<=distemp ;w<= 1;when 1 => temp:= TMP7 downto 4; dataout2<=distemp ;w<= 2;when 2 => temp:= TMP11 downto 8; dataout3<=distemp ;w<= 0;end case;end process;end Behavioral;。

温度传感器ds1820 的汇编程序

温度传感器ds1820 的汇编程序

晶振:12MTEMPER_L EQU 36HTEMPER_H EQU 35HTEMPER_NUM EQU 60HFLAG1 BIT 00HDQ BIT P3.3AAA:MOV SP,#70HLCALL GET_TEMPERLCALL TEMPER_COVLJMP AAANOP;------------------读出转换后的温度值GET_TEMPER:SETB DQ ; 定时入口BCD:LCALL INIT_1820JB FLAG1,S22LJMP BCD ; 若DS18B20不存在则返回S22:LCALL DELAY1MOV A,#0CCH ; 跳过ROM匹配------0CCLCALL WRITE_1820MOV A,#44H ; 发出温度转换命令LCALL WRITE_1820NOPLCALL DELAYLCALL DELAYCBA:LCALL INIT_1820JB FLAG1,ABCLJMP CBAABC:LCALL DELAY1MOV A,#0CCH ; 跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ; 发出读温度命令LCALL WRITE_1820LCALL READ_18200 ;READ_1820RET;------------------读DS18B20的程序,从DS18B20中读出一个字节的数据READ_1820:MOV R2,#8RE1:CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE1RET;-------------------写DS18B20的程序WRITE_1820:MOV R2,#8CLR CWR1:CLR DQMOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1SETB DQRET;-------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据READ_18200:MOV R4,#2 ; 将温度高位和低位从DS18B20中读出MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)RE00:MOV R2,#8RE01:CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RET;-------------------将从DS18B20中读出的温度数据进行转换TEMPER_COV:MOV A,#0F0HANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值SWAP AMOV TEMPER_NUM,AMOV A,TEMPER_LJNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值INC TEMPER_NUMTEMPER_COV1:MOV A,TEMPER_HANL A,#07HSWAP AORL A,TEMPER_NUMMOV TEMPER_NUM,A ; 保存变换后的温度数据LCALL BIN_BCDRET;-------------------将16进制的温度数据转换成压缩BCD码BIN_BCD:MOV DPTR,#TEMP_TABMOV A,TEMPER_NUMMOVC A,@A+DPTRMOV TEMPER_NUM,ARETTEMP_TAB:DB 00H,01H,02H,03H,04H,05H,06H,07HDB 08H,09H,10H,11H,12H,13H,14H,15HDB 16H,17H,18H,19H,20H,21H,22H,23HDB 24H,25H,26H,27H,28H,29H,30H,31HDB 32H,33H,34H,35H,36H,37H,38H,39HDB 40H,41H,42H,43H,44H,45H,46H,47HDB 48H,49H,50H,51H,52H,53H,54H,55HDB 56H,57H,58H,59H,60H,61H,62H,63HDB 64H,65H,66H,67H,68H,69H,70H,71HDB 72H,73H,74H,75H,76H,77H,78H,79HDB 80H,81H,82H,83H,84H,85H,86H,87HDB 88H,89H,90H,91H,92H,93H,94H,95HDB 96H,97H,98H,99H;-------------------DS18B20初始化程序INIT_1820:SETB DQNOPCLR DQMOV R0,#80HTSR1:DJNZ R0,TSR1 ; 延时SETB DQMOV R0,#25H ;96US-25HTSR2:DJNZ R0,TSR2JNB DQ,TSR3LJMP TSR4 ; 延时TSR3:SETB FLAG1 ; 置标志位,表示DS1820存在LJMP TSR5TSR4:CLR FLAG1 ; 清标志位,表示DS1820不存在LJMP TSR7TSR5:MOV R0,#06BH ;200USTSR6:DJNZ R0,TSR6 ; 延时TSR7:SETB DQRET;------------------重新写DS18B20暂存存储器设定值RE_CONFIG:JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1 RETRE_CONFIG1:MOV A,#0CCH ; 发SKIP ROM命令LCALL WRITE_1820MOV A,#4EH ; 发写暂存存储器命令LCALL WRITE_1820MOV A,#00H ; TH(报警上限)中写入00HLCALL WRITE_1820MOV A,#00H ; TL(报警下限)中写入00HLCALL WRITE_1820MOV A,#7FH ; 选择12位温度分辨率LCALL WRITE_1820RET;------------------延时子程序DELAY:MOV R7,#00HMIN:DJNZ R7,YS500RETYS500:LCALL YS500USLJMP MINYS500US:MOV R6,#00HDJNZ R6,$RETDELAY1:MOV R7,#20HDJNZ R7,$RET。

DS18B20温度传感器C程序

DS18B20温度传感器C程序

DS18B20温度传感器C程序单片机型号:STC89C54RD+, STC89C52RC测试通过。

晶震频率:11.05924使用时只需要修改对应的外部管脚即可。

MAIN.C:#include <reg52.h>#include <intrins.h>sbit IO_18B20 = P3^2; //18B20通讯引脚。

extern void DelayX10us(unsigned char t);extern bit Get18B20Temp(int *temp);extern bit Get18B20Ack();extern bit Start18B20();unsigned char code LedChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}; //数码管编码0-F unsigned char LedBuff[12] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};int temp=1;unsigned char flg;unsigned char T0RH,T0RL;void ConfigTimer0(unsigned int ms) //开内部定时器延时,到时间后触发中断。

{unsigned long tmp;tmp = 11059200 / 12;tmp = (tmp * ms) / 1000;tmp = 65536 - tmp;tmp = tmp + 18;T0RH = (unsigned char)(tmp>>8);T0RL = (unsigned char)tmp;TMOD &= 0xF0;TMOD |= 0x01;TH0 = T0RH;TL0 = T0RL;ET0 = 1;TR0 = 1;}void LedScan() //数码管扫描程序。

DS18B20汇编程序(完整版)

DS18B20汇编程序(完整版)

DS18B20汇编程序(完整版)DS18B20汇编程序;实验目的:熟悉DS18B20的使用;六位数码管显示温度结果,其中整数部分2位,小数部分4位;每次按下RB0键后进行一次温度转换。

;硬件要求:把DS18B20插在18B20插座上; 拨码开关S10第1位置ON,其他位置OFF; 拨码开关S5、S6全部置ON,其他拨码开关全部置OFF;*****************以下是暂存器的定义*****************************#INCLUDE#DEFINE DQ PORTA,0 ;18B20数据口__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF &_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS _OSC CBLOCK 20HDQ_DELAY1DQ_DELAY2TEMPTEMP1TEMP2 ;存放采样到的温度值TEMP3COUNTCOUNT1ENDCTMR0_VALUE EQU 0AH ;寄存器初值为6,预分频比1:4,中断一次时间为4*(256-6)=1000usDQ_DELAY_VALUE1 EQU 0FAHDQ_DELAY_VALUE2 EQU 4H;**********************以下是程序的开始************************ ORG 00HNOPGOTO MAIN ;入口地址ORG 04HRETFIE ;在中断入口出放置一条中断返回指令,防止干扰产生中断TABLEADDWF PCL,1RETLW 0C0H ;0的编码(公阳极数码管)RETLW 0F9H ;1的编码RETLW 0A4H ;2的编码RETLW 0B0H ;3的编码RETLW 99H ;4的编码RETLW 92H ;5的编码RETLW 082H ;6RETLW 0F8H ;7RETLW 080H ;8RETLW 090H ;9;***************************主程序******************************* MAINCLRF PORTACLRF PORTBBANKSEL TRISACLRF TRISA ;A口所有先设置为输出CLRF TRISDMOVLW 01HMOVWF TRISB ;B0口为输入,其他为输出MOVLW 06HMOVWF ADCON1 ;关闭所有A/D口MOVLW 01HMOVWF OPTION_REG ;分频比1:4,定时器,内部时钟源BCF STATUS,RP0CLRF TEMPCLRF TEMP1CLRF TEMP2 ;清零临时寄存器MOVLW 8HMOVWF COUNTMOVLW 38HMOVWF FSRCLRF INDFINCF FSR,1DECFSZ COUNT,1GOTO $-3;****************************循环处理部分************************;先启动18B20温度转换程序,在判断温度转换是否完成(需750us);未完成则调用显示子程序,直到完成温度转换;完成后读取温度值;送LCD显示LOOPBTFSC PORTB,0 ;判断温度转换按键是否按下GOTO LOOP1 ;否,转显示CALL DELAY ;消抖BTFSC PORTB,0 ;再次判断GOTO LOOP1CALL RESET_18B20 ;调用复位18B20子程序MOVLW 0CCHMOVWF TEMPCALL WRITE_18B20 ;SKIP ROM命令MOVLW 44HMOVWF TEMPCALL WRITE_18B20 ;温度转换命令CLRF STATUSCALL DELAY_750MS ;调用温度转换所需要的750MS延时NOPCALL RESET_18B20MOVLW 0CCHMOVWF TEMPCALL WRITE_18B20 ;SKIP ROM命令MOVLW 0BEHMOVWF TEMPCALL WRITE_18B20 ;读温度命令CALL READ_18B20 ;调用读温度低字节MOVFW TEMPMOVWF TEMP1 ;保存到TEMP1CALL READ_18B20 ;调用读温度高字节MOVFW TEMPMOVWF TEMP2 ;保存到TMEP2CALL RESET_18B20LOOP1CALL TEMP_CHANGE ;调用温度转换程序CALL DISPLAY ;调用LCD显示程序GOTO LOOP ;循环工作;*********************复位DS18B20子程序************************** RESET_18B20;根据DATASHEET介绍,写数据时应遵照如下规定:;主控制器把总线拉低至少480us,;18B20等待15-60us后,把总线拉低做为返回给控制器的应答信号BANKSEL TRISABCF TRISA,0BCF STATUS,RP0BCF DQMOVLW 0A0HMOVWF COUNT ;160USDECFSZ COUNT,1GOTO $-1 ;拉低480usBSF DQ ;释放总线MOVLW 14HMOVWF COUNTDECFSZ COUNT,1GOTO $-1 ;等待60usBANKSEL TRISABSF TRISA,0 ;DQ设置为输入BCF STATUS,RP0BTFSC DQ ;数据线是否为低GOTO RESET_18B20 ;否则继续复位MOVLW 4HMOVWF COUNTDECFSZ COUNT,1 ;延时一段时间后再次判断GOTO $-1BTFSC DQGOTO RESET_18B20MOVLW 4BHMOVWF COUNTDECFSZ COUNT,1GOTO $-1BANKSEL TRISABCF TRISA,0 ;DQ设置为输出BCF STATUS,RP0RETURN;*********************写DS18B20子程序**************************** WRITE_18B20;根据DATASHEET介绍,写数据时应遵照如下规定:;写数据0时,主控制器把总线拉低至少60us;写数据1时,主控制器把总线拉低,但必须在15us内释放MOVLW 8HMOVWF COUNT ;8位数据BANKSEL TRISABCF TRISA,0BCF STATUS,RP0BCF STATUS,CWRITE_18B20_1BSF DQ ;先保持DQ为高MOVLW 5HMOVWF COUNT1BCF DQ ;拉低DQ15usDECFSZ COUNT1,1GOTO $-1RRF TEMP,1BTFSS STATUS,C ;判断写的数据为0还是1GOTO WRITE_0BSF DQ ;为1,立即拉高数据线GOTO WRITE_ENDWRITE_0BCF DQ ;继续保持数据线为低WRITE_ENDMOVLW 0FHMOVWF COUNT1 ;保持45msDECFSZ COUNT1,1GOTO $-1BSF DQ ;释放总线DECFSZ COUNT,1 ;是否写完8位数据GOTO WRITE_18B20_1RETURN;**********************读DS18B20子程序**************************** READ_18B20;根据DATASHEET介绍,读数据时应遵照如下规定:;读数据0时,主控制器把总线拉低后,18B20再把总线拉低60us ;读数据1时,主控制器把总线拉低后,保持总线状态不变;主控制器在数据线拉低后15us内读区数据线上的状态。

DS18B20汇编程序

DS18B20汇编程序

FLAG BIT 00H;DS18B20存在标志位DQ BIT P3.7WD_L EQU 28HWD_H EQU 29H************程序起始********************ORG 0000HAJMP STARTORG 0030H**************主程序开始************START:MOV SP,#70HLCALL INIT_18B20LCALL RE_CONFIGLCALL GET_WDAJMP CHANGE**********DS18B20复位程序*****************INIT_18B20:SETB DQNOPCLR DQMOV R0,#0FBHDJNZ R0,$;延时SETB DQMOV R0,#25HDJNZ R0,$JNB DQ,TSR1AJMP TSR2TSR1:SETB FLAG;置标志位,表明DS18B20存在AJMP TSR3TSR2:CLR FLAG;清标志位,表明DS18B20不存在AJMP TSR4TSR3:MOV R0,#6BHDJNZ R0,$TSR4:SETB DQ;拉高总线RET********************设定DS18B20暂存器设定值************** RE_CONFIG:JB FLAG,RE_CONFIG1RETRE_CONFIG1:MOV A,#0CCH;放跳过ROM命令LCALL WRITE_18B20MOV A,#4EHLCALL WRITE_18B20 ;写暂存器命令MOV A,#00H ;报警上限中写入00HLCALL WRITE_18B20MOV A,#00H;报警下限中写入00HLCALL WRITE_18B20MOV A,#1FH;选择九位温度分辨率LCALL WRITE_18B20RET*****************读转换后的温度值****************GET_WD:SETB DQLCALL INIT_18B20JB FLAG,TSS1RET;若不存在则返回TSS1:MOV A,#0CCH;跳过ROMLCALL WRITE_18B20MOV A,#44H;发出温度转换命令LCALL WRITE_18B20LCALL DISPLAY;延时LCALL INIT_18B20MOV A,#0CCH;跳过ROMLCALL WRITE_18B20MOV A,#0BEH;发出读温度命令LCALL WRITE_18B20LCALL READ2_18B20;读两个字节的温度RET***************写DS18B20程序************WRITE_18B20:MOV R2,#8CLR CWR1:CLR DQMOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1SETB DQRET***********读18B20程序,读出两个字节的温度*********READ2_18B20:MOV R4,#2MOV R1,#28H;低位存在28H,高位存在29H RE00:MOV R2,#8RE01:CLR CSETB DQNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE01MOV @R1,AINC R1DJNZ R4,RE00RET************读出的温度进行数据转换************** CHANGE:MOV A,28HMOV C,29H.0;将29H中的最低位移入CRRC AMOV C,29H.1RRC AMOV C,29H.2RRC AMOV C,29H.3RRC AMOV 28H,ALCALL DISPLAY;调用数码管显示子程序LJMP MAIN*******************DISPLAY******DISPLAY:MOV A,28H;将28H中的十六进制数转换成10进制MOV B,#10;10进制/10=10进制DIV ABMOV SHI,A;十位在SHIMOV GW,B;个位在GWMOV DPTR,#TAB ;指定查表启始地址 MOV A,GW ;取个位数MOVC A,@A+DPTR ;查个位数的7段代码MOV 34H,A;送出个位的7段代码MOV A,SHI;取十位数MOVC A,@A+DPTR ;查十位数的7段代码MOV 35H,A;送出十位的7段代码RET。

数字温度传感器DS18B20汇编程序例子

数字温度传感器DS18B20汇编程序例子

;DS18B20温度传感器和7个LED数码显示程序(原创程序,请支持)ORG 0000H;LED数码管采用动态,P0口接八个数据口,P2.0-P2.2采用3-8译码器控制七个LED TX BIT P2.3 ;DS18B20数据口接P2.3FLAG BIT 10HTEMH EQU 50H ;整数部分TEML EQU 51H ;小数部分MOV SP,#60HCLR EAAJMP MAINORG 0200HMAIN:;MOV R0,#10LCALL TMP;温度传感器设置LCALL CHANG;温度转换为十进制STR:LCALL DISPLAY;温度显示;DJNZ R0,STRAJMP MAIN;//////////////////////////TMP:;温度传感器DS18B20LCALL RESERTMOV A,#0CCHLCALL WRITEMOV A,#44HLCALL WRITE;LCALL DELAY750;延时750MsLCALL RESERTMOV A,#0CCHLCALL WRITEMOV A,#0BEHLCALL WRITELCALL READMOV 30H,ALCALL READMOV 31H,ARETDELAY750:;750USDELAYSETB RS0MOV R0,#20MS2:MOV R1,#20MS1:MOV R2,#20DJNZ R2,$DJNZ R1,MS1DJNZ R0,MS2CLR RS0RET;////////////////////////////CHANG:;温度转换为十进制PUSH APUSH BMOV A,31HANL A,#07HSWAP AMOV B,AMOV A,30HANL A,#0F0HSWAP AADD A,BMOV TEMH,AMOV A,30HANL A,#0FHMOV TEML,AMOV A,31HJNB ACC.3,POSI;区分正负温度;//////////////负温度转化MOV A,TEMLSWAP ACPL AANL A,#0F0HADD A,#10HSWAP AMOV 1FH,CMOV TEML,AMOV A,TEMHCPL ASUBB A,#80HMOV C,1FHADDC A,#0MOV 70H,#20AJMP NEGPOSI:MOV A,TEMHMOV B,#100DIV ABMOV 70H,AMOV A,BNEG:MOV B,#10DIV ABMOV 71H,AMOV A,BADD A,#10MOV 72H,A;整数部分分离MOV A,TEMLMOV B,#5MUL ABMOV B,#10DIV ABMOV 76H,BMOV 75H,AMOV A,TEMLMOV B,#2MUL ABADD A,75HMOV B,#10DIV ABMOV 75H,BMOV 74H,AMOV A,TEMLMOV B,#6MUL ABADDC A,74HMOV B,#10DIV ABMOV 74H,BMOV 73H,A;小数部分分离POP BPOP ARET;//////////////////////DISPLAY:;温度显示70H---76H XXX.XXXX;采用默认的12位,精度0.0625,-55~~+125 SETB RS0MOV R0,#70HMOV R1,#7MOV R2,#0MOV DPTR,#TABLE DIS:MOV A,@R0MOVC A,@A+DPTR MOV P2,R2MOV P0,AINC R2INC R0LCALL DELAY1MS DJNZ R1,DISCLR RS0RET;/////////////////////////DELAY1MS:SETB RS1MOV R0,#100MS:MOV R1,#20DJNZ R1,$DJNZ R0,MSCLR RS1RET;//////////////////// RESERT:;DS18B20初始化;SETB RS0SETB TXNOPCLR TXMOV R0,#240;RST:CLR TXDJNZ R0,$;DELAY480US SETB TXMOV R1,#30;DELAY 60US DJNZ R1,$JNB TX,RE1CLR FLAGSETB TXRETRE1:SETB FLAGMOV R2,#200DJNZ R2,$ ;DELAY 400us SETB TXRET;///////////WRITE:;DS18B20写字节;SETB RS0CLR CMOV R0,#8WW:MOV R1,#6MOV R2,#23RRC ACLR TXDJNZ R1,$;DELAY 12USMOV TX,CDJNZ R2,$;DELAY 46USSETB TXNOPDJNZ R0,WWSETB TX;CLR RS0RET;///////////READ:;DS18B20读字节;SETB RS0CLR CMOV R0,#8;八位RE:SETB TXMOV R1,#10;延时20usMOV R2,#15 ;延时30usCLR TXNOPSETB TX;此句最重要,读取数据的时候一定要释放总线,否则读不出暂存器数据DJNZ R1,$MOV C,TXDJNZ R2,$RRC ADJNZ R0,RESETB TX;CLR RS0RET;//////////////TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0-9 需要加点应用ADD 80H即可DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH;0.-9.DB 40H ;-END。

DS18B20汇编程序编写实例

DS18B20汇编程序编写实例

多路温度采集显示系统设计与总结报告参赛选手:摘要:在传统的模拟信号远距离温度测量系统中,需要很好的解决引线误差补偿问题、多点测量切换误差问题和放大电路零点漂移误差问题等技术问题,才能够达到较高的测量精度。

另外一般监控现场的电磁环境都非常恶劣,各种干扰信号较强,模拟温度信号容易受到干扰而产生测量误差,影响测量精度。

因此,在温度测量系统中,采用抗干扰能力强的新型数字温度传感器是解决这些问题的最有效方案,新型数字温度传感器DS18B20具有体积更小、精度更高、适用电压更宽、采用一线总线、可组网等优点,在实际应用中取得了良好的测温效果。

关键词:数字温度传感器,单总线Abstract: In the traditional analog signal long-distance temperaturemeasuring system, need good solve fuses error compensation problem, multi-point measurement error and amplifying circuit switching zero drift error problem and some other technical problems, only then can achieve high measuring accuracy. Also general monitoring site of the electromagnetic environment is very bad, all kinds of jam,affect precision,Therefore, in temperature measuring system, using anti-jamming ability of the new digital temperature sensor is to solve these problems, the most effective solution new digital temperature sensor DS18B20 have smaller, higher accuracy, voltage applied to wider and adopt 1-wire bus, etc, and networking in practical application made .Key word:Digital temperature sensor,1-wire bus目录1 系统方法选择和论证 (1)1.1 题目要求 (1)1.1.1 基本要求 (1)1.1.2 说明 (1)1.2 系统基本方案 (1)1.2.1 各模块方案选择和论证 (1)1.2.2 系统各模块的最终方案 (3)2.系统的硬件设计与实现 (3)2.1 系统的硬件基本组成部分 (3)2.2主要单元电路的设计 (4)2.2.1 传感器部分电路 (4)2.2.2七段数码管 (4)3.系统程序设计 (4)3.1系统的软件设计 (4)3.2 温度转换设计 (4)3.3 系统主程序流程图 (5)4.系统测试 (6)4.1 测试仪器 (6)4.2 指标测试 (6)4.2.1动态显示的测试 (6)4.2.2多路温度采集的测试 (6)4.2.3系统实现的功能 (6)4.3 结论 (6)5.总结 (6)参考文献 (6)附录1:元器件清单 (6)附录2:系统电路图 (7)附录3:程序清单 (8)附录4:DS18B20的通讯协议及读写复位等程序 (10)附录5:其他子程序的设计 (16)附录6:系统使用说明书........................................................... 错误!未定义书签。

DS18B20温度计完整单片机程序(汇编语言)

DS18B20温度计完整单片机程序(汇编语言)

end
sjmp dis1
dis :
movc a,@a+dptr
CLR P2.2
clr P2.1 ;低位灭
mov p0,a
call delay3
dis1:
mov a,b
movc a,@a+dptr
setb P2.2
clr P2.1 ;高位灭
mov p0,a
call delay3
djnz r1,write_bit
ret
;*****************************************
;读一个字节(内容放在在A中)
read_byte:
mov r2,#8
read_bit:
clr p1.7
nop
nop
nop
nop
setb p1.7 ;释放总线的目的是为了读18b20发出的数据,低电平是不能读的。
sjmp f1
f:clr 20h.0 ;初始化失败置0
f1:
ret
;*****************************************
;写一个字节(内容在A中)
write_byte:
mov r1,#8
;写一位
write_bit:
rrc a ;先写低位
clr 20h.0
mov a, #0cch ;跳过序列号
call write_byte
mov a,#0BEH ;送入读内部ram命令
call write_byte
call read_byte
mov r6,a
call read_byte

DS18B20温度传感器详解带c程序

DS18B20温度传感器详解带c程序

00A2H
+0.5
0000 0000 0000 000
0000H
-0.5
1111 1111 1111 1000
FFF8H
-10.125
1111 1111 0110 1110
FF5EH
-25.0625
1111 1110 0110 1111
FF6FH
-55 执行序列与介绍 3.1 执行序列
duan=1; switch(i) {
case 0: if(zf==0) P1=numfh[zf];
else if(bai!=0) P1=numd[bai]; else if(shi!=0) P1=numd[shi]; else P1=numdg[ge]; break;
case 1: if(zf==0&&shi!=0) P1=numd[shi];
表 3.2 DS18B20 温度/数字对应关系表
温度(℃)
输出的二进制码
对应的十六进制码
+125
0000 0111 1101 0000
07D0H
+85
0000 0101 0101 0000
0550H
+25.0625
0000 0001 1001 0001
0191H
+10.125
0000 0000 1010 0010
uchar x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--); } /******************15us 延时函数****************/ void delay(uint z) {
while(z--); } /******************初始化 DS18B20 函数****************/ void reset_ds18b20() {

DS18B20温度控制数码管显示(汇编非常详细)

DS18B20温度控制数码管显示(汇编非常详细)

D S18B20温度控制数码管显示(汇编非常详细)-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN; DS18B20温度控制数码管显示(汇编非常详细)*;* 1、= → 进入设定温度报警值 TL 状态: *;* L--20 *;* 2、→ 进入设定温度报警值 TH 状态: *;* H--28 *;* 3、→ 返回 *;* 4、设定过程:→加键(UP),→减键(DOWN),可快速调。

* ;* **TIMER_L DATA 23HTIMER_H DATA 24HTIMER_COUN DATA 25HTEMPL DATA 26HTEMPH DATA 27HTEMP_TH DATA 28HTEMP_TL DATA 29HTEMPHC DATA 2AHTEMPLC DATA 2BHTEMP_ZH DATA 2CHBEEP EQUDATA_LINE EQURELAY EQUFLAG1 EQUFLAG2 EQU;-------------------------------------------------K1 EQUK2 EQUK3 EQUK4 EQU;=================================================ORG 0000HJMP MAINORG 000BHAJMP INT_T0;--------------------------------------------------MAIN: MOV SP,#30HMOV TMOD,#01H ;T0,方式1MOV TIMER_L,#00H ;50ms定时值MOV TIMER_H,#4CHMOV TIMER_COUN,#00H ;中断计数MOV IE,#82H ;EA=1,ET0=1LCALL READ_E2;LCALL RE_18B20MOV 20H,#00HSETB BEEPSETB RELAYMOV 7FH,#0AH ;熄灭符CALL RESET ;复位与检测DS18B20JNB FLAG1,MAIN1 ;FLAG1=0,DS18B20不存在JMP STARTMAIN1: CALL RESETJB FLAG1,STARTLCALL BEEP_BL ;DS18B20错误,报警JMP MAIN1START:MOV A,#0CCH ; 跳过ROM匹配CALL WRITEMOV A,#044H ; 发出温度转换命令CALL WRITECALL RESETMOV A,#0CCH ; 跳过ROM匹配CALL WRITEMOV A,#0BEH ; 发出读温度命令CALL WRITECALL READ ;读温度数据CALL CONVTEMPCALL DISPBCDCALL DISP1CALL SCANKEYLCALL TEMP_COMPJMP MAIN1;===================================================== ;DS18B20 复位与检测子程序;FLAG1=1 OK, FLAG1=0 ERROR;====================================================== RESET:SETB DATA_LINENOPCLR DATA_LINEMOV R0,#64H ;主机发出延时600微秒的复位低脉冲MOV R1,#03HRESET1: DJNZ R0,$MOV R0,#64HDJNZ R1,RESET1SETB DATA_LINE ;然后拉高数据线NOPMOV R0,#25HRESET2: JNB DATA_LINE,RESET3 ;等待DS18B20回应DJNZ R0,RESET2JMP RESET4 ; 延时RESET3: SETB FLAG1 ; 置标志位,表示DS1820存在JMP RESET5RESET4: CLR FLAG1 ; 清标志位,表示DS1820不存在JMP RESET6RESET5: MOV R0,#064HDJNZ R0,$ ; 时序要求延时一段时间RESET6: SETB DATA_LINERET;=========================================================== ;;=========================================================== WRITE: MOV R2,#8 ;一共8位数据CLR CYWR1:CLR DATA_LINE ;开始写入DS18B20总线要处于复位(低)状态 MOV R3,#09DJNZ R3,$ ;总线复位保持18微妙以上RRC A ;把一个字节DATA 分成8个BIT环移给CMOV DATA_LINE,C ;写入一个BITMOV R3,#23DJNZ R3,$ ;等待46微妙SETB DATA_LINE ;重新释放总线NOPDJNZ R2,WR1 ;写入下一个BITSETB DATA_LINERET;============================================================ ;从DS18B20中读出温度低位、高位和报警值TH、TL;存入26H、27H、28H、29H;============================================================ READ: MOV R4,#4 ; 将温度高位和低位从DS18B20中读出MOV R1,#26H ; 存入26H、27H、28H、29HRE00: MOV R2,#8RE01: CLR CSETB DATA_LINENOPNOPCLR DATA_LINE ;读前总线保持为低NOPNOPNOPSETB DATA_LINE ;开始读总线释放MOV R3,#09 ;延时18微妙DJNZ R3,$MOV C,DATA_LINE ;从DS18B20总线读得一个BITMOV R3,#23DJNZ R3,$ ;等待46微妙RRC A ;把读得的位值环移给ADJNZ R2,RE01 ;读下一个BITMOV @R1,AINC R1DJNZ R4,RE00RET;--------------------------------------------;200ms对闪动标记取反一次;--------------------------------------------INT_T0:PUSH ACCPUSH PSWMOV TL0,TIMER_LMOV TH0,TIMER_HINC TIMER_COUNMOV A,TIMER_COUNCJNE A,#04H,INT_ENDMOV TIMER_COUN,#00HCPL FLAG2INT_END:POP PSWPOP ACCRETI;========================================================== ;重新对 DS18B20 初始化;将设定的温度报警值写入 DS18B20;========================================================== RE_18B20:JB FLAG1,RE_18B20ARETRE_18B20A:CALL RESETMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#4EH ;写暂存寄存器LCALL WRITEMOV A,TEMP_TH ;TH(报警上限)LCALL WRITEMOV A,TEMP_TL ;TL(报警下限)LCALL WRITEMOV A,#7FH ;12位精确度LCALL WRITERET;====================================================;功能键扫描子程序;==================================================== SCANKEY:MOV P1,#0F0HJB K1,SCAN_K2CALL BEEP_BLSCAN_K1: CALL ALERT_TLCALL ALERT_PLAYJB K1,SCAN_K1CALL BEEP_BLSCAN_K11: CALL ALERT_THCALL ALERT_PLAYJB K1,SCAN_K11CALL BEEP_BLSCAN_K2: JB K2,SCAN_K3CALL BEEP_BLSCAN_K3: JB K3,SCAN_K4CALL BEEP_BLLCALL RESET_ALERTLCALL RE_18B20LCALL WRITE_E2SCAN_K4: JB K4,SCAN_ENDCALL BEEP_BLSCAN_END: RET;================================================ ;设置温度报警值;================================================ RESET_ALERT:CALL ALERT_TLCALL ALERT_PLAYJNB K3,$ ;K3为位移键SETB TR0RESET_TL:CALL ALERT_PLAYJNB FLAG2,R_TL01mov 75H,7fh ;送入熄灭符mov 76H,7fhCALL ALERT_PLAYJMP R_TL02R_TL01: CALL ALERT_TLmov 75h,7Eh ;送设定值mov 76h,7DhCALL ALERT_PLAY ;显示设定值R_TL02: JNB K1,K011AJNB K2,K011BJNB K3,RESET_THJMP RESET_TLK011A:INC TEMP_TLMOV A,TEMP_TLCJNE A,#120,K012A ;没有到设定上限值,转MOV TEMP_TL,#0K012A: CALL TL_DELJMP RESET_TLK011B:DEC TEMP_TLMOV A,TEMP_TLCJNE A,#00H,K012B ;没有到设定下限值,转MOV TEMP_TL,#119K012B: CALL TL_DELJMP RESET_TL;-------------------------------------------------------RESET_TH:CALL BEEP_BLJNB K3,$RESET_TH1:CALL ALERT_PLAYJNB FLAG2,R_TH01mov 75H,7fh ;送入熄灭符mov 76H,7fhCALL ALERT_PLAYJMP R_TH02R_TH01: CALL ALERT_THmov 75h,7Eh ;mov 76h,7DhCALL ALERT_PLAYR_TH02: JNB K1,K021AJNB K2,K021BJNB K3,K002JMP RESET_TH1K021A:INC TEMP_THMOV A,TEMP_THCJNE A,#120,K022A ;没有到设定上限值,转 MOV TEMP_TH,#0K022A: CALL TH_DELJMP RESET_TH1K021B:DEC TEMP_TH ;减1MOV A,TEMP_THCJNE A,#00H,K022B ;没有到设定下限值,转 MOV TEMP_TH,#119K022B: CALL TH_DELJMP RESET_TH1K002: CALL BEEP_BLCLR TR0 ;关闭中断RET;-----------------------------------------------------;键延时子程序;多次调用报警值显示程序来延时;-----------------------------------------------------TL_DEL: ;报警低值延时MOV R2,#0AHTL_DEL1: CALL ALERT_TLCALL ALERT_PLAYDJNZ R2,TL_DEL1RETTH_DEL: ;报警高值延时MOV R2,#0AHTH_DEL1: CALL ALERT_THCALL ALERT_PLAYDJNZ R2,TH_DEL1RET;==================================================== ;实时温度值与设定报警温度值 TH、TL 比较子程序;当实际温度大于 TH 的设定值时,显示“H”,继电器关闭。

DS18B20读取温度并显示-汇编程序

DS18B20读取温度并显示-汇编程序

DS18B20读取温度并显示-汇编程序*程序效果:通过DS18B20 读取温度值,显示对应的温度值程序重在理解时序,及延时时间*/DS18DQ EQU P1.3 //P1.3 与DS18DQ 等同,便于理解SPEAKER EQU P2.0 //驱动蜂鸣器TEMPH EQU 29H //保存读出温度的低8 位TEMPL EQU 28H //保存读出温度的高8 位DS18FLAG EQU 40H //设置标志ORG 0000H LJMP START ORG 0030HSTART: MOV 30H,#00 //设置初始值MOV 31H,#00 MOV 32H,#00 START1: LCALL DS18_GF //设置DS18B20 的工作方式LCALL CONVERT_TEMPERATURE //输出转换温度命令LCALL DELAY750MS //延时750ms LCALL GET_TEMPERATURE //获?温度数据LCALL CAL_TEMPERATURE //计算温度数值LCALL DISPLAY //调用显示,防止掉显LJMP START1 //无限循环//初始化子程序DS18_START: PUSH 07H //保存R7 的值,防止改变R7 的数值SETB DS18DQ //将数据线拉高NOP //延时1us CLR DS18DQ //将数据线拉低MOV R7,#0 //延时大约512us DJNZ R7,$ SETB DS18DQ //将数据线拉高MOV R7,#40DS18_START1: //延时大约160us JNB DS18DQ,DS18_START2 //检查DS18B20 是否工作正常DJNZ R7,DS18_START1 SETB DS18FLAG //工作不正常CLR SPEAKER //驱动蜂鸣器,报警DS18_START2: CLR DS18FLAG MOV R7,#100 //延时月200us DJNZ R7,$ POP 07H //恢复R7 的值RET//设置DS18B20 工作方式DS18_GF:CLR DS18FLAG //清除标志LCALL DS18_START //调用初始化子程序MOV A,#0CCH //跳跃ROM 指令LCALL DS18_SEND // MOV A,#4EH //向RAM 写数据LCALL DS18_SEND MOV A,#75 LCALL DS18_SEND MOV A,#0 LCALL DS18_SEND MOV A,#7FH //设置工作方式LCALL DS18_SEND。

DS18B20测温程序

DS18B20测温程序

//温度高于26摄氏度则蜂鸣器响#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbitdula=P2^6;sbitwela=P2^7;sbit beer=P2^3; //控制蜂鸣器sbitdsb=P2^2; //ds18b20的数据总线sbitrs=P3^5; //液晶显示数据命令选择端口sbitlcme=P3^4; //液晶显示使能信号sbit key=P3^7;uint temp; //温度传感器测得的温度uchar code listone[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucharcodelisttwo[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; ucharcodelistthree[]={"The temp is under:"};void delay(uchari){while(--i);}Voiddelayone(uint z){uintx,y;for(x=100;x>0;x--)for(y=z;y>0;y--);}/*液晶显示写命令初始化*/ Voidwritecom(uchar com) {rs=0;delayone(2);lcme=0;P0=com;lcme=1;delayone(2);lcme=0;}/*液晶显示写数据初始化*/ void writebyte(uchar byte) {rs=1;delayone(2);lcme=0;P0=byte;lcme=1;delayone(2);lcme=0;}/*液晶显示初始化*/ void ds18b20init() {uinttempone;uinti;dula=0;wela=0;lcme=0;writecom(0x38);writecom(0x0f);writecom(0x06);writecom(0x80);for(i=0;i<16;i++){writebyte(listthree[i]);delayone(2);}writecom(0x80+0x40);for(i=0;i<16;i++){tempone=temp&0x80;writebyte(tempone);delay(2);temp<<=1;}writecom(0x0c);}/*温度传感器初始化*/ voidtempinit(){dsb=1;delay(1);dsb=0;delay(250);dsb=1;delay(100);}voidwritedata(uchardat) {uinti;for(i=0;i<8;i++){dsb=1;_nop_();dsb=0;_nop_();_nop_();dsb=dat&0x01;delay(10);dat>>=1;delay(1);}dsb=1;}ucharreaddata(){uinti;for(i=0;i<8;i++){dsb=1;_nop_();dsb=0;_nop_();_nop_();// date>>=1;dsb=1;delay(1);date>>=1; //右移放于此处也可以if(dsb==1)date|=0x80;delay(10);}return date;}uint control(){floattt;// uint temp;tempinit();writedata(0xcc);writedata(0x44);tempinit();writedata(0xcc);writedata(0xbe);a =readdata();b = readdata();temp = b;temp<<= 8;temp = temp|a;tt = temp*0.0625;temp = tt*100+0.05;return temp;}voidshuma(uint temp) {ucharbai,shi,ge,xiaoshu; bai=(temp/1000);shi=temp%1000/100; ge=temp%100/10; xiaoshu=temp%10;dula=1;P0=listone[bai];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delayone(1);dula=1;P0=listtwo[shi];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delayone(1);dula=1;P0=listone[ge];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delayone(1);dula=1;P0=listone[xiaoshu];dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(10);}void warning(uint temp){if((temp>=2600)&&(temp<2800)&&(key==1)){beer=0;P1=0x55;delayone(4);}if((key==0)||(temp<2600)){delayone(5);if((key==0)||(temp<2600)){beer=1;P1=0xff;}}}void main(){while(1){if(temp<2600){shuma(control());}if((temp>=2600)&&(temp<2800)){shuma(control());warning(temp);}if(temp>=2800){dula=0;wela=0;P0=0xff;}}}。

数字温度传感器DS18B20(含程序)

数字温度传感器DS18B20(含程序)

数字温度传感器DS18B20摘要DS-18B20 数字温度传感器具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。

应用范围广泛,适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域,轴瓦,缸体,纺机,空调,等狭小空间工业设备测温和控制和汽车空调、冰箱、冷柜、以及中低温干燥箱等。

一、引脚图DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)二、DS18B20的主要特性1.1、电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电1.2、DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯1.3、多个DS18B20可以并联在唯一的三线上,实现组网多点测温1.4、DS18B20在使用中不需要任何外围元件1.5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃1.6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温1.7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快1.8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力1.9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

三、DS18B20的外形和内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。

DS18B20内部结构图四、DS18B20工作原理DS18B20的温度转换时的延时时间由2s 减为750ms。

DS18B20测温原理如图3所示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

晶振:12M
TEMPER_L EQU 36H
TEMPER_H EQU 35H
TEMPER_NUM EQU 60H
FLAG1 BIT 00H
DQ BIT P3.3
AAA:MOV SP,#70H
LCALL GET_TEMPER
LCALL TEMPER_COV
LJMP AAA
NOP
;------------------读出转换后的温度值
GET_TEMPER:
SETB DQ ; 定时入口
BCD:LCALL INIT_1820
JB FLAG1,S22
LJMP BCD ; 若DS18B20不存在则返回
S22:LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配------0CC
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
NOP
LCALL DELAY
LCALL DELAY
CBA:LCALL INIT_1820
JB FLAG1,ABC
LJMP CBA
ABC:LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;READ_1820
RET
;------------------读DS18B20的程序,从DS18B20中读出一个字节的数据
READ_1820:
MOV R2,#8
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE1
RET
;-------------------写DS18B20的程序
WRITE_1820:
MOV R2,#8
CLR C
WR1:
CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;-------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:
MOV R2,#8
RE01:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;-------------------将从DS18B20中读出的温度数据进行转换TEMPER_COV:
MOV A,#0F0H
ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值
INC TEMPER_NUM
TEMPER_COV1:
MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM
MOV TEMPER_NUM,A ; 保存变换后的温度数据
LCALL BIN_BCD
RET
;-------------------将16进制的温度数据转换成压缩BCD码BIN_BCD:
MOV DPTR,#TEMP_TAB
MOV A,TEMPER_NUM
MOVC A,@A+DPTR
MOV TEMPER_NUM,A
RET
TEMP_TAB:
DB 00H,01H,02H,03H,04H,05H,06H,07H DB 08H,09H,10H,11H,12H,13H,14H,15H DB 16H,17H,18H,19H,20H,21H,22H,23H DB 24H,25H,26H,27H,28H,29H,30H,31H DB 32H,33H,34H,35H,36H,37H,38H,39H DB 40H,41H,42H,43H,44H,45H,46H,47H DB 48H,49H,50H,51H,52H,53H,54H,55H DB 56H,57H,58H,59H,60H,61H,62H,63H DB 64H,65H,66H,67H,68H,69H,70H,71H DB 72H,73H,74H,75H,76H,77H,78H,79H DB 80H,81H,82H,83H,84H,85H,86H,87H DB 88H,89H,90H,91H,92H,93H,94H,95H DB 96H,97H,98H,99H
;-------------------DS18B20初始化程序INIT_1820:
SETB DQ
NOP
CLR DQ
MOV R0,#80H
TSR1:
DJNZ R0,TSR1 ; 延时
SETB DQ
MOV R0,#25H ;96US-25H
TSR2:
DJNZ R0,TSR2
JNB DQ,TSR3
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示DS1820存在LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示DS1820不存在LJMP TSR7
TSR5:
MOV R0,#06BH ;200US
TSR6:
DJNZ R0,TSR6 ; 延时
TSR7:
SETB DQ
RET
;------------------重新写DS18B20暂存存储器设定值RE_CONFIG:
JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1 RET
RE_CONFIG1:
MOV A,#0CCH ; 发SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH ; 发写暂存存储器命令
LCALL WRITE_1820
MOV A,#00H ; TH(报警上限)中写入00H
LCALL WRITE_1820
MOV A,#00H ; TL(报警下限)中写入00H
LCALL WRITE_1820
MOV A,#7FH ; 选择12位温度分辨率
LCALL WRITE_1820
RET
;------------------延时子程序
DELAY:MOV R7,#00H
MIN:DJNZ R7,YS500
RET
YS500:LCALL YS500US
LJMP MIN
YS500US:MOV R6,#00H
DJNZ R6,$
RET
DELAY1:MOV R7,#20H
DJNZ R7,$
RET。

相关文档
最新文档