用单片机C语言设计数字温度计!求代码!急急急

用单片机C语言设计数字温度计!求代码!急急急,第1张

//------------------------------------------------------------------

//DS18B20温度传感器输出显示,运行本例时,外界温度将显示在1602LCD上

//------------------------------------------------------------------

#include <reg52h>

#include <intrinsh>

#define uchar unsigned char

#define uint unsigned int

#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}

sbit DQ=P2^2;

sbit dula=P2^6; //定义锁存器锁存端

sbit wela=P2^7;

sbit rs=P3^5; //定义1602液晶RS端

sbit lcden=P3^4;//定义1602液晶LCDEN端

sbit s1=P3^0; //定义按键--功能键

sbit s2=P3^1;//定义按键--增加键

sbit s3=P3^2;//定义按键--减小键

sbit s4=P3^6;//闹钟查看键

sbit rd=P3^7;

sbit beep=P2^3; //定义蜂鸣器端

uchar code Temp_Disp_Title[]={" Current Temp : "};

uchar Current_Temp_Display_Buffer[]={" TEMP: "};

uchar code Alarm_Temp[]={"ALARM TEMP Hi Lo"};

uchar Alarm_HI_LO_STR[]={"Hi: Lo: "};

uchar temp_data[2]={0x00,0x00};

uchar temp_alarm[2]={0x00,0x00};

uchar display[5]={0x00,0x00,0x00,0x00,0x00};

uchar display1[3]={0x00,0x00,0x00};

uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};

uchar CurrentT=0;//当前读取的温度整数部分

uchar Temp_Value[]={0x00,0x00};//从DS18B20读取的温度值

uchar Display_Digit[]={0,0,0,0}; //待显示的各温度数位

bit DS18B20_IS_OK=1;//传感器正常标志

//-------------------------------------

//延时1

//-------------------------------------

void delay1(uint x)

{

uchar i;

while(x--) for(i=0;i<200;i++);

}

//-------------------------------------

//延时2

//-------------------------------------

void Delay(uint x)

{

while(x--);

}

//------------------------------------

//忙检查

//------------------------------------

void write_com(uchar com)//液晶写命令函数

{

rs=0;

lcden=0;

P0=com;

delay1(5);

lcden=1;

delay1(5);

lcden=0;

}

void Write_LCD_Data(uchar date)//液晶写数据函数

{

rs=1;

lcden=0;

P0=date;

delay1(5);

lcden=1;

delay1(5);

lcden=0;

}

//-----------------------------

//设置LCD显示位置

//---------------------------------

void Set_Disp_Pos(uchar Pos)

{

write_com(Pos|0x80);

}

//-----------------------------

//LCD初始化

//---------------------------------

void Initialize_LCD()

{

uchar num;

rd=0; //软件将矩阵按键第4列一端置低用以分解出独立按键

dula=0;//关闭两锁存器锁存端,防止 *** 作液晶时数码管会出乱码

wela=0;

lcden=0;

write_com(0x38);//初始化1602液晶

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80);//设置显示初始坐标

for(num=0;num<14;num++)//显示年月日星期

{

Write_LCD_Data(Temp_Disp_Title[num]);

delay1(5);

}

}

//-------------------------------------

//函数功能:初始化DS18B20

//出口参数:status---DS18B20是否复位成功的标志

//-------------------------------------

uchar Init_DS18B20()

{

uchar status; //储存DS18B20是否存在的标志,status=0,表示存在;status=1,表示不存在

DQ=1;Delay(8); //先将数据线拉高 //略微延时约6微秒

DQ=0;Delay(90); //再将数据线从高拉低,要求保持480~960us

//略微延时约600微秒 以向DS18B20发出一持续480~960us的低电平复位脉冲

DQ=1;Delay(8); //释放数据线(将数据线拉高) //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)

status=DQ;Delay(100); //让单片机检测是否输出了存在脉冲(DQ=0表示存在) //延时足够长时间,等待存在脉冲输出完毕

DQ=1; // 将数据线拉高

return status; //返回检测成功标志

}

