STC12C5A60S2 + DS18B20 程序
ds18b20c语言程序

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语言程序完毕。
12C5A60S2水温控制程序

Abstract: Along with the computer measurement and control technology of the rapid development and wide application, based on singlechip temperature gathering and control system development and application greatly improve the production of temperature in life level of control. This design STC12C5A60S2describes a kind of mainly by MCU control unit, for temperature sensor DS18B20 temperature control system. The control system can real-time storage temperature data and record related to the current time. System design related hardware circuit and related applications. STC12C5A60S2 microcontroller hardware circuit include temperature detection circuit smallest system, and real-time clock circuit, LCD display circuit, communication module circuit, etc. System programming mainly include main program, read temperature subroutine, the calculation of temperature subroutines, key processing procedures, LCD display procedures and data storage procedures, etc.
DS18B20各程序功能

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测温程序

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原理及程序编写(一)概述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 程序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 字节数据**************************************/。
STC12XX单片机与DS18B20用软件实现1-Wire通信

//读取和显示温度 void Get_temperature(void) { unsigned char TPL,TPH,temp_data,temp_flg; //unsigned char Tem; unsigned int val; float t; temp_flg=0; //0,正温度标志 DQ=1; Delayus(2);
//DS18B20 Read 1Byte unsigned char DS18B20_ReadByte() { unsigned char i; unsigned char dat=0 ; for(i=0;i<8;i++) { dat>>=1; DQ=0;
Delayus(2) ;
// 1 ,
// 6us
Standard 6
代码实例(STC12XX,晶振 11.0592HZ)
void Delayus(unsigned char n) { while(n--) { _nop_(); _nop_(); } }
//DS18B20 Reset // Return 0, Reset OK; bit DS18B20_Reset() { bit CY=1;
STC12XX 单片机与 DS18B20 用软件实现 1-Wire®通信
摘要:在没有专用总线主机(如 DS18B20、DS2421)的情况下,微处理器可以轻松地产生 1-Wire 时序信号。本 应用笔记给出了一个采用‘C’语言编写、支持标准速率的 1-Wire 主机通信基本子程序实例。1-Wire 总线的四个基 本操作是:复位、写“1”、写“0”和读数据位。字节操作可以通过反复调用位操作实现,本文提供了通过各种传输 线与 1-Wire 器件进行可靠通信的时间参数。
STC12C5A60S2单片机课程设计报告

一、课程设计基本情况介绍课程设计的基本目的与任务本课程设计旨在驾驭本专业学生理论指导实践能力以及电子产品工程设计与开发能力。
本实践课所要达到的主要目的是: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、温度测量模块温度测量程序主要包括主程序,读出温度子程序,温度转换子程序,计算温度子程序,显示数据子程序等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DQ = 0 ; //给脉冲信号
dat >>= 1 ;
DQ = 1 ; //给脉冲信号
if(DQ)
dat |= 0x80 ;
Delay(4) ;
}
return (dat) ;
}
/*写一个字节*/
/*******************************************************************/
dis_off();
PUTLED(tab1[display[3]]);//显示百位
LED1=1;
Delay(150);
dis_off();
PUTLED(tab1[display[2]]);//显示十位
LED2=1;
Delay(150);
dis_off();
PUTLED(0x7f&tab1[display[1]]);//显示个位和小数点
sbit LED2= P4^6 ;
sbit LED3= P0^7 ;
sbit LED4= P1^7 ;
//***************************************************************************************************//
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,
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 ;
}
}
/*读取温度*/
/*******************************************************************/
STC12C5A60S2+ DS18B20程序
#include < STC12C5A60S2.h >
#include < intrins.h >
#define uchar unsigned char
#define uint unsigned int
bit presence ;
//***************************************************************************************************//
Read_Temperature(void)
{
Init_DS18B20() ;
WriteOneChar(0xCC) ; //跳过读序号列号的操作
WriteOneChar(0x44) ; //启动温度转换
Init_DS18B20() ;
WriteOneChar(0xCC) ; //跳过读序号列号的操作
};
//***************************************************************************************************//
const uchar tab1[]={ /*根据共阳极字型编码表获取0~9,A~B字型代码*/
0xC0,0xF9,0xA4,0xB0,//0~3
0x99,0x92,0x82,0xF8,//4~7
0x80,0x90,0x88,0x83,//8~b
0xC6,0xA1,0x86,0x8E,//c~f
0xff//mie
};
#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;
Disp_Temperature()
{
display[4]=temp_data[0]&0x0f ;
display[0]=ditab[display[4]] ; //查表得小数位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
unsigned char code mytab[4] = {0xF9,0xB0,0x92,0x99} ;//纯粹用来测试,可删除
//***************************************************************************************************//
WriteOneChar(0xBE) ; //读取温度寄存器
temp_data[0] = ReadOneChar() ; //温度低8位
temp_data[1] = ReadOneChar() ; //温度高8位
}
/*数据转换与温度显示*/
/*******************************************************************/
}
/*读一个字节*/
/*******************************************************************/
ReadOneChar(void)
{
unsigned char i = 0 ;
unsigned char dat = 0 ;
for (i = 8 ; i > 0 ; i--)
P2M0=0x80;
P4M1=0x00;
P4M0=0x40;
P4SW = 0xff; //启动P4接口
while(1)
{
const uchar tab[]={ /*根据共阴极字型编码表获取0~9,A~B字型代码*/
0x3f,0x06,0x5b,0x4f,//0~3
0x66,0x6D,0x7D,0x07,//4~7
0x7F,0x6F,0x77,0x7C,//8~b
0x39,0x5E,0x79,0x71,//c~f
0x00//mie
display[3]=display[4]/100 ;
display[1]=display[4]%100 ;
display[2]=display[1]/10 ;
display[1]=display[1]%10 ;
if(display[3]==0x00) //高位为0,不显示
{
display[3]=16 ;
void PUTLED (unsigned char d){ //LED段输入
unsigned char i;
i = d & 0x01;
if(i == 0x00){LED_A = 0;}
i = d & 0x02;
if(i == 0x00){LED_B = 0;}
i = d & 0x04;
if(i == 0x00){LED_C = 0;}
i = d & 0x08;
if(i == 0x00){LED_D = 0;}
i = d & 0x10;
if(i == 0x00){LED_E = 0;}
i = d & 0x20;
if(i == 0x00){LED_F = 0;}
i = d & 0x40;
if(i == 0x00){LED_G = 0;}
if(display[2]==0x00) //次高位为0,不显示
display[2]=16 ;
}
}
/*主函数*/
/************************************/
void main()
{ P0M1=0x00;
P0M0=0x80;
P1M1=0x00;
P1M0=0x80;
P2M1=0x00;
void Delay(unsigned int num) //延时6us,误差0us
{
unsigned char a;
while(num--!=0)
{for(a=15;a>0;a--);}
}
/*void Delay(unsigned int num)
{
while( --num ) ;
}
*/
/*********************************************************************************************/
Delay(90) ; //精确延时大于480us
DQ = 1 ; //拉高总线
Delay(8) ;
presence = DQ ; //如果=0则初始化成功=1则初始化失败
Delay(100) ;
DQ = 1 ;
return(presence) ; //返回信号,0=presence,1= no presence
_nop_() ;
_nop_() ;
_nop_() ;
}
}
}
/******************************************************************/