打印
[51单片机]

哪位大神帮看看,为什么temp总等于0xffff?这是用学习板写的

[复制链接]
2142|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qaz411140525|  楼主 | 2013-8-21 07:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qaz411140525 于 2013-8-21 16:05 编辑

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit DQ=P2^2;   //温度数据
uint temp;
float ftemp;        float tt;
uchar timecount;
uchar tflag,sflag;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                                0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,};
void delay(uint x)
{
        while(x--);
}
/*
delay(1)          延时 7us
delay(7)          延时63us
delay(100)         延时 611us
*/
void delay1(uint x)
{
        uint i,j;
        for(i=x;i>0;i--)
                for(j=110;j>0;j--);
}

void init_18b20()
{
        uint i;
        i=3000;
        DQ = 1;
        delay(1);         
        DQ = 0;              
        delay(100);         
        DQ=1;
        while(DQ==0&&i>0) i--;
        delay(80);
        DQ=1;
}

//读字节
uchar readonebyte( )
{
        bit flag = 0;        
        
        uchar i = 0, temp2 = 0;
        
        for(i = 0; i < 8; i++)
        {        
                temp2=temp2>>1;
                DQ=1;
                _nop_();
                DQ = 0;
                delay(1);        
                DQ = 1;                        
                delay(1);               
                flag = DQ;               
                if(flag == 1)
                        temp2= temp2|0x80;
                delay(7);               

                DQ = 1;                        
                _nop_();               
                _nop_();
        }

        return temp2;
}


//写字节
void writeonebyte(uchar date)
{
        uchar temp1= 0, i = 0;

        temp1= date;

        for(i = 0; i < 8; i++)
        {
                DQ = 0
                delay(2);                  
                DQ = temp1 & 0x01;  
                delay(7);                  
                DQ = 1;                           
                temp1= temp1>>1;
        }
}

void readtemp()
{
        uchar a=0,b=0;

        init_18b20();
        writeonebyte(0xcc);
        writeonebyte(0x44);
        delay1(1000);
        init_18b20();
        writeonebyte(0xcc);
        writeonebyte(0xbe);
        
        a=readonebyte();
        delay1(5);
        b=readonebyte();
        temp=b;
        temp<<=8;
        temp=temp|a;
        tt=temp*0.0625;
        temp=tt*10+0.5;

}


void display(uint temp)                        //显示程序
{
        dula=1;
        P0=table[temp/1000];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfe;
        wela=0;
        delay(5);
        
       dula=1;
        P0=table[temp%100/10+10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfd;
        wela=0;
        delay(5);

        dula=1;
        P0=table[temp%100%10];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfb;
        wela=0;
        delay(5);
}

void main()
{
        while(1)
        {
                readtemp();
                display(temp);
        }
}

相关帖子

沙发
浅唱246| | 2013-8-23 23:16 | 只看该作者
数据溢出

使用特权

评论回复
板凳
qaz411140525|  楼主 | 2013-8-24 07:45 | 只看该作者
浅唱246 发表于 2013-8-23 23:16
数据溢出

怎么溢出了,那个数据啊

使用特权

评论回复
地板
liwei12400| | 2013-8-24 14:07 | 只看该作者
DS18B20时序要求还是挺严格的。最好看看晶振,看看时序图,再来看程序

使用特权

评论回复
5
wes7856863| | 2013-8-24 15:29 | 只看该作者
我写的12单片机显示温度··你试试·· 12864显示温度12单片机.zip (38.18 KB)

使用特权

评论回复
6
xiaoliping1945| | 2013-8-24 21:03 | 只看该作者
你看你用的什么单片机,这个时序要求鼻尖严格,延时液要求高,随便加的延时不得行,如果用的STc,你在KEIL软件里添加STC的MCU仿真,把时间调准一点,

使用特权

评论回复
7
820557114| | 2013-8-27 12:13 | 只看该作者
/*
时间:2013年08月23日。17:02(316)
用12864显示ds18b20的温度。
*/

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
//**********************************
//12864的操作
sbit en = P3^4;//位声明  
sbit rs = P3^5;
sbit rw = P3^6;
sbit psb = P3^7;
sbit dula = P2^6;//
sbit wela =P2^7;//
sbit DQ =P2^2;//
int temper = 0;

void delayms(uint z)//延时函数
{
      uint i,j;
      for(i  = z;i>0;i--)
      for(j  = 110;j>0;j--);
}
        
        void write_command(uchar com)//写指令子函数
        {
   
                 rs = 0;//
          rw = 0;
          en=0;   
                P0= com;//
                 delayms(5);//延时
                 en = 1;//
                 delayms(5);//
                 en = 0;
       }
      
       void write_data(uchar date)
        {
                              rs = 1;//
                       rw = 0;
                       en=0;
                       P0= date;//
                             delayms(5);//
                            en = 1;//
                              delayms(5);//
                            en = 0;//
   
        }
        
   void init()//
   {
      psb = 1;  
             write_command(0x30);//
      delayms(5);
             write_command(0x0c);//开显示。不显示光标。光标不闪烁
      delayms(5);
      write_command(0x01);//数据指针清零
      delayms(5);
   }

   void write_xy(uchar address,uchar dat)
   {
   write_command(0x80 + address);
   write_data( dat);
      
   }
//*************************************
//*****************************************
//18b20的操作
void delay(uint time)
{
uint i,j;
for(i = 0;i<time;i++)
   for(j = 0;j<1;j++);

}

uchar reset() //复位
{
  uchar prense;
  DQ = 0;
  delay(29);
  DQ = 1;
  delay(3);
  prense = DQ;
  delay(25);
  return (prense);

}

uchar read_bit() //        读一位
{
  uchar i;
DQ = 0;
DQ = 1;
for(i = 0;i < 3;i++);
return (DQ);

}

void write_bit(uchar dat)//         写一位
{                                                  
  DQ = 0;
  if(dat == 1)
     DQ = 1;
         delay(5);
         DQ = 1;
}


uchar read_byte()  //  读一个字节
{
  uchar dat = 0;
  uchar i;
  for(i = 0;i < 8;i++)
   {
     if(read_bit())
              dat|=0x01<<i;
           delay(1);
   }

   return (dat);
}

void write_byte(uchar dat) // 写一个字节
{
  uchar i,j;
  for(i = 0;i < 8;i++)
     {
           j =( (dat>>i)&0x01 );
           write_bit(j);
           delay(1);
         }
}

int read_temp()           // 温度转换
{
   uchar templ,temph;
   int temp;
   reset();
   write_byte(0xcc);
   write_byte(0x44);
   delay(100000);
   reset();
   write_byte(0xcc);
   write_byte(0xbe);
   templ = read_byte();
   temph = read_byte();
   temp = templ+temph*256;
   return (temp);

}

void main()   //
{
   
          
    wela  = 0;
    dula = 0;
    delayms(10);
    init();//

   while(1)
   {
            temper = read_temp(); //

         if(temper < 0)
         {
           write_xy(0,'-');
           temper = 0 - temper;
         }
   
            else
           write_xy(0,'+');

           write_xy(1,(temper>>4)/100+0x30);
              write_xy(2,(temper>>4)%100/10+0x30);
           write_xy(3,(temper>>4)%10+0x30);
           write_xy(4,'.');
           write_xy(5, ((temper&0x000f) *62.5)/100+0x30);
           write_xy(6,'C');
   }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

11

帖子

0

粉丝