//-------------------------------------

//函数功能:读一字节

//出口参数:dat---读出的数据

//-------------------------------------

uchar ReadOneByte()

{

uchar i,dat=0;

DQ=1;_nop_(); // 先将数据线拉高 //等待一个机器周期

for (i=0;i<8;i++)

{

DQ=0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序

dat>>=1;

_nop_();//等待一个机器周期

DQ=1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备

_nop_();_nop_(); //延时约6us,使主机在15us内采样

if (DQ) dat|=0x80; //如果读到的数据是1,则将1存入dat,如果是0则保持原值不变

Delay(30); //延时3us,两个读时序之间必须有大于1us的恢复期

DQ=1; // 将数据线拉高,为读下一位数据做准备

}

return dat;

}

//-------------------------------------

//函数功能:写一字节

//入口参数:dat---待写入的数据

//-------------------------------------

void WriteOneByte(uchar dat)

{

uchar i;

for (i=0;i<8;i++)

{

DQ=0; //将数据线从高拉低时即启动写时序

DQ=dat & 0x01; //利用与运算取出要写的某位二进制数据,

//并将其送到数据线上等待DS18B20采样

Delay(5); //延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样

DQ=1; //释放数据线

dat>>=1; //将dat中的各二进制位数据右移1位

}

}

//-------------------------------------

//函数功能:读取温度值

//出入口参数:无

//-------------------------------------

void Read_Temperature()

{

if(Init_DS18B20() == 1) //DS18B20故障

DS18B20_IS_OK=0;

else

{

WriteOneByte(0xCC); // 跳过读序号列号的 *** 作

WriteOneByte(0x44); // 启动温度转换

Init_DS18B20(); //将DS18B20初始化

WriteOneByte(0xCC); //跳过读序号列号的 *** 作

WriteOneByte(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位

Temp_Value[0]=ReadOneByte(); //温度低8位

Temp_Value[1]=ReadOneByte(); //温度高8位

DS18B20_IS_OK=1;

}

}

//-------------------------------------

//函数功能:在LCD上显示当前温度

//入口参数:

//-------------------------------------

void Display_Temperature()

{

uchar i;

//延时值与负数标识

uchar t=150,ng=0;

//高5位全为1(0xF8)则为负数,为负数时取反加1,并设置负数标示

if ((Temp_Value[1] & 0xF8)==0xF8)

{

Temp_Value[1]=~Temp_Value[1];

Temp_Value[0]=~Temp_Value[0]+1;

if(Temp_Value[0]==0x00) Temp_Value[1]++; //加1后如果低字节为00表示有进位,进位位再加到高字节上

ng=1; //负数标示置1

}

Display_Digit[0]=df_Table[Temp_Value[0] & 0x0F]; //查表得到温度小数部分

//获取温度整数部分(高字节的低3位与低字节中的高4位,无符号)

CurrentT=((Temp_Value[0] & 0xF0)>>4)|((Temp_Value[1] & 0x07)<<4);

//将整数部分分解为3位待显示数字

Display_Digit[3]=CurrentT/100;//百位 digit[CurrentT/100];

Display_Digit[2]=CurrentT%100/10;//十位

Display_Digit[1]=CurrentT%10;//个位

//刷新LCD显示缓冲

Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';//先将'0'转换成整数48,然后与前面数字相加,得到相应数字的ASCII字符

Current_Temp_Display_Buffer[10]='';

Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0'; //个位

Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0'; //十位

Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0'; //百位

//高位为0时不显示

if(Display_Digit[3]==0) Current_Temp_Display_Buffer[7]=' ';

//高位为0且次高位为0时,次高位不显示

if(Display_Digit[2]==0 && Display_Digit[3]==0)

Current_Temp_Display_Buffer[8]=' ';

//负数符号显示在恰当位置

if(ng)

{

if (Current_Temp_Display_Buffer[8]==' ')

Current_Temp_Display_Buffer[8]='-';

else if(Current_Temp_Display_Buffer[7]==' ')

Current_Temp_Display_Buffer[7]='-';

else

Current_Temp_Display_Buffer[6]='-';

}

//在第一行显示标题

Set_Disp_Pos(0x00);

for(i=0;i<16;i++)

{

Write_LCD_Data(Temp_Disp_Title[i]);

}

Set_Disp_Pos(0x40); //在第二行显示当前温度

for(i=0;i<16;i++)

{

Write_LCD_Data(Current_Temp_Display_Buffer[i]);

}

//显示温度符号

//Set_Disp_Pos(0x4D);Write_LCD_Data(0x00);

Set_Disp_Pos(0x4D);Write_LCD_Data(0xdf);

Set_Disp_Pos(0x4E);Write_LCD_Data('C');

}

//-------------------------------------

//函数功能:主函数

//入口参数:

//-------------------------------------

void main()

{

Initialize_LCD();

Read_Temperature();

Delay(50000);

Delay(50000);

while (1)

{

Read_Temperature();

if (DS18B20_IS_OK) Display_Temperature();

delay1(100);

}

}

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

;标签:单片机 c语言 ds18b20 温度计 51 mcu

>

#include <reg51h>

#define uchar unsigned char

sbit keyup=P1^0;

sbit keydn=P1^1;

sbit keymd=P1^2;

sbit out=P3^7; //接控制继电器

sbit DQ = P3^4; //接温度传感器18B20

uchar t[2],number=0,pt; //温度值

uchar TempBuffer1[4]={0,0,0,0};

uchar Tmax=18,Tmin=8;

uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xfe,0xf7};

