ds18b20温度显示程序,4位共阳数码管显示。我想加一个温度高于设定值蜂鸣器响,低于则关闭。但是弄了好久都没成功,求大神看看。
#include<reg52.h>
#define ui unsigned int
#define uc unsigned char //宏定义
sbit DQ =P3^7; //定义DS18B20总线I/O
bit bdata fuhao;
uc qian,bai,shi,ge;
uc code led[] = {0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7};
uc code led_dian[] = {0x7f,0x64,0xbd,0xf5,0xe6,0xf3,0xfb,0x67,0xff,0xf7};
//============================================================================================
//====================================DS18B20=================================================
//============================================================================================
/*****延时子程序*****/
void Delay(int num)
{
while(num--) ;
}
/*****初始化DS18B20*****/
void Init_DS18B20()
{
DQ = 1; //DQ复位
Delay(8); //稍做延时
DQ = 0; //
单片机将DQ拉低
Delay(80); //精确延时,大于480us
DQ = 1; //拉高总线
Delay(40);
}
/*****读一个字节*****/
uc ReadOneChar()
{
uc i=0;
uc dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
/*****写一个字节*****/
void WriteOneChar(uc dat)
{
uc i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay(5);
DQ = 1;
dat>>=1;
}
}
/*****读取温度*****/
ui ReadTemperature()
{
ui a=0,b=0,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;
if(t&0xf800)
{
t=~t+1;
fuhao=1;
}
else
fuhao=0;
tt=t*0.0625;
t=tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
/*****读取温度*****/
void check_wendu()
{
ui f;
f=ReadTemperature(); //获取温度值并减去DS18B20的温漂误差
qian=f/1000;
bai=(f%1000)/100; //计算得到十位数字
shi=((f%1000)%100)/10; //计算得到个位数字
ge=((f%1000)%100)%10; //计算得到小数位
}
/*****显示开机初始化等待画面*****/
void Disp_init()
{
P0 = 0x7f; //显示----
P2 = 0x7f;
Delay(100);
P2 = 0xdf;
Delay(100);
P2 = 0xf7;
Delay(100);
P2 = 0xfd;
Delay(100);
P2 = 0xff; //关闭显示
}
/*****显示温度子程序*****/
void Disp_Temperature() //显示温度
{
if(qian==0)
{
if(fuhao==1)
P0=0x7f; //1011 1111
else
P0=0xff;
P2=0xfd;
Delay(10);
P2 = 0xff;
}
else if(qian!=0)
{
P0 =~led[qian];
P2 = 0xfd;
Delay(10);
P2 = 0xff;
}
if((bai==0)&&(qian==0))
{
P0=0xff; //
P2=0xf7;
Delay(10);
P2=0xff;
}
else if((bai==0)&&(qian!=0))
{
P0=~led[bai];
P2=0xf7;
Delay(10);
P2=0xff;
}
else if(bai!=0)
{
P0=~led[bai]; //
P2=0xf7;
Delay(10);
P2=0xff;
}
P0=~led_dian[shi]; //
P2=0xdf;
Delay(10);
P2=0xff;
P0=~led[ge]; //显示符号
P2=0x7f;
Delay(10);
P2=0xff; //关闭显示
}
/*****主函数*****/
void main()
{
uc z;
for(z=0;z<100;z++)
{
Disp_init();
check_wendu();
}
while(1)
{
check_wendu();
for(z=0;z<10;z++)
Disp_Temperature();
}
}
这是加的蜂鸣器代码,蜂鸣器io口随便定义一个到时。
if(temp>=310) //当温度超过31度(仅作试验用,实际可设为其他更高的值),蜂鸣器便会报警。
{
beep=0;
}
else
{
beep=1;
怎么加,貌似还要定义,困扰好久,新人初学不久,泪谢了!
仿真 还不怎么会用
怎么个比较法呢?求助!!!
一周热门 更多>