小小温度报警器

 #include<reg52.h>
 #include<absacc.h>
 #define uchar unsigned char
 #define uint  unsigned int
 #define PA  XBYTE[0XD1FF]
 #define PB  XBYTE[0XD2FF]
 #define CON XBYTE[0XD7FF]

 uchar table[]={0xfe,0xfd,0xfb};
 uchar table1[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xb8,0x20,0x28};
 uchar b;    //返回温度的全局变量
 
 sbit DQ=P1^7;   //温度传感器的数据引脚
 sbit P33=P3^3;

 void write_byte(uchar dat);
 uchar read_byte();
 void initial_18b20();
 void delay(uchar t);
 uchar readtemperature(void);

 //延时函数
 void delay(uchar t)
 {
   while(t--);
 }
 
 /************************
  函数名:write_byte()—写字节函数                    
  函数调用:无
  函数功能:给温度传感器写数据和指令                     
 ************************/
 void write_byte(uchar dat)
 {
  uchar i;
 for(i=0;i<8;i++)
 {
    DQ=0;     //拉低数据总线,准备写入数据
    DQ=dat&0x01;    //从最低位开始往单总线上传数据
    delay(4);    //延时以使温度传感器采样完数据
    DQ=1;     //释放总线
    dat=dat>>1;    //从高位往低位移动要传的数据
 
  }
  delay(5);
 
 }
 
 /************************
  函数名:rea_byte()—字节函数                    
  函数调用:无
  函数功能:从温度传感器中读出数据                     
 ************************/
 uchar read_byte(void)
 {
   uchar i,value;
   for(i=0;i<8;i++)
   {
     DQ=0;    //拉低单总线,开始读时间隙
  value>>=1;   //将所获得的数据从高往低移动
  DQ=1;    //拉高总线,开始总线采样从温度传感器中传出的数据
  if(DQ)
  value=value|0X80; //采样得到“1”的数据
  delay(4);
 
   }
   return value;   //返回采样到的数据
   
 }

/************************
  函数名:initial_18b20()—温度传感器初始化函数                    
  函数调用:delay()
  函数功能:初始化温度传感器                    
 ************************/
 void initial_18b20()
 {
    uchar n;
 DQ=1;
 delay(8);
 DQ=0;
 delay(80);
 DQ=1;
 delay(5);
 n=DQ;
 while(n);
 delay(15);

 }

/************************
  函数名:displayreadtemperature()—温度传感器初始化函数                    
  函数调用:delay(),write_byte(),read_byte(),initial_18b20()
  函数功能:初始化温度传感器                    
 ************************/
uchar  displayreadtemperature(void)
{
   uchar a,b,c;
   uchar x,y;
   initial_18b20();    //初始化温度传感器
   write_byte(0xcc);   //跳过搜索rom指令
   write_byte(0x44);   //开始温度传感器的转换
   delay(300);     //等待转换

   initial_18b20();    //初始化温度传感器
   write_byte(0xcc);   //跳过搜索rom指令
   write_byte(0xbe);   //写入读温度传感器的指令
   a=read_byte();    //读到第一字节的数据
   b=read_byte();    //读到第二字节的数据
   c=a&0x0f;     //得到a的低四位数据
   b<<=4;     
   b+=(a&0xf0)>>4;    //得到温度值的整数值
   c=c*0.0625*10;    //得到温度值的小数点后第一位的值
  
   x=b/16;
   y=b%16;
   PB=0xff;
   PA=table[0];
   PB=table1[x];  //显示温度值的十位
   delay(100);
   PB=0xff;
   PA=table[1];
   PB=table1[y]-32;  //显示温度值的个位,减32是显示加了小数点后的编码
   delay(100);
   PB=0xff;
   PA=table[2];
   PB=table1[c];  //显示温度值的小数位
   delay(100);
   b=10*x+y;   //将显示的值赋给b
   return b;

}

main()
{
  uchar temp;
  CON=0X80;       //写入8255的控制字
  P33=1;
  while(1)
  {
    temp=displayreadtemperature();
 if(temp>=40||temp<0)    //判断温度值是否超过报警值
    {
      P33=~P33;       //超过产生驱动蜂鸣器报警的方波

    }
 else
   P33=1;
 
  }
}

 

