本帖最后由 yesno 于 2012-5-19 15:29 编辑
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit DQ=P2^2;
uint temp;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0-9数字
void delay (uint x) //延时函数
{
uchar i;
while(x--)
for(i=0; i<120; i++);
}
void delay1(uint a) //延时函数
{
while(--a);
}
void disp(uchar num) //显示函数
{
uchar shi,ge;
shi=num/10;
ge=num%10;
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);
}
void init_18b20() // 初始化
{
DQ=1;
delay1(8);
DQ=0;
delay1(90);
DQ=1;
_nop_();
_nop_();
delay1(100);
DQ=1;
}
void write(uchar dat) //写字节
{
uchar i;
for(i=0; i<8; i++)
{
DQ=0;
DQ=dat&0x01;
delay1(5);
DQ=1;
dat>>=1;
}
delay1(4);
}
uchar read() //读字节
{
uchar i, dat=0;
DQ=1;
_nop_();
for(i=0; i<8; i++)
{
DQ=0;
_nop_();
_nop_();
dat>>=1;
DQ=1;
_nop_();
_nop_();
if(DQ)
dat|=0x80;
delay1(30);
DQ=1;
}
return dat;
}
uchar read_tu() // 温度转换
{
uchar a,b;
init_18b20();
delay1(100);
write(0xcc);
write(0x44);
init_18b20();
write(0xcc);
write(0xbe);
a=read();
b=read();
b<<=4;
b+=(a&0xf0)>>4;
return b;
}
void main() //主函数
{
delay(30);
while(1)
{
temp=read_tu;
disp(temp);
}
}
这个初学仔细检查啦视乎没错,可是下载到板子里面就不行啦。其他的情况也没什么就是温度没反应,数码管就是显示70,任凭我怎么触摸传感器都是没反应既不升温也不降温。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
可以看你编译时的汇编文件。
- void delay_15us( uchar times )
- {
- do
- {
- _nop_ ();
- _nop_ ();
- _nop_ ();
- _nop_ ();
- _nop_ ();
- _nop_ ();
- _nop_ ();
- _nop_ ();
- _nop_ ();
- _nop_ ();
- _nop_ ();
- _nop_ ();
- _nop_ ();
-
- times--;
- }while(times);
- }
- //初始化函数
- void DS18B20_reset(void)
- {
- uchar x=0;
-
- DQ = 1; //DQ复位
- delay_15us (3); //稍做延时
- DQ = 0; //单片机将DQ拉低
- delay_15us(33); //精确延时 大于 480us 33 大于10即可
- DQ = 1; //拉高总线
- delay_15us(6); //等待大于60us 有无都可以
- x = DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
- delay_15us(6);
- }
- //读一个字节
- uchar DS18B20_read(void)
- {
- uchar i=0;
- uchar dat = 0;
-
- for (i=0;i<8;i++)
- {
- DQ = 1; //高电平
- _nop_();_nop_();//延时2us
- DQ = 0; //低电平 开始时间片
- dat>>=1;
- DQ = 1; //高电平 DS18B20开始输出
- if(DQ)
- {
- dat|=0x80; //如果是高电平就在最高位写入1,低电平则保留原来的0
- }
- delay_15us(2); //延时30us
- }
-
- return(dat);
- }
- //写一个字节
- void DS18B20_write(uchar dat)
- {
- uchar i=0;
-
- for (i=8; i>0; i--)
- {
- DQ = 0;
- delay_15us(1);
- DQ = dat&0x01;
- delay_15us(2);
- DQ = 1;
- dat>>=1;
- }
- }
- void DS18B20_convert( void )
- {
- DS18B20_reset();
- DS18B20_write(0xCC); // 跳过读序号列号的操作
- DS18B20_write(0x44); // 启动温度转换
- }
- //读取温度
- uint get_temperature(void)
- {
- uchar tempL=0;
- uchar tempH=0;
- uint t=0;
- DS18B20_convert();
- DS18B20_reset();
- DS18B20_write(0xCC); //跳过读序号列号的操作
- DS18B20_write(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
- tempL=DS18B20_read();
- tempH=DS18B20_read();
- t = (tempH*256 + tempL)*0.625+0.5;
- return(t);
- }
复制代码51单片机啊
具体型号,因为有些新51和旧51指令速度不同,delay延时就不通用了,
如果你的是STC 1T系列,就用这贴的就可以:STC 1T DS18B20通用操作模块,正 / 负温度,适应晶振:1 ~ 45MHz
如果是AT89C52的话,你把工程发上来,今天比较有空,帮你改改
一周热门 更多>