找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3399|回复: 3
收起左侧

单片机温控仪的仿真图 编程 PCB文件与电路原理图 可用作练手

[复制链接]
ID:280260 发表于 2018-1-27 19:07 | 显示全部楼层 |阅读模式
已经添加附件,大家各取所需.51单片机控制的温控仪设计资料
0.png

温控仪电路原理图:
0.jpg

pcb工程文件:
0.jpg

温控仪单片机源程序如下:
  1. #include<reg52.h>
  2. #include"eeprom.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit wei1 = P1^3;                     //数码管位选
  6. sbit wei2 = P1^2;
  7. sbit wei3 = P1^1;
  8. sbit wei4 = P1^0;
  9. sbit DQ = P3^2;                 //温度
  10. sbit k1=P3^7;                                //功能按键
  11. sbit k2=P3^6;                                  // 增加键
  12. sbit k3=P3^5;                                //减少键
  13. uchar TL,TH,TN,TD;     
  14. sbit beep=P1^6;
  15. uchar count,num,m,s1num=0;                                              //温度值
  16. uchar htemp=33,ltemp=15;                                        //温度上下线初始化
  17. float f_temp;
  18. int key_delay=0;
  19. const int key_count=200;
  20. bit yyp=1,halarm=0,lalarm=0;
  21. uchar code TAB[]={0xC0, 0xF9, 0xA4,  0xB0,   0x99,  0x92,   0x82,  0xF8, 0x80,  0x90,   0x88,   0x83, 0xC6,  0xA1, 0x86,  0x8E};
  22. uchar code TAB1[]={0xbf,0x89,0xc7,0xC6};         //三个依次是 - H L         后面两个是温度符号大写的C
  23. /****毫秒级延时函数*****/
  24. void delay(uint x)
  25. {
  26.   uint i,j;
  27.   for(i=x;i>0;i--)
  28.      for(j=110;j>0;j--);
  29. }
  30. void delay1(uchar i)
  31. {
  32.     uchar j=100;
  33.         for(i;i>0;i--)
  34.           for(j;j>0;j--)
  35.             {;}
  36. }
  37. void di()
  38. {
  39.         beep=0;
  40.         delay(100);
  41.         beep=1;
  42. }
  43. /***********ds18b20延迟子函数(晶振12MHz )*******/
  44. ///////////////////////////////////////////////////
  45. void delay_18B20(unsigned int i)
  46. {
  47.         while(i--);
  48. }
  49. ///////////////////////////////////////////////////
  50. /**********ds18b20初始化函数**********************/
  51. ////////////////////////////////////////////////////
  52. void Init_DS18B20(void)
  53. {
  54.          unsigned char x=0;
  55.          DQ = 1;                                                          //DQ复位
  56.          delay_18B20(8);                                                  //稍做延时
  57.          DQ = 0;                                                          //单片机将DQ拉低
  58.          delay_18B20(80);                                                 //精确延时 大于 480us
  59.          DQ = 1;                                                          //拉高总线
  60.          delay_18B20(14);
  61.          x=DQ;                                                            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  62.          delay_18B20(20);
  63. }
  64. ////////////////////////////////////////////
  65. /***********ds18b20读一个字节**************/  
  66. ///////////////////////////////////////////
  67. unsigned char ReadOneChar(void)
  68. {
  69.         uchar i=0;
  70.         uchar dat = 0;
  71.         for (i=8;i>0;i--)
  72.          {
  73.                   DQ = 0;                                                         // 给脉冲信号
  74.                   dat>>=1;
  75.                   DQ = 1;                                                         // 给脉冲信号
  76.                   if(DQ)
  77.                   dat|=0x80;
  78.                   delay_18B20(4);
  79.          }
  80.         return(dat);
  81. }
  82. //////////////////////////////////////////////////
  83. /*************ds18b20写一个字节****************/  
  84. //////////////////////////////////////////////////
  85. void WriteOneChar(uchar dat)
  86. {
  87.         unsigned char i=0;
  88.         for (i=8; i>0; i--)
  89.         {
  90.                   DQ = 0;
  91.                 DQ = dat&0x01;
  92.             delay_18B20(5);
  93.                 DQ = 1;
  94.             dat>>=1;
  95. }
  96. }

  97. /**************读取ds18b20当前温度************/
  98. //////////////////////////////////////////////
  99. void ReadTemp()
  100. {
  101.        
  102.         Init_DS18B20();
  103.         WriteOneChar(0xCC);            // 跳过读序号列号的操作
  104.         WriteOneChar(0x44);         // 启动温度转换

  105.         Init_DS18B20();
  106.         delay(1);
  107.         WriteOneChar(0xCC);         //跳过读序号列号的操作
  108.         WriteOneChar(0xBE);         //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

  109.         TL=ReadOneChar();    //先读的是温度值低位
  110.         TH=ReadOneChar();    //接着读的是温度值高位
  111.         TN=TH*16+TL/16;         //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
  112.                                         //这样得出的是温度的整数部分,小数部分被丢弃了
  113.                                           
  114.         TD=(TL%16)*10/16;       //计算温度的小数部分,将余数乘以10再除以16取整,
  115.                                         //这样得到的是温度小数部分的第一位数字(保留1位小数)          
  116. }
  117. ////////////////////////////////////////////////
  118. void get_wendu(uchar m)
  119. {
  120.         uchar ws,wg;
  121.         ws=m/10;
  122.         wg=m%10;

  123.         wei1=0;                          //读取温度的十位和个位
  124.         P0=TAB[ws];
  125.         delay(2);
  126.         wei1=1;
  127.         P0=0xff;

  128.         wei2=0;
  129.         P0=TAB[wg]& 0x7f;
  130.         delay(2);
  131.         wei2=1;       
  132.         P0=0xff;
  133.        
  134. }
  135. void get_wendu2(uchar m)
  136. {
  137.         wei3=0;
  138.         P0=TAB[m];
  139.         delay(2);
  140.         wei3=1;       
  141.         P0=0xff;
  142.        
  143.         wei4=0;
  144.         P0=TAB1[3];
  145.         delay(2);
  146.         wei4=1;       
  147.         P0=0xff;
  148.        
  149.        
  150. }
  151. /////////调最高温度调用的函数//////
  152. void hdisplay(uchar dat)                                       
  153. {       
  154.         uchar fs,fg;
  155.         wei1=0;                          //读取最高温度符号“H-”
  156.         P0=TAB1[1];
  157.         delay(5);
  158.         wei1=1;
  159.         P0=0xff;
  160.                                                        
  161.         wei2=0;
  162.         P0=TAB1[0];
  163.         delay(5);
  164.         wei2=1;       
  165.         P0=0xff;       
  166.                
  167.         fs=dat/10;
  168.         fg=dat%10;
  169.         wei3=0;
  170.         P0=TAB[fs];
  171.         delay(5);
  172.         wei3=1;
  173.         P0=0xff;

  174.         wei4=0;
  175.         P0=TAB[fg];
  176.         delay(5);
  177.         wei4=1;               
  178.         P0=0xff;
  179. }
  180. /////////调最低温度调用的函数//////
  181. void ldisplay(uchar dat)                                       
  182. {       
  183.         uchar fs,fg;
  184.         wei1=0;                          //读取最低温度符号“L=”
  185.         P0=TAB1[2];
  186.         delay(2);
  187.         wei1=1;
  188.         P0=0xff;
  189.                                                        
  190.         wei2=0;
  191.         P0=TAB1[0];
  192.         delay(2);
  193.         wei2=1;       
  194.         P0=0xff;       
  195.                
  196.         fs=dat/10;
  197.         fg=dat%10;
  198.         wei3=0;
  199.         P0=TAB[fs];
  200.         delay(2);
  201.         wei3=1;
  202.         P0=0xff;

  203.         wei4=0;
  204.         P0=TAB[fg];
  205.         delay(2);
  206.         wei4=1;       
  207.         P0=0xff;       
  208. }
  209. /****按键扫描******/
  210. void keyscan()
  211. {
  212.         if(k1==0)
  213.         {
  214.                 delay(10);
  215.                 if(k1==0)
  216.                 {
  217.                         yyp=0;
  218.                         s1num++;
  219.                         while(!k1);        //等待按键释放
  220.                         di();
  221.                         htemp=byte_read(0x2200);
  222.                         ltemp=byte_read(0x2000);
  223.                         switch(s1num)
  224.                         {
  225.                                 case 1:break;
  226.                                 case 2:break;
  227.                                 case 3:if(s1num==3)s1num=0;yyp=1;
  228.                                                 break;
  229.                         }

  230.                          
  231.                
  232.                 }
  233.         }
  234.         if(s1num!=0)
  235.         {
  236.                 if(k2==0)
  237.                 {
  238.                         delay(10);
  239.                         if(k2==0)
  240.                         {
  241.                                 do
  242.                                 {
  243.                                         delay1(10);
  244.                                 }
  245.                                 while((!k2)&(key_delay++<key_count));        ///等待按键释放
  246.                                 di();
  247.                                 switch(s1num)
  248.                         {
  249.                                         case 1: htemp++;
  250.                                                         if(htemp==99)htemp=0;
  251.                                                         hdisplay(htemp);       
  252.                                                         SectorErase(0x2200);//擦除扇区
  253.                                                            byte_write(0x2200,htemp);//重新写入数据
  254.                                                         break;
  255.                                         case 2: ltemp++;
  256.                                                         if(ltemp==99)ltemp=0;
  257.                                                         ldisplay(ltemp);
  258.                                                         SectorErase(0x2000);//擦除扇区
  259.                                                            byte_write(0x2000,ltemp);//重新写入数据
  260.                                                     break;
  261.                                 }
  262.                         }
  263.                 }
  264.                 if(k3==0)
  265.                 {
  266.                         delay(10);
  267.                         if(k3==0)
  268.                         {
  269.                                 do
  270.                                 {
  271.                                         delay1(10);
  272.                                 }
  273.                                 while((!k3)&(key_delay++<key_count));                //等待按键释放
  274.                                 di();
  275.                                 switch(s1num)
  276.                         {
  277.                                         case 1: htemp--;
  278.                                                         if(htemp==0)htemp=99;
  279.                                                         hdisplay(htemp);
  280.                                                         SectorErase(0x2200);//擦除扇区
  281.                                                            byte_write(0x2200,htemp);//重新写入数据       
  282.                                                         break;
  283.                                         case 2: ltemp--;
  284.                                                         if(ltemp==0)ltemp=99;
  285.                                                         ldisplay(ltemp);
  286.                                                         SectorErase(0x2000);//擦除扇区
  287.                                                            byte_write(0x2000,ltemp);//重新写入数据
  288.                                                     break;
  289.                                 }
  290.                         }
  291.                 }
  292.         }
  293. }
  294. ///////////////////////////////////////////////////////////
  295. void baojing()
  296. {
  297.                         if((TN>=htemp)||(TN<=ltemp))                //温度高于设置最大温度
  298.                         {
  299. ……………………

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

所有资料51hei提供下载:
温控资料.zip (12.91 MB, 下载次数: 41)
回复

使用道具 举报

ID:87193 发表于 2018-1-30 14:22 | 显示全部楼层
具体功能的实现能否介绍详细一点呢
回复

使用道具 举报

ID:280260 发表于 2018-1-31 14:09 | 显示全部楼层
lemon0210 发表于 2018-1-30 14:22
具体功能的实现能否介绍详细一点呢

温度控制 可设置低高温超过区间 蜂鸣器报警 自动检测温度
回复

使用道具 举报

ID:273691 发表于 2018-2-25 11:03 | 显示全部楼层
大神,为什么我下载的文件仿真的时候调温度上限下限也会跟着变,调下限上限也跟着变,要怎么办
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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