温度传感器程序

合集下载

温度采集与显示设计程序详解

温度采集与显示设计程序详解

温度采集与显示设计程序详解程序流程如下:1.初始化温度传感器:连接温度传感器至控制器,并进行初始化。

这包括设置传感器接口和模式,设置精度等。

2.采集温度数据:通过温度传感器读取环境温度数据,并将其存储在变量中。

3.数据处理:对采集到的温度数据进行一定的处理,例如进行单位转换、滤波处理等。

4.数据显示:将处理后的温度数据通过显示器显示出来。

可以使用LCD液晶显示器、LED数码管、数码管等不同的显示器设备。

5.重复采集与显示:循环执行步骤2-4,以实现实时监测和显示环境温度。

实现细节如下:1. 初始化温度传感器:根据具体采用的温度传感器型号和接口类型,选择相应的初始化函数进行初始化。

例如,如果使用OneWire接口的DS18B20温度传感器,可以使用Arduino库中的OneWire库进行初始化。

2.采集温度数据:通过读取温度传感器的输出,可以获取到环境温度的原始数据。

具体的采集方法和代码取决于所采用的传感器和控制器类型。

3.数据处理:在采集到的温度数据上进行一定的处理,以满足实际需求。

例如,对于DS18B20传感器输出的12位数据,可以通过位运算进行小数点处理,从而得到实际的温度值。

4. 数据显示:根据设计需求选择相应的显示器设备,并使用相应的显示库函数将处理后的温度数据显示出来。

例如,使用LiquidCrystal库操作LCD液晶显示器进行显示。

5. 重复采集与显示:使用循环语句,如while循环,不断执行数据采集和显示的步骤,以实现实时监测和显示环境温度。

可以根据实际需求设置采集和显示的时间间隔。

总结:温度采集与显示设计主要包括温度传感器的初始化、温度数据的采集、数据的处理和显示器的选择与操作。

通过合理的程序设计和选择适合的硬件设备,可以实现实时监测和显示环境温度。

具体的实现细节和程序代码取决于具体的传感器和控制器类型,以及所采用的显示器设备。

温度传感器ds18b20模块化程序

温度传感器ds18b20模块化程序

#include"reg51.h"#define uchar unsigned char#define uint unsigned intsbit DQ=P1^4; //ds18b20与单片机连接口sbit RS=P2^0;sbit RW=P2^1;sbit EN=P1^2;unsigned char code str1[]={"temperature: "};unsigned char code str2[]={" "};uchar data disdata[5];uint tvalue; //温度值uchar tflag; //温度正负标志/*************************lcd1602程序**************************/void delay1ms(unsigned int ms) //延时1毫秒{unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com) //写指令// {delay1ms(1);RS=0;RW=0;EN=0;P0=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat) //写数据// {delay1ms(1);;RS=1;RW=0;EN=0;P0=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init() //初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void display(unsigned char *p) //显示// {while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}init_play() //初始化显示{lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);//display(str2);}/******************************ds1820程序***************************************/void delay_18B20(unsigned int i)//延时1微秒{while(i--);}/*****ds1820复位******/void ds1820rst(){unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480usDQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{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_18B20(10);}return(dat);}/***********写数据**********/ void ds1820wr(uchar wdata){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}/***读取温度值并转换***/read_temp(){uchar a,b;ds1820rst();ds1820wr(0xcc); //*跳过读序列号*/ds1820wr(0x44); //*启动温度转换*/ds1820rst();ds1820wr(0xcc); //*跳过读序列号*/ds1820wr(0xbe); //*读取温度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625); //温度值扩大10倍,精确到1位小数return(tvalue);}/********************************************************** *********/void ds1820disp() //温度值显示{uchar flagdat;disdata[0]=tvalue/1000+0x30; //百位数disdata[1]=tvalue%1000/100+0x30; //十位数disdata[2]=tvalue%100/10+0x30; //个位数disdata[3]=tvalue%10+0x30; //小数位if(tflag==0)flagdat=0x20; //正温度不显示符号elseflagdat=0x2d; //负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20; //如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20; //如果百位为0,十位为0也不显示}}wr_com(0xc0);wr_dat(flagdat); //显示符号位wr_com(0xc1);wr_dat(disdata[0]); //显示百位wr_com(0xc2);wr_dat(disdata[1]); //显示十位wr_com(0xc3);wr_dat(disdata[2]); //显示个位wr_com(0xc4);wr_dat(0x2e); //显示小数点wr_com(0xc5);wr_dat(disdata[3]); //显示小数位}/********************主程序***********************************/void main(){init_play(); //初始化显示while(1){read_temp(); //读取温度ds1820disp(); //显示}}。

内部温度传感器串口显示完整程序

内部温度传感器串口显示完整程序

STM32F103 内部温度传感器用串口传递到PC上显示程序如下:#include ""#include ""#include ""#include <>#define DR_ADDRESS ((uint32_t)0x4001244C) n\r", a, b, c, d);Delay_ARMJISHU(8000000);}}void ADC_GPIO_Configuration(void) //ADC配置函数{GPIO_InitTypeDef GPIO_InitStructure;//PC0 作为模拟通道10输入引脚= GPIO_Pin_0; //管脚1= GPIO_Mode_AIN;//输入模式GPIO_Init(GPIOC, &GPIO_InitStructure); //GPIO组}超级终端显示如下:关于一些数据格式的定义解释:#ifndef __STM32F10x_TYPE_H#define __STM32F10x_TYPE_Htypedef signed longs32;typedef signed short s16;typedef signed chars8;typedef signed longconst sc32;?typedef signed short const sc16;?typedef signed charconst sc8;typedef volatile signed longvs32;typedef volatile signed short vs16;typedef volatile signed charvs8;typedef volatile signed longconst vsc32;?typedef volatile signed short const vsc16;?typedef volatile signed charconst vsc8; typedef unsigned longu32;typedef unsigned short u16;typedef unsigned charu8;typedef unsigned longconst uc32;?typedef unsigned short const uc16;?typedef unsigned charconst uc8;typedef volatile unsigned longvu32;typedef volatile unsigned short vu16;typedef volatile unsigned charvu8;typedef volatile unsigned longconst vuc32;?typedef volatile unsigned short const vuc16;?typedef volatile unsigned charconst vuc8;typedef enum {FALSE = 0, TRUE = !FALSE} bool;typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;#define U8_MAX((u8)255)#define S8_MAX((s8)127)#define S8_MIN((s8)-128)#define U16_MAX((u16)65535u) #define S16_MAX((s16)32767) #define S16_MIN((s16)-32768) #define U32_MAX((u32)95uL) #define S32_MAX((s32)47)#define S32_MIN((s32)-48)#endif。

