您现在所在的是:

单片机论坛

回帖:2个,阅读:1196 [上一页] [1] [下一页]
700
crystalh90
文章数:2
年度积分:50
历史总积分:700
注册时间:2010/8/2
发站内信
发表于:2010/8/2 21:25:15
#0楼
本人菜鸟,目前在做一个温度显示并报警的装置,程序烧进去后在面包板上搭好了元件,接通电源后发现复位时数码管显示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) ;
}

700
crystalh90
文章数:2
年度积分:50
历史总积分:700
注册时间:2010/8/2
发站内信
发表于:2010/8/3 8:59:35
#1楼
各位师兄师姐。。。。帮帮忙啊。。。。
699
songliu1
文章数:-1
年度积分:50
历史总积分:699
注册时间:2010/8/3
发站内信
发表于:2010/8/3 23:40:44
#2楼
此楼内容不符合板块规定,不予显示! 查看原帖内容>>

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

62.4004