求C语言程序,AT89C51单片机为核心,DS18B20测温度,实时用4位LED显示温度,并且用单片机控制继电器 30

求C语言程序,AT89C51单片机为核心,DS18B20测温度,用4位共阳极7段LED显示实时温度,精度是0.1并且用单片机控制继电器,使继电器接通5秒就断开一次,过30... 求C语言程序,
AT89C51单片机为核心,DS18B20测温度,用4位共阳极7段LED显示实时温度,精度是0.1
并且用单片机控制继电器,使继电器接通5秒就断开一次,过30s再接通(间隔较短时间),当温度大于设定温度上限时,继电器自动断开,
要有键盘或者按键,可设置温度上下限,继电器额定电流3A,(打算用HK4100F-DC5V-SH),
展开
 我来答
GUEL86
2013-04-17
知道答主
回答量:0
采纳率:0%
帮助的人:0
展开全部

#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();   //显示
    }
  } 

更多追问追答
追问
先谢谢你了,
继电器怎么控制啊,
按键的程序我也需要,
谢谢大神
追答
需要什么功能,就加什么功能的控制或者 等等。
浙江启扬智能科技有限公司
2019-05-20 广告
目前,ARM开发板已经逐渐替代单片机。虽然它们在应用领域上很类似,但是单片机能够完成的ARM开发板可以完成的更好,ARM开发板能够完成的单片机未必能够完成。ARM开发板每个部分分工明确,多功能处理问题,稳定性非常高,整体运行效率高,当然成本... 点击进入详情页
本回答由浙江启扬智能科技有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
?>

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式