• 大小: 12KB
    文件类型: .c
    金币: 2
    下载: 1 次
    发布日期: 2021-07-11
  • 语言: 其他
  • 标签: 单片机  

资源简介

控制蔬菜大棚的温度在一定的范围内变化,过高或者过低就进行报警

资源截图

代码片段和文件信息





#include
#include





sbit DQ = P2^5;                 //定义ds18b20通信端口
unsigned char result_18b20;     //ds18b20初始化结果
signed int temKLKHKL1KH1;   //温度






sbit sda=P2^7;                 //串行数据/地址
sbit scl=P2^6;                 //串行时钟




sbit P2_0=P2^0;                //数码管选择
sbit P2_1=P2^1;
sbit P2_2=P2^2;

sbit P2_3=P2^3;                //“负号“数码管控制
sbit P2_4=P2^4;

sbit P3_2=P3^2;                //控制红色发光二极管
sbit P3_3=P3^3;                //控制蓝色发光二极管
 
unsigned char baishige;     //数据的百位 十位 个位
unsigned int z=0;             //用于控制那个蓝色按钮按下是偶数次还是奇数次








/***********ds18b20延迟子函数(晶振12MHz)延时时间为n乘以15us****************/ 

void delay_18B20(unsigned int n)
{
do{
   _nop_();
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       _nop_();
   n--;
   }while(n);
}


/***************************ds18b20初始化函数*********************************/

void Init_DS18B20(void) 
{
          DQ = 0;                //单片机将DQ拉低
  delay_18B20(36);        //延时540us
  DQ = 1;                 //拉高总线
  delay_18B20(6);         //延时90us
  result_18b20=DQ;        //稍做延时后如果result_18B20=0则初始化成功result_18B20=1则初始化失败
  delay_18B20(18);        //延时270us

}



/***************************ds18b20读一个字节**********************************/  

unsigned char ReadOneChar(void)
{
unsigned char ij;
    unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  dat>>=1;
          DQ = 0;                 // 拉低总线产生读信号
  for(j=2;j>0;j--);       //延时4us
  DQ = 1;                 // 释放总线准备读数据
          for (j=4;j>0;j--);      //延时8微秒读数据
  if(DQ==1)
  dat|=0x80;
  delay_18B20(4);
          DQ = 1;                //拉高总线准备下一位数据的读取.
 }
  return(dat);                 //返回读到的数据
}

/************************ds18b20写一个字节***********************************/  

void WriteOneChar(unsigned char dat)
{
  unsigned char ij;
  for (i=8; i>0; i--)
  {
   DQ = 0;                //拉低总线产生写信号
        for (j=2;j>0;j--);     //延时4us
  DQ = dat&0x01;         //发送1位
     delay_18B20(5);        //延时75us
  DQ = 1;                //释放总线等待总线恢复
     dat>>=1;               //准备下一位数据的传送
 }
}


/*******************读取ds18b20当前温度,tem中为测得的温度值****************************/

void ReadTemperature(void)
{
unsigned char a=0b=0;
float x;
    signed int t=0;

Init_DS18B20();         //初始化
WriteOneChar(0xCC);     //跳过读序号列号的操作
WriteOneChar(0x44);  //启动温度转换
Init_DS18B20();         //初始化
WriteOneChar(0xCC);  //跳过读序号列号的操作
WriteOneChar(0xBE);  //读取温度寄存器等,前两个就是温度

a=ReadOneChar();     //读取温度值低位
b=ReadOneChar();    //读取温度值高位

t=b;
t=t<<8;
t=t+a;                 //将温度高低位合成
    

if(t<0)                //判断温度t为正还是负
{t=-t;
 x=t*0.0625;           //当前采集温度值除16得实际温度值
     tem=x*10+0.5;         //将温度放大十倍,并精确到小数点后一位

评论

共有 条评论