找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1368|回复: 1
打印 上一主题 下一主题
收起左侧

求大神看一下這段温度显示程序有没有错误

[复制链接]
跳转到指定楼层
楼主
ID:255316 发表于 2017-12-5 22:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<AT89X52.h>
#include<intrins.h>
#define uint unsigned int           
#define uchar unsigned char
uchar max_int=0x00,max_dot=0x00,min_int=0x00,min_dot=0x00;
bit   s=0,s1=0;
                 
#include"ds18b20.h"
#include"keyscan.h"
#include"display.h"
/***********************主函数************************/
void main()
{
         beer=0;
         led=1;
         IT1=1;
         EX1=0;
         EA=1;
         timer1_init(0);
         get_temperature(1);         
         while(1)
         {         
                 keyscan();
                 get_temperature(0);
                 keyscan();
                 display(temp,temp_d*0.625);
                 alarm();
                 keyscan();                          
         }
}   
/********************************************************************
* 程序名;  __ds18b20_h__
*   能: DS18B20c51编程头文件         
* 编程者:ZPZ
* 编程时间:2009/10/2
*   明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d
* (测得的温度小数部分),标志位f(测量温度的标志位‘0’表示正温度”‘1’
* 负温度),标志位f_max(上限温度的标志位‘0’表示正温度1’
* 负温度),标志位f_min(下限温度的标志位‘0’表示正温度1’
* 负温度),标志位w(报警标志位‘1’启动报警0’关闭报警)                  
*********************************************************************/
#ifndef __ds18b20_h__
#define __ds18b20_h__
#define uint unsigned int           
#define uchar unsigned char
sbit    DQ= P2^3;
sbit    beer=P3^0;                                 
sbit    led=P3^1;
uchar   temp=0;                            //温度的整数部分
uchar   temp_d=0;                       //温度的小数部
uchar   n;
bit    f=0,f_max=0,f_min=0;w=0;
/***********************延时子函数************************/
void ds18b20_delayus(uint t)
{
   while(t--);
}
void ds18b20_delayms(uint t)
{
        uint i,j;
        for(i=t;i>0;i--)
            for(j=120;j>0;j--);
}
/******************ds18b20初始化函数*********((*********/
void ds18b20_init()                                        // DS18B20初始化
{
        DQ=1;
        DQ=0;                                                    //控制器向DS18B20发低电平脉冲
        ds18b20_delayus(30);                    //延时480μs
        DQ=1;                                                        //控制器拉高总线,
        while(DQ);                                                   //等待DS18B20拉低总线,在60-240μs之间
        ds18b20_delayus(20);                        //延时,等待上拉电阻拉高总线
        DQ=1;                                                        //提升数据线,准备数据传输;
}
/******************ds18b20字节读函数******************/
uchar ds18b20_read()                                       //DS18B20 字节读取
{
        uchar i;
        uchar d = 0;
        DQ = 1;                                                        //准备读;
        for(i=8;i>0;i--)
        {       
            d >>= 1;                    //低位先发;
                DQ = 0;                                                                       
                _nop_();
                _nop_();
                _nop_();                               
                DQ = 1;                                                //必须写1,否则读出来的将是不预期的数据;
                if(DQ)                                                //12us处读取数据;
                        d |= 0x80;
                ds18b20_delayus(10);               
                }
        return d;       
}
/******************ds18b20字节写函数******************/
void ds18b20_write(uchar d)                                // ds18b20字节写
{
     uchar  i;
     for(i=8;i>0;i--)
     {        
                  DQ=0;
                  _nop_();
                  _nop_();
                  _nop_();
                  DQ=d&0x01;
                  ds18b20_delayus(5);
                  DQ=1;       
                  d >>= 1;         
     }
}
/*********************获取温度函数**********************/
void get_temperature(bit f)                                            //得到整数的温度值
{
        uchar a=0,b=0,c=0,d=0;
    uint i;
        ds18b20_init();                                              //DS18B20初始化
        ds18b20_write(0xcc);                                        //DS18B20SKIP ROM命令
        ds18b20_write(0x44);                                        //启动DS18B20进行温度转换,结果存入内部RAM
        ds18b20_delayms(1);
        ds18b20_init();                                        //DS18B20初始化
        ds18b20_write(0xcc);                                         //DS18B20SKIP ROM命令
        ds18b20_write(0xbe);                                        //读内部RAM9字节的内容命令
        a=ds18b20_read();                                        //读内部RAM LSB
        b=ds18b20_read();                                        //读内部RAM MSB
        if(f==1)
        {
            max_int=ds18b20_read();                                        //读内部RAM LSB
            min_int=ds18b20_read();
               
        }
        if((max_int&0x80)==0x80)
        {f_max=1;max_int=(max_int-0x80);}
         if((min_int&0x80)==0x80)
        {f_min=1;min_int=(min_int-0x80);}
                
        i=b;
        i>>=4;
        if (i==0)
                {
        f=0;                                            //i0,正温度,设立正温度标记
        temp=((a>>4)|(b<<4));                //整数部分
               a=(a&0x0f);
               temp_d=a;                                        //小数部分
                }
        else
                {
               f=1;                                            //i1,负温度,设立负温度标记
               a=~a+1;
               b=~b;
               temp=((a>>4)|(b<<4));                                        //整数部分
               a=(a&0x0f);                                        //小数部分
               temp_d=a;
            }
}
void store_t()
{
        if(f_max==1)
        max_int=max_int+0x80;
        if(f_min==1)
        min_int=min_int+0x80;
        ds18b20_init();                                        //DS18B20初始化
        ds18b20_write(0xcc);                                         //DS18B20SKIP ROM命令
        ds18b20_write(0x4e);
        ds18b20_write(max_int);
        ds18b20_write(min_int);
        ds18b20_write(0xff);
        ds18b20_init();                                        //DS18B20初始化
        ds18b20_write(0xcc);                                         //DS18B20SKIP ROM命令
        ds18b20_write(0x48);
}
/**********************温度超限报警函数***********************/
void alarm()
{
          if(f_max==0)
          {
             if(f_min==0)
                 {
                         if(f==0)
                         {
                                 if((temp+temp_d*0.0625)<=min_int||(temp+temp_d*0.0625)>=max_int)
                                 {w=1;TR1=1;}
                                 if((temp+temp_d*0.0625)<max_int&&(temp+temp_d*0.0625)>min_int)
                                 {w=0;}
                         }
                         if(f==1){w=1;TR1=1;}
                 }
             if(f_min==1)
                 {
                          if(f==0)
                         {
                                 if((temp+temp_d*0.0625)>=max_int)
                                 {w=1;TR1=1;}
                                 if((temp+temp_d*0.0625)<max_int )
                                 {w=0;}
                         }
                         if(f==1)
                         {
                                 if((temp+temp_d*0.0625)>=min_int)
                                 {w=1;TR1=1;}
                                 if((temp+temp_d*0.0625)<min_int )
                                 {w=0;}
                         }
                 }
          }
          if(f_max==1)
          {
             if(f_min==1)
                 {
                         if(f==1)
                         {
                                 if((temp+temp_d*0.0625)<=max_int||(temp+temp_d*0.0625)>=min_int)
                                 {w=1;TR1=1;}
                                 if((temp+temp_d*0.0625)<min_int&&(temp+temp_d*0.0625)>max_int)
                                 {w=0;}
                         }
                         if(f==0){w=1;TR1=1;}
                 }
          }          
}
#endif
/**********************************************************************
* 程序名;   __keyscan_H__
*   能:  ds18b20键盘头文件,通过键盘设定设定上下限报警温度
* 编程者:ZPZ
* 编程时间:2009/10/2   
**********************************************************************/
#ifndef __keyscan_H__
#define __keyscan_H__
               
