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

合集下载

DS18B20单片机数码管显示原理图和程序

DS18B20单片机数码管显示原理图和程序

最近天气热了,想要是做个能显示温度的小设备就好了,于是想到DIY个电子温度计,网上找了很多资料,结合自己的材料,设计了这个用单片机控制的实时电子温度计。

作为单片机小虾的我做这个用了2天时间,当然是下班后,做工不行见谅了。

主要元件用到了单片机STC89C54RD+,DB18B20温度传感器,4为共阳数码管,PNPS8550三极管等。

先上原理图:洞洞板布局图:然后就是实物图了:附上源程序:程序是别人写的,我只是自己修改了下,先谢谢原程序者的无私奉献。

#include"reg52.h"#define uchar unsigned char#define uint unsigned intsbit DQ=P3^4; //温度数据口sbit wx1=P2^0; //位选1sbit wx2=P2^1; //位选2sbit wx3=P2^2; //位选3sbit wx4=P2^3; //位选4unsigned int temp, temp1,temp2, xs;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, //共阳数码管0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6};/******延时程序*******/void delay1(unsigned int m){unsigned int i,j;for(i=m;i>0;i--)for(j=110;j>0;j--);}void delay(unsigned int m) //温度延时程序{while(m--);}void Init_DS18B20(){unsigned char x=0;DQ = 1; //DQ复位ds18b20通信端口delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ = 1; //拉高总线delay(4);x=DQ; //稍做延时后如果x=0那么初始化成功x=1那么初始化失败delay(20);}/***********ds18b20读一个字节**************/uchar ReadOneChar(){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 高电平拉成低电平时读周期开始dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80; //delay(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0; //从高电平拉至低电平时,写周期的开始DQ = dat&0x01; //数据的最低位先写入delay(5); //60us到120us延时DQ = 1;dat>>=1; //从最低位到最高位传入}}/**************读取ds18b20当前温度************/void ReadTemperature(){unsigned char a=0;unsigned b=0;unsigned t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作/WriteOneChar(0x44); // 启动温度转换delay(5); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度存放器等〔共可读9个存放器〕前两个就是温度/ delay(5);a=ReadOneChar(); //读取温度值低位/b=ReadOneChar(); //读取温度值高位/temp1=b<<4; //高8位中后三位数的值temp1+=(a&0xf0)>>4; //低8位中的高4位值加上高8位中后三位数的值temp1室温整数值temp2=a&0x0f; //小数的值temp=((b*256+a)>>4); //当前采集温度值除16得实际温度值zhenshuxs=temp2*0.0625*10; //小数位,假设为0.5那么算为5来显示xs小数xiaoshu }void wenduxianshi(){wx1=0;P0=table[temp/10]; //显示百位delay1(5);wx1=1;wx2=0;P0=table[temp%10]+0x80; //显示十位加上0x80就显示小数点了。

51单片机 DS18B20温控保温汇编程序

51单片机 DS18B20温控保温汇编程序

