标题: 求助求助求助 有关温度计的 我是新手 [打印本页]

作者: jj思密达    时间: 2015-10-27 18:27
标题: 求助求助求助 有关温度计的 我是新手
/***************读取DS18B20温度,通共阴数码管显示**************/                                                                                                                                                       
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

code uchar seven_seg[] = {0xFA,0x22,0xB9,0xAB,0x63,0xCB,0xDB,0xA2,0xFB,0xEB};
code uchar seven_bit[] = {0xfe,0xfd,0xfb,0xf7,0xff};///{0x01,0x02,0x04,0x08,0x00};
uint timer;
uint temp;
sbit DQ = P2^0;

void delay(uint x)
{
        while(x--);  
}
void Init_DS18B20(void)
{
        unsigned char x=0;
        DQ = 1;         //DQ复位
        delay(8);       //稍做延时
        DQ = 0;                //单片机将DQ拉低
        delay(80);           //精确延时 大于 480us
        DQ = 1;              //拉高总线
        delay(14);
        x=DQ;                  //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
        delay(20);
}
/******************************从18B20中读一个字节****************************/
uchar Read_OneChar(void)
{
        uchar i = 0;
        uchar dat = 0;
        for (i=8;i>0;i--)
        {
                  DQ = 0;          // 给脉冲信号
                  dat >>= 1;
                  DQ = 1;          // 给脉冲信号
                  if(DQ)
                  dat |= 0x80;
                  delay(8);
        }
        return(dat);
}
/******************************向18B20中写一个字节****************************/
void Write_OneChar(uchar dat)
{
        uchar i=0;
        for (i=8; i>0; i--)
        {
                DQ = 0;
                DQ = dat&0x01;
                delay(10);
                DQ = 1;
                dat >>= 1;
        }
        delay(8);
}
/***********************************读取温度**********************************/
uint Read_Temperature(void)
{
        int t=0;
        float tt=0;               
        uchar temp_L,temp_H;        //温度低8位,和高8位
        EA=0;                                        //关中断,以免意外
        Init_DS18B20();
        Write_OneChar(0xcc);         // 跳过读序号列号的操作
        Write_OneChar(0xbe);         // 读取温度寄存器等(共可读9个寄存器) 前两个就是温度
        temp_L = Read_OneChar();           //读取温度值低位
        temp_H = Read_OneChar();           //读取温度值高位
        Init_DS18B20();

        Write_OneChar(0xcc);         //跳过读序号列号的操作
        Write_OneChar(0x44);         //启动温度转换
       
        t=temp_H;
        t<<=8;
        t=t|temp_L;
        tt=t*0.0625;
        t= tt*10+0.5;
        EA=1;                                    //开中断
        return(t);
}
/********延时函数************/
void delay_time(uint time)
{uint a,b;
for(a=0;a<time;a++)
for(b=0;b<2;b++);
}

/********初始化中断函数************/
void timer0_init(void)         //初始化
{
        TMOD = 0x01;
        TH0 = 0xec;
        TL0 = 0x78;
        TR0 = 1;
        EA  = 1;
        ET0 = 1;
}       
/************************************************************************/
void timer0_isr(void) interrupt 1                  //中断
{

        TH0 = (65535-1000)/256;
        TL0 = (65535-1000)%256;
        timer++;
}
/**********显示函数************/
void display_num(uint num)
{

P3=seven_bit[1];
P1=seven_seg[num/100%10];
delay_time(10);
P1=0;

P3=seven_bit[2];
P1=seven_seg[num/10%10]+0x80;
delay_time(10);
P1=0;

P3=seven_bit[3];
P1=seven_seg[num%10];
delay_time(10);
P1=0;
}

/***********主函数*************/
void main(void)
{
        timer0_init();
        while(1)
{
       
        display_num(temp+1);        //  temp2
       
        if(timer>1000)
        {timer=0;temp=Read_Temperature();}

}
}


6OL(C~}G2BZ~D5]@}AQK)}Q.png (32 KB, 下载次数: 133)

6OL(C~}G2BZ~D5]@}AQK)}Q.png

作者: jj思密达    时间: 2015-10-27 18:28
无法正常显示温度,倒入硬件数码管都不会亮   
作者: wc86110    时间: 2015-11-22 17:19
LZ 还是先弄清楚电路图与程序的关系就不会再犯同样错误。





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1