打印
[AVR单片机]

新手:DS18B20为烧程序不送显!读写有问题吗?时序有问题?

[复制链接]
2184|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
实在么办法了啊,这个程序已经改写了七八遍了,可就是送不了显,向各位高手求助啊,不知道这个版块是否合适发此贴~~:)
——————————————————————————————
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//不带小数点数字列表;
uchar code type[]={0xbf,0x86,0xcb,0xcf,0xe4,0xed,0xfd,0x87,0xff,0xef};//带小数点的数字列表;

uint T;//全局变量;
sbit DQ=P2^3; //位变量定义

/**********************************************  时序定义  ********************************************************/


#define delay1us _nop_();//定义一微妙时间;
#define delay10us _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();   
#define delay80us delay10us;delay10us;delay10us;delay10us;delay10us;delay10us;delay10us;delay10us;
#define delay240us delay80us;delay80us;delay80us;


/*********************************************************************************************************/


/********  延时子程序  *******/

void delay(uchar x)
   
    {
uint i;
   
for(i=x;i>0;i--)

   
delay80us;
    }
void delay1(uchar y)

{

uint n;

for(n=y;n>0;n--)

delay10us;

}
void delay2(uchar s)

{

uint m;

for(m=s;m>0;s--)

delay1us;

}
void delay3(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}
void delay4(uint N)
{

int i;

for(i=0; i<N; i++)

;
}

/*************************/



/*************  单总线初始化程序  ************/

  /*void reset(void)

{//
uchar received;


//
DQ=1;

uint i;

DQ=0;

//
delay(9);

i=103;

while(i>0)i--;

DQ=1;

//
delay1(4);

i=4;

while(i>0)i--;

/*
if(DQ==0)

  {

delay1(26);

DQ=1;


  }*/

//
received=DQ;

//
delay(3);

//
return received;
//
}
uchar Reset(void)
{

uchar deceive_ready;

DQ = 0;

delay(29);

DQ = 1;

delay4(3);

deceive_ready = DQ;

delay4(25);

return(deceive_ready);
}
/****************************************/


/***************************读一位数据*****************/
   bit readbit(void)

{
uint i;

bit dat;

//
DQ   =1;

//
delay2(2);

DQ   =0;

//
delay2(6);

i++;

DQ   =1;

//
delay2(4);

i++;

i++;

dat=DQ;

//
delay1(3);

i=8;

while(i>0)i--;

return dat;





}
/*******************************************************/


/*************************** 读一个字节数据************************/

   uchar readbyte(void)

{
uchar j,cont=0,smark;

//
bit
A;

for(;j<=7;j++)

{//
A=readbit();

smark=readbit();

cont=(smark<<7)|(cont>>1);

}

return (cont);

}
/**************************************************************/


/*******************************************写一个字节*******************************/



void writebyte(uchar dat)

{

uchar k;

uint i;

bit   wei;

for(;k<=7;k++)

{
wei=dat&0x01;

dat  =dat>>1;

  if(wei==1)


   { DQ=0;

//
delay2(3);

i++;

i++;

DQ=1;

//
delay2(45);

i=8;

while(i>0)i--;

//
wei=0;

   }

else

   {

DQ=0;

//
delay1(6);

i=8;

while(i>0)i--;

DQ=1;

i++;

i++;

//
wei=1;

   }



}



}



/*************************************************************************************/


/*************************************************温度开始转换***********************************/



void starttemprature(void)

{

reset();

delay3(1);

writebyte(0xcc);//写跳过读ROM命令;

writebyte(0x44);//启动温度转换指令;

}


/**********************************************************************************************/




/******************************************主函数部分******************************************/



void main()

{


uint a,b,c,d,e,f;

    long num1;

while(1)

{       starttemprature();

    reset();

delay3(1);

writebyte(0xcc);//写跳过读ROM命令?

writebyte(0xbe);//读取暂存器中得温度数值;

a=readbyte();

b=readbyte();

T=b;

T<<=8;

T=a|T;

num1=T*625;


a=num1/10000/10;

b=num1/10000%10;

c=num1%10000/1000;

d=num1%10000%1000/100;

e=num1%10000%1000%100/10;

f=num1%10000%1000%100%10;



        
//第一个数码管显示十位;

P0  =table[a];

P2  =0x02;

     
delay1(20);

P0  =0x00;



                 
//第一个数码管显示个位和小数点;

P0   =type[b];
//带小数点位;

P2   =0x03;


delay1(20);

P0   =0x00;




//第一个数码管显示小数点第一位;

P0   =table[c];

P2   =0x04;


delay1(20);

P0   =0x00;



   
//第一个数码管显示小数点第二位;

P0   =table[d];

P2   =0x05;


delay1(20);

P0   =0x00;



//第一个数码管显示小数点第三位;

P0   =table[e];

P2   =0x06;


delay1(20);

P0   =0x00;



//第一个数码管显示小数点第四位;

P0   =table[f];

P2   =0x07;

delay1(20);

P0   =0x00;



}


}

}K_7J`QO80_V62A~E@T{RXR.jpg (97.36 KB )

}K_7J`QO80_V62A~E@T{RXR.jpg

相关帖子

沙发
chen3bing| | 2011-9-10 19:31 | 只看该作者
可能时序有问题。网上搜,例子多的是。

使用特权

评论回复
板凳
NE5532| | 2011-9-10 21:14 | 只看该作者
器件应答看过了么?把这么大一堆程序烧进去,我都不敢保证是对的,你敢?

使用特权

评论回复
地板
xuebichongkafei|  楼主 | 2011-9-10 21:55 | 只看该作者
3# NE5532 除了显示程序是自己写的,时序是照搬过来的,程序大是啥意思?这貌似不大吧,之前写了很多子程序,后来全部放到主程序中运行了!
     这个显示程序做了单独实验,能够显示,而且换了一个配套时序也能够显示,但就是自己写的和照搬的这个时序不对,怎么按照参数来写时序会有如此大得差别?

使用特权

评论回复
5
xuebichongkafei|  楼主 | 2011-9-10 21:59 | 只看该作者
2# chen3bing   我有个时序能跑,我是想弄明白,为啥这单总时序这么难写。
   例子看了不少,可就是不对,写了好几遍了!:)

使用特权

评论回复
6
NE5532| | 2011-9-11 08:21 | 只看该作者
人家的时钟频率和你的时钟频率一样么?所有的Delay你都测过么?人家写的就是圣旨,你拿来就用,都不检查?

老板是扣你的工资还是扣网上写这个程序的人的工资?程序该怎么写?

上面问题你全部回答好了就知道了。

使用特权

评论回复
7
xuebichongkafei|  楼主 | 2011-9-12 10:34 | 只看该作者
6# NE5532    硬件般上的时钟频率都是11.0592MHZ的!不过每一个delay延时没有测试,谢了···:P

使用特权

评论回复
8
NE5532| | 2011-9-12 11:18 | 只看该作者
6# NE5532    硬件般上的时钟频率都是11.0592MHZ的!不过每一个delay延时没有测试,谢了···:P
xuebichongkafei 发表于 2011-9-12 10:34


呵呵,我就从来不用这个频点,只要不是标准51,也不会用这个频点吧。

使用特权

评论回复
9
xuebichongkafei|  楼主 | 2011-9-13 17:26 | 只看该作者
8# NE5532
新手,从51开始:)

使用特权

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

本版积分规则

0

主题

23

帖子

1

粉丝