設計要求:
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)
2019-5-3 17:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|