51单片机+DS18B20温控保温汇编程序;DS18B20和AT89C2051制作的热水器程序!两位数码管显示温度,设定温度时数码管成闪烁状态,延时几秒后跳转到被测温度;DS18B20的正电源就是红线接+5伏,兰线接地,黄线接P3.2,红线和黄线之间接一个4.7K的上拉电阻;这是关于DS18B20的读写程序,数据脚P3.2,晶振12MHz ;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒;可以将检测到的温度直接显示到AT89C2051的p1口输数码管段码到两位一体数码管上;显示温度00到99度,很准确哦~~无需校正!;p3.1驱动加热管装置,让温度保温在0-99度内;p3.0保温指示灯,p3.4是温度设定按键加1度;p3.5是温度设定按键减1度,p3.7是数码管高位位码,p3.3是数码管低位位码;程序16进制的温度值放在29h里,我用可调节0度到99度的16进制值(#08H/#0EH)与之比较;1至40度的16进制为:01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 1-10度; 0BH 0CH 0DH 0EH 0FH 10H 11H 12H 13H 14H 11-20度; 15H 16H 17H 18H 19H 1AH 1BH 1CH 1DH 1EH 21-30度; 1FH 2OH 21H 22H 23H 24H 25H 26H 27H 28H 31-40度; 29H 2AH 2BH 2CH 2DH 2EH 2FH 30H 31H 32H 41-50度; 33H 34H 35H 36H 37H 38H 39H 3AH 3BH 3CH 51-60度; 3CH 3DH 3EH 3FH 40H 41H 42H 43H 44H 45H 61-70度; 46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH 71-80度; 51H 52H 53H 54H 55H 56H 57H 58H 59H 5AH 81-90度; 5BH 5CH 5DH 5EH 5FH 60H 61H 62H 63H 64H 91-100度;================================================ =========================================;单片机内存分配申明!TEMPER_L EQU 29H ;用于保存读出温度的低8位 TEMPER_H EQU 28H ;用于保存读出温度的高8位(特别是可位寻址,程序中用的着哦)TIAO_H EQU 27H ;用于保存设定温度的数据(最低温度的设定,高温度为低温度加2度)FLAG1 EQU 38H ;是否检测到DS18B20标志位a_bit equ 20h ;数码管个位数存放内存位置b_bit equ 21h ;数码管十位数存放内存位置SL EQU 22H ;设定温度时数码管个位数存放内存位置SH EQU 23H ;设定温度时数码管十位数存放内存位置sdwd equ 24h ;设定温度压缩BCD码位DS18B20 BIT P3.2 ;定义DS18B20的数据脚为P3.2端口ORG 0000HMOV sdwd,#25H ;;;;设定初始温度37度,上电后内部设定温度MAIN:LCALL INIT_1820 ;调用复位DS18B20子程序MAIN1:LCALL GET_TEMPER ;调用读温度子程序;进行温度显示,这里我是用两位数码管来显示温度,显示范围00到99度,显示精度为1度;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度;这个转化温度的方法可是我想出来的哦~~非常简洁无需乘于0.0625系数MOV A,29HMOV C,40H ;将28H中的最低位移入CRRC AMOV C,41HRRC AMOV C,42HRRC AMOV C,43HRRC AMOV 29H,ALCALL DISPLAY ;调用数码管显示子程序;这里是后加的,做为控制在0-99度内恒温的程序!p3.1驱动加热管装置setb p3.4setb p3.5jnb p3.4,DD1 ;按下后转加1程序jnb p3.5,DD2 ;按下后转减1程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;TT: CLR C ;比较转换值与设定值MOV 26H,sdwd ;把低温度设定保存到26H单元后减2度,作为低度的数据DEC 26HMOV A,29HCJNE A,26H,LOOP1 ;下限设定温度度,不相等跳LOOP1SJMP HOTTING ;与下限值相等跳HOTTING,加热LOOP1:JC HOTTING ;温度小于下限值跳HOTTING,加热MOV A,29H ;温度大于下限值,与上限值比较CLR Cmov 27h,sdwdinc 27hCJNE A,27h,LOOP2 ;上限设定温度度,不相等跳LOOP2SJMP STOPHOT ;相等跳STOPHOT,停止加热LOOP2:JNC STOPHOT ;温度大于上限值跳STOPHOT,停止加热SJMP KEEP ;温度小于上限且大于下限值跳KEEP,保温HOTTING:CLR P3.1 ;小,加热器驱动setb p3.0 ;关闭保温灯KEEP:SJMP MAIN ;返回,保持原态,保温STOPHOT:SETB P3.1 ;关闭加热器clr p3.0 ;点亮保温灯AJMP MAIN ;反回主程序;;;;;;;;;;;;;;;;;;;;;按键处理;;;;;;;;;;;; ;;;;;加限设定温度度;;;;;;;;;;DD1:LCALL displa ;调用数码管闪烁设定显示子程序mov r5,#30JNB P3.4,DD1mov a,sdwd ;把设定温度送累加器判断cjne a,#62h,ty1 ;比较设定温度是否到99度,不是则加ajmp dh2ty1: INC sdwddh2:jnb p3.4,DD1jnb p3.5,DD2 ;按下后转减1程序LCALL displa ;调用数码管闪烁设定显示子程序djnz r5,dh2LJMP TT;;;减限设定温度度;;;;;;;;;;;;DD2:LCALL displa ;调用数码管闪烁设定显示子程序mov r5,#30JNB P3.5,DD2mov a,sdwd ;把设定温度送累加器判断cjne a,#01h,ty ;比较设定温度是否到0度,不是则减ajmp dh1ty: DEC sdwddh1:jnb p3.5,DD2jnb p3.4,DD1 ;按下后转加1程序LCALL displa ;调用数码管闪烁设定显示子程序djnz r5,dh1LJMP TT;================================================ =========================================; DS18B20复位初始化程序INIT_1820:SETB DS18B20NOPCLR DS18B20MOV R0,#06BH ;主机发出延时537微秒的复位低脉冲MOV R1,#03HTSR1:DJNZ R0,TSR1MOV R0,#6BHDJNZ R1,TSR1SETB DS18B20 ;然后拉高数据线NOPNOPNOPMOV R0,#25HTSR2:JNB DS18B20,TSR3 ;等待DS18B20回应DJNZ R0,TSR2LJMP TSR4 ;延时TSR3:SETB FLAG1 ;置标志位,表示DS1820存在 LJMP TSR5TSR4:CLR FLAG1 ;清标志位,表示DS1820不存在 LJMP TSR7TSR5:MOV R0,#06BHTSR6:DJNZ R0,TSR6 ;时序要求延时一段时间TSR7:SETB DS18B20;================================================ =========================================; 读出转换后的温度值GET_TEMPER:SETB DS18B20 ;定时入口LCALL INIT_1820 ;先复位DS18B20JB FLAG1,TSS2RET ;判断DS1820是否存在?若DS18B20不存在则返回TSS2:MOV A,#0CCH ;跳过ROM匹配LCALL WRITE_1820MOV A,#44H ;发出温度转换命令LCALL WRITE_1820LCALL DISPLAY ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒. LCALL INIT_1820 ;准备读温度前先复位MOV A,#0CCH ;跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ;发出读温度命令LCALL WRITE_1820LCALL READ_18200 ;将读出的温度数据保存到35H/36H;写DS18B20的子程序(有具体的时序要求)WRITE_1820:MOV R2,#8 ;一共8位数据CLR CWR1:CLR DS18B20MOV R3,#6DJNZ R3,$RRC AMOV DS18B20,CMOV R3,#23DJNZ R3,$SETB DS18B20NOPDJNZ R2,WR1SETB DS18B20RET; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据READ_18200:MOV R4,#2 ;将温度高位和低位从DS18B20中读出MOV R1,#29H ;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)RE00:MOV R2,#8RE01:CLR CSETB DS18B20NOPNOPCLR DS18B20NOPNOPNOPSETB DS18B20MOV R3,#09RE10:DJNZ R3,RE10MOV C,DS18B20MOV R3,#23RE20:DJNZ R3,RE20RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RET;========================================================================================= ;;;;;;;;;;;;;;;显示子程序;;;;;;;;;;;;;;;;;; display:mov a,29H ;将29H中的十六进制数转换成10进制mov b,#10 ;10进制/10=10进制div abmov b_bit,a ;十位在amov a_bit,b ;个位在bmov dptr,#numtab ;指定查表启始地址mov r1,#250 ;显示250次dplop:mov a,a_bit ;取个位数MOVC A,@A+DPTR ;查个位数的7段代码mov p1,a ;送出个位的7段代码clr p3.3 ;开个位显示acall d1ms ;显示1mssetb p3.3mov a,b_bit ;取十位数MOVC A,@A+DPTR ;查十位数的7段代码mov p1,a ;送出十位的7段代码clr p3.7 ;开十位显示acall d1ms ;显示1mssetb p3.7djnz r1,dplop ;250次没完循环RET;;;============================================== =================;;;;;;;闪烁设定显示子程序===================== displa: MOV A,sdwdmov b,#10 ;10进制/10=10进制div abmov SL,a ;十位在amov SH,b ;个位在bmov r1,#250 ;显示250次dpl2: mov a,SL ;取设定温度个位数mov dptr,#numtab ;指定查表启始地址MOVC A,@A+DPTR ;查个位数的7段代码mov p1,a ;送出个位的7段代码clr p3.7 ;开个位显示acall d1ms ;显示1mssetb p3.7mov a,SH ;取设定温度十位数MOVC A,@A+DPTR ;查十位数的7段代码mov p1,a ;送出十位的7段代码clr p3.3 ;开十位显示acall d1ms ;显示1mssetb p3.3djnz r1,dpl2 ;250次没完循环acall D1s ;显示1msRET;;=============================================== ==========================================;1MS延时(按12MHZ算)D1MS:MOV R7,#80DJNZ R7,$RET;;1S延时(按12MHZ算)D1s:MOV R7,#255l1:nopnopnopnopnopnopnopnopnopnop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nopnop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nopnop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nopnop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nopnop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nopnopnopDJNZ R7,l1RET;================================================ ========================================= numtab: DB 0EEH;0DB 048H;1DB 0D6H;2DB 0DCH;3DB 078H;4DB 0BCH;5DB 0BEH;6DB 0C8H;7DB 0FEH;8DB 0FCH;9END。

DS18B20汇编程序(完整版)

DS18B20汇编程序(完整版)

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

;硬件要求:把DS18B20插在18B20插座上; 拨码开关S10第1位置ON,其他位置OFF; 拨码开关S5、S6全部置ON,其他拨码开关全部置OFF;*****************以下是暂存器的定义*****************************#INCLUDE<P16F877A.INC>#DEFINE DQ PORTA,0 ;18B20数据口__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS _OSCCBLOCK 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数码管显示温度

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit w1=P2^4;sbit w2=P2^5;sbit w3=P2^6;sbit w4=P2^7;sbit DQ=P3^7;uint temp;float f_temp; //温度值variable of temperaturebit flag;uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef };//uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0x4f,0x79,0x24,0x70,0x19,0x12,0x02,0x78,0x00,0x10};void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command {uint i;DQ = 0; //单片机拉低总线i=70;while(i>0)i--;DQ = 1; //释放总线,即拉高了总线i=4;while(i>0)i--;}bit Read_One_bit() //读取一个字节的数据read a byte date//读数据时,数据以字节的最低有效位先从总线移出{uint i;bit dat;DQ=0;i++;DQ=1;i++;i++;dat=DQ;i=3;while(i>0)i--;return (dat);}uchar Read_One_Byte(void){uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=Read_One_bit();dat=(j<<7)|(dat>>1);}return (dat);}void Write_One_Byte(uchar dat){uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){DQ=0;i++;i++;DQ=1;i=5;while(i>0)i--;}else{DQ=0;i=5;while(i>0)i--;DQ=1;i++;i++;}}}void tmpchange(void){uchar f;Init_Ds18b20();f=70;while(f>0)f--;delay(1);Write_One_Byte(0xcc); //忽略ROM指令Write_One_Byte(0x44); //温度转换指令}uint Get_Tmp() //获取温度get the temperature{uchar a,b,f;Init_Ds18b20(); //初始化f=70;while(f>0)f--;Write_One_Byte(0xcc); //忽略ROM指令Write_One_Byte(0xbe); //温度转换指令a = Read_One_Byte(); //读取到的第一个字节为温度LSBb = Read_One_Byte(); //读取到的第一个字节为温度MSBtemp = b; //先把高八位有效数据赋于temptemp <<= 8; //把以上8位数据从temp低八位移到高八位temp = temp|a; //两字节合成一个整型变量f_temp = temp*0.0625; //temp = f_temp*10+0.5; //放大十倍f_temp=f_temp+0.5; // //同时进行一个四舍五入操作。

DS18B20温度检测仪表(数码管显示)doc资料

DS18B20温度检测仪表(数码管显示)doc资料

目录第1章绪论 (1)1.1 选题目的 (1)1.2 设计要求 (1)第2章电路结构及工作原理 (2)2.1 电路方框图 (2)2.1.1 电路图 (2)2.1.2 系统流程 (3)2.2芯片介绍 (5)2.2.1 DS18B20 (5)2.2.1.1 DS18B20的工作原理 (5)2.2.1.2 DS18B20的使用方法 (6)2.2.2 AT89C51 (8)2.2.2.1 AT89C51简介 (8)第3章整机工作原理 (10)第4章系统调试与分析 (12)4.1 系统的调试 (12)4.2系统的分析 (12)结论 (13)收获和体会 (14)致谢 (15)参考文献 (16)附录一元件清单 (17)课程设计任务书年月日第1章绪论1.1 选题目的随着人们生活水平的不断提高,单片机技术已经普及到我们生活,工作,科研等各个领域。

单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。

本文利用单片机结合传感器技术开发设计,把传感器理论与单片机实际应用有机结合,详细地讲述了利用温度传感器DS18B20测量环境温度,设置上下报警温度,当温度不在设置范围内是,可以报警。

同时51单片机在现代电子产品中广泛应用以及其技术已经非常成熟,DS18B20可以直接读出被测温度值,而且采用一线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。

1.2 设计要求(1)设计题目和设计指标测量温度范围为0-100℃。

并通过数码管显示(2)设计功能利用DS18B20实现温度采集,并用数码管显示第2章 电路结构及工作原理2.1 电路方框图图2-1 电路方框图2.1.1 电路图2.1.2 系统流程图2-3 读DS18B20的子程序图2-4 读转换温度子程序2.2芯片介绍2.2.1 DS18B202.2.1.1 DS18B20的工作原理当DS18B20接收到温度转换命令后,开始启动转换。

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测量室温并在数码管上显示
for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
}
}
if(temper & BIT9)
{
dN[4] += 2;
dN[5] += 3;
if(dN[4] >= 10)
{
dN[4] -= 10;
码管位选变量
uchar cnt = 2;
void Disp_Numb(uint temper);
/****************主函数****************/
void main(void)
{
uchar i;
WDTCTL=WDTPW+WDTHOLD;
/*************************************************
程序功能:用DS18B20测量室温并在数码管上显示。
-------------------------------------------------
测试说明:观察显示温度数值。
*************************************************/
功 能:看门狗定时器中断服务函数,进行数码
管动态扫描
参 数:无
返回值 :无
********************************************/
#pragma vector = WDT_VECTOR

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的显示程序,数码管显示

开机时对DS18B20进行检测,如果DS18B20检测不正常,蜂鸣器报警,关闭显示。

采用6位数码管显示-用4位数码管显示温度值,2位数码管显示符号。

数码管显示格式:100.8 °C如果温度值高位为0,将不显示出来。

#includesbit DQ = P3^3; //定义DS18B20端口DQsbit BEEP=P3^7 ;unsigned char presence ;unsigned char code LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0xff};unsigned char data temp_data[2] = {0x00,0x00};unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00};unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04, 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};void beep();sbit DIN = P0^7; //小数点bit flash=0; //显示开关标记/**********************************************************/void Delay(unsigned int num)//延时函数{while( --num );}/**********************************************************/Init_DS18B20(void)//初始化ds1820{DQ = 1; //DQ复位Delay(8); //稍做延时DQ = 0; //单片机将DQ拉低Delay(90); //精确延时大于 480usDQ = 1; //拉高总线Delay(8);presence = DQ; //如果=0则初始化成功 =1则初始化失败Delay(100);DQ = 1;return(presence); //返回信号,0=presence,1= no presence}/**********************************************************/ ReadOneChar(void)//读一个字节{unsigned char i = 0;unsigned char dat = 0;for (i = 8; i > 0; i--){DQ = 0; // 给脉冲信号dat >>= 1;DQ = 1; // 给脉冲信号if(DQ)dat |= 0x80;Delay(4);}return (dat);}/**********************************************************/ WriteOneChar(unsigned char dat)//写一个字节{unsigned char i = 0;for (i = 8; i > 0; i--){DQ = 0;DQ = dat&0x01;Delay(5);DQ = 1;dat>>=1;}}/*********************************************************/Read_Temperature(void)//读取温度{Init_DS18B20();if(presence==1){ beep();flash=1;} //DS18B20不正常,蜂鸣器报警else{flash=0;WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器temp_data[0] = ReadOneChar(); //温度低8位temp_data[1] = ReadOneChar(); //温度高8位}}/*********************************************************/ Disp_Temperature()//显示温度{unsigned char n=0;display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]]; //查表得小数位的值display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4); display[3]=display[4]/100;display[1]=display[4]%100;display[2]=display[1]/10;display[1]=display[1]%10;if(!display[3]) //高位为0,不显示{display[3]=0x0a;if(!display[2]) //次高位为0,不显示display[2]=0x0a;}P0 = 0xc6; //显示 CP2 = 0x7f;P0 = 0x9c; //显示°P2 = 0xbf;Delay(300);P0 =LEDData[display[0]] ; //显示小数位P2 = 0xdf;Delay(300);P0 =LEDData[display[1]]; //显示个位DIN = 0;P2 = 0xef;Delay(300);P0 =LEDData[display[2]]; //显示十位P2 = 0xf7;Delay(300);P0 =LEDData[display[3]]; //显示十位P2 = 0xfb;Delay(300);P2 = 0xff; //关闭显示}/*********************************************************/ void beep(){unsigned char i;for (i=0;i<100;i++){Delay(60);BEEP=!BEEP; //BEEP取反}BEEP=1; //关闭蜂鸣器}/*********************************************************/ void main(void){while(1){Read_Temperature();{Disp_Temperature();}else P2 = 0xff ; //DS18B20不正常,关闭显示}}。

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温度传感器测温通过数码管显示(上传)

DS18B20温度传感器测温通过数码管显示(详尽版)/*-----------------------------------------------名称:DS18B20温度传感器数码管显示编写:JR日期:2017.12修改:无内容:利用DS18B20温度传感器测量温度-40~+100℃,通过数码管显示单片机开发板使用“金容电子(https:///item.htm?id=544540401703)”开发的JR51单片机开发板。

------------------------------------------------*/#include<reg52.h>#include<stdio.h>#include<intrins.h>#include"delayus.h"#define uchar unsigned char#define uint unsigned intsbit DQ=P2^2; //温度传感器信号线sbit dula=P2^6; //数码管段选线sbit wela=P2^7; //数码管位选线sbit beep=P2^3; //数码管位选线uint temper;uchar a1,a2,a3,a4,a5,n;uint aaa,num;uint warn_l=3000; //低温-40℃报警,测试温度乘以100uint warn_h=10000; //高温100℃报警,测试温度乘以100float ttt;void disp(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5);const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};//不带小数点0-9编码const uchar table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点0-9编码uchar data temp_data[2]={0x00,0x00}; //读出温度暂放void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*******************************************************************18B20复位初始化函数1、将数据线拉高到12、延时2us(该时间要求不是很严格,但是要尽可能短一点)3、将数据线拉低到04、延时750us(该时间范围可以在480~960us)5、将数据线拉高到16、延时等待(70us),如果初始化成功则在15~60us内产生一个由18B20返回的低电平0,据该状态可以确定它的存在。

18b20 温度热水器控制数码管显示操作说明

18b20 温度热水器控制数码管显示操作说明

18b20 温度控制数码管显示操作说明
本设计系统是18b20温度报警系统数码管显示,水温值,设置一个温度值,当低于设定值继电器吸合,控制外接加热装置加热。

高于高温设定温度,继电器断开,停止加热。

1.功能测量温度然后控制继电器输出
2.最左边的按键按下是设定
3.显示带H的是设置一个高温
4.按设定键两下显示带L的是低温
5.右边两个键是加键减键
6.设定好后如果测得的温度小于低温继电器吸合
7.测得的温度大于低温小于高温也吸合
8.大于高温时就断开
9.温度传感器在主控板上用手握住温度传感器就会升温
第一次按下“设定”进入温度设置:
按下“加、减”键可设置高温报警,最高设置成99.0度,
最低可设置成比低温报警高0.1度。

第二次按下“确定键”进入正常温度显示:
1.正常温度显示界面
当前温度11.3度
2.温度设置界面
高混报警值17.4度。

DS18B20温度检测仪表(数码管显示)

DS18B20温度检测仪表(数码管显示)

目录第1章绪论 (1)1.1 选题目的 (1)1.2 设计要求 (1)第2章电路结构及工作原理 (2)2.1 电路方框图 (2)2.1.1 电路图 (2)2.1.2 系统流程 (3)2.2芯片介绍 (5)2.2.1 DS18B20 (5)2.2.1.1 DS18B20的工作原理 (5)2.2.1.2 DS18B20的使用方法 (6)2.2.2 AT89C51 (8)2.2.2.1 AT89C51简介 (8)第3章整机工作原理 (10)第4章系统调试与分析 (12)4.1 系统的调试 (12)4.2系统的分析 (12)结论 (13)收获和体会 (14)致谢 (15)参考文献 (16)附录一元件清单 (17)课程设计任务书年月日第1章绪论1.1 选题目的随着人们生活水平的不断提高,单片机技术已经普及到我们生活,工作,科研等各个领域。

单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。

本文利用单片机结合传感器技术开发设计,把传感器理论与单片机实际应用有机结合,详细地讲述了利用温度传感器DS18B20测量环境温度,设置上下报警温度,当温度不在设置范围内是,可以报警。

同时51单片机在现代电子产品中广泛应用以及其技术已经非常成熟,DS18B20可以直接读出被测温度值,而且采用一线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。

1.2 设计要求(1)设计题目和设计指标测量温度范围为0-100℃。

并通过数码管显示(2)设计功能利用DS18B20实现温度采集,并用数码管显示第2章 电路结构及工作原理2.1 电路方框图2.1.1 电路图2.1.2 系统流程图2-3 读DS18B20的子程序图2-4 读转换温度子程序2.2芯片介绍2.2.1 DS18B202.2.1.1 DS18B20的工作原理当DS18B20接收到温度转换命令后,开始启动转换。

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

; DS18B20温度控制数码管显示(汇编非常详细)*;* 1、P1.6= → 进入设定温度报警值TL 状态:*;* L--20*;* 2、P1.6 → 进入设定温度报警值TH 状态:*;* H--28*;* 3、P1.6 → 返回*;* 4、设定过程:P1.4 →加键(UP),P1.5 →减键(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 EQU P3.7DATA_LINE EQU P3.3RELAY EQU P1.3FLAG1 EQU 20H.0FLAG2 EQU 20H.1;-------------------------------------------------K1 EQU P1.4K2 EQU P1.5K3 EQU P1.6K4 EQU P1.7;=================================================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 DA TA_LINENOPCLR DATA_LINEMOV R0,#64H ;主机发出延时600微秒的复位低脉冲MOV R1,#03HRESET1: DJNZ R0,$MOV R0,#64HDJNZ R1,RESET1SETB DA TA_LINE ;然后拉高数据线NOPMOV R0,#25HRESET2: JNB DA TA_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 ;把一个字节DA TA 分成8个BIT环移给CMOV DATA_LINE,C ;写入一个BITMOV R3,#23DJNZ R3,$ ;等待46微妙SETB DA TA_LINE ;重新释放总线NOPDJNZ R2,WR1 ;写入下一个BITSETB DA TA_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 DA TA_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”,继电器关闭。

相关文档
最新文档