uchar dismod=0,xiaodou1=0,xiaodou2=0,currtemp;

bit flag;

void t0isr() interrupt 1

{

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

switch(number)

{

case 0:

P2=0x08;

P0=distab[TempBuffer1[0]];

break;

case 1:

P2=0x04;

P0=distab[TempBuffer1[1]];

break;

case 2:

P2=0x02;

P0=distab[TempBuffer1[2]]&0x7f;

break;

case 3:

P2=0x01;

P0=distab[TempBuffer1[3]];

break;

default:

break;

}

number++;

if(number>3)number=0;

}

void delay_18B20(unsigned int i)

{

while(i--);

}

/ds18b20初始化函数/

void Init_DS18B20(void)

{

bit x=0;

do{

DQ=1;

delay_18B20(8);

DQ = 0; //单片机将DQ拉低

delay_18B20(90); //精确延时 大于 480us

DQ = 1; //拉高总线

delay_18B20(14);

x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败,继续初始化

}while(x);

delay_18B20(20);

}

/ds18b20读一个字节/

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_18B20(4);

}

return(dat);

}

/ds18b20写一个字节/

void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

delay_18B20(5);

DQ = 1;

dat>>=1;

}

}

/读取ds18b20当前温度/

unsigned char ReadTemperature(unsigned char rs)

{

unsigned char tt[2];

delay_18B20(80);

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的 *** 作

WriteOneChar(0x44); //启动温度转换

delay_18B20(80);

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的 *** 作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度

tt[0]=ReadOneChar(); //读取温度值低位

tt[1]=ReadOneChar(); //读取温度值高位

return(tt);

}

void covert1(void) //将温度转换为LED显示的数据