sbit key1=P2^2;                                  
sbit key2=P2^1;                                 
sbit key3=P2^0;
sbit key4=P3^3;
uchar a=0,i=0;
bit          k4=0,v=0,v1=0,v2=0;
/***************************读键盘延时子函数**************************/
void keyscan_delay(uint z)
{
  uint i,j;
  for(i=z;i>0;i--)
        for(j=120;j>0;j--);
}
/****************************温度调节函数******************************/
int temp_change(int count,bit f)
{
    if(key2==0)
        {
                keyscan_delay(10);
                if(key2==0)
                {                  
                   if(f==0)
                   {  
                      count++;
                      if(a==1){if(count>125) count=125;}
                          if(a==2){if(count>125) count=125;}
                   }
                   if(f!=0)
                   {                     
                          count++;
                          if(a==1){if(count>55) count=55;}
                          if(a==2){if(count>55) count=55;}
                   }
                }
                while(key2==0);
                keyscan_delay(10);
       
        }
        if(key3==0)
        {
                keyscan_delay(10);
                if(key3==0)
                {
                           count--;
                        if(a==1){if(count<0) count=0;}
                        if(a==2){if(count<0) count=0;}       
                }
                while(key3==0);
                keyscan_delay(10);
       
        }
        return count;
}
/*****************************读键盘函数******************************/
void keyscan()
{
        if(key1==0)
        {
                keyscan_delay(10);
                if(key1==0)
                {
                   TR1=1;                  
                   k4=1;
                   v=1;
                   i++;                  
                   if(i>2){i=0;TR1=0;k4=0;v=0;store_t();get_temperature(1);}                  
                   switch(i)
                   {
                       case 0:a=0;break;
                           case 1:a=1;break;
                           case 2:a=2;break;
                          
                           default:break;
                   }
                          
                }
                while(key1==0);
                keyscan_delay(10);
               
        }
        if(a==1&&v==1)       
        {led=0;max_int=temp_change(max_int,f_max);}
        else if(a==2&&v==1)
        {led=1;min_int=temp_change(min_int,f_min);}
        else;
        if(k4==1)
        {
                if(key4==0)
                {
                        keyscan_delay(5);
                        if(key4==0)
                        {
                           if(a==1)
                           {if(max_int>55) f_max=0;else f_max=~f_max;}
                           if(a==2)
                           {if(min_int>55) f_max=0;else f_min=~f_min;}                                  
                        }
                        while(key4==0);
                        keyscan_delay(10);
                }
        }
       
        if(v==0)
        {
                if(key2==0)
                {
                        keyscan_delay(10);
                        if(key2==0)
                        {
                           a=1;
                           TR1=1;
                           s1=1;                          
                        }
                        while(key2==0);
                        keyscan_delay(10);
                       
                }
                if(key3==0)
                {
                        keyscan_delay(10);
                        if(key3==0)
                        {
                           a=2;
                           TR1=1;
                           s1=1;                                                             
                        }
                        while(key3==0);
                        keyscan_delay(10);
                       
                }
                if(v1==1)
                {a=0;v1=0;TR1=0;}
               
        }        
}
#endif
/**********************************************************************
* 程序名;   __ds18b20_display_H__
*   能:  ds18b20数码管动态显示头文件,通过定时器0延时实现数码管动态显示
* 编程者:ZPZ
* 编程时间:2009/10/2   
**********************************************************************/
#ifndef __ds18b20_display_H__
#define __ds18b20_display_H__
#define uint unsigned int           
#define uchar unsigned char
sbit wei1=P2^4;                                 
sbit wei2=P2^5;                                 
sbit wei3=P2^6;                                  
sbit wei4=P2^7;
uchar num=0;
uchar code temperature1[]={ 0x3f,0x06,0x5b,0x4f,0x66,
                           0x6d,0x7d,0x07,0x7f,0x6f};
