设计要求:
1.利用4*4矩阵键盘进行温度任意设定
2.利用PID控制实现PWM控制,驱动H桥电路,使制冷片工作
3.利用18b20显示系统实时温度值
4.利用1cd1602进行键盘输入值显示,时间显示
单片机源程序如下:
- #include <reg52.h>
- #include <math.h>
- #include "anjian.h"
- #include "1602.h"
- #include "18b20.h"
- #include "anjian.c"
- #include "1602.c"
- #include "18b20.c"
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define LCD_COM 0
- #define LCD_DAT 1
- #define tpwnsum (5000)
- #define THR1 (-tpwnsum)
- #define THR0 (-50000)
- /***********************************/
- uint T = 0;
- /************************************/
- float idata temp,key,sum=0,anjian=0;
- char e=0;
- sbit pwm=P3^6;
- void T_1() //T1初始化
- {
- EA=1;
- TMOD|=0x10;
- ET1=1;
- TH1=THR1/256;
- TL1=THR1%256;
- TR1=1;
- }
-
- void Delay1ms(unsigned int n)
- {
- unsigned int i,j;
- for(i=n;i>0;i--)
- for(j=112;j>0;j--);
- }
- void T_0() //T0初始化
- {
- TMOD=0X01;
- EA=1;
- TR0=1;
- ET0=1;
- TH0=THR0/256;
- TL0=THR0%256;
- }
- void main(void)
- {
- uchar k;
- uchar i=0,j=0,flag=0;
- float x=0,y=0,w=0;
- Delay1ms(10);
- anjian=000;
- T_0();
- T_1();
- LCD_Initial();
- GotoXY(0,0);
- Print("shuru:");
- GotoXY(1,0);
- Print("sc: C");
- while(1)
- {
- k=key1();
- if(((k>=0)&&(k<=10)))
- {
- if(k==10)
- {
- if(i!=0)
- if(flag==0)
- {
- GotoXY(0,6+i);
- LCD_WRITE('.',LCD_DAT);
- flag=1;
- i++;
- }
- }
- else
- {
- lcd_word(0x86+i,k);
- if(flag==0)
- x=x*10+k;
- else
- {
- y=y*10+k;
- j++;
- }
- i++;
- }
- }
- if(k==15)
- {
- w=x+y/pow(10,j);
- anjian=w;i=0,j=0;
- x=0,y=0,w=0;
- flag=0;
- GotoXY(0,6);
- Print(" ");
- }
- disp(0x8b,anjian);
- disp(0xc3,temp);
- }
- }
- /* PID较正*/
- float idata e0,e1,e2;
- int kp=1,ki=200,kd=1;
- float U;
- float D;
- unsigned int Higt;
- unsigned int low;
- void T0down() interrupt 1 //T0中断
- {
- TH0=THR0/256;
- TL0=THR0%256;
- temp=readtemp()/10.0;
- e2=e1; //e2=e1;e1=e0 顺序不能换过来,不然往下看三行,有详细解析
- e1=e0;
- e0=anjian-temp;
- 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算法不准确
- //且是增量型PID算法
- if(anjian>=temp)
- {
- TR1=0; //关中断
- pwm=0;
- }
- else
- {
- D=abs(U)/100.0;
- if(D>0.95)D=0.95;
- if(D<0.05)D=0.05;
- Higt=D*tpwnsum;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
keshe终极版.rar
(201.44 KB, 下载次数: 78)
|