{

uchar x=0x00,y=0x00;

t[0]=pt;

pt++;

t[1]=pt;

if(t[1]&0x080) //判断正负温度

{

TempBuffer1[0]=0x0c; //c代表负

t[1]=~t[1]; /下面几句把负数的补码/

t[0]=~t[0]; /换算成绝对值/

x=t[0]+1;

t[0]=x;

if(x==0x00)t[1]++;

}

else TempBuffer1[0]=0; //A代表正

t[1]<<=4; //将高字节左移4位

t[1]=t[1]&0xf0;

x=t[0]; //将t[0]暂存到X,因为取小数部分还要用到它

x>>=4; //右移4位

x=x&0x0f; //和前面两句就是取出t[0]的高四位

y=t[1]|x; //将高低字节的有效值的整数部分拼成一个字节

TempBuffer1[1]=(y%100)/10;

TempBuffer1[2]=(y%100)%10;

t[0]=t[0]&0x0f; //小数部分

TempBuffer1[3]=t[0]10/16;

//以下程序段消去随机误检查造成的误判,只有连续12次检测到温度超出限制才切换加热装置

if(currtemp>Tmin)xiaodou1=0;

if(y<Tmin)

{

xiaodou1++;

currtemp=y;

xiaodou2=0;

}

if(xiaodou1>12)

{

out=0;

flag=1;

xiaodou1=0;

}

if(currtemp<Tmax)xiaodou2=0;

if(y>Tmax)

{

xiaodou2++;

currtemp=y;

xiaodou1=0;

}

if(xiaodou2>12)

{

out=1;

flag=0;

xiaodou2=0;

}

out=flag;

}

void convert(char tmp)

{

uchar a;

if(tmp<0)

{

TempBuffer1[0]=0x0c;

a=~tmp+1;

}

else

{

TempBuffer1[0]=0;

a=tmp;

}

TempBuffer1[1]=(a%100)/10;

TempBuffer1[2]=(a%100)%10;

}

void keyscan( )

{

uchar keyin;

keyin=P1&0x07;

if(keyin==0x07)return;

else if(keymd==0)

{

dismod++;

dismod%=3;

while(keymd==0);

switch(dismod)

{

case 1:

convert(Tmax);

TempBuffer1[3]=0x11;

break;

case 2:

convert(Tmin);

TempBuffer1[3]=0x12;

break;

default:

break;

}

}

else if((keyup==0)&&(dismod==1))

{

Tmax++;

convert(Tmax);

while(keyup==0);

}

else if((keydn==0)&&(dismod==1))

{

Tmax--;

convert(Tmax);

while(keydn==0);

}

else if((keyup==0)&&(dismod==2))

{

Tmin++;

convert(Tmin);

while(keyup==0);

}

else if((keydn==0)&&(dismod==2))

{

Tmin--;

convert(Tmin);

while(keydn==0);

}

xiaodou1=0;

xiaodou2=0;

}

main()

{

TMOD=0x01;

TH0=(65536-5000)/256;

TL0=(65536-5000)%256;

TR0=1;

ET0=1;

EA=1;

out=1;

flag=0;

ReadTemperature(0x3f);

delay_18B20(50000); //延时等待18B20数据稳定

while(1)

{

pt=ReadTemperature(0x7f); //读取温度,温度值存放在一个两个字节的数组中

if(dismod==0)covert1();

keyscan();

delay_18B20(30000);

}

}

#include<reg52h> #include<mathh>

#include<INTRINSH>

#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;//显示数据端口

//

/ 全局变量 /

//

uint temp;

uchar flag_get,count,num,minute,second;

uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//7段数码管段码表共阳

uchar str[6];

//

/ 函数声明 /

//

void delay1(uchar MS);

unsigned int ReadTemperature(void);

void Init_DS18B20(void);

unsigned char ReadOneChar(void);

void WriteOneChar(unsigned char dat);

void delay(unsigned int i);

//

/ 主函数 /

//

main()

