找回密码
 立即注册

QQ登录

只需一步,快速开始

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

智能温度报警系统程序!!!

[复制链接]
跳转到指定楼层
楼主
ID:264569 发表于 2017-12-22 14:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit DQ=P3^7;//ds18b20与单片机连接口
  6. sbit EN=P2^7;
  7. sbit RW=P2^5;
  8. sbit RS=P2^6;
  9. sbit BEEP = P1^7;//蜂鸣器
  10. uchar code str1[]={" Temperature is   "};
  11. uchar code str2[]={"studentNO:         "};
  12. uchar code str3[]={"0346912"};  
  13. uchar data disdata[5];
  14. uchar p=0;
  15. uint tvalue;//温度值
  16. uchar tflag;//温度正负标志
  17. //*************************lcd1602程序**************************/
  18. void delay1ms(uint ms)//延时1毫秒
  19. {
  20.          uint i,j;
  21.          for(i=0;i<ms;i++)
  22.          for(j=0;j<114;j++);
  23. }
  24. //*************************报警程序**************************/
  25. void baojing(void)
  26. {
  27.        unsigned int j;
  28.            BEEP=0;
  29.        for (j = 49; j > 0; j--)//响30ms
  30.         {
  31.           BEEP = ~BEEP; //输出频率800Hz
  32.           delay1ms(10); //延时310us
  33.           }
  34.               BEEP=0;
  35.     }
  36. void wr_com(uchar com)//写指令//
  37. {
  38.          delay1ms(1);
  39.          RS=0;
  40.          RW=0;
  41.          EN=0;
  42.          P0=com;
  43.          delay1ms(1);
  44.          EN=1;
  45.          delay1ms(1);
  46.          EN=0;
  47. }
  48. void wr_dat(uchar dat)//写数据//
  49. {
  50.          delay1ms(1);
  51.          RS=1;
  52.          RW=0;
  53.          EN=0;
  54.          P0=dat;
  55.          delay1ms(1);
  56.          EN=1;
  57.          delay1ms(1);
  58.          EN=0;
  59. }
  60. void lcd_init()//初始化设置//
  61. {
  62.          wr_com(0x38);delay1ms(5);
  63.          wr_com(0x08);delay1ms(5);
  64.          wr_com(0x01);delay1ms(5);
  65.          wr_com(0x06);delay1ms(5);
  66.          wr_com(0x0c);delay1ms(5);
  67. }
  68. void display(uchar *p)//显示//
  69. {
  70.          while(*p!='\0')
  71.          {
  72.                  wr_dat(*p);
  73.                  p++;
  74.                  delay1ms(1);
  75.          }
  76. }                                                                        
  77. void init_play()//初始化显示
  78. {
  79.          lcd_init();
  80.          wr_com(0x80);
  81.          display(str2);
  82.          wr_com(0xc0);
  83.          display(str3);
  84.          delay1ms(3000);
  85.          lcd_init();
  86. wr_com(0x80);
  87.          display(str1);
  88. }

  89. /***************************ds18b20程序****************************/
  90. void delay_18B20(uint i)//延时1微秒
  91. {
  92.     while(i--);
  93. }
  94. void ds1820rst()/*ds1820复位*/
  95. {

  96.          DQ = 1;          //DQ复位
  97.         delay_18B20(4); //延时
  98.         DQ = 0;          //DQ拉低
  99.         delay_18B20(100); //精确延时大于480us
  100.          DQ = 1;          //拉高
  101.         delay_18B20(30);
  102. }
  103. uchar ds1820rd()/*读数据*/
  104. {
  105.          uchar i=0;
  106.          uchar dat = 0;
  107.          for (i=8;i>0;i--)
  108.          {  
  109.                  DQ = 0; //给脉冲信号
  110.             dat>>=1;
  111.              DQ = 1; //给脉冲信号
  112.             if(DQ)
  113.              dat|=0x80;
  114.              delay_18B20(10);
  115.          }
  116.     return(dat);
  117. }
  118. void ds1820wr(uchar wdata)/*写数据*/
  119. {
  120.          uchar i=0;
  121.          for (i=8; i>0; i--)
  122.          {
  123.                  DQ = 0;
  124.                  DQ = wdata&0x01;
  125.                  delay_18B20(10);
  126.                  DQ = 1;
  127.                  wdata>>=1;
  128.          }
  129. }
  130. read_temp()/*读取温度值并转换*/
  131. {
  132.          uint a,b;
  133.          ds1820rst();   
  134.          ds1820wr(0xcc);//*跳过读序列号*/
  135.          ds1820wr(0x44);//*启动温度转换*/
  136.          ds1820rst();   
  137.          ds1820wr(0xcc);//*跳过读序列号*/
  138.          ds1820wr(0xbe);//*读取温度*/
  139.          a=ds1820rd();
  140.          b=ds1820rd();
  141.          tvalue=b;
  142.          tvalue<<=8;
  143.          tvalue=tvalue|a;
  144. if(tvalue<0x08ff)
  145.                  tflag=0;
  146.          else
  147.          {
  148.                  tvalue=~tvalue+1;
  149.                  tflag=1;
  150.          }                                                                                                         
  151.          tvalue=tvalue*(0.0625)*10;//温度值扩大10倍,精确到1位小数
  152.         return(tvalue);
  153. }
  154. /*******************************************************************/
  155. void ds1820disp()//温度值显示
  156. {
  157.          uchar flagdat;
  158.          disdata[0]=tvalue/1000+0x30;//百位数
  159.         disdata[1]=tvalue%1000/100+0x30;//十位数
  160.         disdata[2]=tvalue%100/10+0x30;//个位数
  161.         disdata[3]=tvalue%10+0x30;//小数位
  162.         if(tflag==0)
  163.                  flagdat=0x20;//正温度不显示符号
  164.         else
  165.          flagdat=0x2d;//负温度显示负号:-

  166.         if(disdata[0]==0x30)
  167.          {
  168.                  disdata[0]=0x20;//如果百位为0,不显示
  169.                 if(disdata[1]==0x30)
  170.                  {
  171.                          disdata[1]=0x20;//如果百位为0,十位为0也不显示
  172.                 }
  173.          }
  174.          wr_com(0xc0+4);
  175.          wr_dat(flagdat);//显示符号位
  176.         wr_com(0xc1+4);
  177.          wr_dat(disdata[0]);//显示百位
  178.         wr_com(0xc2+4);
  179.          wr_dat(disdata[1]);//显示十位
  180.         wr_com(0xc3+4);
  181.          wr_dat(disdata[2]);//显示个位
  182.         wr_com(0xc4+4);
  183.          wr_dat(0x2e);//显示小数点
  184.         wr_com(0xc5+4);
  185.          wr_dat(disdata[3]);//显示小数位
  186.         wr_com(0xc6+4);
  187.      wr_dat(0x43);
  188. }
  189. //********************主程序***********************************//
  190. void main()
  191. {         
  192.      BEEP=0;
  193.          init_play();//初始化显示
  194. while(1)
  195.          {         
  196.                     read_temp();//读取温度
  197.                      ds1820disp();//显示
  198.                         if(read_temp()>252+0x30||read_temp()<203+0x30)           //上限30°C报警,下限25°C报警
  199.                         {  baojing() ;}
  200.                          delay1ms(1)        ;
  201. }}
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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