STC12C5A60S2 + DS18B20 程序
- 格式:doc
- 大小:45.50 KB
- 文档页数:6
ds18b20c语言程序DS18B20驱动程序(C语言)//#include"reg51.h"sbit DQ =P1^4; //定义通信端口//延时函数/*void delay(unsigned inti){while(i--);}*///初始化函数Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ 复位delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于 480usDQ = 1; //拉高总线delay(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(20);}//读一个字节ReadOneChar(void){unsigned chari=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 chardat){unsigned char i=0;for (i=8; i>;0; i--){DQ = 0;DQ = dat&0x01;delay(5);DQ =1;dat>;>;=1;}//delay(4);}//DS18B20程序读取温度ReadTemperature(void){unsigned char a=0;unsignedchar b=0;unsigned int t=0;floattt=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();b=ReadOneChar();t=b;t<<=8;t=t|a;t t=t*0.0625;//t= tt*10+0.5; //放大10倍输出并四舍五入---此行没用return(t);}//DS18B20主程序main(){unsigned chari=0;while(1){i=ReadTemperature();//读温度}}ds18b20c语言程序完毕。
DS18B20各程序功能(急求!)2009-09-29 10:46 ke1783|分类:其他编程语言|浏览2045次我想知道,常规情况下,DS18B20各程序段的功能(1)主程序(2)显示子程序(3)中断子程序(4)延时子程序(5)DS18B20初始化子程序(6)读/写一个字节子程序(7)读出温度子程序(8)键盘扫描子程序keyscan在线等。
解释最好详细一点,好的再加50分。
扫描二维码下载下载知道APP10分钟有问必答!建议:可使用微信的“扫一扫”功能扫描下载分享到:2009-09-30 12:42 提问者采纳(1)主程序:程序的执行从主程序开始,首先调用初始化子程序,用于对中断配置等必要的初始赋值,然后进入主循环,不断重复的执行或调用主循环中的程序,实现数码管的动态扫描、按键的识别和键值处理、温度转换等功能。
(2)显示子程序:显示若用数码管,要显示完整的温度值,一般会选用4位一体数码管,在显示子程序中,对数码管的段、位以动态扫描的方式根据当前需要显示的内容不断对其进行更新和配置,利用人眼的惰性效应达到动态显示的目的。
(3)中断子程序:一般温度不需要实时测量,因为温度是不会突变的,没有必要实时,另一方面实时太占用系统资源,所以可以隔一段时间测量一次,用定时器中断来定时使能测温标志,供温度转换程序在主程序中查询。
(4)延时子程序:单总线时序是建立在延时操做基础上的。
(5)DS18B20初始化子程序:相当于给18B20数据头的作用,18B20检测到初使化电平,准备开始接收或发送数据,另一方面,可根据DS18B20是否作出应答来检测它是否在总线上。
(6)读/写一个字节子程序:在单总线上按照标准单总线的读/写时序,产生一个读/写单字节数据的操作事件,什么时候读/写,读/写些什么,由18B20这个单总线器件内部的数据协议和数据结构来决定(单总线的器件有很多种,操作协议和数据结构不尽相同,但读写时序都是一样的)。
DS18B20测温程序(数码显示)*;************************************************************************** ;*接线方法: *;* 1、用一8P的数据线,一头插在J1,另一头插在J5,接通数码管的段选*;* 2、用一8P的数据线,一头插在J4,另一头插在J6,接通数码管的位选*;* 3、将DS18B20插在主机上的测温部份 *;* 4、用一根单根的数据线,一头插在DS18B20所在数据插针,另一头插到P2.7 * ;**************************************************************************TEMPER_L EQU 36H ;从DS18B20中读回高位,低位暂存区TEMPER_H EQU 35H ;TEMPER_NUM EQU 60H;温度值存储TEMPER_GE EQU 61HTEMPER_SHI EQU 62HTEMPER_SAVE EQU 63HFLAG1 BIT 00HFLAG2 BIT 01HRS BIT p3.0;液晶控制接口RW BIT p3.1E BIT p3.2DQ BIT P2.7;单总线口ORG 0000HA JMP MAINORG 0030HMAIN: MOV SP,#70HLCALL GET_TEMPERLCALL TEMPER_COVLCALL DISPLAYLJMP MAINNOP;**************************************************;读出转换后的温度值;**************************************************GET_TEMPER:SETB DQ ; 定时入口BCD: LCALL INIT_1820JB FLAG1,S22LJMP BCD ;若DS18B20不存在则返回S22: LCALL DELAY1MO V A,#0CCH ; 跳过ROM匹配------0CC命令LCALL WRITE_1820MOV A,#44H ; 发出温度转换命令LCALL WRITE_1820LCALL DELAYCBA CALL INIT_1820JB FLAG1,ABCLJMP CBAABC CALL DELA Y1MOV 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:MOV 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,A ;得到低四位MOV A,TEMPER_LJNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值INC TEMPER_NUMTEMPER_COV1:MOV A,TEMPER_HANL A,#07HSWAP AORL A,TEMPER_NUM ;得到高四位,再与低四位相或得到值MOV TEMPER_NUM,A ; 保存变换后的温度数据LCALL BIN_BCDRET;;**************************************************** ;将16进制的温度数据转换成压缩BCD码;;**************************************************** BIN_BCD:MOV A,TEMPER_NUMMOV B,#10DIV ABMOV TEMPER_SHI,AMOV TEMPER_GE,BMOV A,TEMPER_SAVECJNE A,TEMPER_GE,ZWFHRET:MOV TEMPER_SAVE,TEMPER_GERETZW:CALL LCDDISPAJMP FHRET;**************************************************** ;DS18B20初始化程序;;**************************************************** INIT_1820:SETB DQNOPCLR DQMOV R0,#250TSR1:DJNZ R0,TSR1 ; 延时520usSETB DQMOV R0,#25H ;96US-25HTSR2:DJNZ R0,TSR2JNB DQ,TSR3;如D0为低则复位成功,DS18B20存在LJMP TSR4 ; 延时TSR3:SETB FLAG1 ; 置标志位,表示DS1820存在LJMP TSR5TSR4:CLR FLAG1 ; 清标志位,表示DS1820不存在LJMP TSR7TSR5:MOV R0,#06BH ;200USTSR6:DJNZ R0,TSR6 ; 延时TSR7:SETB DQ ;拉高总线RET;************************************************* ;数码显示程序;************************************************* Display:MOV DPTR,#disptabMOV A,TEMPER_GEMOVC A,@A+DPTRMOV P1,ACLR P2.2CALL DELAYCALL DELAYSETB P2.2MOV DPTR,#disptabMOV A,TEMPER_SHIMOVC A,@A+DPTRMOV P1,ACLR P2.3CALL DELAYCALL DELAYSETB P2.3RET;************************************************* ;液晶显示程序;*************************************************mov p0,#01h;清屏call enrwmov p0,#38h;设为8位,5*7字型两行 call enrwmov p0,#0Chcall enrwmov p0,#06hcall enrwmov p0,#80hcall enrwmov dptr,#yjtabcall rwrammov p0,#0C0hcall enrwmov dptr,#yjtab1call rwramW_TEM:mov p0,#0CChcall enrwMO V DPTR,#ASCIIMO V A,TEMPER_SHIMO VC A,@A+DPTRMO V P0,Asetb rsclr rwclr ecall delaysetb eMO V DPTR,#ASCIIMO V A,TEMPER_GEMO VC A,@A+DPTRMO V P0,Asetb rsclr rwclr ecall delaysetb eRE Tenrw:clr rsclr rwclr esetb eretrwram:mov r1,#00ha1: mov a,r1movc a,@a+dptrcall rwram2inc r1cjne a,#00h,a1retrwram2:mov p0,asetb rsclr rwclr ecall delaysetb eret;*************************************************;延时子程序;*************************************************DELAY:MOV R6,#250;延时500usDJNZ R6,$RETDELAY1:MOV R7,#20HDJNZ R7,$RETdisptab:db 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;字形代码表 ;0 1 2 3 4 5 6 7 8 9yjtab: db 'HTTP// ',00hyjtab1:db 'CHENZHOU_TE:**`C',00hASCII: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39Hend。
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的驱动程序,引用了数码管的驱动。
STC12C5A60S2 控制温度传感器DS18B20 c 程序STC12C5A60S2 控制温度传感器DS18B20 c 程序工作频率:12.000MHz #include”REG51.H”#include”INTRINS.H”typedefunsignedcharBYTE; sbitDQ=P3;//DS18B20的数据口位P3.3BYTETPH;//存放温度值的高字节BYTETPL;//存放温度值的低字节voidDelayXus(BYTEn); voidDS18B20_Reset(); voidDS18B20_WriteByte(BYTEdat); BYTEDS18B20_ReadByte(); voidmain() { DS18B20_Reset();//设备复位DS18B20_WriteByte(0xCC);//跳过ROM 命令DS18B20_WriteByte(0x44);//开始转换命令while(!DQ);//等待转换完成DS18B20_Reset();//设备复位DS18B20_WriteByte(0xCC);//跳过ROM 命令DS18B20_WriteByte(0xBE);//读暂存存储器命令TPL=DS18B20_ReadByte();//读温度低字节TPH=DS18B20_ReadByte();//读温度高字节while(1); } /************************************** 延时X 微秒(STC12C5A60S2@12M) 不同的工作环境,需要调整此函数此延时函数是使用1T 的指令周期进行计算,与传统的12T 的MCU 不同**************************************/ voidDelayXus(BYTEn) { while(n--){ _nop_(); _nop_(); } } /************************************** 复位DS18B20,并检测设备是否存在**************************************/voidDS18B20_Reset() { CY=1; while(CY) { DQ=0;//送出低电平复位信号DelayXus(240);//延时至少480us DelayXus(240); DQ=1;//释放数据线DelayXus(60);//等待60us CY=DQ;//检测存在脉冲DelayXus(240);//等待设备释放数据线DelayXus(180); } } /************************************** 从DS18B20 读1 字节数据**************************************/。
一、课程设计基本情况介绍课程设计的基本目的与任务本课程设计旨在驾驭本专业学生理论指导实践能力以及电子产品工程设计与开发能力。
本实践课所要达到的主要目的是:1、通过本次课程设计,是对学生综合能力的检,提高学生综合运用专业知识,强化单片机应用系统设计与防震能力。
2、本次课程设计是在生产实习所完成的“单片机核心板+电子钟模块+MP3模块+RFID模块+无线传输模块+GPS模块+脉搏传感模块”的基础上设计该硬件系统的工作程序。
课程设计的基本内容1、在生产实习设计单片机硬件系统的基础上,设计相应的应用软件系统。
2、在LCD1602上显示学号程序设计。
3、基于DS1302的实时时钟软件设计。
4、基于DS18B20的温度测量软件设计。
5、基于TL1838A的红外遥控解码软件设计。
6、设计应用软件系统框图和流程图,完成所设计软件的调试。
课程设计的教学要求1、通过资料查阅及学习了解单片机应用系统的软件设计方法及单片机编程、软硬件联机调试技巧。
2、独立设计并编写下列应用程序:(1)LCD1602学号显示程序;(2)DS1302实时时钟程序;(3)DS18B20温度测量程序;(4)TL1838A红外遥控解码程序;3、独立完成所设计程序与硬件系统的联机仿真。
二、整机系统框图(硬件、软件)该设计方案是以STC12C5A60S2单片机为核心,采用LCD液晶屏幕显示模块、实时时钟模块、温度测量模块、红外遥控解码等模块所构建的系统,能在LCD1602液晶屏上显示当前的日期(年、月、日)、时间(时、分、秒)数据、当前环境温度值和红外遥控解码值。
用户可通过遥控器或单片机核心板上的按键来进行日期和时间的设置。
本系统设计大部分功能由软件来实现,电路简单明了,系统稳定性也得到大大提高。
1、总体硬件设计框架图:2、总体软件设计框架图图为电子时钟程序设计流程图。
图电子时钟程序设计流程图 2、温度测量模块温度测量程序主要包括主程序,读出温度子程序,温度转换子程序,计算温度子程序,显示数据子程序等。
//DS18B20的读写程序,数据脚P3.3 ////温度传感器18B20汇编程序,采用器件默认的12位转化 ////最大转化时间750微秒,显示温度-55到+125度,显示精度 ////为0.1度,显示采用4位LED共阳显示测温值 ////P0口为段码输入,P24~P27为位选 ///***************************************************/#include "reg51.h"#include "intrins.h" //_nop_();延时函数用#define Disdata P1 //段码输出口#define discan P0 //扫描口#define uchar unsigned char#define uint unsigned intsbit DQ=P3^2; //温度输入口uint h;//**************温度小数部分用查表法***********//uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09 };//uchar dd[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};//共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"uchar scan_con[4]={0x00,0x01,0x02,0x03}; //列扫描控制字uchar temp_data[2]={0x00,0x00}; //读出温度暂放uchar display[4]={0x00,0x00,0x00,0x00,}; //显示单元数据,共4个数据和一个运算暂用///////***********11微秒延时函数**********///void delay(uint t){for(;t>0;t--);}///***********显示扫描函数**********/scan(){uchar k;for(k=0;k<3;k++){P0=0xff;dd[k]=dd[display[k]];dd[k]=dd[k]*16;dd[k]=dd[k]|scan_con[k];P0=dd[k];delay(90);P0=0xff;}}/////***********18B20复位函数**********/ ow_reset(void){char presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();DQ=0; //delay(50); // 550usDQ=1; //delay(6); // 66uspresence=DQ; // presence=0继续下一步 }delay(45); //延时500uspresence = ~DQ;}DQ=1;}/////**********18B20写命令函数*********/ //向 1-WIRE 总线上写一个字节void write_byte(uchar val){uchar i;for (i=8; i>0; i--) //DQ=1;_nop_();_nop_();DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us DQ = val&0x01; //最低位移出delay(6); //66usval=val/2; //右移一位}DQ = 1;delay(1);}///*********18B20读1个字节函数********///从总线上读取一个字节uchar read_byte(void){uchar i;uchar value = 0;for (i=8;i>0;i--){DQ=1;_nop_();_nop_();value>>=1;DQ = 0; //_nop_();_nop_();_nop_();_nop_(); //4usDQ = 1;_nop_();_nop_();_nop_();_nop_(); //4usif(DQ)value|=0x80;delay(6); //66us}DQ=1;return(value);}///***********读出温度函数**********///read_temp(){ow_reset(); //总线复位write_byte(0xCC); // 发Skip ROM命令write_byte(0xBE); // 发读命令temp_data[0]=read_byte(); //温度低8位temp_data[1]=read_byte(); //温度高8位ow_reset();write_byte(0xCC); // Skip ROMwrite_byte(0x44); // 发转换命令}/***********温度数据处理函数**********/void work_temp(){display[3]=temp_data[0]&0x0f;display[0]=ditab[display[3]]; //小数部分display[3]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4); display[2]=display[3]/10%10;display[1]=display[3]%10;}/////**************主函数****************/main(){Disdata=0xff; //初始化端口discan=0xff;ow_reset(); // 开机先转换一次write_byte(0xCC); // Skip ROMwrite_byte(0x44); // 发转换命令for(h=0;h<500;h++){scan();} //开机显示"0000"2秒while(1){read_temp(); //读出18B20温度数据work_temp(); //处理温度数据scan(); //显示温度值2秒}}////*********************结束**************************//。
主程序ORG 0000HLJMP STARTSTART: MOV DISBUF4,#00H ;开始,初始化MOV DISBUF5, #00HMAIN: ;主程序LCAAL KEY ;调按键预置数子程序CLR RS1CLR RS0LCALL RESET ;调复位子程序MOV A,#0CCH ;跳过ROM匹配------0CCLCALL WRITE ;调DS18B20子程序MOV A,#44H ;发出温度转换命令LCALL WRITE ;调DS18B20子程序LCALL RESET ;调复位子程序MOV A,#0CCH ;跳过ROM匹配LCALL WRITE ;调DS18B20子程序MOV A,#0BEH ;发出读取温度值命令LCALL WRITE ;调DS18B20子程序LCALL READ ;调DS18B20子程序MOV A, 3DHMOV 29H,ALCALL READMOV A, 3DHMOV 28H,AMOV R0, #34HMOV A, 28HRLC AMOV 47H,CJNB 47H, BTOD1 ;28H中的最高位是不是为1(温度<0);小于0的温度值不处置,大于0顺序执行BTOD1: MOV A, 28HRRC AMOV 40H,CRRC AMOV 41H,CRRC AMOV 42H,CRRC AMOV 43H,CMOV A, 29HMOV 27H, AMOV C,40H ;将28H中的最低位移入C,40H41H42H43H ;为28H中的位地址RRC A ;将28H中的低4位移到A的高4位MOV C, 41HRRC AMOV C, 42HRRC AMOV C, 43HRRC AMOV 29H,A ;将28H中的低4位放入29H中MOV A, 29H ;将29H中的十六进制数转换成10进制MOV B, #100DIV ABMOV @R0, A ;百位存于34HMOV @R0, #11H ;百位不显示DEC R0MOV A, #10XCH A, BDIV ABMOV @R0, A ;十位存于33HDEC R0MOV @R0, B ;个位存于32HDEC R0ANL 27H, #0FH ;小数点后一名进制转换MOV A, 27HMOV B, #06HMUL ABMOV B, #10DIV ABMOV @R0, A ;小数点后一名存于31HMOV DISBUF0,33H ;十位MOV DISBUF1,32H ;个位MOV DISBUF2,31H ;小数位MOV DISBUF3, #0H ;置0MOV DISBUF6, #0HMOV DISBUF7, #0HLCALL CMP ;调比较报警子程序LCALL DISPLAY ;调显示子程序LJMP MAIN ;转到MAINDS18B20复位子程序RESET: NOPL0: CLR ;拉低数据线MOV R2,#200 ;发出600us的复位脉冲L1: NOPDJNZ R2, L1SETB ;主机释放数据线MOV R2,#30 ;DS18B20等待60usL4: DJNZ R2, L4CLR CORL C, ;DS18B20数据变低(存在脉冲)吗?JC L3 ;DS18B20未预备好,从头初始化MOV R6, #80L5: ORL C,JC L3 ;DS18B20数据变高,初始化成功DJNZ R6,L5 ;数据线低电平可持续3us*80=240us SJMP L0 ;初始化失败,从头初始化L3: MOV R2, #250L2: DJNZ R2,L2 ;DS18B20应答500usRET读DS18B20子程序READ: MOV R6,#8 ;循环8次,读一个字节RE1: CLRMOV R4, #6NOPNOPSETBRE2: DJNZ R4,RE2 ;等待8USMOV C, ;读DS18B20的数据RRC A ;读取的数据移入AMOV R5, #30DJNZ R6,RE1 ;读完一个字节的数据MOV 3DH,A ;数据存入3DH中SETB ;把数据线拉高RET写DS18B20子程序;写DS18B20的子程序, 从DS18B20中写出一个字节的数据WRITE: MOV R3,#8 ;循环8次,写一个字节WR1: SETB ;拉高数据线MOV R4, #8RRC A ;写入位从A中移到CYCLRWR2: DJNZ R4,WR2 ;等待16USMOV ,C ;命令字按位依次送给DS18B20MOV R4, #20WR3: DJNZ R4,WR3 ;保证写进程持续40USDJNZ R3,WR1 ;未写完一个字节转WR1继续SETB ;写完一个字节,数据线置高RET比较报警子程序CMP: MOV A,DISBUF0 ;实际测量温度值放在DISBUF8中SWAP AMOV DISBUF8, AMOV A, DISBUF1ORL A, DISBUF8MOV DISBUF8, AMOV A,DISBUF4 ;预置温度值放在DISBUF9中SWAP AMOV DISBUF9, AMOV A, DISBUF5ORL A, DISBUF9MOV DISBUF9, ACLR CMOV A, DISBUF8SUBB A, DISBUF9JNC KK ;没有借位,即实际温度值大于;预置温度值转KKCLR ;有借位,即实际温度值小于预置温度值;置0,不发报警信号RETKK: SETB ;置1,即发出报警标志发光二极管亮RET按键子程序KEY: JNB , YZBWJNB , YZSWLJMP KEYRET YZBW: LCALL DELAY1JB , KEYRETJNB , $INC DISBUF5MOV A, DISBUF4CJNE A, #10,KEYRETMOV DISBUF4, #0LJMP KEYRETYZSW: LCALL DELAY1JB , KEYRETJNB , $INC DISBUF5MOV A, DISBUF5CJNE A, #10,KEYRETMOV DISBUF5, #0 KEYRET: RET显示子程序DISPLAY: MOV A, DISBUF0MOV DPTR, #SEGMOVC A, @A+DPTRMOV P1, AMOV P2, #00000001BLCALL DELAY1MOV P2, #00000000BMOV A, DISBUF1MOV DPTR, #SEGMOVC A, @A+DPTRORL A, #80HMOV P1, AMOV P2, #00000010BLCALL DELAY1MOV P2, #00000000BMOV A, DISBUF2MOV DPTR, #SEGMOVC A, @A+DPTRMOV P1, AMOV P2, #00000100BLCALL DELAY1MOV P2, #00000000BMOV A, DISBUF3MOV DPTR, #SEGMOVC A, @A+DPTRMOV P1, AMOV P2, #00001000BLCALL DELAY1MOV P2, #00000000BMOV A, DISBUF4MOV DPTR, #SEGMOVC A, @A+DPTRMOV P1, AMOV P2, #00010000BLCALL DELAY1MOV P2, #00000000BMOV A, DISBUF5MOV DPTR, #SEGMOVC A, @A+DPTRMOV P1, AMOV P2, #00100000BLCALL DELAY1MOV P2, #00000000BMOV A, DISBUF6MOV DPTR, #SEGMOVC A, @A+DPTRMOV P1, AMOV P2, #00000000BLCALL DELAY1MOV P2, #00000000BMOV A, DISBUF7MOV DPTR, #SEGMOVC A, @A+DPTRMOV P1, AMOV P2, #00000000BLCALL DELAY1MOV P2, #00000000BRET; (00) (01) (02) (03) (04)SEG: DB 03FH, 06H, 05BH, 04FH, 066H ; (05) (06) (07) (08) (09)DB 06DH, 07DH, 007H, 07FH, 06FH ;延时子程序DELAY1: MOV R1, #0A0HDEL11: NOPDJNZ R1, DEL11RETEND;工作内存概念:DISBUF0 EQU 10H DISBUF1 EQU 11H DISBUF2 EQU DISBUF1+1 DISBUF3 EQU DISBUF2+1 DISBUF4 EQU DISBUF3+1 DISBUF5 EQU DISBUF4+1 DISBUF6 EQU DISBUF5+1 DISBUF7 EQU DISBUF6+1 DISBUF8 EQU DISBUF7+1 DISBUF9 EQU DISBUF8+1。
DS18B20单线数字温度传感器DALLAS半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器,体积更小、适用电压更宽、更经济。
一线总线独特而且经济的特点,使用户可轻松地组建温度传感器网络,为测量系统的构建引入全新概念。
DS18B20、DS1822 “一线总线”数字化温度传感器同DS1820一样,支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C,而DS1822的精度较差为± 2°C 。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性,适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。
DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C,分辨率设定,以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS1822与DS18B20软件兼容,是DS18B20的简化版本。
省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。
继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。
DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
1、 DS18B20性能特点DS18B20的性能特点:①采用单总线专用技术,既可通过串行口线,也可通过其它I/O口线与微机接口,无须经过其它变换电路,直接输出被测温度值(9位二进制数,含符号位),②测温范围为-55℃-+125℃,测量分辨率为0.0625℃,③内含64位经过激光修正的只读存储器ROM,④适配各种单片机或系统机,⑤用户可分别设定各路温度的上、下限,⑥内含寄生电源。
ds18b20程序设计如何使用ds18b20编写程序设计。
DS18B20是一种数字温度传感器,它可以通过编程来读取环境温度信息。
本文将详细介绍如何使用DS18B20进行程序设计,以帮助读者了解如何在自己的项目中应用这款传感器。
第一步:准备工作在开始实际的程序设计之前,我们需要准备一些硬件和软件工具。
首先,我们需要一块支持DS18B20的硬件平台,例如Arduino、树莓派或其他微控制器。
其次,我们需要一块DS18B20传感器和一些杜邦线用于连接。
最后,我们需要一个编程环境,例如Arduino IDE或树莓派的Python开发环境。
第二步:连接硬件将DS18B20传感器与硬件平台连接起来是第二个关键步骤。
DS18B20传感器有三个引脚,其中一个是地线(GND),一个是电源(VCC),还有一个是数据线(DATA)。
将GND引脚连接到硬件平台的地线引脚,将VCC 引脚连接到硬件平台的电源引脚,将DATA引脚连接到硬件平台的数字引脚。
确保连接正确后,我们可以进入下一步。
第三步:配置硬件平台在编程之前,我们需要配置硬件平台,以便能够与DS18B20传感器进行通信。
具体配置的方式取决于使用的硬件平台。
在Arduino中,我们可以使用OneWire库来与DS18B20传感器进行通信。
在树莓派中,我们需要通过GPIO引脚来与传感器进行通信。
了解所使用硬件平台的配置方式是非常重要的。
第四步:编写程序一旦硬件平台配置完成,我们可以开始编写程序。
程序的目标是读取DS18B20传感器的温度数据并将其显示出来。
以下是使用Arduino IDE 编写的简单示例代码:#include <OneWire.h>#include <DallasTemperature.h>数据线引脚连接到Arduino的数字引脚2#define ONE_WIRE_BUS 2OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);void setup() {Serial.begin(9600);sensors.begin();}void loop() {sensors.requestTemperatures();float temperature = sensors.getTempCByIndex(0);Serial.print("Temperature: ");Serial.println(temperature);delay(1000);}上述代码首先引入了两个库:OneWire和DallasTemperature。
数字温度传感器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所示。
第28卷 第1期基于STC12C 系列单片机的DS18B20编程*李建兰1,2 邵建龙1 张志宏1 吕英英1 罗景文1(1.昆明理工大学信息工程与自动化学院 昆明 650051;2.云南机电职业技术学院 昆明 650203)摘 要:针对新一代高性能单时钟/机器周期的STC12C 系列单片机由于执行速度远高于传统的51单片机而不能直接使用原有单片机程序的问题,采用Keil 软件的性能分析器来计算Atmel 单片机的执行时间;通过手工计算修改程序段的执行时间,使ST C12C 系列单片机的执行时间满足数字温度传感器DS18B20的时序要求。
测试结果表明ST C12C2052能正确读取DS18B20的温度转换值,此方法对于具有时序要求的可编程器件的使用具有一定的参考价值。
关键词:STC12C 单片机;DS18B20;时序;编程中图分类号:TP274 文献标识码:APrograms for DS18B20based on STC12C single 2chip computerLi Jianlan1,2Shao Jianlong 1 Zhang Zhihong 1 Lv Yingying 1 Luo Jingwen 1(1.Faculty of Information Engineering and Automation,Kunming University of Science and T echnology,Kunming 650051;2.Yunnan Vocat ional college of Mechanical and Electrical T echnology,Kunming 650203)Abstract:T he new generation high 2performance one 2clock period per machine c ycle architecture ST C12C series Single 2chip computers can run several times fast er t han tradit ional 8051family.So t he programs for original 51single 2chip com 2put er can not be used in STC12C series direc t ly.T he performance analyzer in Keil software is used to calculate the execu 2tion time of Atmel single 2chip computers.B y manual computing the execution t ime of programs for both A tmel and STC12C series,programs are modified t o meet the t ime sequence needs of digital temperature sensor DS18B 20.The test shows t hat t he single 2chip c omput er STC12C2052c an read the t emperat ure values of DS18B20.T he met hod plays a sig 2nificant role for the use of a programmable device which has the t ime sequence requirement s.Ke ywords:STC12C single 2chip computer;DS18B20;time sequence;program作者简介:李建兰,硕士,讲师,主要研究方向为微电子与单片机控制技术。
#include<reg52.h>#define uint unsigned int#define uchar unsigned char//==========LCD的定义====================sbit lcden=P1^2;sbit lcdrw=P1^1;sbit lcdrs=P1^0;uchar str0[9];uchar str1[8]="MCU_time";uchar str2[]="Tempture:";uchar num[]={"0123456789-."};uchar second=0,mint=0,hour=0;//============DS18B20的定义===============sbit DQ=P3^7;void STR(unsigned char h,unsigned char m,unsigned char s){str0[0]=h/10+0x30;str0[1]=h%10+0x30;str0[2]=':';str0[3]=m/10+0x30;str0[4]=m%10+0x30;str0[5]=':';str0[6]=s/10+0x30;str0[7]=s%10+0x30;str0[8]=' ';}//=============LCD延时子函数=================== void delayLCD(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--) ;}//============DS18B20延时子函数=================== void delay(uint x){uchar i;while(x--)for(i=0;i<110;i++);}void delay_us(uchar x){uchar i;for(i=0;i<x;i++);}/********************************************************** 延时2us:6+1+2+(3+4)*1+4=20fosc,约2us***********************************************************/ void delay_1us(){uchar i;for(i=0;i<1;i++);}/********************************************************* 延时200ms***********************************************************/void delay_200ms(){uchar i,j;for(j=0;j<200;j++)for(i=0;i<255;i++);}/********************************************************** 18B20复位***********************************************************/bit rst_18b20(){bit flag;//存在标志,为0存在,1不存在DQ=1;delay_1us();//略微延时DQ=0;delay_us(255);//480-960的低电平DQ=1;//释放总线delay_us(30);//等待15-60微秒,18b20作出回应flag=DQ;//检测是否为低电平delay_us(255);delay_us(255);//延时足够长,最少480us,完成复位周期}/********************************************************** 18B20写一个字节数据***********************************************************/ void write_18b20(uchar x){uchar i;for(i=0;i<8;i++){DQ=1;delay_1us();//稍作延时DQ=0;//启动写时序DQ=x&0x01;//向数据线传送最低位delay_us(40);//延时约50us,供18b20采样数据DQ=1;//释放总线delay_1us();x>>=1;//右移一位}delay_us(2);//写完一个指令稍作延时}/********************************************************** 18B20读一个字节数据***********************************************************/ uchar read_18b20(){uchar i=0,dat;for(i=0;i<8;i++){DQ=1;//先拉高delay_1us();//稍作延时DQ=0;//启动读时序delay_1us();//稍作延时DQ=1;//释放总线delay_us(6);//延时7us,主机采样dat>>=1;//先右移一位,使最高位为0if(DQ==1)dat|=0x80;//与10000000或,dat=10000000elsedat|=0x00;//取值为0delay_us(50);}}/**********************************************************18B20启动温度转换并准备读取温度**********************************************************/void ready_18b20(){rst_18b20();//复位write_18b20(0xcc);//跳过序列号操作write_18b20(0x44);//启动温度转换delay_200ms();//温度转换时间rst_18b20();//复位write_18b20(0xcc);//跳过序列号操作write_18b20(0xbe);//读取数据}//=======写命令子函数============================void write_com(uchar com){lcdrs=0;P0=com;delayLCD(5);lcden=1;delayLCD(5);lcden=0;}//=======LCD写数据字函数=========================void write_date(uchar date){lcdrs=1;P0=date;delayLCD(5);lcden=1;delayLCD(5);lcden=0;}//========初始化子函数==========================void init(){ lcdrw=0;write_com(0x38); //显示模式设置,5x7write_com(0x0c); //0x0c光标不闪烁write_com(0x06); // 0x06当写完一个字符,地址指针和光标往后移一位write_com(0x01); //清屏write_com(0x80); //从第一行显示0x80为显示地址起始点0x10表示光标指在右端}//=========温度显示字程序===================void write_sfm(uchar TD,uchar TN,uchar H,uchar M,uchar S){uchar i,j,q,w,y;i=TN/10;j=TN%10;write_com(0x80);for(y=0;y<=8;y++){write_date(str2[y]);}write_date(num[i]);write_date(num[j]);write_date(num[11]);write_date(num[TD]);write_date('^');write_date('C');STR(H,M,S) ;write_com(0x80+0x40); //换行显示for(w=0;w<=7;w++){write_date(str1[w]);}for(q=0;q<=8;q++){write_date(str0[q]);}}//==============主函数=========================void main(){uchar TL,TH,TN,TD;init(); //LCD初始化TMOD = 0x01;TH0 = 0x0D8;TL0 = 0x0F0;EA = 1;ET0 = 1;TR0 = 1;while(1){ready_18b20();TL=read_18b20();//读低字节TH=read_18b20();//读高字节TN=TH*16+TL/16;//整数部分,TH左移4位,TL右移四位,相加得到整数部分TD=(TL%16)*10/16;//低字节对16取余,得小数部分,write_sfm(TD,TN,hour,mint,second);}}//******************TO中断子程序10MS一次*****************//void timer0()interrupt 1{unsigned char u;TR0=0;TH0 = 0x0D8;TL0 = 0x0F0;u++;if (u==100){u=0;second++;if(second==60){second=0;mint++;if(mint==60){mint=0;hour++;if(hour==24) hour=0;}}}TR0=1;}。