登录
首页 单片机论坛
回帖 发帖
正文

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

点击:1227 回复:2

本人菜鸟,目前在做一个温度显示并报警的装置,程序烧进去后在面包板上搭好了元件,接通电源后发现复位时数码管显示8888,复位结束后显示02??(后面两位没有显示)。本人怀疑是程序问题,但经多方修改实在不知道如何继续,请高人指教,大谢!附程序:
#include
#include
#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) ;
}
10-08-02 21:25
各位师兄师姐。。。。帮帮忙啊。。。。
10-08-03 08:59
2楼
该帖内容不符合相关规定!
10-08-03 23:40

工控新闻

更多新闻资讯