求用AT89C51单片机和DS18B20做温度报警器,报警器用蜂鸣器,温度显示用数码管,用c语言编写程序最好有注释

报警时要有段音乐,最好!
我程序不会!这是做课题设计的题目!望您帮忙!
程序我试了!但是数码管不显示!没反应!

第1个回答  2012-12-08
#include < reg51.h >
#include < intrins.h >
#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 0x0a: 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();
}
}
}
参考一下喔本回答被提问者和网友采纳
第2个回答  2012-12-08
上课好好听
相似回答