uchar code temperature2[]={ 0xbf,0x86,0xdb,0xcf,0xe6,
                           0xed,0xfd,0x87,0xff,0xef};
uchar code temperature3[]={ 0x00,0x80,0x40,0x76,0x38};
/***********************延时子函数************************/
void display_delay(uint t)
{
        uint i,j;
        for(i=t;i>0;i--)
            for(j=20;j>0;j--);
}
/**************************定时器1初始化函数***************************/
void timer1_init(bit t)
{
    TMOD=0x10;
    TH0=0x3c;
    TL0=0xb0;
    EA=1;
    ET1=1;
    TR1=t;       
}
/**************************定时器1中断函数*****************************/
void timer1() interrupt 3
{
    TH0=0x3c;
    TL0=0xb0;
        num++;
    if(num<5) {s=1;if(w==1){beer=1;led=1;}else{beer=1;led=1;}}
        else      {s=0;if(w==1){beer=0;led=0;}else{beer=1;led=1;}}
        if(num>25)
    {
           num=0;
           s1=0;
           v1=1;
    }
       
}
/***********************调节选择函数************************/
void  selsct_1(uchar f,uchar k)
{
      if(f==0)
          {
                  if(k/100==0)  P0=temperature3[0];
                  else          P0=temperature1[k/100];
          }
          if(f==1)
          {
              if(k%100/10==0)   P0=temperature3[0];
                  else              P0=temperature3[2];
          }
}
void  selsct_2(bit f,uchar k)
{
      if(f==0)
          {
                  if((k/100==0)&&(k%100/10==0))  
                      P0=temperature3[0];
                  else          P0=temperature1[k%100/10];
          }
          if(f==1)
          {
              if(k%100/10==0)   P0=temperature3[2];
                  else               P0=temperature1[k%100/10];
          }               
}
/***********************显示函数************************/
void display(uchar t,uchar t_d)
{
   uchar i;
   for(i=0;i<4;i++)           
   {                  
       switch(i)
           {
              case 0:
                  
                  if(a==0){selsct_1(f,t);}
                  if(a==1)
                  {                      
                      if(s==0) selsct_1(f_max,max_int);
                      else P0=temperature3[0];
                      if(s1==1) selsct_1(f_max,max_int);             
                  }
                  if(a==2)
                  {                       
                      if(s==0) selsct_1(f_min,min_int);
                      else P0=temperature3[0];
                      if(s1==1) selsct_1(f_min,min_int);     
                  }                                          
                  wei2=0;
                  wei3=0;
                  wei4=0;                  
              wei1=1;                                                    
                  break;
              case 1:
                  if(a==0){selsct_2(f,t);}
                  if(a==1)
                  {  
                      if(s==0) selsct_2(f_max,max_int);
                          else P0=temperature3[0];
                          if(s1==1) selsct_2(f_max,max_int);
                  }
                  if(a==2)
                  {  
                      if(s==0) selsct_2(f_min,min_int);
                          else P0=temperature3[0];
                          if(s1==1) selsct_2(f_min,min_int);
                  }                          
                  wei1=0;                  
                  wei3=0;
                  wei4=0;                  
              wei2=1;                                                    
                  break;
              case 2:
                  if(a==0){P0=temperature2[t%10];}
                  if(a==1)
                  {
                      if(s==0) P0=temperature2[max_int%10];
                          else P0=temperature3[0];
                          if(s1==1) P0=temperature2[max_int%10];
                  }
                  if(a==2)
                  {
                      if(s==0) P0=temperature2[min_int%10];
                          else P0=temperature3[0];
                          if(s1==1) P0=temperature2[min_int%10];
                  }                                  
                  wei1=0;
                  wei2=0;                  
                  wei4=0;                  
              wei3=1;                                                    
                  break;
              case 3:
                  if(a==0){P0=temperature1[t_d];}
                  if(a==1)
                  {
                               if(s==0)
                                P0=temperature1[0];
                                else P0=temperature3[0];
                                if(s1==1)  P0=temperature1[0];
                  }
                  if(a==2)
                  {
                             if(s==0)
                                P0=temperature1[0];
                                else P0=temperature3[0];
                                if(s1==1)  P0=temperature1[0];
                  }                                                       
                  wei1=0;                 
                  wei2=0;                  
                  wei3=0;
                  wei4=1;                                                                  
                  break;                  
           }
         display_delay(16);
        }
       
}
#endif

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:258164 发表于 2017-12-6 15:53 | 只看该作者
这么长的程序,没几个人会看的,你还是直接说遇到什么问题吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表