{

unsigned char TempH,TempL;

TMOD|=0x01;//定时器设置

TH0=0xef;

TL0=0xf0;

IE=0x82;

TR0=1;

P2=0x00;

count=0;

while(1)

{

str[5]=0x39; //显示C符号

str[1]=tab[TempH/100]; //十位温度

str[2]=tab[(TempH%100)/10]; //十位温度

str[3]=tab[(TempH%100)%10]|0x80; //个位温度,带小数点

str[4]=tab[TempL];

if(flag_get==1) //定时读取当前温度

{

temp=ReadTemperature();

if(temp&0x8000)

{

str[0]=0x40;//负号标志

temp=~temp; // 取反加1

temp +=1;

}

else

str[0]=0;

TempH=temp>>4;

TempL=temp&0x0F;

TempL=TempL6/10;//小数近似处理

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=0;

dataled=str[0];}//数码管扫描

if(count==2)

{P2=1;

dataled=str[1];}

if(count==3)

{ P2=2;

dataled=str[2];

}

if(count==4)

{ P2=3;

dataled=str[3];

}

if(count==5)

{ P2=4;

dataled=str[4];

}

if(count==6)

{ P2=5;

dataled=str[5];

count=0;}

}

//

/ 延时函数 /

//

void delay(unsigned int i)//延时函数

{

while(i--);

}

//

/ 初始化 /

//

void Init_DS18B20(void)

{

unsigned char x=0;

DQ = 1; //DQ复位

delay(8); //稍做延时

DQ = 0; //单片机将DQ拉低

delay(80); //精确延时 大于 480us

DQ = 1; //拉高总线

delay(10);

x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

delay(5);

}

//

/ 读一个字节 /

//

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(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 int ReadTemperature(void)

{

unsigned char a=0;

unsigned int b=0;

unsigned int t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的 *** 作

WriteOneChar(0x44); // 启动温度转换

delay(200);

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的 *** 作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

a=ReadOneChar(); //低位

b=ReadOneChar(); //高位

b<<=8;

t=a+b;

return(t);

}

//LZ,这是测温并且用数码管显示程序,报警可以自己另行添加!主要程序就是这些!

()

//按照我的电路图我这是四位有负温度显示你可以看一下。有什么问题可以问我?

/

created: 2010/07/27

created: 27:7:2010   10:27

filename:  D:\Keil Debug\ds18b20c

file path: D:\Keil Debug

file base: ds18b20

file ext: c

author:  Honguo ZHU

purpose:

//DS18B20的读写程序,数据脚P27

//温度传感器18B20汇编程序,采用器件默认的12位转化

//最大转化时间750微秒,显示温度-55到+125度,显示精度

//为01度,显示采用4位LED共阳显示测温值

//P0口为段码输入,P34~P37为位选

/

#include "reg51h"

#include "intrinsh"                            //_nop_();延时函数用

#define  Disdata P0                             //段码输出口

#define  discan  P3                             //扫描口

#define  uchar unsigned char

#define  uint  unsigned int

#define READROM_18b20_CM     0x33

#define MATCHROM_18b20_CM    0x55

#define SKIPROM_18b20_CM     0xCC

#define SEARCHROM_18b20_CM   0xF0

#define ALARMSEARCH_18b20_CM 0xEC

#define CONVERTT_CM          0x44

#define RSCRATCHPAD_CM       0xBE

#define WSCRATCHPAD_CM       0x4E

#define CSCRATCHPAD_CM       0x48

#define RECALLE2_CM          0xB8

#define RPOWERSUNNLY_CM      0xB4

sbit     DQ=P2^7;                               //温度输入口

sbit     DIN=P0^7;                              //LED小数点控制

//

//

//温度小数部分用查表法//

uchar code ditab[16]=

{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

//

uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};

//共阳LED段码表        "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "不亮" "-"

uchar code scan_con[4]={0x8f,0x4f,0x2f,0x1f};    //列扫描控制字

uchar data temp_data[2]={0x00,0x00};             //读出温度暂放

uchar data display[5]={0x00,0x00,0x00,0x00,0x00};     //显示单元数据,共4个数据和一个运算暂用

//

//

//

/11us延时函数/

//

void delay(uint t)

{

for (;t>0;t--);

}

//

/显示函数/

scan()

{

char k;

for(k=0;k<4;k++)                             //4位LED扫描控制

{

Disdata = 0xff;                         //

discan=scan_con[k];                     //位选

Disdata=dis_7[display[k]];              //数据显示

if (k==1)

{

DIN=0;

}                            //小数点显示

delay(300);

}

}

//

//

/DS18B20复位函数/

ow_reset(void)

{

char presence=1;

while(presence)

{

while(presence)

{

DQ=1;_nop_();_nop_();   //从高拉倒低

DQ=0;

delay(50);              //550 us

DQ=1;

delay(6);               //66 us

presence=DQ;            //presence=0 复位成功,继续下一步

}

delay(45);                   //延时500 us

presence=~DQ;

}

DQ=1;                           //拉高电平

}

//

//

/DS18B20写命令函数/

//向1-WIRE 总线上写1个字节

void write_byte(uchar val)

{

uchar i;

for(i=8;i>0;i--)

{

DQ=1;_nop_();_nop_();                  //从高拉倒低

DQ=0;_nop_();_nop_();_nop_();_nop_();  //5 us

DQ=val&0x01;                           //最低位移出

delay(6);                              //66 us

val=val/2;                             //右移1位

}

DQ=1;

delay(1);

}

//

/DS18B20读1字节函数/

//从总线上取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_();         //4 us

DQ=1;_nop_();_nop_();_nop_();_nop_();         //4 us

if(DQ)

{value|=0x80;}

delay(6);                                     //66 us

}

DQ=1;

return(value);

}

