急需用温度传感器ds18b20,数码管显示温度的单片机的C语言程序,运用的是89c52单片机,附上电路图,谢谢!

如题所述

#include<reg52.h> 
#define uchar unsigned char 
#define uint unsigned int 
sbit DQ=P1^4;  //ds18b20与单片机连接口 
unsigned char code str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; //共阴数码管字码表
unsigned char code str1[]={0x0bf,0x86,0x0db,0x0cf,0x0e6,0x0ed,0x0fd,0x87,0x0ff,0x0ef}; //个位带小数点字码表
unsigned char code wei[]={0x0fe,0x0fd,0x0fb,0x0f7}; 
uchar data disdata[5]; 
uint  tvalue;   //温度值 
uchar tflag;    //温度正负标志 
/**********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); //精确延时大于   480us 
  DQ = 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+2; tflag=1;  //负温度 
    }
  tvalue=tvalue*(0.625);  //温度值扩大10倍,精确到1位小数
  return(tvalue);
  }
/*********************************/
void ds1820disp()        //温度值显示
  {
  uchar i;
  disdata[0]=tvalue/1000;     //百位数
  disdata[1]=tvalue%1000/100; //十位数 
  disdata[2]=tvalue%100/10;   //个位数
  disdata[3]=tvalue%10;       //小数位
  if(tflag==0)
    {
    if(disdata[0]==0x00)
      {
      disdata[0]=0x0a;                        //百位数位为0不显示   
      if(disdata[1]==0x00)  disdata[1]=0x0a;  //十位数位为0不显示   
      }
    }
  else                         //负温度 
    {   
    disdata[0]=0x0b;                      //负温度百位显示负号:-
    if(disdata[1]==0x00)  disdata[1]=0x0a;    //十位数位为0不显示   
    }
  for(i=0;i<150;i++)
    {
    P2=wei[0];
    P0=str[disdata[3]];
    delay_18B20(20);
    P2=wei[1];
    P0=str1[disdata[2]];
    delay_18B20(20);
    P2=wei[2];
    P0=str[disdata[1]];
    delay_18B20(20);
    P2=wei[3];
    P0=str[disdata[0]];
    delay_18B20(20);
    }
  }
/************主程序**********/
void main()
  {
  ds1820rst();      //初始化显示
  while(1)
    {
    read_temp();    //读取温度
    ds1820disp();   //显示
    }
  } 

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-03-09
楼上的也是其他地方抄来的吧?真够复杂的。如果你的温度要求没有负的没小数,程序处理是否简单,如果有小数和负数,就是现实上会增加语句,但是怎么看也没楼上的复杂。

急需用温度传感器ds18b20,数码管显示温度的单片机的C语言程序,运用的是...
include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit DQ=P1^4; \/\/ds18b20与单片机连接口 unsigned char code str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; \/\/共阴数码管字码表unsigned char code str1[]={0x0bf,0x86,...

求STC89C52单片机与DS18B20传感器用Keil c语言设计程序
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;\/...

我需要stc89c52单片机ds18b20温度控制的c语言程序,要求可显示当前温度...
void delay(unsigned char i) \/\/ds18b20的延时程序 { while(i--);} unsigned char resetds() \/\/DS18B20初始化 { unsigned char i=0;unsigned char flag=0;DQ=0; \/\/拉低总线 delay(81); \/\/精确延时 497us DQ=1; \/\/释放总线 delay(20);flag=DQ;delay(60); \/\/ return ...

...温度传感器是DS18B20) 寻高手帮在C语言程序中加个报警程序。急需...
if(flag)\/\/温度为正数 由于实际的焊的板子只有三个数码管 所以,没加“+” 了。如 45.0度 { \/\/DIN=1;P2=0xff;P2=seg[0];P0=tab[0];delay1(4);P2=0xff;P2=seg[1];P0=tab[ge];DIN=0; \/\/ 问题问什么 加小数点要在P2口上加才能正常显示。delay1(4);DIN=1;P2=0xff;P2=...

求基于AT89C51单片机的DS18B20温度检测程序(用C语言)
\/\/DS18B20的读写程序,数据脚P3.3 \/\/ \/\/温度传感器18B20汇编程序,采用器件默认的12位转化 \/\/ \/\/最大转化时间750微秒,显示温度-55到+125度,显示精度 \/\/ \/\/为0.1度,显示采用4位LED共阳显示测温值 \/\/ \/\/P0口为段码输入,P24~P27为位选 \/\/ \/***\/ include "reg51.h"include...

...单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温度计程序...
void Init_DS18B20(void){ unsigned char x=0;DQ = 1; \/\/DQ复位 delay_18B20(8); \/\/稍做延时 DQ = 0; \/\/单片机将DQ拉低 delay_18B20(80); \/\/精确延时 大于 480us DQ = 1; \/\/拉高总线 delay_18B20(4);x=DQ; \/\/稍做延时后 如果x=0则初始化成功 x=1则初始化失败...

求:基于AT89C51单片机的多路DS18B20测温显示
bit DS18B20_FLG = 0; \/\/“1”:DS18B20存在 ;“0”:不存在 unsigned char LEDBuf[4];void delay(unsigned int i);\/\/延时 display();\/\/DS18B20温度采集子程序\/\/\/DS18B20温度采集子程序\/\/\/DS18B20温度采集子程序\/\/\/ unsigned char Init_DS18B20(void);unsigned char Read_DS18B20(void); ...

用AT89C51单片机和温度传感器DS18B20S设计数字式温度计
3.3 按键程序设计 134实物制作及调试 145电子综合设计体会 15参考文献 161 引言本系统所设计的数字温度计采用的是DS18B20数字温度传感器测温,DS18B20直接输出的就是数字信号,与传统的温度计相比,具有读数方便,测温范围广,测温准确,上下限报警功能。其输出温度采用LED数码管显示,主要用于对测温比较准确的场所。该设计...

理解89c52单片机开发板的电路原理图
这个图应该很清楚了,各个功能模块都归纳到一个方框里面:1、LCD1602显示模块接口2、LCD12864显示模块接口3、LED接口4、蜂鸣器接口5、ISP下载接口6、PL2303驱动电路7、电源电路8、数码管电路接口及独立按键接口9、DS18B20温度传感器接口及红外接收电路接口10、CPU11、复位电路和时钟电路。这个开发板缺少4*4矩阵...

用51单片机和18b20做一个温度计,求一个完整程序,要求用12864显示。
用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在-20度到+100度之间,用8位数码管显示出来。5. 电路原理图 6. 系统板上硬件连线 (1). 把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。(2). 把“单片机系统”...

相似回答