于18b20显示2位温度并显示上下限,超限报警,温度上下限均可调整,附带闪烁灯
单片机源程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
bit key=0;
sbit led=P1^2;
uint get_temp();
void send(uchar);
uint temp,num,p,cycle,high,low,zd,xs,TL;
uint l=19; //定义温度下限
uint h=25; //定义温度上限
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0xbf,0x86,
0xdb,0xcf,0xe6,0xed,
0xfd,0x87,0xff,0xef};
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay1(uint ms)
{
uchar j;
while(ms--)
for(j=110;j>0;j--);
}
/////中断/////////////////////
void init()
{
TMOD|=0X10;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
EA=1;
ET0=1;
TR0=1;
}
//按键扫描程序******************************************************
void keyscan()
{
if(key3==0)
delay1(5);
if(key3==0)
{ while(!key3);
key=!key;
while(key3==0);
}
if(key==0)
{
if(key1==0)
{
delay1(5);
if(key1==0)
{
//while(!key1) ;
l++;
delay(50);
if(l==99)
l=0;
}
}
if(key2==0)
{
delay1(5);
if(key2==0)
{// while(!key2);
if(l!=0)
l--;
delay(50);
}
}
}
if(key==1)
{
if(key1==0)
{
delay1(5);
if(key1==0)
{// while(!key1) ;
h++;
delay(50);
if(h==99)
h=0;
}
}
if(key2==0)
{
delay1(5);
if(key2==0)
{//while(!key2);
if(h!=0)
h--;
delay(50);
}
}
}
}
//温度传感器********************************************************
void dsreset()//ds18b20复位 初始化函数
{
uint i;
ds=0;
i=80;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit()
{
uint i;
bit dat;
ds=0;i++; //i++起延时作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchar tempread()
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1); //读出数据最低位在最前面,这样刚好一个字节在dat里
}
return(dat);
}
void tempwritebyte(uchar dat) //向ds18b20写一个字节数据函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写一
{
ds=0;
i++;i++;
ds=1;
i=8;
while(i>0)i--;
}
else
{
ds=0;//写0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange() //DS18B20开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc); //写跳过读ROM指令
tempwritebyte(0x44); //写温度转换指令
}
uint get_temp()
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //读低八位
b=tempread(); //读高八位
temp=b;
temp<<=8;//两个字节组合为一个字
temp=temp|a;
temp=temp*0.0625; //温度在寄存器中为12位,分辨率位0.0625 度
SBUF=temp;
return temp;//temp是整型
}
//数码管显示**********************************************************************
void
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』