
#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}//不带小数点uchar code table2[]= {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}//带小数点uchar id[8]sbit DQ=P1^3sbit led2=P1^1sbit led=P1^0sbit led3=P1^4sbit beep=P1^5uint tempuchar l,h,ttuchar a1,a2,a3,a4,bzvoid delay(uchar r) //2微妙延时{ uchar ifor( i=0i<ri++)}
void sjzh(){ a1=temp/1000a2=temp%1000/100a3=temp%100/10a4=temp%10}void display(){ sjzh()if(bz==5) { P0=0x40P2=0delay(5)P0=table[a2]P2=1delay(5)}else { P0=table[a1]P2=0delay(2)} P0=table2[a2]P2=1delay(2)P0=table[a3]P2=2delay(2)P0=table[a4]P2=3delay(2)
} void init() //18b20复位{ DQ=0delay(240)DQ=1 delay(20)}void write(uchar dat)//写字节 { uchar i display() for(i=0i<8i++) { DQ=0 DQ=dat&0x01delay(10) DQ=1 dat>>=1delay(10) } display()}uchar read() //读一字节{ uchar i,dat=0for(i=8i>0i--) { DQ=0 dat=dat>>1 DQ=1 if(DQ) {dat|=0x80} delay(10)} display()return dat}void wdzh() //温度转换{init()write(0xcc)write(0x44)init()write(0xcc)write(0xbe)l=read()h=read()if(h&0xf0)// 判断负温度 { bz=1 led3=0 temp=h temp=((~((temp<<8)|l))+1)*6.25+0.5} else//否则正温度 { temp=h led3=1 temp=((temp<<8)|l)*6.25+0.5 if(temp>(23000+0.5)) {led=0 } else led=1 bz=0 if(temp<(20000+0.5)) led2=0else led2=1} }
void main(){ while(1) {display() wdzh()}}
#include <REGX52.H>#include <stdio.h>
#include "LCD1602.h"
#include "DS1302.h"
sbit DQ=P3^0//ds18b20 端口
unsigned int ReadTemperature(void)
bit Init_DS18B20(void)
unsigned char ReadOneChar(void)
void WriteOneChar(unsigned char dat)
void DelayUs2x(unsigned char)
void Delay1ms(unsigned int)
/*-----------------------------------------------
名称:18B20温度传感器
网站:www.doflye.net
编写:shifang
日期:2009.5
修改:无
内容:18B20单线温度检测的应用样例程序
------------------------------------------------*/
/*-----------------------------------------------
18b20初始化
------------------------------------------------*/
bit Init_DS18B20(void)
{
bit dat=0
DQ = 1 //DQ复位
DelayUs2x(5) //稍做延时
DQ = 0 //单片机将DQ拉低
DelayUs2x(200) //精确延时 大于 480us 小于960us
DelayUs2x(200)
DQ = 1 //拉高总线
DelayUs2x(50) //15~60us 后 接收60-240us的存在脉冲
dat=DQ //如果x=0则初始化成功, x=1则初始化失败
DelayUs2x(25) //稍作延时返回
return dat
}
void DelayUs2x(unsigned char t)
{
while(--t)
}
/*------------------------------------------------
读取一个字节
------------------------------------------------*/
unsigned char ReadOneChar(void)
{
unsigned char i=0
unsigned char dat = 0
for (i=8i>0i--)
{
DQ = 0 // 给脉冲信号
dat>>=1
DQ = 1 // 给脉冲信号
if(DQ)
dat|=0x80
DelayUs2x(25)
}
return(dat)
}
/*------------------------------------------------
写入一个字节
------------------------------------------------*/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0
for (i=8 i>0 i--)
{
DQ = 0
DQ = dat&0x01
DelayUs2x(25)
DQ = 1
dat>>=1
}
DelayUs2x(25)
}
/*------------------------------------------------
读取温度
------------------------------------------------*/
unsigned int ReadTemperature(void)
{
unsigned char a=0
unsigned int b=0
unsigned int t=0
Init_DS18B20()
WriteOneChar(0xCC) // 跳过读序号列号的 *** 作
WriteOneChar(0x44) // 启动温度转换
Delay1ms(10)
Init_DS18B20()
WriteOneChar(0xCC) //跳过读序号列号的 *** 作
WriteOneChar(0xBE) //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar() //低位
b=ReadOneChar() //高位
b<<=8
t=a+b
return(t)
}
void Delay1ms(unsigned int count)
{
unsigned int i,j
for(i=0i<counti++)
for(j=0j<120j++)
}
main()
{
SYSTEMTIME CurrentTime
int temp
float temperature
unsigned char dist[4]
LCD_Initial()
Initial_DS1302()
Init_DS18B20()
GotoXY(14,0)
Print(".")
GotoXY(15,1)
Print("C")
while(1)
{
DS1302_GetTime(&CurrentTime)
TimeToStr(&CurrentTime)
DateToStr(&CurrentTime)
GotoXY(0,0)Print("20")
GotoXY(2,0)
Print(CurrentTime.DateString)
GotoXY(0,1)
Print(CurrentTime.TimeString)
temp=ReadTemperature()
temperature=(float)temp*0.0625
sprintf(dist,"%4f",temperature)
GotoXY(9,1)
Print(dist)
Delay1ms(400)
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)