
//青岛理工大学琴岛学院
#include<REG52.H>
#include<math.h>
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
/*****************************************************************************/
sbit seg1=P2^0
sbit seg2=P2^1
sbit seg3=P2^2
sbit DQ=P1^7//ds18b20 端口
sfr dataled=0x80//显示数据端口
/**********************************************************************/
uchar temp
uchar flag_get,count,num,minute,second
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}//7段数码管段码表共阳
uchar str[3]
/***********************************************************************/
void delay1(uchar MS)
unsigned char ReadTemperature(void)
void Init_DS18B20(void)
unsigned char ReadOneChar(void)
void WriteOneChar(unsigned char dat)
void delay(unsigned int i)
/************************************************************************/
main()
{
TMOD|=0x01//定时器设置
TH0=0xef
TL0=0xf0
IE=0x82
TR0=1
P2=0x00
count=0
while(1)
{
str[2]=0xc6//显示C符号
str[0]=tab[temp/10]//十位温度
str[1]=tab[temp%10]//个位温度
if(flag_get==1) //定时读取当前温度
{
temp=ReadTemperature()
flag_get=0
}
}
}
void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔
{
TH0=0xef//定时器重装值
TL0=0xf0
num++
if (num==50)
{num=0<br> flag_get=1//标志位有效<br> second++<br> if(second>=60)<br>{second=0<br> minute++ <br> }
}
count++
if(count==1)
{P2=0xf7<br> dataled=str[0]}//数码管扫描
if(count==2)
{P2=0xfb<br> dataled=str[1]}
if(count==3)
{ P2=0xfd
dataled=str[2]
count=0}
}
/*************************************************************************************/
void delay(unsigned int i)//延时函数
{
while(i--)
}
/***************************************************************************************/
//18b20初始化函数
void Init_DS18B20(void)
{
unsigned char x=0
DQ = 1 //DQ复位
delay(8) //稍做延时
DQ = 0 //单片机将DQ拉低
delay(80)//精确延时 大于 480us
DQ = 1 //拉高总线
delay(10)
x=DQ //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(5)
}
//读一个字节
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
delay(5)
}
return(dat)
}
//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i=0
for (i=8i>0i--)
{
DQ = 0
DQ = dat&0x01
delay(5)
DQ = 1
dat>>=1
}
delay(5)
}
//读取温度
unsigned char ReadTemperature(void)
{
unsigned char a=0
unsigned char b=0
unsigned char t=0
//float tt=0
Init_DS18B20()
WriteOneChar(0xCC)// 跳过读序号列号的 *** 作
WriteOneChar(0x44)// 启动温度转换
delay(200)
Init_DS18B20()
WriteOneChar(0xCC)//跳过读序号列号的 *** 作
WriteOneChar(0xBE)//读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar()
b=ReadOneChar()
b<<=4
b+=(a&0xf0)>>4
t=b
//tt=t*0.0625
//t= tt*10+0.5//放大10倍输出并四舍五入
return(t)
}
接上18B20温度传感器后数码管显示出当前温度#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2 //define interface
uint temp// variable of temperature
uchar flag1 // sign of the result positive or negative
sbit dula=P2^6
sbit wela=P2^7
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef}
void delay(uint count) //delay
{
uint i
while(count)
{
i=200
while(i>0)
i--
count--
}
}
///////功能:串口初始化,波特率9600,方式1///////
void Init_Com(void)
{
TMOD = 0x20
PCON = 0x00
SCON = 0x50
TH1 = 0xFd
TL1 = 0xFd
TR1 = 1
}
void dsreset(void) //send reset and initialization command
{
uint i
DS=0
i=103
while(i>0)i--
DS=1
i=4
while(i>0)i--
}
bit tmpreadbit(void) //read a bit
{
uint i
bit dat
DS=0i++ //i++ for delay
DS=1i++i++
dat=DS
i=8while(i>0)i--
return (dat)
}
uchar tmpread(void) //read a byte date
{
uchar i,j,dat
dat=0
for(i=1i<=8i++)
{
j=tmpreadbit()
dat=(j<<7)|(dat>>1) //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat)
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20
{
uint i
uchar j
bit testb
for(j=1j<=8j++)
{
testb=dat&0x01
dat=dat>>1
if(testb) //write 1
{
DS=0
i++i++
DS=1
i=8while(i>0)i--
}
else
{
DS=0 //write 0
i=8while(i>0)i--
DS=1
i++i++
}
}
}
void tmpchange(void) //DS18B20 begin change
{
dsreset()
delay(1)
tmpwritebyte(0xcc) // address all drivers on bus
tmpwritebyte(0x44) // initiates a single temperature conversion
}
uint tmp() //get the temperature
{
float tt
uchar a,b
dsreset()
delay(1)
tmpwritebyte(0xcc)
tmpwritebyte(0xbe)
a=tmpread()
b=tmpread()
temp=b
temp<<=8//two byte compose a int variable
temp=temp|a
tt=temp*0.0625
temp=tt*10+0.5
return temp
}
void readrom() //read the serial
{
uchar sn1,sn2
dsreset()
delay(1)
tmpwritebyte(0x33)
sn1=tmpread()
sn2=tmpread()
}
void delay10ms()//delay
{
uchar a,b
for(a=10a>0a--)
for(b=60b>0b--)
}
void display(uint temp) //显示程序
{
uchar A1,A2,A2t,A3,ser
ser=temp/10
SBUF=ser
A1=temp/100
A2t=temp%100
A2=A2t/10
A3=A2t%10
dula=0
P0=table[A1] //显示百位
dula=1
dula=0
wela=0
P0=0x7e
wela=1
wela=0
delay(1)
dula=0
P0=table1[A2] //显示十位
dula=1
dula=0
wela=0
P0=0x7d
wela=1
wela=0
delay(1)
P0=table[A3] //显示个位
dula=1
dula=0
P0=0x7b
wela=1
wela=0
delay(1)
}
void main()
{
uchar a
Init_Com()
do
{
tmpchange()
// delay(200)
for(a=10a>0a--)
{ display(tmp())
}
}while(1)
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)