DS18B20温度计C程序

合集下载

ds18b20温度传感C语言程序、LCD1602显示

ds18b20温度传感C语言程序、LCD1602显示

程序主体#include<reg52.h>#define uchar unsigned char#define uint unsigned intextern TemperatuerResult(); //声明引用外部函数extern unsigned int idata Temperature;sbit lcd_e=P2^7;sbit lcd_rs=P2^6;sbit lcd_rw=P2^5;void delay_ms(uchar i) //延时毫秒{int j;for(i;i>0;i--)for(j=110;j>0;j--);}bit lcd_check() //检测忙{bit result;lcd_rs=0;lcd_rw=1;lcd_e=1;delay_ms(1);result=(bit)(P0&0x80);lcd_e=0;return (result);}void write_cmd(uchar cmd) //向lcd写命令{while(lcd_check());lcd_rs=0;delay_ms(1);lcd_rw=0;delay_ms(1);P0=cmd;delay_ms(1);lcd_e=1;delay_ms(1);lcd_e=0;}void write_data(uchar shuju) //向lcd写数据{while(lcd_check());lcd_rs=1;delay_ms(1);lcd_rw=0;delay_ms(1);P0=shuju;delay_ms(1);lcd_e=1;delay_ms(1);lcd_e=0;}void lcd_init() //初始化{delay_ms(15);write_cmd(0x38);delay_ms(5);write_cmd(0x0c);delay_ms(5);write_cmd(0x06);delay_ms(5);write_cmd(0x01);}void display(uchar i,uchar j,uchar shuju) //在指定位置显示{write_cmd(0x80+j*0x40+i);delay_ms(1);write_data(shuju);delay_ms(1);}void main(){lcd_init();while(1){TemperatuerResult();display(0,0,'T');display(1,0,'e');display(2,0,'m');display(3,0,'p');display(4,0,'e');display(5,0,'r');display(6,0,'a');display(7,0,'t');display(8,0,'u');display(9,0,'r');display(10,0,'e');display(11,0,' ');display(12,0,'i');display(13,0,'s');display(0,1,(Temperature/16%10000/1000+0x30));display(1,1,(Temperature/16%1000/100+0x30));display(2,1,(Temperature/16%100/10+0x30));display(3,1,(Temperature/16%10+0x30));display(4,1,'.');display(5,1,(Temperature*10/16%10+0x30));display(6,1,'`');display(7,1,'C');}}温度采集子程序/*************************此部分为18B20的驱动程序*************************************/#include <reg52.H>#include <intrins.h>sbit D18B20=P3^7;#define NOP() _nop_() /* 定义空指令*/#define _Nop() _nop_() /*定义空指令*/bit flag;unsigned int idata Temperature;unsigned char idata temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID 为8字节unsigned char idata id_buff[8];unsigned char idata *p,TIM;unsigned char idata crc_data;//************************************************************void TempDelay (unsigned char idata us){while(us--);}//************************************************************void Init18b20 (void){D18B20=1;_nop_();D18B20=0;TempDelay(80); //delay 530 uS//80_nop_();D18B20=1;TempDelay(14); //delay 100 uS//14_nop_();_nop_();_nop_();if(D18B20==0)flag = 1; //detect 1820 success!elseflag = 0; //detect 1820 fail!TempDelay(20); //20_nop_();_nop_();D18B20 = 1;}//************************************************************ void WriteByte (unsigned char idata wr) //单字节写入{unsigned char idata i;for (i=0;i<8;i++){D18B20 = 0;_nop_();D18B20=wr&0x01;TempDelay(3); //delay 45 uS //5_nop_();_nop_();D18B20=1;wr >>= 1;}}//************************************************************ unsigned char ReadByte (void) //读取单字节{unsigned char idata i,u=0;for(i=0;i<8;i++){D18B20 = 0;u >>= 1;D18B20 = 1;if(D18B20==1)u |= 0x80;TempDelay (2);_nop_();}return(u);}//************************************************************ void read_bytes (unsigned char j){unsigned char idata i;for(i=0;i<j;i++){*p = ReadByte();p++;}}//************************************************************ void TemperatuerResult(void){Init18b20 ();WriteByte(0xcc); //skip romWriteByte(0x44); //Temperature convertInit18b20 ();WriteByte(0xcc); //skip romWriteByte(0xbe); //read Temperaturep = temp_buff;read_bytes (2);Temperature = temp_buff[1]*0x100 + temp_buff[0];TempDelay(1);}。

温度测量、报警系统 C程序

温度测量、报警系统  C程序

