找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1687|回复: 1
打印 上一主题 下一主题
收起左侧

求大神看一下哪里出了问题。18b20

[复制链接]
跳转到指定楼层
楼主
ID:319802 发表于 2018-5-1 13:19 来自触屏版 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<regx52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit a1=P2^2;
sbit b1=P2^3;
sbit c1=P2^4;
uchar DisplayData[5];
void Delay1ms(uint y)
{
        uint x;
        for( ; y>0; y--)
        {
                for(x=110; x>0; x--);
        }
}
uchar code LEDcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(uint x)
{
        while(x--);
}
void display()
{
        uchar i;
for(i=0;i<5;i++)
{
switch(i)
{
        case 0:a1=0;b1=0;c1=0;break;
        case 1:a1=1;b1=0;c1=0;break;
        case 2:a1=0;b1=1;c1=0;break;
        case 3:a1=1;b1=1;c1=0;break;
        case 4:a1=0;b1=0;c1=1;break;
}
P0=DisplayData[i];
delay(100);
P0=0x00;
}
}

sbit ds18b20=P3^7;
void rest()
{
        uchar  i;
        ds18b20=0;
        i=70;       
        while(i--);
        ds18b20=1;
        while(ds18b20);
        i=50;
        while(i--);
}
void writeds18b20(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                uchar i;
                ds18b20=0;
                _nop_();_nop_();
                ds18b20=dat&0x01;
                dat>>=1;
                i=6;
                while(i--);
                ds18b20=1;
                _nop_();
        }
}
uchar readds18b20()
        {
                uchar bi,i,a;
                for(i=0;i<8;i++)
                {
                ds18b20=0;
                _nop_();_nop_();
                        ds18b20=1;
                        i++;
                        i++;
                        a=ds18b20;
                 bi=(bi>>1)|(a<<7);
                                i = 4;       
                while(i--);
                }
                return bi;
        }
        void  Ds18b20ChangTemp()
{
        rest();
        Delay1ms(1);
        writeds18b20(0xcc);                //跳过ROM操作命令                 
        writeds18b20(0x44);            //温度转换命令
        //Delay1ms(100);        //等待转换成功,而如果你是一直刷着的话,就不用这个延时了
   
}
void  Ds18b20ReadTempCom()
{       

        rest();
        Delay1ms(1);
        writeds18b20(0xcc);         //跳过ROM操作命令
        writeds18b20(0xbe);         //发送读取温度命令
}
uint Ds18b20ReadTemp()
{
        uint temp = 0;
        uchar tmh, tml;
        Ds18b20ChangTemp();                                 //先写入转换命令
        Ds18b20ReadTempCom();                        //然后等待转换完后发送读取温度命令
        tml = readds18b20();                //读取温度值共16位,先读低字节
        tmh =readds18b20();                //再读高字节
        temp = tmh;
        temp <<= 8;
        temp |= tml;
        return temp;
}
void datapros(uint temp)          
{
                temp=temp*0.0625;       
        DisplayData[0] = ~LEDcode[temp / 10000];
        DisplayData[1] = ~LEDcode[temp % 10000 / 1000];
        DisplayData[2] = ~LEDcode[temp % 1000 / 100] | 0x80;
        DisplayData[3] = ~LEDcode[temp % 100 / 10];
        DisplayData[4] = ~LEDcode[temp % 10];
}
main()
{
while(1)
{
datapros(Ds18b20ReadTemp());
display();       
}
}
对于延时多久我是真的头疼,把控不了
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

无效楼层,该帖已经被删除
板凳
ID:123289 发表于 2018-5-2 17:46 | 只看该作者
读通器件的手册,就知道该延时多少了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表