//

/读出温度函数/

//

uint read_temp()

{

uint  temp;

// ow_reset();                  //总线复位

// delay(200);

//  write_byte(SKIPROM_18b20_CM);       //发命令

// write_byte(CONVERTT_CM);            //发转换命令

ow_reset();

delay(1);

write_byte(SKIPROM_18b20_CM);       //发命令

write_byte(RSCRATCHPAD_CM);

temp_data[0]=read_byte();           //读温度值的第字节

temp_data[1]=read_byte();           //读温度值的高字节

temp=temp_data[1];

temp<<=8;

temp=temp|temp_data[0];             // 两字节合成一个整型变量。

return temp;                 //返回温度值

}

//

/温度数据处理函数/

//二进制高字节的低半字节和低字节的高半字节组成一字节,这个

//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩

//下的低字节的低半字节转化成十进制后,就是温度值的小数部分

//

work_temp(uint tem)

{

uchar n=0;

if(tem>6348)                        // 温度值正负判断

{

tem=65536-tem;

n=1;

}            // 负温度求补码,标志位置1

display[4]=tem&0x0f;           // 取小数部分的值

display[0]=ditab[display[4]];  // 存入小数部分显示值

display[4]=tem>>4;             // 取中间八位,即整数部分的值

display[3]=display[4]/100;     // 取百位数据暂存

display[1]=display[4]%100;     // 取后两位数据暂存

display[2]=display[1]/10;      // 取十位数据暂存

display[1]=display[1]%10;

/符号位显示判断/

if(!display[3])

{

display[3]=0;           //最高位为0时不显示

if(!display[2])

{

display[2]=0;        //次高位为0时不显示

}

}

if(n)

{

display[3]=0x0b;

}      //负温度时最高位显示"-"

}

//

//

/主函数/

main()

{

uint   h;

Disdata=0xff;                             //初始化端口

discan=0xff;

for(h=0;h<4;h++)                       //开机显示"0000"

{display[h]=0;}

ow_reset();                               //开机先转换一次

write_byte(SKIPROM_18b20_CM);             //Skip ROM

write_byte(CONVERTT_CM);                  //发转换命令

for(h=0;h<100;h++)                     //开机显示"0000"

{scan();}

while(1)

{

work_temp(read_temp());     //处理温度数据

scan();                     //显示温度值

}

}

//

//结束//

以上就是关于用单片机C语言设计数字温度计!求代码!急急急全部的内容,包括:用单片机C语言设计数字温度计!求代码!急急急、单片机DS18B20温度计C语言程序、DS18B20与单片机结合来测量温度。利用数字温度传感器DS18B20测量温度信号等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9371418.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存