小小温度报警器

来源:互联网 发布:时时彩源码出售.txt 编辑:程序博客网 时间:2024/04/29 18:51

 #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;
 
  }
}