haoDIY创好电子音响电脑科技DIY小制作发明移动版

主页 > 电子DIY > 单片机 >

DS18B20单片机温度计测量、报警系统的设计 附视频(2)


    默认上限报警温度为38℃、默认下限报警温度为5℃
    报警值可设置范围:最低上限报警值等于当前下限报警值
    最高下限报警值等于当前上限报警值
    将下限报警值调为0时为关闭下限报警功能    
编    写:JiangX.net
最后更新:09/04/16晚于寝室
******************************************************************/
#include <AT89X52.h>
#include "DS18B20.h"   
#define uint unsigned int
#define uchar unsigned char   //宏定义
#define SET  P3_1    //定义调整键
#define DEC  P3_2    //定义减少键
#define ADD  P3_3    //定义增加键
#define BEEP P3_7    //定义蜂鸣器
bit shanshuo_st;    //闪烁间隔标志
bit beep_st;     //蜂鸣器间隔标志
sbit DIAN = P2^7;        //小数点
uchar x=0;      //计数器
signed char m;     //温度值全局变量
uchar n;      //温度值全局变量
uchar set_st=0;     //状态标志
signed char shangxian=38;  //上限报警温度,默认值为38
signed char xiaxian=5;   //下限报警温度,默认值为38
uchar code  LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};

/*****延时子程序*****/
void Delay(uint num)
{
 while( --num );
}

/*****初始化定时器0*****/
void InitTimer(void)
{
  TMOD=0x1;
  TH0=0x3c;
  TL0=0xb0;     //50ms(晶振12M)
}

/*****定时器0中断服务程序*****/
void timer0(void) interrupt 1
{
 TH0=0x3c;
 TL0=0xb0;
 x++;
}

/*****外部中断0服务程序*****/
void int0(void) interrupt 0
{
 
 EX0=0;      //关外部中断0
 if(DEC==0&&set_st==1)
 {
  shangxian--;
  if(shangxian<xiaxian)shangxian=xiaxian;
 }
 else if(DEC==0&&set_st==2)
 {
  xiaxian--;
  if(xiaxian<0)xiaxian=0;
 }
}

/*****外部中断1服务程序*****/
void int1(void) interrupt 2
{
 EX1=0;      //关外部中断1
 if(ADD==0&&set_st==1)
 {
  shangxian++;
  if(shangxian>99)shangxian=99;
 }
 else if(ADD==0&&set_st==2)
 {
  xiaxian++;
  if(xiaxian>shangxian)xiaxian=shangxian;
 }  
}

/*****读取温度*****/
void check_wendu(void)
{
 uint a,b,c;
 c=ReadTemperature()-5;  //获取温度值并减去DS18B20的温漂误差
 a=c/100;     //计算得到十位数字
 b=c/10-a*10;    //计算得到个位数字
 m=c/10;      //计算得到整数位
 n=c-a*100-b*10;    //计算得到小数位
 if(m<0){m=0;n=0;}   //设置温度显示上限
 if(m>99){m=99;n=9;}   //设置温度显示上限    
}

/*****显示开机初始化等待画面*****/
Disp_init()    
{
 P2 = 0xbf;      //显示-
 P1 = 0xf7;
 Delay(200);
 P1 = 0xfb;
 Delay(200);   
 P1 = 0xfd;
 Delay(200);
 P1 = 0xfe;
 Delay(200);

 P1 = 0xff;         //关闭显示
}

/*****显示温度子程序*****/
Disp_Temperature()     //显示温度
{
 P2 =0xc6;      //显示C
 P1 = 0xf7;
 Delay(300);

 P2 =LEDData[n];    //显示个位 (责任编辑:admin)

haoDIY创好电子 版权所有,电话微信13977534587