代码:#include //用AT89C51时就用这个头文件 //#include //用华邦W78E58B时必须用这个头文件 #include #include #include #include #include #include #include "LCD1602.h" ////液晶显示头文件 //sbit DQ = P3^4; //定义DQ引脚为P3.4 sbit mode=P1^3; sbit add=P1^4; sbit sub=P1^5; sbit power=P1^7; unsigned char TH=50,TL=20; unsigned char t[2],*pt; //用来存放温度值,测温程序就是通过这个数组与主函数通信的 unsigned char TempBuffer1[9]={0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,'\0'}; //显示实时温度,上电时显示+125.00C unsigned char TempBuffer0[17]={0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20, 0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'\0'}; //显示温度上下限,上电时显示TH:+125 TL:+124C unsigned char code dotcode[4]={0,25,50,75}; /***因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法******* 再将表值分离出十位和个位后送到十分位和百分位********************/ void covert0( unsigned char TH, unsigned char TL) //将温度上下限转换为LCD显示的数据 { if(TH>0x7F) //判断正负,如果为负温,将其转化为其绝对值 { TempBuffer0[3]=0x2d; //0x2d为"-"的ASCII码 TH=~TH; TH++; } else TempBuffer0[3]=0x2b; //0x2B为"+"的ASCII码 if(TL>0x7f) { TempBuffer0[11]=0x2d; //0x2d为"-"的ASCII码 TL=~TL+1; } else TempBuffer0[11]=0x2b; //0x2B为"+"的ASCII码 TempBuffer0[4]=TH/100+0x30; //分离出TH的百十个位 if( TempBuffer0[4]==0x30) TempBuffer0[4]=0xfe; //百位数消隐 TempBuffer0[5]=(TH0)/10+0x30; //分离出十位 TempBuffer0[6]=(TH0)+0x30; //分离出个位 TempBuffer0[12]=TL/100+0x30; //分离出TL的百十个位 if( TempBuffer0[12]==0x30) TempBuffer0[12]=0xfe; //百位数消隐 TempBuffer0[13]=(TL0)/10+0x30; //分离出十位 TempBuffer0[14]=(TL0)+0x30; //分离出个位 } void covert1(void) //将温度转换为LCD显示的数据 { unsigned char x=0x00,y=0x00; t[0]=*pt; pt++; t[1]=*pt; if(t[1]>0x07) //判断正负温度 { TempBuffer1[0]=0x2d; //0x2d为"-"的ASCII码 t[1]=~t[1]; /*下面几句把负数的补码*/ t[0]=~t[0]; /* 换算成绝对值*********/ x=t[0]+1; /***********************/ t[0]=x; /***********************/ if(x>255) /**********************/ t[1]++; /*********************/ } else TempBuffer1[0]=0x2b; //0xfe为变"+"的ASCII码 t[1]<>=4; //右移4位 x=x&0x0f; //和前面两句就是取出t[0]的高四位 t[1]=t[1]|x; //将高低字节的有效值的整数部分拼成一个字节 if(t[1]>TH) { power=0; } if(t[1]>=2; //左移两位,以便查表 x=t[0]; y=dotcode[x]; //查表换算成实际的小数 TempBuffer1[5]=y/10+0x30; //分离出十分位 TempBuffer1[6]=y+0x30; //分离出百分位 } void delay(unsigned char i) { while(i--); } main() { bit flag1=0; bit flag2=0; //下一步扩展时可能通过这两个变量,调节上下限 power=0; //测温函数返回这个数组的头地址 while(1) { if(mode==0) { if(add==1) { flag1=0; } if(add==0&&flag1==0) { TL++; flag1=1; } if(sub==1) { flag2=0; } if(sub==0&&flag2==0&&TL>20) { TL--; flag2=1; } } if(mode==1) { if(add==1) { flag1=0; } if(add==0&&flag1==0&&TH<50) { TH++; flag1=1; } if(sub==1) { flag2=0; } if(sub==0&&flag2==0) { TH--; flag2=1; } } pt=ReadTemperature(TH,TL,0x3f); //上限温度-22,下限-24,分辨率10位,也就是0.25C //读取温度,温度值存放在一个两个字节的数组中, delay(100); covert1(); covert0(TH,TL); LCD_Initial(); //第一个参数列号,第二个为行号,为0表示第一行 //为1表示第二行,第三个参数为显示数据的首地址 LCD_Print(0,0,TempBuffer0); LCD_Print(0,1,"Cur_Temp:"); LCD_Print(10,1,TempBuffer1); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值