微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 亲们,能不能帮我运行这些代码看看。关于单片机温度设...

亲们,能不能帮我运行这些代码看看。关于单片机温度设...

时间:10-02 整理:3721RD 点击:

主程序代码为:

#include <reg51.h> //  51系类单片机头文件

#include "LCD1602.h" //包含对1602读写操作的头文件

#include "Delay.h" //延时操作头文件

#include "18B20.h" //包含对18B20操作的头文件

#include<intrins.h>

sbit beep = P3^0; //定义蜂鸣器信号线

sbit led0=P1^0; //定义发光二极管端口

sbit led1=P1^1;

sbit led2=P1^2;

sbit led3=P1^3;

uint warn_l1=250; //定义温度下限值 温度*10

uint warn_l2=220;

uint warn_h1=370;

uint warn_h2=350;

/******************************************************

函数名称:deal(uint t)                                *

* 函数功能:对18B20获取的温度进行相应的处理         *    入口参数:temp                                    *

出口参数:无                                       *

*******************************************************/

void deal(uint t)

{

if((t>warn_l2)&&(t<=warn_l1)) //22~25 度  

{

led0=0;  //第一个闪烁

Delayms(20);

led0=1;

mdi();  //蜂鸣器慢“滴”

}   //模拟开启制热

else if(t<=warn_l2)  // <22 度

{

led0=0;

led1=0;   //第一二灯闪烁

Delayms(10);

led0=1;

led1=1;

kdi(); //蜂鸣器快“滴”

}   //模拟加大制热功率

else if((t>warn_h2)&&(t<=warn_h1))   //35~37度

{

led2=0;  //第三个灯闪烁

Delayms(20);

led2=1;

mdi();   //蜂鸣器慢“滴”

}     //模拟开启制冷

else if(t>=warn_h1) // >37度

{

led2=0;   //第三四个灯闪烁

led3=0;

Delayms(10);

led2=1;

led3=1;

kdi();   //蜂鸣器慢“滴”

}  //模拟加大制冷功率

else

beep=1;  //温度正常

}

/******************************************************

函数名称:display(uint t);                                *

函数功能:显示温度                                    *

入口参数:t                                            *

出口参数:无                                          *

*******************************************************/

void display(uint t)

{

write_com(0x80+12);   //  第一行第13列

write_data(t/100+0x30);  // 十位+0X30转换为字符显示

write_com(0x80+14);

write_data(t%100/10+0x30);

write_com(0x80+15);

write_data(t%10+0x30);

}

/******************************************************

函数名称:main(void);                                 *

*      函数功能:主函数                               *

       入口参数:无                                   *

*      出口参数:无                                   *

*******************************************************/

void main(void)

{

    uchar i = 0;

    uint temp  = 0;

    while(1)

{

    init();    //LCD 初始化

    tempchange();    //温度转换

    _nop_();    //稍作延时

      temp = get_temp();

    deal(temp);   //温度处理

    _nop_();

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

   {

          display(temp());   //温度处理

      }

}  

}

附录1

18B20.H 头文件

#ifndef __18B20_h__    //防止重复定义

#define __18B20_h__

#include<reg51.h>

#include<intrins.h>  

#include"18B20.h"

#include"Delay.h"

extern void dsreset(void);   //函数声明  外部可见

extern void tempwritebyte(uchar dat);

extern bit tempreadbit(void);

extern uchar tempreadbyte(void);

extern void tempchange(void);

extern uint get_temp(void);

#endif  

18B20.C  文件

#include"18B20.h"

sbit beep = P3^0; //定义蜂鸣器信号线

sbit ds =  P2^7;  //定义18B20信号线

static uint temp = 0;

static float f_temp = 0.0;

/**************************************

*      函数名称:dsreset(void)           *

*      函数功能:18B20 初始化         *

*      入口参数:无                   *

*      出口参数:无                   *

***************************************/

void dsreset(void)

{

ds = 1;     //将数据线置高电平

_nop_();    //稍作延时,要尽可能短

ds = 0;     // 拉低数据线

Delayus(40);   //延时

_nop_();

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

Delayus(14);  //延时

ds = 1;    //拉高数据线

}

/********************************************

*      函数名称:temwritebyte(uchar dat)       *

*      函数功能:向18B20写一个字节        *

*      入口参数:dat                        *

*      出口参数:无                        *

********************************************/

void tempwritebyte(uchar dat)

{

uint i;

for(i=0;i<8;i++)  // 一个字节有8位

{

   ds=0;         //将数据线拉低

   _nop_();    //稍作延时,待数据稳定

   ds=dat&0x01;   //低位在前,高位在后

   Delayus(3);   //延时45us

   _nop_();

   _nop_();

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

   dat>>=1;   //左移一位,继续发送下一位

}

}

/**************************************

*      函数名称:tempreadbit(void)       *

*      函数功能:读一位数据           *

*      入口参数:无                   *

*      出口参数:dat                   *

***************************************/

bit tempreadbit(void)

{

uint i = 0;  //定义i,做延时用

bit dat;    //定义一位数据

ds = 0;i++;

ds = 1;i++;i++;

dat = ds;

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

return(dat);  //返回一位数据

}

/**************************************

*      函数名称:tempreadbyte(void)      *

*      函数功能:读一个字节            *

*      入口参数:无                    *

*      出口参数:dat                   *

***************************************/

uchar tempreadbyte(void)

{

  uchar i,j,dat;

  dat=0;

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

  {

   j=tempreadbit();

dat=(j<<7)|(dat>>1);   //读出的数据低位在前,刚好在一个字节dat里

  }

  return(dat);

}

/**************************************

*      函数名称:tempchange(void)      *

*      函数功能:获取18B20温度转换   *

*      入口参数:无                   *

*      出口参数:无                   *

***************************************/

void tempchange(void)

{

dsreset();   //18B20复位

Delayms(1); //稍作延时

tempwritebyte(0xcc);//跳过读ROM指令

tempwritebyte(0x44);//写温度转换指令

}

/****************************************

*      *

*      函数名称:get_temp(void)           *

*      函数功能:获取18B20寄存器中的数据*

*      入口参数:无                      *

*      出口参数:temp                    *

****************************************/

uint get_temp(void)

{

  uchar a,b;

  dsreset();

  Delayms(1);

  tempwritebyte(0xcc);  //跳过ROM

  tempwritebyte(0xbe);  //读暂存器

  a = tempreadbyte();//读低8位

  b = tempreadbyte();//读高8位

  temp = b;

  temp <<= 8;//将两个字节合为一个字

  temp  =  temp|a;

  f_temp = temp*0.0625;//温度在寄存器中为12为,分辨率为0.0625

  temp = f_temp*10+0.5;  //温度修正 四舍五入

  return temp;

}

上一篇:新手入门视频
下一篇:求助程序找错?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top