|
單片機(jī)源程序如下:
- #include <reg52.h>
- #include<intrins.h>
- #include<string.h>
- #include <stdio.h>
- #include <math.h>
- #define uchar unsigned char
- #define uint unsigned int//位定義
- //max6675
- sbit SO= P1^0;
- sbit CS= P1^1;
- sbit SCK=P1^2;
- //按鍵
- sbit key1=P1^5; //功能鍵
- sbit key2=P1^6; //+
- sbit key3=P1^7; //-
- sbit BEEP=P1^3; //蜂鳴器
- sbit RELAY=P1^4; //繼電器
- //DAC0832
- //sbit CSDA=P3^2;
- //sbit wr=P3^6;
- //int high_limit=1250; //上限溫度,默認(rèn)值為1250
- int Temp_set=250; //設(shè)定目標(biāo)溫度,默認(rèn)值為250
- int Temp_true;
- int set_status=0;
- uchar qian=0,bai=0,shi=0,ge=0,xiao=0;
- uchar smg[8];
- //float Kp,Ki,Kd;
- uchar num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰極數(shù)碼管賦值 0,1,2,3,4,5,6,7,8,9
- //uchar num_p[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共陽(yáng)極數(shù)碼管帶小數(shù)點(diǎn)賦值 0,1,2,3,4,5,6,7,8,9
- uchar choose[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//數(shù)碼管位選
- //sbit dula=P2^6; //數(shù)碼管段選,鎖存器控制信號(hào)
- //sbit wela=P2^7; //數(shù)碼管位選,鎖存器控制信號(hào)
- uint Re_Convert(); //熱電偶數(shù)據(jù)讀取,返回溫度
- //int ek=0;
- //int eset_statu=0; //第K-1采樣時(shí)的偏差值,Error[-1]
- //int ek2=0; //第K-2采樣時(shí)的偏差值,Error[-2]
- //float LastOutput=0; //上次PID輸出
- //float Output=0; //PID的輸出
- //uchar high_time,low_time,count=0; //占空比調(diào)節(jié)參數(shù)
- //---------------------------延時(shí)子程序---------------------------//
- void delay(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void delay_50ms(uint m)
- {
- uchar x,y;
- for(x=m;x>0;x--)
- for(y=50;y>0;y--) ;
- }
- /*********** MAX6675函數(shù)***********/
- uint Re_Convert() //熱電偶數(shù)據(jù)讀取,返回溫度
- {
- long int a=0x7ff8;
- long int wendu=0,wendu_1;
- float wendu_2;
- uint i;
- CS=1;
- SCK=0;
- delay(200);
- _nop_();
- _nop_();
- CS=0;
- for(i=1;i<=16;i++)
- { wendu=wendu<<1;
- _nop_();
- SCK=1;
- if(SO==1){wendu=wendu|0x01;}
- else wendu=wendu|0x00;
- _nop_();
- _nop_();
- SCK=0;
- _nop_();
- _nop_();
- }
- wendu_1=wendu&a;
- wendu_1=wendu_1>>3;
- wendu_2=wendu_1*0.25;
- return wendu_2; //返回帶兩位小數(shù)的實(shí)際溫度
- //wendu=wendu_2*100; //放大100倍轉(zhuǎn)成整型常數(shù)
- //return wendu; //返回整型常數(shù)便于顯示小數(shù)位數(shù)字
- }
- //*************溫度顯示程序*******************//
- void Disp_temp_true(uint temp)//溫度顯示
- {
- unsigned char i;
- unsigned int j;
- ge=temp%10; //取個(gè)數(shù)位數(shù)字
- temp=temp/10;
- shi=temp%10;//取十位數(shù)字
- temp=temp/10;
- bai=temp%10;//取百位數(shù)字
- qian=temp/10;//取千位數(shù)字
- smg[0]=num[qian];
- smg[1]=num[bai];
- smg[2]=num[shi];
- smg[3]=num[ge];
- /*
- for(i=0; i<4; i++)
- {
- P2=choose[i]; //數(shù)碼管位選
- P0=smg[i]; //送數(shù)字到段碼端口,顯示數(shù)字
- j = 10; //掃描間隔時(shí)間設(shè)定
- while(j--);
- P0 = 0x00;//消隱
- }
- */
- }
- //*************溫度設(shè)置顯示程序*******************//
- void Disp_temp_set(uint set)//溫度設(shè)置顯示
- {
- unsigned char i;
- unsigned int j;
- ge=set%10; //取個(gè)數(shù)位數(shù)字
- set=set/10;
- shi=set%10;//取十位數(shù)字
- set=set/10;
- bai=set%10;//取百位數(shù)字
- qian=set/10;//取千位數(shù)字
- smg[4]=num[qian];
- smg[5]=num[bai];
- smg[6]=num[shi];
- smg[7]=num[ge];
- /*
- for(i=4; i<8; i++)
- {
- P2=choose[i]; //數(shù)碼管位選
- P0=smg[i]; //送數(shù)字到段碼端口,顯示數(shù)字
- j = 10; //掃描間隔時(shí)間設(shè)定
- while(j--);
- P0 = 0x00;//消隱
- }
- */
- }
- //*************報(bào)警子程序*******************//
- void Alarm()//蜂鳴器間斷
- {
- if(Temp_true>Temp_set)
- {
- int b;
- for(b=100;b>0;b--)
- {
- BEEP=1;
- delay_50ms(10);
- BEEP=0;
- delay_50ms(10);
- }
- }
- }
- void compare_temper()
- {
- uint temper=Temp_true;
- if(temper>=Temp_set) //實(shí)際溫度是否大于設(shè)置的溫度
- {
- RELAY=1;
- }
- else if(temper<Temp_set)
- {
- RELAY=0;
- }
- }
- //*******按鍵子程序*******//
- void keyset()
- {
- #if 1
- if(key1 == 0){
- set_status =!set_status;
- }
- if(set_status==1){
- if(key1==0)
- {
- set_status =!set_status;
- }
- if(key2==0)
- {
- Temp_set=Temp_set+10;
- Disp_temp_set(Temp_set);
- //delay_50ms(1);
- //while(!key2);
- }
- if(key3==0)
- {
- Temp_set=Temp_set-10;
- Disp_temp_set(Temp_set);
- //delay_50ms(10);
- //while(!key3);
- }
- }
- }
- #else
-
- if(set_status==0)
- {
- if(key1==0)
- {
- set_status=1;
- }
- }
- else{
- //while(set_status==1)
- {
- if(key1==0)
- {
- set_status=0;
- }
- if(key2==0)
- {
- Temp_set=Temp_set+10;
- Disp_temp_set(Temp_set);
- //delay_50ms(1);
- //while(!key2);
- }
- if(key3==0)
- {
- Temp_set=Temp_set-10;
- Disp_temp_set(Temp_set);
- //delay_50ms(10);
- //while(!key3);
- }
- //}
- }
- #endif
- }
- void init_sys() //系統(tǒng)初始化
- {
- IT0=1;
- EX0=1;
- ET0=1;
- EA=1;
- TMOD=1;
- TH0=0xfc;
- TL0=0x66;//裝初值,定時(shí)時(shí)間為1ms
- ET0=1; //打開定時(shí)器0的大門
- TR0=1;
- P0=0xc0;
- }
- //*************主程序*******************//
- void main()
- {
- // Kp=1.2;
- // Ki=3.4;
- // Kd=5.6;
- init_sys();
- delay_50ms(1);
- while(1)
- {
- Temp_true=Re_Convert();// 熱電偶數(shù)據(jù)讀取,返回溫度
- compare_temper();
- Disp_temp_true(Temp_true);
- Disp_temp_set(Temp_set);
- //if(key1==0)
- {
- keyset();
- }
- //PID();
- Alarm();
- //delay_50ms(6);
- }
- }
- void Dsqi0() interrupt 1
- {
- long int i=0;
- uchar c=0xfe;
- TH0=0xfc;
- TL0=0x66;
- P2=0xff;
- P0=smg[i];
- P2=c;
- c=_crol_(c,1);
- i=i+1;
- if(i==8)
- {
- i=0;
- c=0xfe;
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
max6675.rar
(43.63 KB, 下載次數(shù): 197)
2019-6-17 13:35 上傳
點(diǎn)擊文件名下載附件
51單片機(jī)+max6675模塊+K型熱電偶的高溫可調(diào)溫控系統(tǒng)
|
|