找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1750|回复: 0
打印 上一主题 下一主题
收起左侧

ds18b20+扬声器做的简易温度报警(仿真+源码)

[复制链接]
跳转到指定楼层
楼主
ds18b20+扬声器做的简易温度报警(仿真+源码)仿真再附上的图片里
源码比较简单,就是检测温度是否达到31度,是的话就启动扬声器

下载: Desktop.rar (66.96 KB, 下载次数: 23)




单片机源程序如下:

  1. /*******************************************************************************
  2. 程序功能:实时采集当前环境温度值,并显示于数码管上。
  3.                   同时,当温度高于某一值时(此处设为31摄氏度),蜂鸣器便会发出报警。
  4.                   而当低于该值时,蜂鸣器自动停止报警。
  5.                   试验时,可用手触摸DS18B20,使其温度升高到31度,观察现象。
  6. *****************************************************************************/
  7. #include <reg52.h>
  8. #define uchar unsigned char
  9. #define uint unsigned int
  10. sbit DS=P2^2;           //define interface
  11. uint temp;             // variable of temperature
  12. uchar flag1;            // sign of the result positive or negative
  13. sbit dula=P2^6;
  14. sbit wela=P2^7;
  15. sbit beep=P2^3;
  16. unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xa0,0x83,0xc6,0xa1,0x84,0x8e};
  17. unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

  18. void delay(uint count)      //delay
  19. {
  20.   uint i;
  21.   while(count)
  22.   {
  23.     i=200;
  24.     while(i>0)
  25.     i--;
  26.     count--;
  27.   }
  28. }
  29. void dsreset(void)       //send reset and initialization command
  30. {
  31.   uint i;
  32.   DS=0;
  33.   i=103;
  34.   while(i>0)i--;
  35.   DS=1;
  36.   i=4;
  37.   while(i>0)i--;
  38. }

  39. bit tmpreadbit(void)       //read a bit
  40. {
  41.    uint i;
  42.    bit dat;
  43.    DS=0;i++;          //i++ for delay
  44.    DS=1;i++;i++;
  45.    dat=DS;
  46.    i=8;while(i>0)i--;
  47.    return (dat);
  48. }

  49. uchar tmpread(void)   //read a byte date
  50. {
  51.   uchar i,j,dat;
  52.   dat=0;
  53.   for(i=1;i<=8;i++)
  54.   {
  55.     j=tmpreadbit();
  56.     dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  57.   }
  58.   return(dat);
  59. }

  60. void tmpwritebyte(uchar dat)   //write a byte to ds18b20
  61. {
  62.   uint i;
  63.   uchar j;
  64.   bit testb;
  65.   for(j=1;j<=8;j++)
  66.   {
  67.     testb=dat&0x01;
  68.     dat=dat>>1;
  69.     if(testb)     //write 1
  70.     {
  71.       DS=0;
  72.       i++;i++;
  73.       DS=1;
  74.       i=8;while(i>0)i--;
  75.     }
  76.     else
  77.     {
  78.       DS=0;       //write 0
  79.       i=8;while(i>0)i--;
  80.       DS=1;
  81.       i++;i++;
  82.     }

  83.   }
  84. }

  85. void tmpchange(void)  //DS18B20 begin change
  86. {
  87.   dsreset();
  88.   delay(1);
  89.   tmpwritebyte(0xcc);  // address all drivers on bus
  90.   tmpwritebyte(0x44);  //  initiates a single temperature conversion
  91. }

  92. uint tmp()               //get the temperature
  93. {
  94.   float tt;
  95.   uchar a,b;
  96.   dsreset();
  97.   delay(1);
  98.   tmpwritebyte(0xcc);
  99.   tmpwritebyte(0xbe);
  100.   a=tmpread();
  101.   b=tmpread();
  102.   temp=b;
  103.   temp<<=8;             //two byte  compose a int variable
  104.   temp=temp|a;
  105.   tt=temp*0.0625;
  106.   temp=tt*10+0.5;
  107.   return temp;
  108. }

  109. void display(uint temp)                        //显示程序
  110. {
  111.    uchar A1,A2,A2t,A3;
  112.    A1=temp/100;
  113.    A2t=temp%100;
  114.    A2=A2t/10;
  115.    A3=A2t%10;
  116.    dula=0;
  117.    P0=table[A1];                //显示百位
  118.    dula=1;
  119.    dula=0;

  120.    wela=0;
  121.    P0=0x01;
  122.    wela=1;
  123.    wela=0;
  124.    delay(1);

  125.    dula=0;
  126.    P0=table1[A2];                //显示十位
  127.    dula=1;
  128.    dula=0;

  129.    wela=0;
  130.    P0=0x02;
  131.    wela=1;
  132.    wela=0;
  133.    delay(1);

  134.    P0=table[A3];                //显示个位
  135.    dula=1;
  136.    dula=0;

  137.    P0=0x04;
  138.    wela=1;
  139.    wela=0;
  140.    delay(1);
  141. }


  142. void main()
  143. {
  144. uchar a;
  145.   do
  146.   {
  147.     tmpchange();
  148.         for(a=10;a>0;a--)
  149.           {   
  150.                   display(tmp());
  151.           }
  152.         if(temp>=310)         //当温度超过31度(仅作试验用,实际可设为其他更高的值),蜂鸣器便会报警。
  153.                 {
  154.                         P1=0x00;
  155.                         beep=0;
  156.                 }
  157.                 else
  158.                 {
  159.                         beep=1;
  160.                         P1=0xff;
  161.                 }
  162.   } while(1);
  163. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表