
接口自己看清楚。程序如下
//
#include "reg51h"
#include "intrinsh" //_nop_();延时函数用
#include "mathh"
#define disdata P0 //段码输出口
#define discan P2 //扫描口
#define uchar unsigned char
#define uint unsigned int
sbit duqu=P3^6; //温度输入口
sbit dian=P0^7; //LED小数点控制
sbit beep=P1^6; //蜂鸣器
sbit key0=P3^0;
sbit key1=P3^1;
sbit key02=P3^2;
sbit key03=P3^3;
sbit led0=P1^0; //红灯
sbit led1=P1^1; //绿灯
sbit led2=P1^2; //黄灯
uint h;
uint temp;
uchar r;
char high=40,low=15;
uchar sign;
uchar st=1;
uchar ti;
uchar pp;
uchar ee;
uchar nn;
//温度小数部分用查表法//
uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//
uchar code dis_7[15]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x00,0x40,0x76,0x38,0x39};
//共阴LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-" "H" "L" "C"
uchar code scan_con[4]={0x70,0xb0,0xd0,0xe0}; //列扫描控制字
uchar data temp_data[2]={0x00,0x00}; //读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用
/11us延时函数/
void delay(uint t)
{
for (;t>0;t--);
}
/显示扫描函数/
void scan()
{
char k;
for(k=0;k<4;k++) //4位LED扫描控制
{
discan=scan_con[k]; //位选
disdata=dis_7[display[k]]; //数据显示
if (k==1){dian=1;} //小数点显示
delay(200);
}
}
/DS18B20复位函数/
ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
duqu=1;_nop_();_nop_(); //从高拉倒低
duqu=0;
delay(50); //550 us
duqu=1;
delay(6); //66 us
presence=duqu; //presence=0 复位成功,继续下一步
}
delay(45); //延时500 us
presence=~duqu;
}
duqu=1; //拉高电平
}
/DS18B20写命令函数/
//向1-WIRE 总线上写1个字节
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
duqu=1;_nop_();_nop_(); //从高拉倒低
duqu=0;_nop_();_nop_();_nop_();_nop_(); //5 us
duqu=val&0x01; //最低位移出
delay(6); //66 us
val=val/2; //右移1位
}
duqu=1;
delay(1);
}
/DS18B20读1字节函数/
//从总线上取1个字节
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=8;i>0;i--)
{
duqu=1;_nop_();_nop_();
value>>=1;
duqu=0;_nop_();_nop_();_nop_();_nop_(); //4 us
duqu=1;_nop_();_nop_();_nop_();_nop_(); //4 us
if(duqu)value|=0x80;
delay(6); //66 us
}
duqu=1;
return(value);
}
/读出温度函数/
uint read_temp()
{
ow_reset(); //总线复位
delay(200);
write_byte(0xcc); //发命令
write_byte(0x44); //发转换命令
ow_reset();
delay(1);
write_byte(0xcc); //发命令
write_byte(0xbe);
temp_data[0]=read_byte(); //读温度值的第字节
temp_data[1]=read_byte(); //读温度值的高字节
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 两字节合成一个整型变量。
return temp; //返回温度值
}
/温度数据处理函数/
//二进制高字节的低半字节和低字节的高半字节组成一字节,这个
//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩
//下的低字节的低半字节转化成十进制后,就是温度值的小数部分
//
work_temp(uint tem)
{
uchar n=0;
nn=0;
if(tem>6348) // 温度值正负判断
{tem=65536-tem;n=1;nn=1;} // 负温度求补码,标志位置1
display[4]=tem&0x0f; // 取小数部分的值
display[0]=ditab[display[4]]; // 存入小数部分显示值
display[4]=tem>>4; // 取中间八位,即整数部分的值
display[3]=display[4]/100; // 取百位数据暂存
display[1]=display[4]%100; // 取后两位数据暂存
display[2]=display[1]/10; // 取十位数据暂存
display[1]=display[1]%10;
r=display[1]+display[2]10+display[3]100;
/符号位显示判断/
if(!display[3])
{
display[3]=0; //最高位为0时不显示
if(!display[2])
{
display[2]=0; //次高位为0时不显示
}
}
if(n){display[3]=0x0b;} //负温度时最高位显示"-"
}
/蜂鸣器报警函数/
void BEEP()
{
if(r>=high||r<=low)
{
beep=1;led1=1;
if(r>=high)
{
led0=0;led2=1;
}
else if (r<=low)
{
led2=0;led0=1;
}
}
else if ((nn==1)&&(r>=abs(low)))
{
led2=0;led0=1;beep=1;led1=1;
}
else
{
beep=0;led1=0;led0=1;led2=1;
}
}
/初始化函数/
void init()
{
beep=0;
EA=1;
EX0=0;
EX1=0;
IT0=1;
IT1=1;
TMOD=0x11;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=(65536-833)/256;
TL1=(65536-833)%256;
sign=0;
ti=high;
}
/温度/上下限调整切换/
void key11()
{
while(key1==0)
{
delay(300);
if(key1==0)
{
st++;
if(st==4)
st=1;
}
while(!key1);
delay(300);
while(!key1);
}
}
/切换调整上下限/
void key10()
{
while(key0==0)
{
delay(300); //消抖动
if(key0==0)
{
sign=!sign;
}
while(!key0);
delay(300);
while(!key0);
}
}
/上下限加1/
void key2()
{
while(key02==0)
{
delay(400);
if(key02==0)
{
if(sign)
{ low=low+1;
if(low>high)
{pp=low;low=high;high=pp;}
}
else
{high=high+1;ti=high;}
}
while(!key02);
delay(400);
while(!key02);
}
}
/上下限减1/
void key3()
{
while(key03==0)
{
delay(400);
if(key03==0)
{
if(sign)
low=low-1;
else
{ high=high-1;ti=high;
if(low>high)
{pp=low;low=high;high=pp;}
}
}
while(!key03);
delay(400);
while(!key03);
}
}
/上限温度显示/
void high1()
{
uchar k;
if(high<100)
{ display[0]=high%10;
display[1]=high/10;
display[2]=10;
display[3]=12;
for(k=0;k<4;k++)
{
discan=scan_con[k];
disdata=dis_7[display[k]];
if (k==1){dian=0;}
delay(300);
disdata=0x00;
delay(100);
}
}
else
{
display[0]=high%10;
display[1]=high%100/10;
display[2]=high/100;
display[3]=12;
for(k=0;k<4;k++)
{
discan=scan_con[k];
disdata=dis_7[display[k]];
if (k==1){dian=0;}
delay(300);
disdata=0x00;
delay(100);
}
}
}
/下限温度显示/
void low1()
{
uchar ki;
if(low>=0)
{ display[0]=low%10;
display[1]=low/10;
display[2]=10;
display[3]=13;
for(ki=0;ki<4;ki++)
{
discan=scan_con[ki];
disdata=dis_7[display[ki]];
if (ki==1){dian=0;}
delay(100);
disdata=0x00;
delay(100);
}
}
else
{
ee=abs(low);
display[0]=ee%10;
display[1]=ee/10;
display[2]=11;
display[3]=13;
for(ki=0;ki<4;ki++)
{
discan=scan_con[ki];
disdata=dis_7[display[ki]];
if (ki==1){dian=0;}
delay(100);
disdata=0x00;
delay(100);
}
}
}
/主函数/
void main()
{
init();
disdata=0x00; //初始化端口
discan=0x00;
for(h=0;h<4;h++) //开机显示"0000"
{display[h]=0;}
ow_reset(); //开机先转换一次
write_byte(0xcc); //Skip ROM
write_byte(0x44); //发转换命令
for(h=0;h<100;h++) //开机显示"0000"
{scan();}
while(1)
{
switch(st) //分支
{
case 1:{
work_temp(read_temp());
scan(); //显示温度
BEEP();
break;
}
case 2: {
high1(); // 显示上限温度
key10();
key2();
key3();
break;
}
case 3: {
low1(); //显示下限温度
key10();
key2();
key3();
break;
}
}
key11();
}
}
//结束//
#include <reg52h>
#include <stdioh>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2; //温度传感器信号线
sbit dula=P2^6; //数码管段选线
sbit wela=P2^7; //数码管位选线
sbit beep=P2^3; //蜂鸣器
uint temp;
float f_temp;
uint warn_l1=260;
uint warn_l2=250;
uint warn_h1=300;
uint warn_h2=320;
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
unsigned char 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 dsreset(void) //18B20复位,初始化函数
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void) //读1位函数
{
uint i;
bit dat;
ds=0;i++; //i++ 起延时作用
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return (dat);
}
uchar tempread(void) //读1个字节
{
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) //向18B20写一个字节数据
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写 1
{
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(void) //DS18B20 开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc); // 写跳过读ROM指令
tempwritebyte(0x44); // 写温度转换指令
}
uint get_temp() //读取寄存器中存储的温度数据
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //读低8位
b=tempread(); //读高8位
temp=b;
temp<<=8; //两个字节组合为1个字
temp=temp|a;
f_temp=temp00625; //温度在寄存器中为12位 分辨率位00625°
temp=f_temp10+05; //乘以10表示小数点后面只取1位,加05是四舍五入
f_temp=f_temp+005;
return temp; //temp是整型
}
////////////////////显示程序//////////////////////////
void display(uchar num,uchar dat)
{
uchar i;
dula=0;
P0=table[dat];
dula=1;
dula=0;
wela=0;
i=0XFF;
i=i&(~((0X01)<<(num)));
P0=i;
wela=1;
wela=0;
delay(1);
}
void dis_temp(uint t)
{
uchar i;
i=t/100;
display(0,i);
i=t%100/10;
display(1,i+10);
i=t%100%10;
display(2,i);
}
//////////////////////////////////////////////
void warn(uint s,uchar led) //蜂鸣器报警声音 ,s控制音调
{
uchar i;i=s;
dula=0;
wela=0;
beep=0;
P1=~(led);
while(i--)
{
dis_temp(get_temp());
}
beep=1;
P1=0XFF;
i=s;
while(i--)
{
dis_temp(get_temp());
}
}
void deal(uint t)
{
uchar i;
if((t>warn_l2)&&(t<=warn_l1)) //大于25度小于27度
{
warn(40,0x01);
}
else if(t<=warn_l2) //小于25度
{
warn(10,0x03);
}
else if((t<warn_h2)&&(t>=warn_h1)) //小于32度大于30度
{
warn(40,0x04);
}
else if(t>=warn_h2) //大于32度
{
warn(10,0x0c);
}
else
{
i=40;
while(i--)
{
dis_temp(get_temp());
}
}
}
void init_com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void comm(char parr)
{
do
{
SBUF = parr++; //发送数据
while(!TI); //等待发送完成标志为1
TI =0; //标志清零
}while(parr); //保持循环直到字符为'\0'
}
void main()
{
uchar buff[4],i;
dula=0;
wela=0;
init_com();
while(1)
{
tempchange();
for(i=10;i>0;i--)
{
dis_temp(get_temp());}
deal(temp);
sprintf(buff,"%f",f_temp);
for(i=10;i>0;i--)
{
dis_temp(get_temp());}
comm(buff);
for(i=10;i>0;i--)
{
dis_temp(get_temp());}
}
}
#include < reg51h >
#include < intrinsh >
#define uchar unsigned char
#define uint unsigned int
#define temp_high 60 //温度报警限设置
uchar data temph;
uchar data templ;
uchar data dat;
uchar temp_buzzer,b,fuhao;
uchar code tab[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
uchar shi,ge,shifen; //全局变量
bit flag;
sbit DQ=P1^0;
sbit buzzer=P1^7;
void delay_50us(unsigned int t) //每次50us延时,最大误差13us
{
unsigned char j;
for(;t>0;t--)
for(j=19;j>0;j--)
;
}
void delay_2us(unsigned char i) //每次2us精确延时,最大误差6us
{
while(--i);
}
void buzzer_sound() //蜂鸣器报警函数
{
if (temp_buzzer>temp_high)
buzzer=0;
else
buzzer=1;
}
void Display() //LCD 显示函数
{
P2=tab[shi];
P3=0xfd;
delay_50us(20);//十位 延时1ms
P3=0xff;
P2=tab[ge]+0x80;
P3=0xfb;
delay_50us(20);//个位 延时1ms
P3=0xff;
P2=tab[shifen];
P3=0xf7;
delay_50us(20);//十分位 延时1ms
P3=0xff;
}
Ds_Reset() //初始化
{
DQ=1;
_nop_();
_nop_();
DQ=0;
delay_50us(10); //延时513us
DQ=1;
delay_2us(23);//延时53us
flag=DQ;
delay_50us(4);//延时200us
DQ=1;//拉伸至高电平
return(flag);
}
Ds_Read() //读函数
{
uint i;
uchar dat=0x00;
for(i=0;i<8;i++)
{
DQ=0;
_nop_(); //延时1us
dat>>=1;
DQ=1; //释放
_nop_();
_nop_();
_nop_();
if(DQ)
{
dat|=0x80;}
delay_2us(30); // 延时67us
DQ=1;
}
return(dat);
}
void Ds_Write(unsigned char datt)
{
uchar j;
bit bitt;
for(j=0;j<8;j++)
{
bitt=datt&0x01;
DQ=0;
_nop_();
_nop_(); //延时2us
if(bitt)
{
DQ=1;
delay_2us(28);
}
else delay_2us(28); //延时56us
datt>>=1;
DQ=1;
_nop_();
}
}
void Set_Tempchange() //温度转换指令
{
Ds_Reset();
Ds_Write(0xcc);// 跳过读序号列号的 *** 作
Ds_Write(0x44);// 启动温度转
}
void Read_Temp() //读出温度
{
Ds_Reset();
Ds_Write(0xcc);// 跳过读序号列号的 *** 作
Ds_Write(0xBE);// 读RAM数据
templ=Ds_Read();//温度的低八位
temph=Ds_Read();//温度的高八
}
void Change_Temp() //转换温度
{
uchar intn,xiaoshu;
uchar k,temp;
fuhao=temph&0xf8;
if(!fuhao) //正数
{
intn=(temph<<4)|(templ>>4);
xiaoshu=(templ&0x0f)625;
}
else //负数
{
intn=((~temph<<4)|(~templ>>4))+1;
xiaoshu=(((~templ)&0x0f)+1)625;
}
k=templ;
temp=intn;
temp=temp&0x80;
if(temp==0x80)
k=~k+1;
k=k&0x0f;
temp_buzzer=intn;
switch (k)
{
case 0x00: b=0;break;
case 0x01: b=1;break;
case 0x02: b=1;break;
case 0x03: b=2;break;
case 0x04: b=2;break;
case 0x05: b=3;break;
case 0x06: b=3;break;
case 0x07: b=4;break;
case 0x08: b=4;break;
case 0x09: b=5;break;
case 0: b=5;break;
case 0x0b: b=6;break;
case 0x0c: b=7;break;
case 0x0d: b=8;break;
case 0x0e: b=9;break;
case 0x0f: b=9;break;
}
shi=intn%100/10;//十位
ge=intn%10; //个位
shifen=b;//xiaoshu/1000;//十分位
buzzer_sound();
}
void main()
{
uchar i,j;
while(1)
{
for(i=0;i<8;i++)
{
Set_Tempchange();
_nop_();
for(j=0;j<250;j++)
{
Display();
}
Read_Temp(); //将读RAM的函数放到这儿是因为温度的转换要用750ms时间,这里用Display()函数来达到延时效果
Change_Temp();
}
}
}
参考一下喔
#include <AT89X52h>#include "DS18B20h" #define uint unsigned int#define uchar unsigned char //宏定义#define SET P3_1 //定义调整键#define DEC P3_2 //定义减少键#define ADD P3_3 //定义增加键#define BEEP P3_7 //定义蜂鸣器bit shanshuo_st; //闪烁间隔标志bit beep_st; //蜂鸣器间隔标志sbit DIAN = P2^7; //小数点uchar x=0; //计数器signed char m; //温度值全局变量uchar n; //温度值全局变量uchar set_st=0; //状态标志signed char shangxian=38; //上限报警温度,默认值为38signed char xiaxian=5; //下限报警温度,默认值为38uchar code LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/延时子程序/void Delay(uint num){ while( --num );}
/初始化定时器0/void InitTimer(void){ TMOD=0x1; TH0=0x3c; TL0=0xb0; //50ms(晶振12M)}
/定时器0中断服务程序/void timer0(void) interrupt 1{ TH0=0x3c; TL0=0xb0; x++;}
/外部中断0服务程序/void int0(void) interrupt 0{ EX0=0; //关外部中断0 if(DEC==0&&set_st==1) { shangxian--; if(shangxian<xiaxian)shangxian=xiaxian; } else if(DEC==0&&set_st==2) { xiaxian--; if(xiaxian<0)xiaxian=0; }}
/外部中断1服务程序/void int1(void) interrupt 2{ EX1=0; //关外部中断1 if(ADD==0&&set_st==1) { shangxian++; if(shangxian>99)shangxian=99; } else if(ADD==0&&set_st==2) { xiaxian++; if(xiaxian>shangxian)xiaxian=shangxian; } }
/读取温度/void check_wendu(void){ uint a,b,c; c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差 a=c/100; //计算得到十位数字 b=c/10-a10; //计算得到个位数字 m=c/10; //计算得到整数位 n=c-a100-b10; //计算得到小数位 if(m<0){m=0;n=0;} //设置温度显示上限 if(m>99){m=99;n=9;} //设置温度显示上限 }
/显示开机初始化等待画面/Disp_init() { P2 = 0xbf; //显示- P1 = 0xf7; Delay(200); P1 = 0xfb; Delay(200); P1 = 0xfd; Delay(200); P1 = 0xfe; Delay(200);
P1 = 0xff; //关闭显示}
/显示温度子程序/Disp_Temperature() //显示温度{ P2 =0xc6; //显示C P1 = 0xf7; Delay(300);
P2 =LEDData[n]; //显示个位 P1 = 0xfb; Delay(300);
P2 =LEDData[m%10]; //显示十位 DIAN = 0; //显示小数点 P1 = 0xfd; Delay(300);
P2 =LEDData[m/10]; //显示百位 P1 = 0xfe; Delay(300);
P1 = 0xff; //关闭显示}
/显示报警温度子程序/Disp_alarm(uchar baojing){ P2 =0xc6; //显示C P1 = 0xf7; Delay(200);
P2=0xff;
P2 =LEDData[baojing%10]; //显示十位 P1 = 0xfb; P2=0xff;
Delay(200);
P2 =LEDData[baojing/10]; //显示百位 P1 = 0xfd; P2=0xff;
Delay(200);
if(set_st==1)P2 =0x89; else if(set_st==2)P2 =0xc7; //上限H、下限L标示 P1 = 0xfe; Delay(200);
P1 = 0xff; //关闭显示}
/报警子程序/void Alarm(){ if(x>=10){beep_st=~beep_st;x=0;} if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=0; else BEEP=1;}
/主函数/void main(void){ uint z; InitTimer(); //初始化定时器 EA=1; //全局中断开关 TR0=1; ET0=1; //开启定时器0 IT0=1; IT1=1; check_wendu(); check_wendu(); for(z=0;z<300;z++) { Disp_init(); } while(1) { if(SET==0) { Delay(2000); do{}while(SET==0); set_st++;x=0;shanshuo_st=1; if(set_st>2)set_st=0; } if(set_st==0) { EX0=0; //关闭外部中断0 EX1=0; //关闭外部中断1 check_wendu(); Disp_Temperature(); Alarm(); //报警检测 } else if(set_st==1) { BEEP=1; //关闭蜂鸣器 EX0=1; //开启外部中断0 EX1=1; //开启外部中断1 if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(shangxian);} } else if(set_st==2) { BEEP=1; //关闭蜂鸣器 EX0=1; //开启外部中断0 EX1=1; //开启外部中断1 if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(xiaxian);} } }}
/END/
DS18B20h:
#include <AT89X52h>#define DQ P3_6 //定义DS18B20总线I/O
/延时子程序/void Delay_DS18B20(int num){ while(num--) ;}
/初始化DS18B20/void Init_DS18B20(void){ unsigned char x=0; DQ = 1; //DQ复位 Delay_DS18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 Delay_DS18B20(80); //精确延时,大于480us DQ = 1; //拉高总线 Delay_DS18B20(14); x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay_DS18B20(20);}
/读一个字节/unsigned char ReadOneChar(void){ unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; Delay_DS18B20(4); } return(dat);}
/写一个字节/void WriteOneChar(unsigned char dat){ unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; Delay_DS18B20(5); DQ = 1; dat>>=1; }}
/读取温度/unsigned int ReadTemperature(void){ unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的 *** 作 WriteOneChar(0x44); //启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的 *** 作 WriteOneChar(0xBE); //读取温度寄存器 a=ReadOneChar(); //读低8位 b=ReadOneChar(); //读高8位 t=b; t<<=8; t=t|a; tt=t00625; t= tt10+05; //放大10倍输出并四舍五入 return(t);}
#include <reg52h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P3^7; //define interface 定义DS18B20接口
uint temp; // variable of temperature
uchar flag1; // sign of the result positive or negative
sbit p0_5=P0^5;
sbit p2_7=P2^7;
sbit p2_4=P2^4;
sbit p2_5=P2^5;
sbit p2_6=P2^6;
unsigned char code TABLE[]={
0xd7,0x11,0xcd,0x5d,0x1b,
0x5e,0xde,0x15,0xdf,0x5f,
0x9f,0xdf,0xc6,0xd7,0xce,0x8e};
void delay(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
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; //DS18B20初始化
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=0;i++; //i++ for delay 小延时一下
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void) //read a byte date 读一个字节
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好
//一个字节在DAT里
}
return(dat); //将一个字节数据返回
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20
{ //写一个字节到DS18B20里
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1 写1部分
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0 写0部分
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change 发送温度转换命令
{
dsreset(); //初始化DS18B20
delay(1); //延时
tmpwritebyte(0xcc); // 跳过序列号命令
tmpwritebyte(0x44); //发送温度转换命令
}
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=temp00625; //得到真实十进制温度值,因为DS18B20
//可以精确到00625度,所以读回数据的最低位代表的是
//00625度。
temp=tt10+05; //放大十倍,这样做的目的将小数点后第一位
//也转换为可显示数字,同时进行一个四舍五入 *** 作。
return temp; //返回温度值
}
void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}
void display(uint temp)
{
uchar a,b,c,d;
a=temp/100;
b=temp/10-a10;
d=temp%10;
c=(temp%100-d)/10;
P0=TABLE[d];
p0_5=0;
p2_7=0;
delay(1);
p2_7=1;
P0=TABLE[c];
p2_4=0;
delay(1);
p2_4=1;
P0=TABLE[b];
p0_5=1;
p2_5=0;
delay(1);
p2_5=1;
P0=TABLE[a];
p2_6=0;
delay(1);
p2_6=1;
}
void main() //主函数
{
uchar a;
Init_Com(); //初始化串口
do
{
tmpchange(); //温度转换
for(a=10;a>0;a--)
{
display(tmp()); //显示十次
}
}
while(1);
}
以上就是关于寻求 DS18B20+89C51单片机+蜂鸣器报警同时LED灯亮的温度报警程序,汇编\C语言都可以,谢谢。全部的内容,包括:寻求 DS18B20+89C51单片机+蜂鸣器报警同时LED灯亮的温度报警程序,汇编\C语言都可以,谢谢。、基于AT89C51和DS18B20制作的温度报警器原理图和单片机内部程序、求用AT89C51单片机和DS18B20做温度报警器,报警器用蜂鸣器,温度显示用数码管,用c语言编写程序最好有注释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)