找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机实现上下限的温度检测与报警Proteus仿真设计

[复制链接]
跳转到指定楼层
楼主
做的单片机课设,简单易理解。
使用DS18B20 和 LCD显示。可实现上下限的温度报警。
含HEX文件,C语言文档,proteus仿真,keil文件。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源码:
  1. #include "reg51.H"
  2. #include "INTRINS.H"
  3. sbit DQ = P3^3;
  4. sbit p3_2 = P3^7;
  5. sbit a = P3^6;
  6. sbit p3_5 = P3^5;
  7. sbit rs=P2^1;
  8. sbit rw=P2^2;
  9. sbit en=P2^3;
  10. unsigned char temp1;//温度值高位
  11. unsigned char temp0;//温度值低位
  12. unsigned char idata TMP;
  13. unsigned char idata TMP_d;
  14. unsigned char f;
  15. unsigned char code zc[]="^_^ COSY";
  16. unsigned char code jg[]="HOT";
  17. unsigned char code jc[]="COLD";
  18. unsigned char code  temper[]= "TEMP IS  ";
  19. unsigned char code wendu[]="0123456789";
  20. unsigned char code fuhao[]="C";
  21. unsigned char code jh=0xdf;
  22. float tem;
  23. void delay_18B20(int i)
  24. {
  25.   while(i--);
  26.   return;

  27. }
  28. void delay(unsigned int count)
  29. {
  30.         unsigned int i;
  31.         while(count)
  32.         {
  33.                 i=200;
  34.                 while(i>0)i--;
  35.                 count--;
  36.         }
  37. }
  38. void Delay_us(unsigned char n)
  39. {
  40.         unsigned char i;
  41.         i=0;
  42.         while(i<n)
  43.         {i++;}
  44.         return;
  45. }
  46. void wr_ds18_1(char dat)
  47. {
  48.             signed char  idata i=0;
  49.             unsigned char idata j;
  50.             bit testb;

  51.             for(j=1;j<=8;j++)         
  52.             {
  53.                 testb=dat & 0x01;
  54.                 dat = dat>>1;
  55.                 if(testb)             //写一
  56.                 {
  57.                             DQ=0;
  58.                              _nop_();
  59.                                 _nop_();
  60.                                 
  61.                             DQ=1;
  62.                           delay_18B20(8);   
  63.                    }
  64.                
  65.                 else                 //写0
  66.                 {
  67.                             DQ=0;
  68.                             delay_18B20(8);
  69.                   
  70.                             DQ=1;
  71.                              _nop_();
  72.                                 _nop_();
  73.                                  
  74.                 }
  75.             }
  76. }
  77. void Init_18B20(void)
  78. {
  79. //  unsigned char x;
  80.   
  81.    DQ=0;
  82.    delay_18B20(103);
  83.    DQ=1;
  84.    delay_18B20(4);
  85.    delay(1);

  86.   // x=DQ;
  87.   // DQ=0;
  88.   // delay_18B20(480);
  89.   // DQ=1;
  90.    wr_ds18_1(0xcc);
  91.   // wr_ds18_1(0xbe);
  92.    wr_ds18_1(0x44);
  93.    
  94. }



  95. unsigned char ReadByte(void)
  96. {
  97.         unsigned char i,k;
  98.         i=8;
  99.         k=0;
  100.         while(i--)
  101.         {        
  102.                 DQ=1;
  103.         //        Delay_us(1);
  104.         _nop_();
  105.                 _nop_();
  106.             DQ=0;
  107.             k=k>>1;
  108.      
  109.                 DQ=1;
  110.         //        Delay_us(60);
  111.         //        _nop_();
  112.                 if(DQ) k|= 0x80;
  113.                 Delay_us(60);
  114.         }
  115.         return(k);
  116. }


  117. void tempture(void)
  118. {

  119. // delay_18B20(12);
  120. // Init_18B20();
  121. // wr_ds18_1(0xcc);
  122.   //wr_ds18_1(0x44);
  123. // delay_18B20(12);
  124.   //Init_18B20();
  125.    DQ=0;
  126.    delay_18B20(103);
  127.    DQ=1;
  128.    delay_18B20(4);

  129.    delay(1);
  130.   
  131.   wr_ds18_1(0xcc);
  132.   wr_ds18_1(0xbe);
  133.   
  134.   //delay_18B20(12);
  135.   temp0=ReadByte();//diwei
  136.   temp1=ReadByte();//gaowei
  137.   f=temp1&0xf8;
  138.           if(f)
  139.         {
  140.                 temp1=~temp1;
  141.                 if(temp0==0)temp1++;        
  142.                 temp0=~temp0+1;        
  143.         }
  144. tem=(temp1*256+temp0)/16;

  145. }
  146. /********************lcd*****************************/
  147.    void write_com(unsigned char com)
  148. {
  149.    rs=0;
  150.    rw=0;
  151.    P0=com;
  152.    Delay_us(550);
  153.    en=1;
  154.    Delay_us(550);
  155.    en=0;
  156.    
  157. }
  158.    void write_data(unsigned char dat)
  159. {
  160.    rs=1;
  161.    rw=0;
  162.    P0=dat;
  163.    Delay_us(550);
  164.    en=1;
  165.    Delay_us(550);
  166.    en=0;
  167. }
  168. void init1602()
  169. {
  170.   rw=0;
  171.   en=0;
  172.   write_com(0x3c);
  173.   write_com(0x0c);
  174.   write_com(0x06);
  175.   write_com(0x01);
  176.   write_com(0x80);
  177. }
  178. void lcd_clear()
  179. {
  180.    int i,j;
  181.    for(i=0;i<32;i++){ write_data(0); }
  182. }
  183. void main()
  184. {
  185.                                                    
  186.     p3_2=0;
  187.           a=0;
  188.    
  189.           while(1)
  190.           {   
  191.         unsigned char i,j;
  192.         int h,l;
  193.             init1602();                 //lcd初始化
  194.         Init_18B20();               //18B20初始化
  195.         //        lcd_clear();
  196.                 tempture();                                        //使用该函数获得温度
  197.             
  198.         if(tem>30)
  199.            {
  200.                                                  p3_2=1;
  201.                                            a=1;
  202.                                                  write_com(0x80);
  203.                                                  for(i=0;i<3;i++)
  204.                                                                 {
  205.                                                                         write_data(jg[i]);
  206.                                                                 }
  207.                                          }
  208.                                 else if (tem<10)
  209.                                          {
  210.                                                  p3_2=1;
  211.                                            a=1;
  212.                                                  write_com(0x80);
  213.                                                  for(i=0;i<4;i++)
  214.                                                                 {
  215.                                                                         write_data(jc[i]);
  216.                                                                 }
  217.                                          }
  218.                     else
  219.                                         {
  220.                                                 p3_2=0;
  221.                                                 a=0;
  222.                                                  //init1602();  
  223.                                                  write_com(0x80);
  224.                                                         for(i=0;i<8;i++)
  225.                                                                 {
  226.                                                                         write_data(zc[i]);
  227.                                                                 }
  228.                                         }
  229.          h=(int)tem/10;
  230.          l=(int)tem%10;
  231.       

  232.         write_com(0x80+0x41);
  233.                                 for(i=0;i<8;i++)
  234.                                                                 {
  235.                                                                         write_data(temper[i]);
  236.                                                                 }
  237.         write_data(wendu[h]);
  238.         write_data(wendu[l]);
  239.                           write_data(jh);
  240.         write_data(fuhao[0]);
  241.                
  242.         delay_18B20(20000);                   //等待转换结束,不然转换结果会不稳定
  243.         delay_18B20(20000);      
  244.         
  245.            
  246.                                                                
  247. }
  248. }
复制代码
全部资料51hei下载地址:
新建文件夹.zip (80.62 KB, 下载次数: 61)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:526896 发表于 2019-5-11 14:11 | 只看该作者
大神 这个程序能改成多点测温和按键调整多个上下限的程序吗
回复

使用道具 举报

板凳
ID:66287 发表于 2019-5-17 14:37 | 只看该作者
比较佩服这些不写注释的高人,时间久了,你看不累?
回复

使用道具 举报

地板
ID:521983 发表于 2019-5-23 10:46 | 只看该作者
感谢楼主,不知增么调节上下限?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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