找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3704|回复: 2
收起左侧

单片机智能热得快仿真设计 含源码

[复制链接]
ID:328014 发表于 2018-7-1 04:16 | 显示全部楼层 |阅读模式
智能热得快仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序:
  1. /*头文件*/

  2. #include<reg52.h>
  3. #include <intrins.h>
  4. /*****************宏定义******************/
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. /***********位操作端口定义**************/
  8. sbit set_key=P1^4;          //“设置”键 K1
  9. sbit add_key=P1^5;           //“加”键 K2
  10. sbit cut_key=P1^6;           //  “减”键 K3
  11. sbit speak=P3^7;          //   蜂鸣器
  12. sbit JK1=P3^6;                 //           温度继电器
  13. sbit JK2=P3^5;                 //          水位继电器
  14. sbit DQ1=P3^3;
  15. sbit qian_wei=P0^7;
  16. sbit bai_wei=P0^6;
  17. sbit shi_wei=P0^5;
  18. sbit ge_wei=P0^4;
  19. sbit led4=P0^3;          //满水位指示灯红色
  20. sbit led3=P0^2;          //3/4水位指示灯
  21. sbit led2=P0^1;          //1/2水位指示灯
  22. sbit led1=P0^0;         //1/4水位指示灯

  23. sbit SW041=P1^0; //1/4水位
  24. sbit SW021=P1^1; //1/2水位
  25. sbit SW043=P1^2; //3/4水位
  26. sbit SW01=P1^3; //满水位
  27. uchar bianma[]={0x05,0xdd,0x46,0x54,0x9c,0x34,0x24,0x5d,0x04,0x14,0xf6};
  28. uchar flog4;
  29. uint DD1;
  30. uchar T_data[4]={0,0,0,0};
  31. uchar Set_data[3]={0,0,0};
  32. uint HT=300,LT;
  33. void delay_1ms(uchar i)
  34. {
  35.           uint x,y;
  36.         for(x=i;x>0;x--)
  37.                 for(y=124;y>0;y--);
  38. }
  39. void data_pro()
  40. {
  41.         Set_data[0]=HT/1000;
  42.         Set_data[1]=(HT%1000)/100;
  43.         Set_data[2]=(HT%100)/10;
  44. }
  45. /*****延时子程序*****/
  46. void Delay_DS18B20(int num)
  47. {
  48.    while(num--) ;
  49. }
  50. /*****初始化DS18B20*****/
  51. void Init_DS18B20(void)
  52. {
  53.    uchar x=0;
  54.    DQ1=1;          //DQ复位
  55.    Delay_DS18B20(2);   //稍做延时
  56.    DQ1=0;          //单片机将DQ拉低
  57.    Delay_DS18B20(80); //精确延时,大于480us
  58.    DQ1=1;          //拉高总线
  59.    Delay_DS18B20(14);
  60.    x=DQ1;            //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
  61.    Delay_DS18B20(20);
  62. }

  63. /*****读一个字节*****/
  64. uchar ReadOneChar(void)
  65. {
  66.    uchar i=0;
  67.    uchar dat=0;
  68.    for(i=8;i>0;i--)         //串行接收数据
  69.    {
  70.            DQ1=0;     // 给脉冲信号
  71.            dat>>=1;
  72.            DQ1=1;     // 给脉冲信号
  73.            if(DQ1)
  74.            dat|=0x80;
  75.            Delay_DS18B20(8);
  76.    }
  77.    return(dat);
  78. }

  79. /*****写一个字节*****/
  80. void WriteOneChar(uchar dat)
  81. {
  82.         uchar i=0;
  83.         for(i=8;i>0;i--)
  84.         {
  85.                 DQ1=0;
  86.                 DQ1=dat&0x01;          //写入最低位
  87.                 Delay_DS18B20(10);
  88.                 DQ1=1;
  89.                 dat>>=1;          //右移一位
  90.     }
  91. }

  92. /*****读取温度*****/
  93. uint ReadTemperature(void)
  94. {
  95.    uchar a=0;
  96.    uchar b=0;
  97.    uint t=0;
  98.    float tt=0;
  99.    Init_DS18B20();            //初始化DS18B20
  100.    WriteOneChar(0xCC); //跳过读序号列号的操作
  101.    WriteOneChar(0x44); //启动温度转换
  102.    Delay_DS18B20(20);
  103.    Init_DS18B20();           //初始化DS18B20
  104.    WriteOneChar(0xCC); //跳过读序号列号的操作
  105.    WriteOneChar(0xBE); //读取温度寄存器
  106.    a=ReadOneChar();    //读低8位
  107.    b=ReadOneChar();    //读高8位
  108.    t=b;
  109.    t<<=8;
  110.    t=t|a;
  111.    tt=t*0.0625;
  112.    t= tt*10+0.5;      //放大10倍输出并四舍五入
  113.    return(t);
  114. }

  115. void pos_data()
  116. {
  117.         DD1=ReadTemperature();
  118.         T_data[0]=DD1/1000;
  119.         T_data[1]=(DD1%1000)/100;
  120.         T_data[2]=(DD1%100)/10;
  121.         T_data[3]=DD1%10;
  122. }

  123. void display_set()                 //温度报警值设置
  124. {
  125.         qian_wei=0;
  126.         bai_wei=1;
  127.         shi_wei=1;
  128.         ge_wei=1;
  129.         P2=bianma[10];
  130.         delay_1ms(5);
  131.         qian_wei=1;
  132.         bai_wei=0;
  133.         shi_wei=1;
  134.         ge_wei=1;
  135.         P2=bianma[Set_data[0]];
  136.         delay_1ms(5);
  137.         P2=0xff;
  138.         qian_wei=1;
  139.         bai_wei=1;
  140.         shi_wei=0;
  141.         ge_wei=1;
  142.         P2=bianma[Set_data[1]];
  143.         delay_1ms(5);
  144.         P2=0xff;
  145.         qian_wei=1;
  146.         bai_wei=1;
  147.         shi_wei=1;
  148.         ge_wei=0;
  149.         P2=bianma[Set_data[2]];
  150.         delay_1ms(5);
  151.         P2=0xff;
  152. }

  153. void display()                   //测量值显示
  154. {
  155.         qian_wei=0;
  156.         bai_wei=1;
  157.         shi_wei=1;
  158.         ge_wei=1;
  159.         P2=bianma[0];
  160.         delay_1ms(5);
  161.         qian_wei=1;
  162.         bai_wei=0;
  163.         shi_wei=1;
  164.         ge_wei=1;
  165.         P2=bianma[T_data[1]];
  166.         delay_1ms(5);
  167.         P2=0xff;
  168.         qian_wei=1;
  169.         bai_wei=1;
  170.         shi_wei=0;
  171.         ge_wei=1;
  172.         P2=bianma[T_data[2]]&0xfb;
  173.         delay_1ms(5);
  174.         P2=0xff;
  175.         qian_wei=1;
  176.         bai_wei=1;
  177.         shi_wei=1;
  178.         ge_wei=0;
  179.         P2=bianma[T_data[3]];
  180.         delay_1ms(5);
  181.         P2=0xff;
  182. }
  183. /********** 报警处理函数******************/
  184. void baojing()
  185. {
  186.           LT=HT-50;         //测量温度低于设定温度10度以下时 重新加热
  187.           if(HT<DD1) //如果温度超过上限 停止加热
  188.           {
  189.                         JK1=1;
  190.           }
  191.          if(DD1<LT) //如果温度低于下限 开始加热
  192.           {
  193.                         JK1=0;
  194.           }
  195.          if((SW01==1)&&(SW043==1)&&(SW021==1)&&(SW041==1))        //0水位 指示 启动水泵加水
  196.          {
  197.                 led1=1;
  198.                 led2=1;
  199.                 led3=1;
  200.                 led4=1;
  201.                 JK2=0;
  202.         }
  203.         
  204.         if((SW01==0)&&(SW043==1)&&(SW021==1)&&(SW041==1))        //1/4水位指示
  205.          {
  206.                 led1=0;
  207.                 led2=1;
  208.                 led3=1;
  209.                 led4=1;
  210.         }
  211.         if((SW01==0)&&(SW043==0)&&(SW021==1)&&(SW041==1))  //1/2水位指示
  212.          {
  213.                 led1=0;
  214.                 led2=0;
  215.                 led3=1;
  216.                 led4=1;
  217.         }
  218.         if((SW01==0)&&(SW043==0)&&(SW021==0)&&(SW041==1))        //3/4水位指示
  219.          {
  220.                 led1=0;
  221.                 led2=0;
  222.                 led3=0;
  223.                 led4=1;
  224.         }
  225.         if((SW01==0)&&(SW043==0)&&(SW021==0)&&(SW041==0))        //如果水满了 指示灯指示 停止加水
  226.          {
  227.                 led1=0;
  228.                 led2=0;
  229.                 led3=0;
  230.                 led4=0;
  231.                 JK2=1;
  232.         }

  233.         if(((SW01==1)&&(SW043==1)&&(SW021==1)&&(SW041==1))||(HT<DD1)||(DD1<LT))          //缺水或者 温度超过上限 蜂鸣器响
  234.         {
  235.                 speak=0;
  236.         }
  237.         else
  238.         {
  239.                 speak=1;        
  240.         }
  241. }
  242. /**********主函数******************/
  243. void main()
  244. {        
  245.         data_pro();
  246.         while(1)
  247.         {
  248.         if(set_key==0)
  249.          {
  250.                  delay_1ms(5);
  251.                 if(set_key==0)
  252.                 {                 
  253.                         flog4=!flog4;
  254.                         while(set_key==0);
  255.                 }
  256.          }
  257.         if(flog4==1)
  258.         {
  259.                         speak=1;
  260.                  if(add_key==0)
  261.                         {
  262.                          delay_1ms(5);
  263.                          if(add_key==0)
  264.                          {
  265. ……………………

  266. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
智能热得快.rar (354.99 KB, 下载次数: 179)
回复

使用道具 举报

ID:721273 发表于 2020-4-3 13:34 来自手机 | 显示全部楼层
这个怎么没有水泵和加热器啊
回复

使用道具 举报

ID:305511 发表于 2020-4-3 18:26 | 显示全部楼层
还挺复杂的!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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