微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > 新手求助:DS18B20+AT89C51+四位共阴数码管+LED/蜂鸣器报警

新手求助:DS18B20+AT89C51+四位共阴数码管+LED/蜂鸣器报警

时间:10-02 整理:3721RD 点击:
本人菜鸟,目前在做一个温度显示并报警的装置,程序烧进去后在面包板上搭好了元件,接通电源后发现复位时数码管显示8888,复位结束后显示02?(后面两位没有显示)。本人怀疑是程序问题,但经多方修改实在不知道如何继续,请高人指教,大谢!附程序:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

//*定义*//
   
sbit Warn_light = P1^3;  // P1.3为报警LED灯输入口
sbit Warn_sound = P1^4;  // P1.4为蜂鸣器输入口
sbit DQ = P3^7;          //定义DS18B20端口DQ
uint TempH,TempL;
uint temp;
bit presence;

uint data  temp_data[2] = {0x0000,0x0000} ;   //温度数据缓存
uchar data  dis_data[5]={0,0,0,0,0};           //温度值百十个小数位及一个数据缓存

uchar code  ditab[16] = {0x3F,0x06,0x06,0x5B,0x4F,0x4F,0x66,0x66,
                                 0x6D,0x7D,0x7D,0x07,0x7F,0x7F,0x6F,0x6F};
                                                         //温度小数部分查表
uchar code  LEDtab[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
                                                      //数码管0到9的显示代码
uchar code  DS18B20_GOODtab[4] = {0x7D,0x3F,0x3F,0x5E}; //DS18B20正常时数码管的显示代码
uchar code  DS18B20_BADtab[3]  = {0x7C,0x77,0x5E};      //DS18B20非正常时数码管的显示代码


void LEDDelay(void) //LED选通延时函数
{uint num;
for(num = 0; num<=800; num++);
}

//*数码管显示函数*//

LED_Display(uchar bai, uchar shi, uchar ge, uchar fen)
{
  if (bai!=0)
   { P2 = 0x01 ;       //如果百位不为0,则选通百位数码管并显示百位
     P0 = bai;
     LEDDelay();
     P2 <<=1 ;         //选通十位数码管并显示十位
     P0 = shi ;
     LEDDelay();
   }
  else
   { if (shi != 0)          //如果百位为0,则跳过百位,判断十位是否为0
      { P2=0x02 ;
        P0= shi ;
        LEDDelay() ;}   //如果十位不为0,则选通十位并显示
     else
       {P2 = 0x04 ;
        P0= ge ;
        LEDDelay() ;   //如果十位为0,则直接选通个位并显示
        P2<<= 1 ;
        P0= fen ;
        LEDDelay() ;}     //选通十分位并显示
}
}


//*DS18B20相关函数定义*//
void delay(unsigned int i)//延时函数
{
while(i--);
}

bit Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;    //DQ复位
delay(8);  //稍做延时
DQ = 0;    //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1;    //拉高总线
delay(10);
x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(5);
return(x);
}

unsigned char ReadOneChar(void)
{
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(5);
}
return(dat);
}

void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
  DQ = 0;
  DQ = dat&0x01;
  delay(5);
  DQ = 1;
  dat>>=1;
}
delay(5);
}

unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();   //低位
b=ReadOneChar();   //高位

b<<=8;
t=a+b;

return(t);
}



TemperatureDisplay()        //温度数据转换和显示函数
{ temp = Readtemperature();
  TempH = temp>>4;
  TempL = temp&0x0F;
  dis_data[3]=ditab[TempL] ;           //查表得小数位的值
   
  dis_data[2]=LEDtab[(TempH%100)%10]|0x80 ;                   //个位
  dis_data[1]=LEDtab[(TempH%100)/10] ;                            //十位
  dis_data[0]=LEDtab[TempH/100] ;                           //百位

  LED_Display(dis_data[0], dis_data[1], dis_data[2],dis_data[3]) ; //显示温度
}

void  DS18B20_GOOD()           //DS18B20 OK 菜单显示函数
{ uchar i = 0 ;
  uchar j = 0 ;
  P2= 0x01  ;

  for(i=0;i<4;i++)
  {
   P0= DS18B20_GOODtab[j];
   LEDDelay(); ;
   P2<<=1;
   j++;
  }
}

void  DS18B20_BAD ()      //DS18B20 ERROR 菜单显示函数
{
  uchar i = 0 ;
  uchar j = 0 ;
  P2 = 0x01 ;
  
  for(i=0;i<3;i++)
  {
  P0= DS18B20_BADtab[j];
  LEDDelay(); ;
  P2<<=1;
  j++;
  }
}

void LED_Init ()    //检查LED数码管是否正常
{
  P2 = 0x0F ;
  P0 = 0xFF ;
  LEDDelay(); ;
  P2 = 0x00 ;
  P0 = 0X00 ;  
  LEDDelay(); ;      
}

//*报警函数*//
void WarnFans()
{  uint Temperature = temp*0.0625;
    if( Temperature<50)                                        //当温度50度以下时,不报警
       {
         delay(100) ;
         Warn_light = 1 ;
         Warn_sound = 1 ;                  
       }     
    else                                                 //当温度50度以上时,报警 LED亮 蜂鸣器响
       {     
         delay(100) ;
         Warn_light = 0 ;
         Warn_sound = 0 ;        
        }     
}


//*主函数*//
void main()          
{ LED_Init () ;
  DS18B20_GOOD () ;
  presence = Init_DS18B20();
    do
    { TemperatureDisplay() ;
      WarnFans(); }
    while(!presence)  ;

  DS18B20_BAD () ;

    do
    { DS18B20_Init() ; }
    while(presence) ;
}

我没看明白。

小数部分查表好像有问题,还有延时程序要特别注意

不明白

这是天书 啊

真拙的程序看不懂

帖子有点乱!看不了呀!

                                                

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

网站地图

Top