A. ds18b20温度报警程序
#include <reg52.h>
#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=temp*0.0625; //得到真实十进制温度值,因为DS18B20
//可以精确到0.0625度,所以读回数据的最低位代表的是
//0.0625度。
temp=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位
//也转换为可显示数字,同时进行一个四舍五入操作。
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-a*10;
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);
}
B. 关于C51单片机温度报警程序的问题 谁能帮我在每段程序后加汉字解释 及怎么实现温度显示及蜂鸣器报警的
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0 ;
#define INT8U unsigned char //宏定义
#define INT16U unsigned int
sbit smg1=P2^0;
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;
sbit Beep=P1^5; //蜂鸣器引脚定义
sbit led=P1^6;
sbit led1=P1^7; //设置灯光报警键
sbit DQ=P2^4; //ds18b20端口
void init_ds18b20(void); //ds18b20初始化子程序
void delay(uchar); //ds18b20工作延时子程序
uchar readbyte(void);//向ds18b20读一个字节数据
/*******************************************************************************/
void writebyte(uchar);//向ds18b20写一个字节数据
uint retemp();//计数变量
uchar key;
uchar a,b,c,d; //计数变量
uchar x[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uint retemp()
{
uint a,b,t;
init_ds18b20(); //初始化ds18b20
writebyte(0xcc); // 跳过读序列号的操作
writebyte(0x44); // 启动温度转换
init_ds18b20();
writebyte(0xcc); //跳过读序号列号的操作
writebyte(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=readbyte(); //读出温度低位LSB
b=readbyte(); //读出温度高位MSB
t=b; //将温度高八位送t
t<<=8; //乘以256移到高八位
t=t|a; //高低八位组合成温度值
if(t<0x8000) //如果温度为正计算正温度值
{
key=0;
t=t*0.625;
}
else //否则温度为负,取反
{
key=1;
t=(~t+1)*0.625;
}
return(t); //返回温度值
}
void main()
{
uint i,t;
EA = 1; //开总中断
TMOD = 0x01; //定时器0工作方式1
TR0=1;
delay(100);
while(1)
{
t=retemp(); 读温度值
a=x[t/1000]; //温度千位数
b=x[t/100%10]; //温度百位数
c=x[t/10%10]-0x80; //温度十位数
d=x[t%10]; //温度个位数
if(key==1) //如果key=1
a=0xbf; //a为“负号"
if((key==0)&&(t>320)) //如果key=0 且t大于320
{
led1=0; //点亮led1
ET0=1; //开启定时器0中断
}
else if(t<290) //如果温度小于290
{
led=0; //点亮led
ET0=1; //开启定时器0中断
}
else //否则
{
led1=1; //关闭led1
led=1; //关闭led
ET0=0; //关闭定时器0中断
}
for(i=0;i<50;i++) //循环50次
{smg1=1;P0=a;delay(100);smg1=0; //显示千位
smg2=1;P0=b;delay(100);smg2=0; //显示百位
smg3=1;P0=c;delay(100);smg3=0; //显示十位
smg4=1;P0=d;delay(100);smg4=0; //显示个位
}
}
}
/*ds18b20工作延时子程序*/
void delay (uchar i)
{
do
{_nop_();
_nop_();
_nop_();
i--;
}
while(i);}
/*ds18b20初始化子程序*/
void init_ds18b20()
{
uchar x=0;
DQ=0; //单片机将DQ拉低
delay (120);
DQ=1; //拉高总线
delay(16);
delay(80);
}
/*读一个字节*/
uchar readbyte ()
{uchar i=0,date=0;
for(i=8;i>0;i--)
{
DQ=0; // 给脉冲信号
delay(1);
DQ=1; // 给脉冲信号
date>>=1;
if(DQ)date|=0x80;
delay(11);
}
return(date);
}
/*写一个字节*/
void writebyte(uchar dat)
{uchar i=0;
for(i=8;i>0;i--) //写8位数
{
DQ=0;
DQ=dat&0x01; //写dat的D0位
delay(12);
DQ=1;
dat>>=1;
delay(5);
}
}
/**************************************************
*函数名:中断函数
*描 述:产生矩形脉冲使蜂鸣器发声
**************************************************/
void BeepTimer0(void) interrupt 1
{
Beep = ~Beep;
TH0 = 65335 / 256; //定时器赋初值
TL0 = 65335 % 256;
}
C. 求用AT89C51单片机和DS18B20做温度报警器,报警器用蜂鸣器,温度显示用数码管,用c语言编写程序最好有注释
#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) //每次延时,最大误差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();
}
}
}
参考一下喔