程序名称:DS18B20温度测量、报警系统简要说明:DS18B20温度计,温度测量范围0~99.9摄氏度可设置上限报警温度、下限报警温度即高于上限值或者低于下限值时蜂鸣器报警默认上限报警温度为38℃、默认下限报警温度为5℃报警值可设置范围:最低上限报警值等于当前下限报警值最高下限报警值等于当前上限报警值将下限报警值调为0时为关闭下限报警功能编写:最后更新:09/04/16晚于寝室******************************************************************/ #include <AT89X52.h>#include "DS18B20.h"#define uint unsigned int#define uchar unsigned char //宏定义#define SET P3_1 //定义调整键#define DEC P3_2 //定义减少键#define ADD P3_3 //定义增加键#define BEEP P3_7 //定义蜂鸣器bit shanshuo_st; //闪烁间隔标志bit beep_st; //蜂鸣器间隔标志sbit DIAN = P2^7; //小数点uchar x=0; //计数器signed char m; //温度值全局变量uchar n; //温度值全局变量uchar set_st=0; //状态标志signed char shangxian=38; //上限报警温度,默认值为38signed char xiaxian=5; //下限报警温度,默认值为38ucharcode LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x ff};/*****延时子程序*****/void Delay(uint num){while( --num );}/*****初始化定时器0*****/void InitTimer(void){TMOD=0x1;TH0=0x3c;TL0=0xb0; //50ms(晶振12M)}/*****定时器0中断服务程序*****/void timer0(void) interrupt 1{TH0=0x3c;TL0=0xb0;x++;}/*****外部中断0服务程序*****/void int0(void) interrupt 0{EX0=0; //关外部中断0if(DEC==0&&set_st==1){shangxian--;if(shangxian<xiaxian)shangxian=xiaxian; }else if(DEC==0&&set_st==2){xiaxian--;if(xiaxian<0)xiaxian=0;}}/*****外部中断1服务程序*****/void int1(void) interrupt 2{EX1=0; //关外部中断1if(ADD==0&&set_st==1){shangxian++;if(shangxian>99)shangxian=99;}else if(ADD==0&&set_st==2){xiaxian++;if(xiaxian>shangxian)xiaxian=shangxian; }}/*****读取温度*****/void check_wendu(void){uint a,b,c;c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差 a=c/100; //计算得到十位数字b=c/10-a*10; //计算得到个位数字m=c/10; //计算得到整数位n=c-a*100-b*10; //计算得到小数位if(m<0){m=0;n=0;} //设置温度显示上限if(m>99){m=99;n=9;} //设置温度显示上限}/*****显示开机初始化等待画面*****/Disp_init(){P2 = 0xbf; //显示-P1 = 0xf7;Delay(200);P1 = 0xfb;Delay(200);P1 = 0xfd;Delay(200);P1 = 0xfe;Delay(200);P1 = 0xff; //关闭显示}/*****显示温度子程序*****/Disp_Temperature() //显示温度{P2 =0xc6; //显示CP1 = 0xf7;Delay(300);P2 =LEDData[n]; //显示个位P1 = 0xfb;Delay(300);P2 =LEDData[m%10]; //显示十位DIAN = 0; //显示小数点P1 = 0xfd;Delay(300);P2 =LEDData[m/10]; //显示百位P1 = 0xfe;Delay(300);P1 = 0xff; //关闭显示}/*****显示报警温度子程序*****/Disp_alarm(uchar baojing){P2 =0xc6; //显示CP1 = 0xf7;Delay(200);P2 =LEDData[baojing%10]; //显示十位P1 = 0xfb;Delay(200);P2 =LEDData[baojing/10]; //显示百位P1 = 0xfd;Delay(200);if(set_st==1)P2 =0x89;else if(set_st==2)P2 =0xc7; //上限H、下限L标示P1 = 0xfe;Delay(200);P1 = 0xff; //关闭显示}/*****报警子程序*****/void Alarm(){if(x>=10){beep_st=~beep_st;x=0;}if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=0; else BEEP=1;}/*****主函数*****/void main(void){uint z;InitTimer(); //初始化定时器EA=1; //全局中断开关TR0=1;ET0=1; //开启定时器0IT0=1;IT1=1;check_wendu();check_wendu();for(z=0;z<300;z++){Disp_init();}while(1){if(SET==0){Delay(2000);do{}while(SET==0);set_st++;x=0;shanshuo_st=1;if(set_st>2)set_st=0;}if(set_st==0){EX0=0; //关闭外部中断0EX1=0; //关闭外部中断1check_wendu();Disp_Temperature();Alarm(); //报警检测}else if(set_st==1){BEEP=1; //关闭蜂鸣器EX0=1; //开启外部中断0EX1=1; //开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(shangxian);} }else if(set_st==2){BEEP=1; //关闭蜂鸣器EX0=1; //开启外部中断0EX1=1; //开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(xiaxian);} }}}/*****END*****/DS18B20.h:#include <AT89X52.h>#define DQ P3_6 //定义DS18B20总线I/O/*****延时子程序*****/void Delay_DS18B20(int num){while(num--) ;}/*****初始化DS18B20*****/void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位Delay_DS18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低Delay_DS18B20(80); //精确延时,大于480usDQ = 1; //拉高总线Delay_DS18B20(14);x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败Delay_DS18B20(20);}/*****读一个字节*****/unsigned char 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_DS18B20(4);}return(dat);}/*****写一个字节*****/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;Delay_DS18B20(5);DQ = 1;dat>>=1;}}/*****读取温度*****/unsigned int ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器a=ReadOneChar(); //读低8位b=ReadOneChar(); //读高8位t=b;t<<=8;t=t|a;tt=t*0.0625;t= tt*10+0.5; //放大10倍输出并四舍五入 return(t);}/*****END*****/。

DS18B20 c语言程序

