找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机设计的半导体制冷系统程序(含PID较正)

[复制链接]
ID:525872 发表于 2019-5-3 17:07 | 显示全部楼层 |阅读模式
设计要求:
1.利用4*4矩阵键盘进行温度任意设定
2.利用PID控制实现PWM控制,驱动H桥电路,使制冷片工作
3.利用18b20显示系统实时温度值
4.利用1cd1602进行键盘输入值显示,时间显示

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <math.h>

  3. #include "anjian.h"
  4. #include "1602.h"
  5. #include "18b20.h"

  6. #include "anjian.c"
  7. #include "1602.c"
  8. #include "18b20.c"
  9. #include <intrins.h>

  10. #define uchar unsigned char
  11. #define uint unsigned int

  12. #define LCD_COM         0  
  13. #define LCD_DAT  1  

  14. #define  tpwnsum  (5000)
  15. #define  THR1  (-tpwnsum)
  16. #define  THR0 (-50000)
  17. /***********************************/
  18. uint T = 0;
  19. /************************************/

  20. float idata temp,key,sum=0,anjian=0;
  21. char e=0;

  22. sbit pwm=P3^6;

  23. void T_1()          //T1初始化
  24. {
  25.          EA=1;
  26.         TMOD|=0x10;
  27.         ET1=1;
  28.         TH1=THR1/256;
  29.         TL1=THR1%256;
  30.         TR1=1;
  31. }
  32.                                                                   
  33. void Delay1ms(unsigned int n)
  34. {
  35.     unsigned int i,j;
  36.       for(i=n;i>0;i--)
  37.          for(j=112;j>0;j--);
  38. }
  39. void T_0()                   //T0初始化
  40. {
  41.         TMOD=0X01;
  42.         EA=1;
  43.         TR0=1;
  44.         ET0=1;
  45.         TH0=THR0/256;
  46.         TL0=THR0%256;        
  47. }

  48. void main(void)
  49. {
  50.         uchar k;
  51.         uchar i=0,j=0,flag=0;
  52.         float x=0,y=0,w=0;
  53.         Delay1ms(10);
  54.         anjian=000;

  55.         T_0();
  56.         T_1();
  57.         LCD_Initial();
  58.         GotoXY(0,0);
  59.         Print("shuru:");
  60.         GotoXY(1,0);
  61.         Print("sc:     C");
  62.         while(1)
  63.         {        

  64.                 k=key1();
  65.                 if(((k>=0)&&(k<=10)))
  66.                 {
  67.                         if(k==10)
  68.                          {
  69.                                 if(i!=0)
  70.                                 if(flag==0)
  71.                                 {
  72.                                         GotoXY(0,6+i);
  73.                                         LCD_WRITE('.',LCD_DAT);
  74.                                         flag=1;
  75.                                         i++;
  76.                                 }
  77.                          }
  78.                         else
  79.                         {                                         
  80.                                 lcd_word(0x86+i,k);
  81.                                 if(flag==0)
  82.                                         x=x*10+k;
  83.                                 else                        
  84.                                 {
  85.                                         y=y*10+k;
  86.                                         j++;
  87.                                 }
  88.                                 i++;                        
  89.                         }                        
  90.                 }
  91.                 if(k==15)
  92.                 {
  93.                         w=x+y/pow(10,j);
  94.                         anjian=w;i=0,j=0;
  95.                          x=0,y=0,w=0;
  96.                         flag=0;
  97.                         GotoXY(0,6);
  98.                         Print("        ");
  99.                 }
  100.                 disp(0x8b,anjian);
  101.                 disp(0xc3,temp);         
  102.   }
  103. }


  104.   /* PID较正*/
  105. float idata e0,e1,e2;
  106. int   kp=1,ki=200,kd=1;
  107. float U;
  108. float D;
  109. unsigned int Higt;
  110. unsigned int low;
  111. void T0down() interrupt 1                   //T0中断
  112. {
  113.         TH0=THR0/256;
  114.         TL0=THR0%256;
  115.         temp=readtemp()/10.0;
  116.         e2=e1;          //e2=e1;e1=e0         顺序不能换过来,不然往下看三行,有详细解析
  117.         e1=e0;
  118.         e0=anjian-temp;
  119.         U=kp*(e0-e1)+ki*e0+kd*(e0-2*e1+e2);                   //如果上面的e2=e1;e1=e0换成         e1=e0;        e2=e1 ,则u=ki*e0 ,对kp和kd木有关系了,PID算法不准确
  120.         //且是增量型PID算法


  121.         if(anjian>=temp)
  122.         {               
  123.                 TR1=0;                                                   //关中断
  124.                 pwm=0;                        
  125.         }
  126.         else
  127.         {
  128.            D=abs(U)/100.0;
  129.            if(D>0.95)D=0.95;
  130.            if(D<0.05)D=0.05;
  131.            Higt=D*tpwnsum;
  132. ……………………

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

所有资料51hei提供下载:
keshe终极版.rar (201.44 KB, 下载次数: 72)
回复

使用道具 举报

ID:328014 发表于 2019-5-5 22:10 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:489878 发表于 2019-5-14 19:21 | 显示全部楼层
注释再多一点就好了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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