程序如下:
#include<reg51.h>
#include<intrins.h>
#define lcd P0
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^6;
sbit E=P2^7;
sbit RW=P2^5;
sbit DS_DQ=P3^7;
sbit led=P1^7;
uint xum;
uchar flag;
uchar code table[]="wendu";
uchar code table1[]=" . C";
void delay_long(uint delay) //延迟函数
{
uchar i,j;
for(i=delay;i>0;i--)
for(j=110;j>0;j--);
}
void tempdelay(uint us)
{
while(us--);
}
void delay(uint count)
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
// DS温度传感器部分
void init_DS() //初始化DS总线
{
DS_DQ=1;
_nop_();
DS_DQ=0;
tempdelay(80);
_nop_();
DS_DQ=1;
tempdelay(5);
_nop_();
_nop_();
_nop_();
if(DS_DQ==0)
flag=1;
else
flag=0;
tempdelay(20);
_nop_();
_nop_();
DS_DQ=1;
}
void DS_writeBY(uchar BY) //写字节函数
{
uchar j;
bit testb;
for(j=0;j<8;j++)
{
testb=BY&0x01;
BY=BY>>1;
if(testb)
{
DS_DQ=0;
_nop_();
_nop_();
DS_DQ=1;
tempdelay(5);
}
else
{
DS_DQ=0;
tempdelay(8);
DS_DQ=1;
_nop_();
_nop_();
}
}
}
bit DS_readBIT()
{
bit dat;
DS_DQ=0;
_nop_();
DS_DQ=1;
_nop_();
_nop_();
dat=DS_DQ;
tempdelay(10);
return(dat);
}
uchar DS_readBY() //读一个字节
{
uchar k,i,date;
date=0;
for(k=0;k<8;k++)
{
i=DS_readBIT();
date=(i<<8)|(date>>1); //date从最低位开始读 J从最高位开始传输
}
return (date);
}
void DS_zhuanhuan_com() //温度转换指令
{
init_DS(); //初始化
delay(1);
DS_writeBY(0xcc);
DS_writeBY(0x44); //开始温度转换 0X44
//温度转换需要时间 具体 参考手册
}
uchar read_DS_wendu() //读取温度 因为有正负 所以用int 类型
{
uchar tml=0;
uchar tmh=0;
float xum1;
init_DS();
delay(1);
DS_writeBY(0xcc);
DS_writeBY(0xbe);
tml=DS_readBY(); //温度值16位 低位
tmh=DS_readBY(); // 高位
xum=tmh; //读低位
xum<<=8; //左移8位
xum|=tml; //或上高位
xum1=xum*0.0625;
xum=xum1*10+0.5;
return xum;
}
// LCD部分
void lcd_write_com(uchar xun)
{
RS=0;
RW=0;
lcd=xun;
delay(5);
E=1;
E=0;
}
void lcd_write_date(uchar xun1)
{
RS=1;
RW=0;
lcd=xun1;
delay(5);
E=1;
E=0;
}
void init_lcd()
{
uchar i,j;
lcd_write_com(0x38);
lcd_write_com(0x0c);
lcd_write_com(0x06);
lcd_write_com(0x01);
lcd_write_com(0x80);
for(i=0;i<5;i++)
{
lcd_write_date(table[i]);
delay(20);
}
lcd_write_com(0xc0);
for(j=0;j<6;j++)
{
lcd_write_date(table1[j]);
delay(20);
}
}
void LCD_xianshi(uint num)
{
uchar bai,shi,ge;
bai=num/100;
shi=(num%100)/10;
ge=(num%100)%10;
lcd_write_com(0xc1);
lcd_write_date(0x30+bai);
lcd_write_com(0xc2);
lcd_write_date(0x30+shi);
lcd_write_com(0xc4);
lcd_write_date(0x30+ge);
}
// 主函数部分
void main()
{
uchar c;
init_lcd();
DS_zhuanhuan_com();
while(1)
{
for(c=25;c>0;c--)
{
LCD_xianshi(read_DS_wendu);
led=flag;
}
}
}
程序固定显示90.6C 请问是怎么回事啊??时序我查了很多次应该没问题啊
不过在调试的时候keil无法设置DS18B20程序段的断点是怎么回事啊~~
求高手帮看看 !!万分感谢! |