DS18B20 c语言程序
从DS18B20读1字节数据
**************************************/
BYTE DS18B20_ReadByte()
{
BYTE i;
BYTE dat = 0;
for (i=0; i<8; i++) //8位计数器
{
dat >>= 1;
DQ = 0; //开始时间片
DelayXus(1); //延时等待
DQ = 1; //准备接收
}
/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(BYTE dat)
{
char i;
for (i=0; i<8; i++) //8位计数器
**************************************/
void DelayXus(BYTE n)
{
while (n--)
{
_nop_();
_nop_();
}
}
/**************************************
void main()
{
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0x44); //开始转换命令
while (!DQ); //等待转换完成

18B20温度C语言程序

18B20温度C语言程序

#include "reg52.h"# include<absacc.h>#include <intrins.h>#define delay_3us _nop_();_nop_();_nop_() //延时3us宏定义sbit DQ=P1^2; //ds18b20的数据端口sbit DE=P3^3; //灯L2sbit DF=P2^2; //K0sbit DM=P2^3; //K1sbit DN=P3^5; //灯L3# define PORTA XBYTE[0X7CFF]# define PORTB XBYTE[0X7DFF]# define PORTC XBYTE[0X7EFF]# define CONTROL XBYTE[0X7FFF]# define uchar unsigned char# define uint unsigned intsbit K0=P2^2;sbit K1=P2^3;sbit K2=P2^4;sbit K3=P2^5;uchar count=0;uchar idata temp[6]; //保存转换后的温度值uchar id[2][8];uchar code table[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x080,0x00};//0-9,'.'消影uchar idata tm;bit flag=0;bit init_ds18b20(void){uchar j;DQ=1; //总线初始状态DQ=0; //启动总线j=250;while(--j); //延时500us ,初始化信号DQ=1; //释放总线,之后检测存在信号j=40;while(--j); //延时80usj=110; //检测低电平(存在信号),如220us 时间里检测不到则初始化失败返回0while(DQ!=0) //初始化失败{j--; //调整检测时间if(!j) //检测时间到return 0; //失败返回0}j=250; //延时500us,满足初始化时序while(--j);return 1; //返回1}bit rdbit_ds18b20(void){uchar j; //定义延时变量bit b; //返回变量暂存DQ=1;_nop_();DQ=0; //启动总线delay_3us;DQ=1; //释放总线delay_3us;delay_3us;delay_3us;if(DQ) //延时9US后采样b=1;elseb=0;j=30;while(--j); //延时满足时序return b; //返回采样值}uchar rdbyte_ds18b20(void){uchar i,dat;for(dat=0,i=0;i<8;i++){dat>>=1; //右移一位if(rdbit_ds18b20()) //如果读取的为1dat|=0x80; //则置位最高位}return dat; //返回接收数据}void wtbyte_ds18b20(uchar wdat){uchar i,j;for (i=0;i<8;i++){if(wdat&0x01) //如果最低位为1{ //则输出1DQ=1;_nop_();DQ=0; //启动总线delay_3us;DQ=1; //写1j=30;while(--j); //等待60us满足写时序}else //如果最低位为0{DQ=1;_nop_();DQ=0; //启动总线j=35;while(--j); //保持70us低电平,写0 满足时序要求DQ=1; //释放总线}wdat>>=1; //wdat右移一位,等待接收下一位}}void convter_t(uchar uct_l,uchar uct_h){uchar tm_dot; //存放小数部分tm_dot=(uct_l>>2)&0x03; //四位二进制小数部分只保留高两位uct_h=(uct_h<<4)&0xf0; //将高位数据左移到最高四位tm=uct_h|((uct_l>>4)&0x0f);//底四位右移到低四位,同高四位合并成一个字节temp[0]=tm/100; //tm除100取整数部分;得百位数据temp[1]=(tm-temp[0]*100)/10; //tm取十位一下数据除10取整数部分;得十位数据temp[2]=tm%10; //tm对10取余的个位数据temp[3]=10; //小数点位赋值10。

单片机中使用DS18B20温度传感器C语言程序文件

单片机中使用DS18B20温度传感器C语言程序文件

单片机中使用DS18B20温度传感器C语言程序(参考1)/********************************************************************************DS18B20 测温程序硬件:AT89S52(1)单线ds18b20接P2.2(2)七段数码管接P0口(3)使用外部电源给ds18b20供电,没有使用寄生电源软件:Kei uVision 3**********************************************************************************/ #include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){while(us--);}void delay(uint count) //延时子函数{uint i;while(count){i=200;while(i>0)i--;count--;}}/*串口初始化,波特率9600,方式1 */void init_com(){TMOD=0x20; //设置定时器1为模式2 TH1=0xfd; //装初值设定波特率TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示*/void display(uint temp){uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存P0=0xfe;wela=1;wela=0;delay(1); //延时约2ms P0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1);}/*****************************************时序:初始化时序、读时序、写时序。

单片机DS18B20温度传感器C语言程序含CRC校验

单片机DS18B20温度传感器C语言程序含CRC校验

单片机DS18B20温度传感器C语言程序含CRC校验单片机中使用DS18B20温度传感器C语言程序(参考1)/***************************************************** ***************************DS18B20 测温程序硬件:AT89S52(1)单线ds18b20接P2.2(2)七段数码管接P0口(3)使用外部电源给ds18b20供电,没有使用寄生电源软件:Kei uVision 3***************************************************** *****************************/#include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){ while(us--); }void delay(uint count) //延时子函数{ uint i;while(count){ i=200;while(i>0)i--;count--; } }/*串口初始化,波特率9600,方式1 */void init_com(){ TMOD=0x20; //设置定时器1为模式2 TH1=0xfd; //装初值设定波特率TL1=0xfd;TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示*/void display(uint temp){ uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存wela=0;P0=0xfe;wela=1;wela=0;delay(1); //延时约2msP0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1); }/*****************************************时序:初始化时序、读时序、写时序。

DS18B20的C语言程序

DS18B20的C语言程序
{
uchar i;
for(i = 0;i < 6;i++) dN[i] = 0; //初始化显示变量
//数值转换
if(temper & BIT0)
{
dN[0] = 5;
dN[1] = 2;
dN[2] = 6;
_DINT();
for(i = 0; i < 8;i++)
{
DQ0;
DelayNus(6); //延时6us
if(wdata & 0X01) DQ1;
else DQ0;
函数名称:Read_SP
功 能:发送读ScratchPad命令
参 数:无
返回值 :无
********************************************/
void Read_SP(void)
{
Write_18B20(0xbe);
}
/*******************************************
}
}
函数名称:Write_18B20
功 能:向DS18B20写入一个字节的数据
参 数:wdata--写入的数据
返回值 :无
********************************************/
void Write_18B20(uchar wdata)
{
uchar i;
uint Do1Convert(void)
{
uchar i;
do
{
i = Init_18B20();

ds18b20的C语言完整程序(c51)

ds18b20的C语言完整程序(c51)

ds18b20的C语言完整程序(c51)(可组网数字式温度传感器)发布日期:[2005-05-10]作者:(sparkstar)//DS1820 C51 子程序//这里以11.0592M晶体为例,不同的晶体速度可能需要调整延时的时间//sbit DQ =P2^1;//根据实际情况定义端口typedef unsigned char byte;typedef unsigned int word;//延时void delay(word useconds){for(;useconds>0;useconds--);}//复位byte ow_reset(void){byte presence;DQ = 0; //pull DQ line lowdelay(29); // leave it low for 480usDQ = 1; // allow line to return highdelay(3); // wait for presencepresence = DQ; // get presence signaldelay(25); // wait for end of timeslotreturn(presence); // presence signal returned} // 0=presence, 1 = no part//从 1-wire 总线上读取一个字节byte read_byte(void){byte i;byte value = 0;for (i=8;i>0;i--){value>>=1;DQ = 0; // pull DQ low to start timeslotDQ = 1; // then return highdelay(1); //for (i=0; i<3; i++);if(DQ)value|=0x80;delay(6); // wait for rest of timeslot}return(value);}//向 1-WIRE 总线上写一个字节void write_byte(char val){byte i;for (i=8; i>0; i--) // writes byte, one bit at a time {DQ = 0; // pull DQ low to start timeslotDQ = val&0x01;delay(5); // hold value for remainder of timeslotDQ = 1;val=val/2;}delay(5);}//读取温度char Read_Temperature(void){union{byte c[2];int x;}temp;ow_reset();write_byte(0xCC); // Skip ROMwrite_byte(0xBE); // Read Scratch Padtemp.c[1]=read_byte();temp.c[0]=read_byte();ow_reset();write_byte(0xCC); //Skip ROMwrite_byte(0x44); // Start Conversionreturn temp.x/2;}。

DS18B20数字温度测量芯片C源程序

DS18B20数字温度测量芯片C源程序

//18B20单线温度检测的应用样例程序//用三个数码管显示,P2.0,P2.1,P2.2接三个位码,P2接段码,P1.7接18B20的DQ//This program comes from the MCU开发板,it can`t show the minus temperature on the leds#include#include#include#define uchar unsigned char#define uint unsigned int;/********************************************************************** *******/sbit seg1=P2^0;sbit seg2=P2^1;sbit seg3=P2^2;sbit DQ=P1^7;//ds18b20 端口sfr dataled=0x80;//显示数据端口,P0/********************************************************************** /uchar temp;uchar flag_get,count,num,minute,second;uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //7段数码管段码表共阳uchar str[3];/********************************************************************** */unsigned char ReadTemperature(void;uchar Init_DS18B20(void;unsigned char ReadOneChar(void;void WriteOneChar(unsigned char dat;void delay(unsigned int i;/********************************************************************** **/main({TMOD|=0x01;//定时器设置TH0=0xef;TL0=0xf0;IE=0x82;TR0=1;P2=0x00;count=0;while(1{str[2]=0xc6;//显示C符号str[0]=tab[temp/10]; //十位温度str[1]=tab[temp%10]; //个位温度if(flag_get==1 //定时读取当前温度{temp=ReadTemperature(;flag_get=0;}}}/********************************************************************** ***/void tim(void interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔{TH0=0xef;//定时器重装值TL0=0xf0;num++;if (num==50{num=0;flag_get=1;//标志位有效second++;if(second>=60{second=0;minute++;}}count++;if(count==1{P2=0xf7;dataled=str[0];}//数码管扫描if(count==2{P2=0xfb;dataled=str[1];}if(count==3{ P2=0xfd;dataled=str[2];count=0;}}/********************************************************************** ***************/void delay(unsigned int i//延时函数{while(i--;}/********************************************************************** *****************///18b20初始化函数uchar Init_DS18B20(void{unsigned char x=0;DQ = 1; //DQ复位delay(8; //稍做延时DQ = 0; //单片机将DQ拉低delay(80; //精确延时大于480usDQ = 1; //拉高总线delay(10;x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(5;return (x;}/********************************************************************** ********************///读一个字节unsigned char ReadOneChar(void{unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--{DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQdat|=0x80;delay(5;}return(dat;}/********************************************************************** **************************///写一个字节void 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;}delay(5;}/********************************************************************** ***********************************///读取温度unsigned char ReadTemperature(void{unsigned char a=0;unsigned char b=0;unsigned char t=0;//float tt=0;while(Init_DS18B20(;WriteOneChar(0xCC; // 跳过读序号列号的操作WriteOneChar(0x44; // 启动温度转换delay(200;while(Init_DS18B20(;//why initial again?WriteOneChar(0xCC; //跳过读序号列号的操作WriteOneChar(0xBE; //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar(;b=ReadOneChar(;b<<=4;b+=(a&0xf0>>4;//b and a make the 8bit of the temperaturet=b;//tt=t*0.0625;//t= tt*10+0.5; //放大10倍输出并四舍五入return(t;}模块电源《常见故障分析》免费下载!——广州金升阳科技有限公司立即报名参加2010吉时利新能源与新材料测试技术研讨会(成都、重庆、合肥,南京站)。

18B20温度显示 c语言程序

18B20温度显示  c语言程序
while(1)
{
tempchange();//温度转换函数
for(i=10;i>0;i--)
{
dis_temp(get_temp());//获取温度并显示
}
deal(temp);//进行温度处理
sprintf(buff,"%f",f_temp);//将浮点温度格式转化为字符型
for(i=10;i>0;i--)
uint temp;//定义整型温度数据
float f_temp ; //定义温度型温度数据
uint warn_l1=270;
uint warn_l2=250;
uint warn_h1=300;
uint warn_h2=320;
sbit led1=P1^0;//发光二极管控制
sbit led2=P1^1;
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);//读出数据最低位在最前面,这样刚好在一个字节的dat里
}
return(dat);
}
void tempwritebyte(uchar dat)//向DS18B20里写一个字节的数据函数
{
warn(10,0x0c);//第三个和第四个灯亮,蜂鸣器发出“嘀”声
}
else//在27到30度之间只调用显示函数延时
{
i=40;
while(i--)
{
dis_temp(get_temp());
}
}
}
void init_com(void)

DS18B20温度计 c程序 lcd1602显示(word文档良心出品)

DS18B20温度计 c程序 lcd1602显示(word文档良心出品)

2007-12-14 19:05温度值精确到0.1度,lcd1602显示仿真电路图如下c程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7;//ds18b20与单片机连接口sbit RS=P3^0;sbit RW=P3^1;sbit EN=P3^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;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据//{ delay1ms(1);;RS=1;RW=0;EN=0;P2=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--);}void ds1820rst()/*ds1820复位*/{ 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();//显示}}。

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

DS18B20温度传感器详解带c程序
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];
break; case 2: if(zf==0&&shi!=0)
//因为存在脉冲检测结束后自动拉高*/ //return stat; } /******************写一个字节函数****************/ void write_byte(uchar dat) { uchar i; DQ=1; //先拉高电平,为写作准备 for(i=0;i<8;i++) {
以 12 位转化为例说明温度高低字节存放形式(温度的存储形式如表 3.1)及计算:12 位转化后得到的 12
位数据,存储在 18B20 的两个高低 8 位的 RAM 中,二进制中的前面 5 位是符号位。如果测得的温度大于 0,
这 5 位为 0,只要将测到的数值乘于 0.0625 即可得到实际温度;如果温度小于 0,这 5 位为 1,测到的数值
配置寄存器
8位CRC生成器
内部结构图
2. 2 DS18B20 内部存储器及温度数据格式
对于 DS18B20 内部存储器结构(见下图),它包括一个暂存 RAM 和一个非易失性电可擦除 EERAM,后者存
放报警上下限 TH、TL。当改变 TH、T L 中的值时,数据首先被写进暂存器的第二、三字节中,主机可再读
表 3.2 DS18B20 温度/数字对应关系表

单片机DS18B20温度计C语言程序

单片机DS18B20温度计C语言程序

{ dsInit(); //初始化 DS18B20, 无论什幺命令, 首先都要发起初始化 dsWait(); //等待 DS18B20 应答 delay(1); //延时 1ms, 因为 DS18B20 会拉低 DQ 60~240us 作为应答信号 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom writeByte(0x44); //写入温度转换命令字 Convert T } //向 DS18B20 发送读取数据命令 void sendReadCmd() { dsInit(); dsWait(); delay(1);
单片机 DS18B20 温度计 C 语言程序
#include #include #include //要用到取绝对值函数 abs() //通过 DS18B20 测试当前环境温度, 并通过数码管显示当前温度值, 目前显 示范围: -55~ +125 度 sbit wela = P2; //数码管位选 sbit dula = P2; //数码管段选 sbit ds = P2 ; int tempValue; //0-F 数码管的编码(共阳极) unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
i = 8; while(i>0) i--; //延时约 64us, 符合写时隙不低于 60us 要求 } else //写 0, 将 DQ 拉低 60us~120us ds = 0; i = 8; while(i>0) i--; //拉低约 64us, 符号要求 ds = 1; i++; i++; //整个写 0 时隙过程已经超过 60us, 这里就不用像写 1 那样, 再延 时 64us 了 } } //向 DS18B20 发送温度转换命令 void sendChangeCmd()

ds18b20测温c程序

ds18b20测温c程序

#include<reg52.h>#include<intrins.h>#include<ZLG7289.h>#define uint unsigned int#define uchar unsigned charuchar mod,x,dat,m,t;uchar pres_temp[]={9,9,9,9},old_temp[]={0,0,0,0};sbit dq=P3^6;sbit P1_1=P1^1;sbit P1_2=P1^2;sbit P1_5=P1^5;sbit P1_6=P1^6;uint temp;uchar ID[2][8]={0x28,0x08,0x34,0x31,0x02,0x00,0x00,0xac,0x28,0xf3,0xa0,0xd0,0x00,0x00,0x00,0x07}; void delay(uint count){uint i,j;for(i=0;i<count;i++)for(j=0;j<10;j++);}void delayb20(uchar count){uchar i;for(i=0;i<count;i++);}uchar b20_Init(){uchar i;dq=1;delayb20(1);dq=0;delayb20(29);dq=1;delayb20(3);i=dq;delayb20(25);if(i==0)return 1;return 0;}uchar b20_Readbit(void){uchar i;dq=0;dq=1;for(i=0;i<3;i++);return(dq);}uchar b20_Readbyte(void) {uchar i,j,dat;dat=0;for(i=0;i<8;i++){j=b20_Readbit();dat=(j<<7)|(dat>>1);}return(dat);}void b20_Writebyte(uchar dat) {uchar i,j;bit testb;for(j=0;j<8;j++){testb=dat&0x01;dat=dat>>1;if(testb){dq=0;i++;i++;dq=1;for(i=0;i<8;i++);}{dq=0;for(i=0;i<8;i++);dq=1;i++;i++;}}}uint b20_Matchrom(uint num){uint j;b20_Init();if(b20_Init()==1){b20_Writebyte(0x55);for(j=0;j<8;j++)b20_Writebyte(ID[num][j]);return 1;}elsereturn 0;}void b20_temchange(){b20_Init();delay(1);b20_Writebyte(0xcc);b20_Writebyte(0x44);delay(5000);delay(5000);}uint b20_tempget(){float tt;uchar a,b;b20_Writebyte(0xbe);a=b20_Readbyte();b=b20_Readbyte();temp=b;temp<<=8;temp=temp|a;tt=temp*0.0625;temp=tt*10+0.5;return(temp);}void dataconvt(){uint t=b20_tempget();pres_temp[0] = t/ 1000;pres_temp[1] = t % 1000 / 100;pres_temp[2]=t%100/10;pres_temp[3] = t% 10;}void display(uchar p){ uint a;dataconvt();a=pres_temp[0]*1000+pres_temp[1]*100+pres_temp[2]*10+pres_temp[3]; if(p){if(a>305){P1_1=0;P1_2=0;}if(a<295){P1_1=1;P1_2=1;}}else{if(a>305){P1_5=0;P1_6=0;}if(a<295){P1_5=1;P1_6=1;}}t=4*p;if(pres_temp[0]==0)ZLG7289_Hide(0);else if(old_temp[0]!=pres_temp[0]) {x=t;dat= pres_temp[0];ZLG7289_Download(1,x,0,dat);old_temp[0]=pres_temp[0];}if(pres_temp[0]==0&&pres_temp[1]==0) ZLG7289_Hide(1);else if(old_temp[3]!=pres_temp[3] ){x=t+1;dat= pres_temp[1];ZLG7289_Download(1,x,0,dat);}if(old_temp[3]!=pres_temp[3]){x=t+2;dat= pres_temp[2];ZLG7289_Download(1,x,1,dat);x=t+3;dat= pres_temp[3];ZLG7289_Download(1,x,0,dat);old_temp[3]=pres_temp[3];}}void main(){ZLG7289_Init(5);delay(1000);ZLG7289_Reset();delay(1000);while(1){b20_temchange();b20_Matchrom(0);display(0);b20_Matchrom(1);display(1);}}#include<reg52.h>#include<math.h>#include<intrins.h>#include<ZLG7289.h>#define unchar unsigned char#define unint unsigned intunchar pres_temp[]={9,9,9,9},old_temp[]={0,0,0,0}; bit flag=0,dp;unint value;unchar low, high, mod,x,dat,m;sbit ds=P3^6;void delay(unchar i){unchar j, k;for(j = i; j > 0; j--)for(k = 125; k > 0; k--);}void dsInit(){unint i;ds = 0;i = 103;while(i>0) i--;ds = 1;i = 4;while(i>0) i--;flag=ds;}bit readBit(){unint i;bit b;ds = 0;i++;ds = 1;i++; i++;b = ds;i = 8;while(i>0) i--;return b;}unchar readByte(){unint i;unchar j, dat;dat = 0;for(i=0; i<8; i++){j = readBit();dat = (j << 7) | (dat >> 1);}return dat;}void writeByte(unchar dat){unint i;unchar j;bit b;for(j = 0; j < 8; j++){b = dat & 0x01;dat >>= 1;if(b){ds = 0;i++; i++;ds = 1;i = 8; while(i>0) i--;}else{ds = 0;i = 8; while(i>0) i--;ds = 1;i++; i++;}}}void dataconvert(){float t;flag=0;value = high;value <<= 8;value |= low;if(value&0x8000){value=~value;value+=1;flag=1;}t = value * 0.0625;value = t * 10+0.5;if(value>310)P1=0xe7;if(value<290)P1=0xff;pres_temp[0] = value/ 1000;pres_temp[1] = value % 1000 / 100;pres_temp[2]=value%100/10;pres_temp[3] = value % 10;}void display(){if(flag==1){dat=0x40;ZLG7289_Download(2,0,0,dat);}else if(pres_temp[0]==0)ZLG7289_Hide(0);else if(old_temp[0]!=pres_temp[0]) {dat= pres_temp[0];ZLG7289_Download(1,0,0,dat);old_temp[0]=pres_temp[0];}if(pres_temp[0]==0&&pres_temp[1]==0) ZLG7289_Hide(1);else if(old_temp[3]!=pres_temp[3] ) {dat= pres_temp[1];ZLG7289_Download(1,1,0,dat);}if(old_temp[3]!=pres_temp[3]){dat= pres_temp[2];ZLG7289_Download(1,2,1,dat);dat= pres_temp[3];ZLG7289_Download(1,3,0,dat);old_temp[3]=pres_temp[3];}}void main(){ZLG7289_Init(5);delay(100);ZLG7289_Reset();delay(100);while(1){dsInit();delay(1);writeByte(0xcc);delay(1);writeByte(0x44);dsInit();delay(1);writeByte(0xcc);delay(1);writeByte(0xbe);low = readByte() ;high = readByte() ;dataconvert();if(old_temp[3]!=pres_temp[3] ){dat=0x63;ZLG7289_Download(2,4,0, dat);dat=0x0c;ZLG7289_Download(1,5,0, dat);}display();}}。

DS18B20的c语言程序

DS18B20的c语言程序

c语言程序单总线接6个DS18B20(其实程序只要多余3个即可),。

//将DQ与Vcc之间接入4.7K上拉电阻#include "reg52.h"#include "INTRINS.H"#include "1602.c"#define uchar unsigned char#define uint unsigned int//#define CLEARSCREEN LCD_en_command(0x01) 1602清屏sbit DQ="P1"^0;/*操作命令代码跳过ROM 0xCC发送温度转换0xBE写EEPROM 0x4E*//////////////低层驱动子程序///////////void Init18B20(void); //初始化void Write18B20(uchar ch);//写数据unsigned char Read18B20(void);//读数据void Delay15(uchar n);void Delay10ms(uint delay_num);void Display(void);/////////////////////////////////////code uchar decimalH[]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93}; code uchar decimalL[]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75};uint ResultTemperatureH ,ResultTemperatureLH,ResultTemperatureLL;//整数,小数高位,小数低位uint ResultSignal;//符号位main(){ uint TemH,TemL,delay,k=0;for(; ; ){Init18B20();Write18B20(0xCC);//跳过ROM_nop_();//Write18B20(0x4E);//写EEPROM// Write18B20(0x00);//Th//Write18B20(0x00);//TlWrite18B20(0x7f);//12 bits温度分辨率Init18B20();Write18B20(0xCC);//跳过ROM_nop_();Write18B20(0x44);//发送温度转换指令Delay10ms(25);Delay10ms(25);Delay10ms(25);Delay10ms(25);//等待1s转换Init18B20();Write18B20(0xCC);//跳过ROMWrite18B20(0xBE);//发送温度转换指令TemL="Read18B20"(); //读低位温度值TemH="Read18B20"(); //读高位温度值Delay10ms(2);TemH=(TemH<<4)|(TemL>>4);TemL="TemL"&0x0f; //取低4位if(TemH&0x80){ TemH=~TemH;TemL=~TemL+1;ResultSignal="1"; //负}else ResultSignal="0"; //正ResultTemperatureLH="decimalH"[TemL];ResultTemperatureLL="decimalL"[TemL];ResultTemperatureH="TemH";Display();for(delay=0;delay<60000;delay++);for(delay=0;delay<20000;delay++);}}void Display(void){ uint i,j,q;LCD_init();CLEARSCREEN;LCD_en_command(0x01);delay_nms(2);q="ResultTemperatureH/100";i=(ResultTemperatureH%100)/10;j="ResultTemperatureH-"(i*10+q*100);LCD_write_string(0,LINE1," Jaq1217 18B20 "); if(ResultSignal){ LCD_write_string(0,LINE2," T is:- . "); }else {LCD_write_string(0,LINE2," T is:+ . ");}LCD_write_char(0x07,LINE2,q|0x30);LCD_write_char(0x08,LINE2,i|0x30);LCD_write_char(0x09,LINE2,j|0x30);LCD_write_char(0x0b,LINE2,(ResultTemperatureLH/10)|0x30); LCD_write_char(0x0c,LINE2,(ResultTemperatureLH%10)|0x30); LCD_write_char(0x0d,LINE2,(ResultTemperatureLL/10)|0x30); LCD_write_char(0x0e,LINE2,(ResultTemperatureLL%10)|0x30);}unsigned char Read18B20(void){ unsigned char ch;unsigned char q ;for(q=0;q<8;q++){ch=ch>>1;DQ="0";_nop_();DQ="1";_nop_();_nop_();_nop_();_nop_();if(DQ==1){ch="ch|0x80";}else {ch="ch"&0x7f;}Delay15(3);DQ="1";}return (ch);}void Write18B20(uchar ch){ uchar i;for(i=0;i<8;i++){ DQ="0";Delay15(1);DQ="ch"&0x01;Delay15(3);DQ="1";ch="ch">>1;_nop_();}}void Init18B20(void){ DQ="0";Delay15(33);//至少延时480usDQ="1";Delay15(10);//至少延时100us/*if(DQ==1) return 0; //初始化失败else return 1;DQ=1; Delay15(18); */}void Delay15(uchar n){ do{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_();n--;}while(n);}void Delay10ms(uint delay_num){uchar i;while(delay_num--){for(i=0;i<125;i++){;}}}说明:如果你只需要温度部分的,那么LCD部分的,你可以不看,只参考18B20的程序段。

单片机DS18B20温度传感器C语言程序含CRC校验

单片机DS18B20温度传感器C语言程序含CRC校验

单片机中使用DS18B20温度传感器C语言程序(参考1)/******************************************************************************** DS18B20 测温程序硬件:AT89S52(1)单线ds18b20接 P2.2(2)七段数码管接P0口(3)使用外部电源给ds18b20供电,没有使用寄生电源软件:Kei uVision 3**********************************************************************************/ #include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为 int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){ while(us--); }void delay(uint count) //延时子函数{ uint i;while(count){ i=200;while(i>0)i--;count--; } }/*串口初始化,波特率9600,方式1 */void init_com(){ TMOD=0x20; //设置定时器1为模式2TH1=0xfd; //装初值设定波特率TL1=0xfd;TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示 */void display(uint temp){ uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存wela=0;P0=0xfe;wela=1;wela=0;delay(1); //延时约2msP0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1); }/*****************************************时序:初始化时序、读时序、写时序。

对ds18b20温度控制C语言程序

对ds18b20温度控制C语言程序

#include<reg52.h>#include<intrins.h>typedef unsigned char uchar;typedef unsigned int uint;uchar wbuf[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F}; uchar tplsb,tpmsb;//温度低位,高位uint temp=0;//实际温度uint temp1=30;//报警温度uint temp2=27;//报警温度//sbit led=P2^1; //示警发光二极管信号引脚sbit motor=P1^7; //电机信号输出引脚sbit reduce=P2^1; //报警温度下减键sbit plus=P2^0; //报警温度上加键//bit flag1=0;//bit flag2=0;sbit A=P2^6;//数码管位选sbit C=P2^7;//数码管位选sbit DQ=P1^0;//DS18B20控制线void delay1(uint j ){ int i,k;for(i=0;i<110;i++)for(k=0;k<j;k++);}void delay(uint t) //延时t毫秒{uint i;while(t--);{for(i=0;i<250;++i); //延时约1us{}}}/*产生复位脉冲初始化DS18B20*/void Init(){uint i=100;DQ=0;while(i>0)i--;//拉低约900usDQ=1;//拉高电平,产生上升沿i=4;while(i>0)i--;}/*等待应答脉冲*/void Wait(){uint i;while(DQ);while(~DQ); //检测到应答脉冲i=4;while(i>0)i--;}/*读数据一位*/bit Rebit(){uint i;bit b;DQ=0;i++;//保持低电平至少1usDQ=1;i++;i++;//延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效b=DQ;i=9;while(i>0)i--;//读时隙不低于60usreturn(b);}/*读一个字节数据*/uchar Rebyte(){uchar i,j=0,k=0;for(i=0;i<8;i++){k=Rebit();j=(k<<7)|(j>>1);}return(j);}/*写一个字节数据*/void Wrbyte(uchar b){uint i,j;bit temp;for(j=0;j<8;j++){temp=b&0x01;b>>=1;if(temp){/*写1*/DQ=0;i++;i++;//延时15usDQ=1;i=8;while(i>0)i--;//整个写1时隙不低于60us}else{/*写0*/DQ=0;i=8;while(i>0)i--;DQ=1;i++;i++;}}}/*启动温度转化*/void Convert(){Init();//初始化DS18B20Wait();//等待应答delay(1);//延时Wrbyte(0xcc);//skip rom命令Wrbyte(0x44);//convert T命令}/*读取温度值*/void Retemp(){Init();//初始化DS18B20Wait();//等待应答delay(1);//延时Wrbyte(0xcc);//skip rom命令Wrbyte(0xbe);//read scratchpad(读暂存器)命令tplsb=Rebyte();//温度低位字节(其中第四位为小数部分)tpmsb=Rebyte();//温度高位字节(其中高五位为符号位)temp=(tpmsb*256+tplsb)*0.0625;//转换}/*LED显示*/void Display(){for(n=0;n<3;n++){ j=temp/10;//取温度十位k=temp%10; //取温度个位P0=wbuf[j];//把要显示的位送入P0口A=0;C=1; //开第一位数码管,显示十位delay(10);//com1=1; //关第一位显示P0=wbuf[k];//把要显示的位送入P0口A=1;C=0; //开第二位数码管,显示个位//delay(2);//com2=1;//关第二位显示}}void main(){EA=1;EX0=1;TF0=1;//EX1=1;do{//delay(1);Convert();//温度转换delay(10);Retemp();//读温度delay(10);Display();//显示if((temp>=temp1)||(temp<=temp2)){// led=0;motor=0;}else{// led=1;motor=1;}// if(temp<=temp2)// motor=0;}while(1);}void TNTO() interrupt 0do{for(n=0;n<5;n++){ j=temp1/10;//取温度十位k=temp1%10; //取温度个位P0=wbuf[j];//把要显示的位送入P0口A=0;C=1; //开第一位数码管,显示报警温度十位delay1(12);P0=wbuf[k];//把要显示的位送入P0口A=1;C=0; //开第二位数码管,显示报警温度个位delay1(12);}if((P2&0x0f)!=0x0f){i=0;delay1(60);if((P2&0x0f)!=0x0f){ if(plus==0){ delay1(10);if(plus==0)temp1++;}if(reduce==0){ delay1(10);if(reduce==0)temp1--;}}}i++;if(((P2&0x0f)==0x0f)&&(i>=50)) break;}while(1);}。

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

温度传感器DS18B20驱动程序(C语言)
// DS18B20驱动程序(C语言)
#include <main.h>
sbit DQ =P3^4; //定义通信端口
//延时函数
/*void delay(unsigned int i)
{
while(i--);
}
*/
//初始化函数
void DS18B20_Set()
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
//读一个字节
uchar ReadOneChar()
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
WriteOneChar(0x4e);
WriteOneChar(0x88);
WriteOneChar(0x44);
WriteOneChar(Set_bit);
DS18B20_Set();
Delay_100ms;
DS18B20_Set();
WriteOneChar(0xcc);
WriteOneChar(0x48);
}
*/
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(100); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
{
uchar a,b;
uchar minus_flag;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档