温度传感器来实现。当温度过高时就自动报警程序

温度传感器来实现。当温度过高时就自动报警程序
sbit p2_6=P2^6;
unsigned char code TABLE[]={
0xd7,0x11,0xcd,0x5d,0x1b,
0x5e,0xde,0x15,0xdf,0x5f,
0x9f,0xdf,0xc6,0xd7,0xce,0x8e};
void delay(uint count) //delay
//一个字节在DAT里
}
return(dat); //将一个字节数据返回
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20
{ //写一个字节到DS18B20里
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1写1部分
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0写0部分
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change发送温度转换命令
temp=temp|a; //两字节合成一个整型变量。
tt=temp*0.0625; //得到真实十进制温度值,因为DS18B20
//可以精确到0.0625度,所以读回数据的最低位代表的是

DS18B20温度传感器使用方法以及代码

DS18B20温度传感器使用方法以及代码

第7章DS18B20温度传感器7.1 温度传感器概述温度传感器是各种传感器中最常用的一种,早起使用的是模拟温度传感器,如热敏电阻,随着环境温度的变化,它的阻值也发生线性变化,用处理器采集电阻两端的电压,然后根据某个公式就可以计算出当前环境温度。

随着科技的进步,现代的温度传感器已经走向数字化,外形小,接口简单,广泛应用在生产实践的各个领域,为我们的生活提供便利。

随着现代仪器的发展,微型化、集成化、数字化、正成为传感器发展的一个重要方向。

美国DALLS半导体公司推出的数字化温度传感器DS18B20采用单总线协议,即单片机接口仅需占用一个I/O端口,无需任何外部元件,直接将环境温度转化为数字信号,以数码方式串行输出,从而大大简化了传感器与微处理器的接口。

7.2 DS18B20温度传感器介绍DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。

与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。

因而使用DS18B20可使系统结构更趋简单,可靠性更高。

他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。

1.DS18B20温度传感器的特性①独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

②在使用中不需要任何外围元件。

③可用数据线供电,电压范围:+3.0~ +5.5 V。

④测温范围:-55 ~+125 ℃。

固有测温分辨率为0.5 ℃。

⑤通过编程可实现9~12位的数字读数方式。

数字温度传感器ds18b20程序(含1602显示液晶程序)

数字温度传感器ds18b20程序(含1602显示液晶程序)
wela=0;
lcden=0;
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址指针加1
write_com(0x01); //显示清0,数据指针清0
{
uint i; //初始化,先将数据线置高电平(单片机管脚默认高电平,故不用拉高),延时,时间尽可能短
ds=0; //数据线拉到低电平0
i=103;
while(i>0)i--; //循环执行相当于延时,延时480-960us,一条指令周期相当于1~4个及其周期(1us)
b=tempread(); //读高8位
temp=b;
temp<<=8; //temp=temp<<8,左移8位
temp=temp|a; //两个8位数据合并成一个数据,两个字节组合为1个字
f_temp=temp*0.0625; //温度在寄存器中为12位 分辨率位0.0625°
{
do
{
SBUF = *parr++; //发送数据
while(!TI); //等待发送完成标志为1
TI =0; //标志清零
}while(*parr); //保持循环直到字符为'\0'
uint temp;
float f_temp;
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);

DS18B20温度传感器实训教程

DS18B20温度传感器实训教程
c.添加温度传感器控制程序temp.c
(2)程序编写、编译。
a.编写主函数程序main.c如下:
#include "reg52.h"
#include"temp.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
2硬件连接3程序烧入芯片1选择单片机型号串口号打开程序文件关闭单片机电源再点击下载程序然后打开电源程序显示下载操作成功即可
DS18B20
1、
1、掌握DS18B20温度传感器设计与制作及其特性;
2、熟练KeiluVision5软件及程序烧入软件基础运用;
3、了解并使用单片机开发试验仪做基础实验。
4、学会基础的C51单片机程序编写并看懂较为复杂的程序。
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc);//跳过ROM操作命令
Ds18b20WriteByte(0xbe);//发送读取温度命令
}
/*******************************************************************************
for(j=8; j>0; j--)
{
DSPORT = 0;//先将总线拉低1us
i++;
DSPORT = 1;//然后释放总线
i++;
i++;//延时6us等待数据稳定
bi = DSPORT;//读取数据,从最低位开始读取

单片机控制的温度传感器C语言程序

单片机控制的温度传感器C语言程序
temp_h= Readbyte(); //存储温度高字节值(其中高五位为符号位)
EA = 1;
}
/*数据转换*/
void DigitalConvert()
{
uchar total = 0;
tempsign = (temp_h >> 7) & 0x01; //得出符号位
if(tempsign == 0)//正数的处理方法
{
uint i = 0;
bit b = 0;
DO = 0; //产生读时隙
i++;//维持低电平至少1us
DO = 1; //1us以上后拉高
Delayus(2); //延时8us,DO下降沿15内ds18b20输出的数据才有效
b = DO; //读取数据
Delayus(40);//每个读时隙至少持续60us
}
/*写一个字节*/
void Writebyte(uchar byte_to_write)
{
uchar i = 0;
uchar j = 0;
bit write_bit = 0;
for(j=0; j<8; j++)
{
write_bit =(byte_to_write & 0x01);
if(write_bit == 1) //写1
return(b);
}
/*读取一个字节*/
uchar Readbyte()
{
uchar byte_read = 0;
uchar i, j;ቤተ መጻሕፍቲ ባይዱ
for(i=0; i<8; i++)
{
j = Readbit();

温度传感器18B20驱动程序(C语言)

温度传感器18B20驱动程序(C语言)

//1楼主:温度传感器18B20驱动程序(C语言)/*************************************************************18B20驱动程序,DQ为数据口,接于P2.1*11.0592M晶振,上拉4.7k电阻*************************************************************/#define uchar unsigned char#define uint unsigned intsbit dq = P1^7;bit flag;uint Temperature;uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节uchar id_buff[8];uchar *p;uchar crc_data;uchar code CrcTable [256]={0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176,238,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};///*************************************************************Function:延时处理*parameter:*Return:*Modify:*************************************************************/void TempDelay (uchar us){while(us--);}/*************************************************************Function:18B20初始化*parameter:*Return:*Modify:*************************************************************/void Init18b20 (void){dq=1;_nop_();dq=0;TempDelay(86); //delay 530 uS//80_nop_();dq=1;TempDelay(14); //delay 100 uS//14_nop_();_nop_();_nop_();if(dq==0)flag = 1; //detect 1820 success!elseflag = 0; //detect 1820 fail!TempDelay(20); //20_nop_();_nop_();dq = 1;}/************************************************************ *Function:向18B20写入一个字节*parameter:*Return:*Modify:*************************************************************/ void WriteByte (uchar wr) //单字节写入{uchar i;for (i=0;i<8;i++){dq = 0;_nop_();dq=wr&0x01;TempDelay(5); //delay 45 uS //5_nop_();_nop_();dq=1;wr >>= 1;}}/************************************************************ *Function:读18B20的一个字节*parameter:*Return:*Modify:*************************************************************/ uchar ReadByte (void) //读取单字节{uchar i,u=0;for(i=0;i<8;i++){dq = 0;u >>= 1;dq = 1;if(dq==1)u |= 0x80;TempDelay (4);_nop_();}return(u);}/************************************************************ *Function:读18B20*parameter:*Return:*Modify:*************************************************************/ void read_bytes (uchar j){uchar i;for(i=0;i {*p = ReadByte();p++;}}/************************************************************ *Function:CRC校验*parameter:*Return:*Modify:*************************************************************/ uchar CRC (uchar j){uchar i,crc_data=0;for(i=0;i crc_data = CrcTable[crc_data^temp_buff[i]]; return (crc_data);}/************************************************************ *Function:读取温度*parameter:*Return:*Modify:*************************************************************/ void GemTemp (void){read_bytes (9);if (CRC(9)==0) //校验正确{Temperature = temp_buff[1]*0x100 + temp_buff[0];// Temperature *= 0.625;Temperature /= 16;TempDelay(1);}}/************************************************************ *Function:内部配置*parameter:*Return:*Modify:*************************************************************/ void Config18b20 (void) //重新配置报警限定值和分辨率{Init18b20();WriteByte(0xcc); //skip romWriteByte(0x4e); //write scratchpadWriteByte(0x19); //上限WriteByte(0x1a); //下限WriteByte(0x7f); //set 11 bit (0.125)Init18b20();WriteByte(0xcc); //skip romWriteByte(0x48); //保存设定值Init18b20();WriteByte(0xcc); //skip romWriteByte(0xb8); //回调设定值}/************************************************************ *Function:读18B20ID*parameter:*Return:*Modify:*************************************************************/ void ReadID (void)//读取器件 id{Init18b20();WriteByte(0x33); //read romread_bytes(8);}/************************************************************ *Function:18B20ID全处理*parameter:*Return:*Modify:*************************************************************/ void TemperatuerResult(void){p = id_buff;ReadID();Config18b20();Init18b20 ();WriteByte(0xcc); //skip romWriteByte(0x44); //Temperature convertInit18b20 ();WriteByte(0xcc); //skip romWriteByte(0xbe); //read Temperaturep = temp_buff;GemTemp();}/*急什么?急着买吗?还是要程序?我给你提供一段吧!也是网友写的。

数字温度传感器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所示。

温度传感器cc2530源码

温度传感器cc2530源码

/*温度传感器头文件(.h文件);*//*ds18b20程序。

本程序使用说明:在使用之前必须在相应的代码文件里全局位置加入一段代码:// #define FLOAT_MODE 1#if FLOAT_MODEunsigned char Temperature[8]; //小数模式需要8个字节;#define Temp_Len_ 7 //温度值字符串有效长度;#elseunsigned char Temperature[5]; //整数模式需要5个字节;#define Temp_Len_ 4 //温度值字符串有效长度;#endif加入此段代码后可以通过是否注释#defineFLOAT_MODE 1这句代码来选择是获取整数温度还是获取小数温度,注释后为获取整数温度。

获取温度的函数如下:TemperatureConver();不需要参数,结果以字符串的形式保存在Temperature[x]中,通过字符串操作方式操作该数组变量;该程序在cc2530采用外部晶振32MHZ时使用,如果频率不是32MHZ,会因为延时不正确导致时序问题,故在其他频率下使用需自行调试延时函数的函数体。

void ds18b20_delay_us(unsigned int x)*/#ifndef __DS18B20_H__#define __DS18B20_H__#include <ioCC2530.h>//引脚定义,即ds18b20的数据线;#define Ds18b20_Data P0_7 //根据实际更改;/*//////////////////////////////////////开启下列定义表示读取的温度精确到小数,注释后精度为整数;*/////////////////////////////////////////默认注释// #define FLOAT_MODE 1 //默认下不开启;<<<<<<-----------//自行更改;////////////////////////////////////////#if FLOAT_MODEextern unsigned char Temperature[8]; //小数模式需要8个字节;#define Temp_Len_ 7 //温度值字符串有效长度;#elseextern unsigned char Temperature[5]; //整数模式需要5个字节;#define Temp_Len_ 4 //温度值字符串有效长度;#endif//端口配置;#define INPUT_MODE P0DIR &= 0x7f#define OUTPUT_MODE P0DIR |= 0x80//32MHZ下,供温度传感器使用的us延时函数;void ds18b20_delay_us(unsigned int x);//ds18b20初始化函数;unsigned char DS18B20_Init(void); //读一个字节函数:unsigned char ReadByte(void);//写一个字节函数;void WriteByte(unsigned char Byte); //读取温度函数;unsigned int ReadTemperature(void); //温度转换函数;void TemperatureConver(void);#endif/*温度传感器源文件;*/#include "ds18b20.h"//#include "OnBoard.h"void ds18b20_delay_us(unsigned int x) {unsigned int i,j;for(i=0;i<x;i++){for(j=0;j<2;j++); }/*while(x--){asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP"); }*/}unsigned char DS18B20_Init(void){unsigned char IS_FINISH = 0; //若ds18b20复位成功,置1,默认为0;unsigned int Count = 0; //获取ds18b20复位成功与否时防止超时的变量;OUTPUT_MODE; //温度传感器IO口为输出模式;Ds18b20_Data = 1; //初始时确保ds18b20数据线为高;ds18b20_delay_us(100); //稍作延时;Ds18b20_Data = 0; //复位ds18b20;ds18b20_delay_us(600);//精确延时,必须满足480us~960us;Ds18b20_Data = 1; //在480us~960us后拉高数据线,ds18b20会在在15~60us产生脉冲;ds18b20_delay_us(40);//精确延时,15~60us后接收数据线上60~240us的存在脉冲;INPUT_MODE; //温度传感器IO口为输入模式;do{Count++;IS_FINISH = Ds18b20_Data; //读IO口状态;}while((IS_FINISH != 0) && (Count<400)); //大约3ms,这段时间等待响应;OUTPUT_MODE; //温度传感器IO口为输出模式;Ds18b20_Data = 1; //归还数据线;ds18b20_delay_us(100); //稍作延时;//如果读取的脉冲为0,说明初始化成功,否则失败;return IS_FINISH;}unsigned char ReadByte(void){unsigned char i,Byte = 0; //Byte为读取的字节;OUTPUT_MODE; //温度传感器IO口为输出模式;Ds18b20_Data = 1; //初始时确保ds18b20数据线为高;ds18b20_delay_us(100); //稍作延时;for(i=0;i<8;i++) //8位,读8次;{Byte >>= 1; //腾出一位用于存入下次的读取位值;Ds18b20_Data = 0; //ds18b20在拉低4us后沿拉高产生10us的读间隙;ds18b20_delay_us(4); //精确延时;Ds18b20_Data = 1; //拉高;ds18b20_delay_us(2); //稍作延时;if(Ds18b20_Data == 1) //判断数据位是否为高,若高,做运算,低则保留;{ Byte |= 0x80; } //最高位置1;ds18b20_delay_us(20); //稍作延时;}return Byte;}void WriteByte(unsigned char Byte){unsigned char i;OUTPUT_MODE; //温度传感器IO口为输出模式;Ds18b20_Data = 1; //初始时确保ds18b20数据线为高;ds18b20_delay_us(100); //稍作延时;for(i=0;i<8;i++){Ds18b20_Data = 0;//拉低数据线后的15us为写入位时间间隙;Ds18b20_Data = Byte & 0x01; //数据位写入,写入后的45us内ds18b20采样,完成写//入位工作;ds18b20_delay_us(40); //40us延时后保证采样成功;Ds18b20_Data = 1; //数据线重新置高;Byte >>= 1;//移出已经写入的位;}ds18b20_delay_us(10); //稍作延时;}/*读取温度的步骤:1.启动温度转换;(1.复位2.发Skip ROM命令,即0xcc3.发Convert T命令,即0x44);2.复位;3.发Skip ROM命令,即0xcc;4.读ds18b20寄存器命令,即0xbe;5.读两字节温度;(低字节高字节)6.温度格式转换;*/unsigned int ReadTemperature(void){unsigned int Temperature = 0, //最终的返回值,同时也用来存放高字节;low = 0; //低字节;DS18B20_Init(); //复位;WriteByte(0xcc); //skip ROM命令;WriteByte(0x44); //Conver T命令;ds18b20_delay_us(5); //稍作延时;DS18B20_Init(); //复位;WriteByte(0xcc); //skip ROM命令;WriteByte(0xbe); //读寄存器命令,前两个寄存器存放温度值;low = ReadByte(); //读取第一个寄存器,即低位温度值;Temperature = ReadByte(); //读取第二个寄存器,即高位温度值;Temperature <<= 8; //高字节移动到高8位,低8位用来放低字节;Temperature += low; //存入低字节;return Temperature;//返回读取值;}void TemperatureConver(void){#if FLOAT_MODEunsigned char TempH,TempL;unsigned int Temp;Temp = ReadTemperature(); //读取当前温度;if(Temp & 0x80000) //最高位为1时表示温度为负数;{Temperature[0] = '-'; //负号标志,表示温度为负数;Temp = ~Temp; //取反Temp += 1; //加1;//当读出数为负的时,必须做取反加1操作;}//ifelse { Temperature[0] = ' '; } //温度为正时,第一位置空;//整数部分;TempH = Temp >> 4; //将温度整数部分存放在TempH中,整数部分包括高字节的低4位//和低字节的高4位;//小数部分;TempL = (unsigned char)(Temp & 0x000f); //将温度小数部分存放在TempL中,小数部分由// 低字节的低4位决定;//小数近似处理,处理原理见下表://------------------------------------------------------------------------------///*二进制:1 1 1 1十进制:8 4 2 1小数:0.5 0.25 0.125 0.0625存在一个整数6,使得十进制数与小数点后的值的转换关系近似相等:8*6 = 48 偏差24*6 = 24 12*60 = 120 忽略1*600 = 600于是,若我们只需要小数点后两位,则只需要*6 即可,需要后一位的话*6/10;若还想提高精度,可加一个修正值,该值建议为:1或者2;*///--------------------------------------------------------------------------------// TempL = TempL * 6; //近似处理转换,两位小数;TempL += 1; //修正值;//百位温度值;if(TempH/100 == 0) { Temperature[1] = ' '; }else { Temperature[1] = TempH/100+'0'; }//十位温度值;if((TempH/100 == 0)&&((TempH%100)/10==0)){ Temperature[2] = ' '; }else { Temperature[2] = (TempH%100)/10+'0'; }//个位温度;Temperature[3] = (TempH%100)%10+'0';//小数点;Temperature[4] = '.';//小数部分;Temperature[5] = TempL/10 + '0';Temperature[6] = TempL%10 + '0';//字符串结束符;Temperature[7] = '\0';//_1ms(); //稍作延时;ds18b20_delay_us(5);#elseunsigned int Temp;Temp = ReadTemperature(); //读取当前温度;if(Temp & 0x80000) //最高位为1时表示温度为负数;{Temperature[0] = '-'; //负号标志,表示温度为负数;Temp = ~Temp; //取反Temp += 1; //加1;//当读出数为负的时,必须做取反加1操作;}//ifelse { Temperature[0] = ' '; } //温度为正时,第一位置空;//整数部分;Temp >>= 4; //将低4位移除,因为这4位为小数部分;//百位温度值;if(Temp/100 == 0) { Temperature[1] = ' '; }else { Temperature[1] = Temp/100+'0'; }//十位温度值;if((Temp/100 == 0)&&((Temp%100)/10==0)){ Temperature[2] = ' '; }else { Temperature[2] = (Temp%100)/10+'0'; }//个位温度;Temperature[3] = (Temp%100)%10+'0';//字符串结束符;Temperature[4] = '\0';//_1ms(); //稍作延时;ds18b20_delay_us(5);#endif}/*主函数所在文件,用做测试;*//*USART0发送温度程序测试。

C8051F040_内部温度传感器C程序

C8051F040_内部温度传感器C程序

附录一://内部温度传感器调试程序////利用过采样实现16位精度////ADC0_TEMP_PRO.c#include <C8051F040.h>#define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage#define STACK_LEN 128//采样128次,再将128个数据总和除以8//处理后的数据相当于16个原始数据之和,在数值表现形式上为16bittypedef unsigned int uint;typedef unsigned char uchar;typedef unsigned long ulong;sfr16 RCAP2=0xca;sfr16 RCAP3=0xca;sfr16 RCAP4=0xca;sfr16 TMR4=0xcc;sfr16 TMR3=0xcc;sfr16 TMR2=0xcc;sfr16 PCA0CP0=0xfb;sfr16 PCA0CP1=0xfd;sfr16 PCA0CP2=0xe9;sfr16 PCA0CP3=0xeb;sfr16 PCA0CP4=0xed;sfr16 PCA0CP5=0xe1;sfr16 ADC0VAL=0xbe;sfr16 ADC0GT=0xc4;sfr16 ADC0LT=0xc6;uchar temppage;bit isnewdata;uint kk;float temp;uchar stack_index;ulong total;xdata float t[20];//存放温度检测数据,为20个数据xdata uint mystack[STACK_LEN];//过采样数据数组void adc0_mux(uchar type,uchar source);void adc0_source(uchar source);void p3anolog_ini(uchar port);void HVDA_ini(uchar gaind);void adc0_ini();void delay1ms(uint time);void config();void adc0_mux(uchar type,uchar source){//type 配置测量方式为差动还是单端输入//source 为ADC0通道选择(共有9个通道)SFRPAGE=0x00;AMX0CF=type;AMX0SL=source;}void adc0_source(uchar source){//ADC0通道选择,为adc0_mux()的简化函数SFRPAGE=0x00;AMX0SL=source;}void p3anolog_ini(uchar port){//配置p3口模拟输入管脚SFRPAGE=0x00;AMX0PRT=port;SFRPAGE=0x0f;P3MDIN&=~port;//将相应管脚配置成模拟输入口}void HVDA_ini(uchar gaind){//高压差动放大器配置SFRPAGE=0x00;HV A0CN=gaind;}void adc0_ini(){SFRPAGE=0x00;ADC0CF=0x80;//ADC0时钟为系统时钟17分频,PGA增益为1ADC0CN=0x80;/*AD0EN=1,ADC0模块使能AD0TM=0,ADC0为连续跟踪模式AD0CM1:AD0CM0=00b,为AD0BUSY启动方式AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高四位*/REF0CN&=0x0f;//AD0VRS=0,ADC0参考电压为VREFAREF0CN|=0x07;//TEMPE=1,内部温度传感器工作/*BIASE=1,偏移产生器工作REFBE=1,内部参考电平工作,电路部分须将VREF参考输出(C8051F40的第12管脚)与VREF0(C8051F040的16管脚相连,并最好并联一个4.7uF和0.1uF的旁路电容以电平滤波*/adc0_source(9);//选择第9通道,即选择温度信号为AD转换EIE2 |= 0x02; //开ADC0中断}void delay1ms(uint time){//延迟1msuint i;uint j;for (i=0;i<time;i++){for(j=0;j<300;j++);}}void config(){//crossbar 使能,但并没有进行外围设备配置WDTCN = 0x07; // Watchdog Timer Control RegisterWDTCN = 0xDE; // Disable WDTWDTCN = 0xAD;SFRPAGE = 0x0F;XBR0 = 0x00; // XBAR0: Initial Reset ValueXBR1 = 0x00; // XBAR1: Initial Reset ValueXBR2 = 0x40; // crossbar使能与否并不影响此程序运行XBR3 = 0x00; // XBAR3: Initial Reset ValueSFRPAGE = 0x0F;P0MDOUT = 0x00; // Output configuration for P0P1MDOUT = 0x00; // Output configuration for P1P2MDOUT = 0x00; // Output configuration for P2P3MDOUT = 0x00; // Output configuration for P3P4MDOUT = 0x00; // Output configuration for P4P5MDOUT = 0x00; // Output configuration for P5P6MDOUT = 0x00; // Output configuration for P6P7MDOUT = 0x00; // Output configuration for P7P1MDIN = 0xFF; // Input configuration for P1P2MDIN = 0xFF; // Input configuration for P2P3MDIN = 0xFF; // Input configuration for P3SFRPAGE = 0x0F;CLKSEL = 0x00; // Oscillator Clock SelectorOSCXCN = 0x00; // EXTERNAL Oscillator Control Register OSCICN = 0x84; // Internal Oscillator Control Register}void main(){char i;config();adc0_ini();//ADC0初始化ADC0START;//ADC0启动EA=1;i=0;stack_index=0;while(1){if(isnewdata){//由该位查询ADC0转化值是否更新if(stack_index==STACK_LEN)for(i=0,total=0;i<STACK_LEN;i++)total+=stack[i];total/=8;//此时total的值即为16bit精度采样值temp=(float)total/65536.0;temp*=2.43;temp-=0.776;temp/=0.00286;//将测量值转化成真实温度值isnewdata=0;t[i]=temp;//将温度检测值存入长度为20的数组中i++;if(i>19)i=0;//在此设断点,观察程序运行结果delay1ms(100);ADC0START;}}}void ADC0_ISR() interrupt 15{//ADC0中断SFRPAGE=0x00;AD0INT=0;isnewdata=1;if(stack_index>=STACK_LEN)//STACK_LEN需小于等于256,否则stack_index要定义成uint型数据stack_index=0;stack[stack_index]=ADC0V AL;stack_index++;}。

单片机控制的温度传感器C语言程序

单片机控制的温度传感器C语言程序

#include 〈at89x52.h>#define DO P3_7#define SEG P0 //数码管自左至右依次为1234位#define MS2L 0x18 //1ms的延时参数#define MS2H 0xfc#define uchar unsigned char#define uint unsigned intuchar code comm[4] = {0x01,0x02,0x04,0x08};uchar code seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code seg_add_dicimal[10]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};uchar code seg_dicimal[2]={0xc0, 0x92};uchar k = 0;uchar temp_l = 0;uchar temp_h = 0;uchar tempsign = 0;uchar hundreds = 0;uchar tens = 0;uchar ones = 0;uchar low_four = 0;/*延时以ms为单位的t时间*/void Delay(uint t){uint i;while(t--){for(i=0;i<125; i++){}}}/*us级延时,延时时间约4+2*i*/void Delayus(uchar i){while(——i);}/*产生复位脉冲,等待应答信号*/void Resetpaulse(){DO = 0; //拉低约600usDelayus(150);Delayus(150);DO = 1;//产生上升沿,延时约15~60usDelayus(30);while(~DO);//等待应答信号}/*读取数据一位*/bit Readbit(){uint i = 0;bit b = 0;DO = 0;//产生读时隙i++;//维持低电平至少1usDO = 1;//1us以上后拉高Delayus(2); //延时8us,DO下降沿15内ds18b20输出的数据才有效b = DO;//读取数据Delayus(40); //每个读时隙至少持续60usreturn(b);}/*读取一个字节*/uchar Readbyte(){uchar byte_read = 0;uchar i, j;for(i=0;i<8; i++){j = Readbit();byte_read = (j〈<i)| byte_read; //低位读起}return(byte_read);}/*写一个字节*/void Writebyte(uchar byte_to_write){uchar i = 0;uchar j = 0;bit write_bit = 0;for(j=0; j<8; j++){write_bit = (byte_to_write &0x01);if(write_bit == 1)//写1{DO = 0; //产生写时隙Delayus(3); //延时15usDO = 1; //写1Delayus(40); //延时,写时隙不得低于60us}else{DO = 0;//产生写时隙Delayus(50);//延时,保持低约60us~120usDO = 1;i++;}byte_to_write = byte_to_write >〉1;}}/*配置ds18b20,9位分辨率*/void Configurate(){EA = 0;Resetpaulse();//发出复位脉冲,每次操作都从复位开始Delay(1);Writebyte(0xcc); //skip room命令Writebyte(0x4e);Writebyte(0x7f);Writebyte(0x80);Writebyte(0x1f);EA = 1;}/*启动温度转换*/void StartConvert(){Resetpaulse(); // 发出复位脉冲,每次操作都从复位开始Delay(1);EA = 0;Writebyte(0xcc);//skip room命令Writebyte(0x44);//启动温度转换命令EA = 1;}/*读取温度值*/void ReadTempreture(){EA = 0;Resetpaulse();// 发出复位脉冲,每次操作都从复位开始Delay(1);Writebyte(0xcc);//skip room命令Writebyte(0xbe);//读取暂存器命令temp_l = Readbyte(); //存储温度低字节值(整数部分低四位和小数部分)temp_h = Readbyte(); //存储温度高字节值(其中高五位为符号位)EA = 1;}/*数据转换*/void DigitalConvert(){uchar total = 0;tempsign = (temp_h 〉> 7)& 0x01;//得出符号位if(tempsign == 0)//正数的处理方法{total = ((temp_h << 4)&0xf0)|((temp_l >〉4)&0x0f);//取整数位low_four = (temp_l>〉3)&0x01;//取小数位,9位分辨率,低字节第3位为小数位,只有0、1两种取值hundreds = total / 100;//计算百、十、个位tens = (total%100)/10;ones = (total%100)%10;}else //负数处理求负数补码规则是,按位取反,得到反码,加1即得补码(符号位不变){tempsign = 1;total = ((temp_l 〉〉4)& 0x0f);//取整数部分低4位total |= ((temp_h <〈4)& 0xf0);//整数部分高三位和符号位low_four = (temp_l 〉> 3) &0x01;//取小数位if(low_four == 0)//这里total位uchar型变量,所以根据最低位来确定整数取补规则total = ~total + 1;//最低位为0的时候,取反加1后有进位,所以这里total要取反加1elsetotal = ~total;//最低位为1的时候,取反加1没有进位,所以total直接取反即可tens = (total%100)/10;ones = (total%100)%10;}}/*中断处理*/void Display()interrupt 1{EA = 0;TL0 = MS2L;TH0 = MS2H;DigitalConvert();//数据转换if(tempsign == 0) //正数{if(k == 0){if(hundreds == 0) //高位0消隐{P1 = 0;}else{P1 = comm[k];SEG = seg[hundreds];}}else if(k == 1){if(tens == 0 && hundreds == 0)//高位0消隐{P1 = 0;}else{P1 = comm[k];SEG = seg[tens];}}else if(k == 2)//显示个位,因为个位有小数点,所以又定义了一个数组分开来显示{P1 = comm[k];SEG = seg_add_dicimal[ones]; //要加上小数点}else //显示小数,0或5{P1 = comm[k];SEG = seg_dicimal[low_four];}}else if(tempsign == 1) //负数{if(k == 0) //显示符号位{P1 = comm[k];SEG = 0xbf;}else if(k == 1){if(tens == 0){P1 = 0;}else{P1 = comm[k];SEG = seg[tens];}}else if(k == 2)//显示个位,因为各位有小数点,所以分开来显示{P1 = comm[k];SEG = seg_add_dicimal[ones]; //要加上小数点}else //显示小数,0或5{P1 = comm[k];SEG = seg_dicimal[low_four];}}k++;if(k == 4)k = 0;EA = 1;}/*主函数部分*/void main(){TMOD = 0x01;TL0 = MS2L;TH0 = MS2H;TF0 = 0;EA = 1;ET0 = 1;TR0 = 1;Configurate();do{Delay(1);StartConvert();Delay(100);ReadTempreture();}while(1);}。

温度传感器 程序

温度传感器  程序

第4章系统程序的设计4.1 系统设计内容系统程序主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序、测量序列号子程序、显示数据刷新子程序等。

4.1.1主程序主程序主要功能是负责温度的实时显示、读出处理DS18B20的测量温度值。

主程序流程图如图4-1所示:开始初始化调用显示子程序读取并显示序列号显示当前四路温度图4-1 主程序流程图4.1.2读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节。

在读出时须进行CRC 校验,校验有错时不进行温度数据的改写。

读出温度子程序流程图如图4-2所示:图4-2 读出温度子程序流程图4.1.3 温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时,转换时间约为750ms 。

在本程序设计中,采用1s 显示程序延时法等待转换的完成。

温度转换命令子程序流程图如图4-3所示:图4-3 温度转换命令子程序流程图 4.1.4计算温度子程序计算温度子程序将RAM 中读取值进行BCD 码的转换运算,并进行温度值正负的判定。

计算温度子程序流程图如图4-4所示: 发DS18B20复位命发跳过ROM 命令发温度转换开始命令结束 开始复位DS18B20 发跳过ROM 命令 发出温度转换命转换完毕 复位DS18B20 发匹配ROM 命令发1个DS18B20序列读温度值存入储存器 指向下一个延时N Y图4-4 计算温度子程序流程图4.1.5 温度数据的计算处理方法从DS18B20读取出的二进制值必须转换成十进制值,才能用于字符的显示。

DS18B20的转换精度为9~12位,为了提高精度采用12位。

在采用12位转换精度时,温度寄存器里的值是以0.0625为步进的,即温度值为寄存器里的二进制值乘以0.0625,就是实际的十进制温度值。

通过观察表4-1可以发现,一个十进制与二进制间有很明显的关系,就是把二进制的高字节的低半字节和低字节的高半字节组成一字节,这个字节的二进制化为十进制后,就是温度值的百、十、个位字节,所以二进制值范围是0~F ,转换成十进制小数就是0.0625的倍数(0~15倍)。

温度传感器程序流程图

温度传感器程序流程图
据 循环显示各通道 扫描键盘 单通道显示
8 路数据采样子程序
开始 置通道数 置存储区首地址 调 16 次采集取平均
存数据 指向下一个通道 指向下一个存储单元
8 路通道采集完 结束
控制程序流程图
开始 采集数据
循环显示方式
扫描按键
有键按下吗
是 1 键按下吗 是 2 键按下吗 是 3 键按下吗 是 4 键按下吗 是 5 键按下吗 是 6 键按下吗 是 7 键按下吗 是 8 键按下吗
结束
退出
调 1 通道数据显示 调 2 通道数据显示 调 3 通道数据显示 调 4 通道数据显示 调 5 通道数据显示 调 6 通道数据显示 调 7 通道数据显示 调 8 通道数据显示
运算子程序流程图
开始 取要运算的数 先做减法,减去 07FFH 调乘法子程序,乘 125 采用移位法,除 256 二进制转 BCD 码

(完整版)读取DS18B20温度传感器的64位ID号方法及程序

(完整版)读取DS18B20温度传感器的64位ID号方法及程序

#include <reg52.h>#define uchar unsigned char#define uint unsigned int/********************************************************************/ sbit DQ = P2^2; //温度传感器信号线sbit rs = P3^5; //LCD数据/命令选择端(H/L)位声明sbit lcden = P3^4; //LCD使能信号端位声明/********************************************************************/ //uint temp; //定义整型的温度数据//float f_temp; //定义浮点型的温度数据//uint warn_11 = 270; //定义温度设定值,是温度值乘以10后的结果//uint warn_12 = 250; //定义温度下限值//uint warn_h1 = 300; //定义温度上限值/********************************************************************/ void delay(uint z); //延时函数void DS18B20_Reset(void); //DQ18B20复位,初始化函数bit DS18B20_Readbit(void); //读1位数据函数uchar DS18B20_ReadByte(void); //读1个字节数据函数void DS18B20_WriteByte(uchar dat); //向DQ18B20写一个字节数据函数void LCD_WriteCom(uchar com); //1602液晶命令写入函数void LCD_WriteData(uchar dat); //1602液晶数据写入函数void LCD_Init(); //LCD初始化函数void Display18B20Rom(char Rom); //显示18B20序列号函数/**********************************************//* 主函数 *//**********************************************/void main(){ uchar a,b,c,d,e,f,g,h;LCD_Init();DS18B20_Reset();delay(1);DS18B20_WriteByte(0x33);delay(1);a = DS18B20_ReadByte();b = DS18B20_ReadByte();c = DS18B20_ReadByte();d = DS18B20_ReadByte();e = DS18B20_ReadByte();f = DS18B20_ReadByte();g = DS18B20_ReadByte();h = DS18B20_ReadByte();LCD_WriteCom(0x80+0x40);Display18B20Rom(h);Display18B20Rom(g);Display18B20Rom(f);Display18B20Rom(e);Display18B20Rom(d);Display18B20Rom(c);Display18B20Rom(b);Display18B20Rom(a);while(1);}/***************************************************//* 延时函数:void delay() *//* 功能:延时函数 *//***************************************************/void delay(uint z)//延时函数{uint x,y;for( x = z; x > 0; x-- )for( y = 110; y > 0; y-- );}/***************************************************//* DS18B20函数:void DS18B20_Reset() *//* 功能:复位18B20 */ /***************************************************/void DS18B20_Reset(void)//DQ18B20复位,初始化函数{uint i;DQ = 0;i = 103;while( i > 0 ) i--;DQ = 1;i = 4;while( i > 0 ) i--;}/***************************************************//* DS18B20函数:void DS18B20_Readbit() *//* 功能:读1个字节数据函数 *//***************************************************/bit DS18B20_Readbit(void) //读1位数据函数{uint i;bit dat;DQ = 0;i++; //i++起延时作用DQ = 1;i++;i++;dat = DQ;i = 8;while( i > 0 )i--;return( dat );}/***************************************************//* DS18B20函数:void DS18B20_ReadByte() *//* 功能:读1个字节数据函数 */ /***************************************************/uchar DS18B20_ReadByte(void) //读1个字节数据函数{uchar i,j,dat;dat = 0;for( i = 1; i <= 8; i++ ){j = DS18B20_Readbit();dat = ( j << 7 ) | ( dat >> 1 );}return(dat);}/***************************************************//* DS18B20函数:void DS18B20_WriteByte() *//* 功能:向DQ18B20写一个字节数据函数 *//***************************************************/void DS18B20_WriteByte(uchar dat) //向DQ18B20写一个字节数据函数{uint i;uchar j;bit testb;for( j=1; j<=8; j++){testb = dat&0x01;dat= dat>>1;if(testb) //写1{DQ = 0;i++;i++;DQ = 1;i = 8;while(i>0)i--;}else{DQ = 0; //写0i = 8;while(i>0)i--;DQ = 1;i++;i++;}}}/***********************************************//* LCD函数:void LCD_WriteCom() *//* 功能:向LCD写入命令 *//***********************************************/void LCD_WriteCom(uchar com){rs = 0;P0 = com;delay(5);lcden = 0;delay(5);lcden = 1;delay(5);lcden = 0;}/***********************************************//* LCD函数:void LCD_WriteData(uchar dat) *//* 功能:向LCD写入数据 *//***********************************************/void LCD_WriteData(uchar dat){rs = 1; //选择LCD为写入数据状态lcden = 0;P0 = dat; //将待写入数据放到总线上delay(5);lcden = 1; //给LCD使能端一个脉冲delay(5); //信号将之前放到总线上lcden = 0; //的数据写入LCDdelay(5);}/***********************************************//* LCD函数:void LCD_Init() */ /* 功能:初始化LCD,设定LCD的初始状态 *//***********************************************/void LCD_Init(){LCD_WriteCom(0x38); //LCD显示模式设定delay(15);LCD_WriteCom(0x08); //关闭LCD显示delay(3);LCD_WriteCom(0x01); //LCD显示清屏delay(3);LCD_WriteCom(0x06); //设定光标地址指针为自动加1delay(3);LCD_WriteCom(0x0c); //打开LCD显示,但不显示光标}/**********************************************//* */ /* 显示18B20序列号 *//* *//**********************************************/void Display18B20Rom(char Rom){uchar h,l;l = Rom & 0x0f; //取低4位h = Rom & 0xf0; //取高4位h >>= 4;if( ( h >= 0x00 )&&( h <= 0x09 ) )LCD_WriteData(h+0x30); //取ASCII码elseLCD_WriteData(h+0x37); //取ASCII码if( ( l >= 0x00 )&&( l <= 0x09 ) )LCD_WriteData(l+0x30); //取ASCII码elseLCD_WriteData(l+0x37); //取ASCII码}。

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