distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xfe,0xf7};❓
uchar dismod=0,xiaodou1=0,xiaodou2=0,currtemp;
bit flag;❓定义一个位变量
void t0isr() interrupt 1
{
TH0=(65536-5000)/256;❓定时器0 5ms溢出一次参数高八位
TL0=(65536-5000)%256;❓定时器0 5ms溢出一次参数低八位
switch(number)❓显示第number位
{
case 0:
P2=0x08;❓第一位选
P0=distab[TempBuffer1[0]];❓第一段码
break;❓退出switch
case 1:
P2=0x04;
P0=distab[TempBuffer1[1]];
break;
case 2:
P2=0x02;
P0=distab[TempBuffer1[2]]&0x7f;
break;
case 3:
P2=0x01;
P0=distab[TempBuffer1[3]];❓第四段码
break;
default:
break;
}
number++;
if(number>3)number=0;
}
void delay_18B20(unsigned int i)❓延时
{
while(i--);
}
/ds18b20初始化函数/
void Init_DS18B20(void)
{
bit x=0;
do{
DQ=1;
delay_18B20(8);
DQ = 0; //单片机将DQ❓数据位送0
delay_18B20(90); //精确延时 大于 480us
DQ = 1; //拉高总线❓数据位送1
delay_18B20(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败,继续初始化
}while(x);
delay_18B20(20);
}
/ds18b20读一个字节/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号❓数据送0
dat>>=1;
DQ = 1; // 给脉冲信号
i
#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();
}
}
}
参考一下喔
以上就是关于如下单片机温度报警器程序的意思(画问号的地方都不太明白,计算机小白求大佬帮忙解释)全部的内容,包括:如下单片机温度报警器程序的意思(画问号的地方都不太明白,计算机小白求大佬帮忙解释)、求用AT89C51单片机和DS18B20做温度报警器,报警器用蜂鸣器,温度显示用数码管,用c语言编写程序最好有注释、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)