找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的数字温度计,上下限,蜂鸣器报警程序

[复制链接]
跳转到指定楼层
楼主
ID:632142 发表于 2020-1-4 10:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg52.h>
  2. #define key P2
  3. #define LCD1602_DB  P0
  4. sbit LCD1602_RS = P1^0;
  5. sbit LCD1602_RW = P1^1;
  6. sbit ADDR2 = P1^2;
  7. sbit ADDR3 = P1^3;//
  8. sbit ENLED = P1^4;//p1.4和p1.3是138使能端
  9. static unsigned char D=0;
  10. static unsigned char G=50;

  11.        sbitbuzz=P1^6;
  12. bit flag1s = 0;          //1s定时标志
  13. unsigned char T0RH = 0;  //T0重载值的高字节
  14. unsigned char T0RL = 0;  //T0重载值的低字节
  15. extern void delay_ms(unsigned int ms);
  16. extern void DelayX10us(unsigned char t);
  17. void ConfigTimer0(unsigned int ms);
  18. unsigned char IntToString(unsigned char*str, int dat);
  19. extern bit Start18B20();
  20. extern bit Get18B20Temp(int *temp);
  21. extern void InitLcd1602();
  22. extern void LcdShowStr(unsigned char x,unsigned char y, unsigned char *str);
  23. unsigned char code table0[]="D=";
  24. unsigned char code table1[]="G=";
  25. unsigned char code table2[]="TEMPIS:";
  26. unsigned char codetable3[]="DS18B20  ERR0R!";
  27. unsigned char codetable4[]="PLEASE   CHECK!";
  28. unsigned char code table5[]="'C";

  29. unsigned char code table7[]="Wlecometo you!!";
  30. unsigned char code table8[]=" I am YYY_Temp!";


  31. void main()
  32. {     
  33.    bit res;
  34.    int temp;        //读取到的当前温度值
  35.    int intT, decT;  //温度值的整数和小数部分
  36.    unsigned char len;
  37.    unsigned char str[12];
  38.    InitLcd1602();   
  39.    LcdShowStr(0, 0, table7);
  40.    LcdShowStr(0, 1, table8);//5初始化显示5s
  41.         delay_ms(5000);
  42.            EX0=1;
  43.            IT0=1;
  44.    EA = 1;            //开总中断
  45.       
  46.    ConfigTimer0(10);  //T0定时10ms
  47.          
  48.    Start18B20();      //启动DS18B20
  49.         delay_ms(5000);

  50.    while (1)
  51.     {
  52.        if (flag1s)  //每5秒更新一次温度
  53.        {
  54.            flag1s = 0;
  55.            res = Get18B20Temp(&temp);  //读取当前温度
  56.            if (res)                    //读取成功时,刷新当前温度显示
  57.            {
  58.                                                    intT = temp >> 4;             //分离出温度值整数部分
  59.                 decT = temp & 0xF;            //分离出温度值小数部分
  60.                 len = IntToString(str, intT);//整数部分转换为字符串
  61.                 str[len++] = '.';             //添加小数点
  62.                 decT = (decT*10) / 16;        //二进制的小数部分转换为1位十进制位
  63.                 str[len++] = decT + '0';      //十进制小数位再转换为ASCII字符
  64.                 while (len < 6)               //用空格补齐到6个字符长度
  65.                 {
  66.                     str[len++] = ' ';
  67.                 }
  68.                 str[len] = '\0';              //添加字符串结束符
  69.                 LcdShowStr(8, 1, str);        //显示到液晶屏         
  70.                                                         
  71.                                                         len= IntToString(str, D); //整数部分转换为字符串
  72.                 while (len < 6)               //用空格补齐到6个字符长度
  73.                 {
  74.                     str[len++] = ' ';
  75.                 }
  76.                 str[len] = '\0';              //添加字符串结束符
  77.                 LcdShowStr(2, 0, str);
  78.                                                         
  79.                 len = IntToString(str, G); //整数部分转换为字符串
  80.                 while (len < 6)               //用空格补齐到6个字符长度
  81.                 {
  82.                     str[len++] = ' ';
  83.                 }
  84.                 str[len] = '\0';              //添加字符串结束符
  85.                 LcdShowStr(10, 0, str);
  86.                                                       
  87.                                                         LcdShowStr(0,0, table0);
  88.                                                         LcdShowStr(8,0, table1);
  89.                                                         LcdShowStr(0,1, table2);
  90.                                                         LcdShowStr(13,1, table5);
  91.            }
  92.            else                        //读取失败时,提示错误信息
  93.            {
  94.                 LcdShowStr(0, 0, table3);
  95.                                                    LcdShowStr(0, 1, table4);
  96.            }
  97.            Start18B20();               //重新启动下一次转换
  98.        }
  99.                             //键盘设置上下限,0.3s扫描一次键值,同时更新一次上下限的显示
  100.         key=0xf7;
  101.                             if(key!=0xf7)
  102.                                           {
  103.                delay_ms(10);
  104.                                                  switch(key)
  105.                                                  {
  106.                                                         case0xe7:
  107.                                                          D++;
  108.                                                          if(D==G)D=0;
  109.                                                                len= IntToString(str, D); //整数部分转换为字符串
  110.                                                                while(len < 6)               //用空格补齐到6个字符长度
  111.                                                                {
  112.                                                                              str[len++]= ' ';
  113.                                                                }
  114.                                                                str[len]= '\0';              //添加字符串结束符
  115.                                                                LcdShowStr(2,0, str);
  116.                   break;        
  117.                                                         case0xd7:
  118.                                                                G--;
  119.                                                                if(G==D)G=50;
  120.                                                                len= IntToString(str, G); //整数部分转换为字符串
  121.                                                                while(len < 6)               //用空格补齐到6个字符长度
  122.                                                                {
  123.                                                                              str[len++]= ' ';
  124.                                                                }
  125.                                                                str[len]= '\0';              //添加字符串结束符
  126.                                                                LcdShowStr(10,0, str);
  127.                                                                break;
  128.                                                  }
  129.                                             Start18B20();
  130.                                       delay_ms(300);//等待0.3s开始下一次扫描键值                                                        
  131.             }
  132.                                           //光和声音警报部分
  133.                                           
  134.                                                         if(D>temp*0.0625||G<temp*0.0625)//超值报警
  135.                                                         {
  136.                                                         
  137.                                                                ENLED= 0;
  138.                                                                ADDR3= 1;
  139.                                                                ADDR2= 1;
  140.                                                                LCD1602_RW= 1;
  141.                                                                LCD1602_RS= 0;

  142.                                                                LCD1602_DB=0xf0;
  143.                                                                
  144.                                                                buzz=1;
  145.                                                                DelayX10us(17);
  146.                                                                buzz=0;
  147.                                                                DelayX10us(17);
  148.                                                                
  149.                                                                ENLED= 1;//138使能关闭
  150.                                                         }
  151.                                                                if(D==(temp*0.0625)||G==(temp*0.0625))//等值报警
  152.                                                         {
  153.                                                                ENLED= 0;
  154.                                                                ADDR3= 1;
  155.                                                                ADDR2= 1;
  156.                                                                LCD1602_RW = 1;
  157.                                                                LCD1602_RS= 0;

  158.                                                                LCD1602_DB=0xf8;
  159.                                                                buzz=1;
  160.                                                                DelayX10us(100);
  161.                                                                buzz=0;
  162.                                                                DelayX10us(100);
  163.                                                                ENLED= 1;//138使能关闭
  164.                                                         }      
  165.                                                         if((D<temp*0.0625&&(1.1*D)>temp*0.0625)||(G>temp*0.0625&&(0.9*G)<temp*0.0625))//接近报警
  166.                                                         {
  167.                                                                ENLED= 0;
  168.                                                                ADDR3= 1;
  169.                                                                ADDR2= 1;
  170.                                                                LCD1602_RW= 1;
  171.                                                                LCD1602_RS= 0;

  172.                                                                LCD1602_DB=0xfc;
  173.                                                                buzz=1;
  174.                                                                DelayX10us(2500);
  175.                                                                buzz=0;
  176.                                                                DelayX10us(2500);
  177.                                                                ENLED= 1;//138使能关闭
  178.                                                         }
  179.                                                 
  180.                                           
  181.     }
  182. }
  183. /* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度*/
  184. unsigned char IntToString(unsigned char*str, int dat)
  185. {
  186.    signed char i = 0;
  187.    unsigned char len = 0;
  188.    unsigned char buf[6];
  189.    
  190.    if (dat < 0)  //如果为负数,首先取绝对值,并在指针上添加负号
  191.     {
  192.        dat = -dat;
  193.        *str++ = '-';
  194.        len++;
  195.     }
  196.               else
  197.               {
  198.               *str++= ' ';
  199.     len++;
  200.               }
  201.    do {          //先转换为低位在前的十进制数组
  202.        buf[i++] = dat % 10;
  203.        dat /= 10;
  204.     }while (dat > 0);
  205.    len += i;     //i最后的值就是有效字符的个数
  206.    while (i-- > 0)   //将数组值转换为ASCII码反向拷贝到接收指针上
  207.     {
  208.        *str++ = buf[i] + '0';
  209.     }
  210.    *str = '\0';  //添加字符串结束符
  211.    
  212.    return len;   //返回字符串长度
  213. }
  214. /* 配置并启动T0,ms-T0定时时间 */
  215. void ConfigTimer0(unsigned int ms)
  216. {
  217.    unsigned long tmp;  //临时变量
  218.    
  219.    tmp = 11059200 / 12;      //定时器计数频率
  220.    tmp = (tmp * ms) / 1000;  //计算所需的计数值
  221.    tmp = 65536 - tmp;        //计算定时器重载值
  222.    tmp = tmp + 12;           //补偿中断响应延时造成的误差
  223.    T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
  224.    T0RL = (unsigned char)tmp;
  225.    TMOD &= 0xF0;   //清零T0的控制位
  226.    TMOD |= 0x01;   //配置T0为模式1
  227.    TH0 = T0RH;     //加载T0重载值
  228.    TL0 = T0RL;
  229.    ET0 = 1;        //使能T0中断
  230.    TR0 = 1;        //启动T0
  231. }
  232. /* T0中断服务函数,完成1秒定时 */
  233. void InterruptTimer0() interrupt 1
  234. {
  235.    static unsigned int tmr1s = 0;
  236.    
  237.    TH0 = T0RH;  //重新加载重载值
  238.    TL0 = T0RL;
  239.    tmr1s++;
  240.    if (tmr1s >= 500)  //定时5s
  241.     {
  242.        tmr1s = 0;
  243.        flag1s = 1;
  244.     }
  245. }
复制代码

超级无敌终极版本数字温度计.zip

64.21 KB, 下载次数: 75, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:293630 发表于 2020-4-28 23:04 来自手机 | 只看该作者
楼主方便把仿真也放一下么?麻烦了
回复

使用道具 举报

板凳
ID:994797 发表于 2021-12-22 08:16 | 只看该作者
那个,温度可以显示负数啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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