打印
[PIC®/AVR®/dsPIC®产品]

哪位大神帮看看,为什么temp总等于0xffff?

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

////////////这是51单片机学习板上写的程序///////////////////
#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);
        }
}

        
沙发
huangxz| | 2013-8-20 14:57 | 只看该作者
这个貌似51的哦。

使用特权

评论回复
板凳
qaz411140525|  楼主 | 2013-8-20 15:22 | 只看该作者
huangxz 发表于 2013-8-20 14:57
这个貌似51的哦。

是啊,帮看看呗

使用特权

评论回复
地板
yklstudent| | 2013-8-20 20:37 | 只看该作者
PIC的读写方向需要设置的

使用特权

评论回复
5
qaz411140525|  楼主 | 2013-8-21 07:11 | 只看该作者
yklstudent 发表于 2013-8-20 20:37
PIC的读写方向需要设置的

我是刚开始学单片机的,这是51程序

使用特权

评论回复
6
yewuyi| | 2013-8-21 08:44 | 只看该作者
你跑PIC版面发51,你这不就是典型的砸场子吗?


另外,大神都很忙,没有时间来看这段似是而非让人抓狂的代码。

使用特权

评论回复
7
qaz411140525|  楼主 | 2013-8-21 13:40 | 只看该作者
yewuyi 发表于 2013-8-21 08:44
你跑PIC版面发51,你这不就是典型的砸场子吗?

不好意思,我在51那也发了,没回答,所以来这看看。版主请谅解啊

使用特权

评论回复
8
taoyuruo| | 2013-8-21 15:25 | 只看该作者
程序问题挺多的,void display(uint temp1)里面使用的参数temp1,怎么又变成temp,得到温度应该是tt,怎么显示temp值,然后你怎么晓得的temp值一直是0xffff呢?

使用特权

评论回复
9
52xiaoer| | 2013-8-21 15:54 | 只看该作者
readonebyte( )函数中flag变量貌似恒为一;

使用特权

评论回复
10
qaz411140525|  楼主 | 2013-8-21 16:01 | 只看该作者
52xiaoer 发表于 2013-8-21 15:54
readonebyte( )函数中flag变量貌似恒为一;

为什么这么说

使用特权

评论回复
11
52xiaoer| | 2013-8-22 11:18 | 只看该作者
qaz411140525 发表于 2013-8-21 16:01
为什么这么说

DQ = 1;                        
delay(1);               
flag = DQ;
前面的这几条语句,难道DQ在中间有输入????

使用特权

评论回复
12
52xiaoer| | 2013-8-22 11:31 | 只看该作者
52xiaoer 发表于 2013-8-22 11:18
DQ = 1;                        
delay(1);               
flag = DQ;

哦,我看错了,DQ是双向IO,但你要确保延时足够长,确保DQ有数据返回!

使用特权

评论回复
13
52xiaoer| | 2013-8-22 11:38 | 只看该作者
display(temp);后最好清0,
///////////////////////////////////////////////////////
a=readonebyte();
        delay1(5);
        b=readonebyte();
最好先看看读回的a,b值是否正确,记住一句话“程序不是写出来的,而是找错误找出来的”!

使用特权

评论回复
14
dao_h| | 2013-8-22 11:39 | 只看该作者
tt=temp*0.0625;
改成:tt=((float)temp)*0.0625;
试试。还应该在头文件中包含浮点库。

使用特权

评论回复
15
qaz411140525|  楼主 | 2013-8-22 12:58 | 只看该作者
dao_h 发表于 2013-8-22 11:39
tt=temp*0.0625;
改成:tt=((float)temp)*0.0625;
试试。还应该在头文件中包含浮点库。 ...

我试过了,不是这方面问题

使用特权

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

本版积分规则

5

主题

11

帖子

0

粉丝