|
高溫測(cè)控系統(tǒng),具有良好的人機(jī)交互,PWM控制
里面有Proteus仿真圖,源程序,元器件清單
元件 型號(hào) 數(shù)量
單片機(jī) AT89C51 1
電容 30pf 2
電容 10uf 1
晶振 12MHZ 1
電阻 10k 1
電阻 1k 5
電阻 100歐 1
三極管 PNP 5
蜂鳴器 有源 1
LED 紅色 1
按鈕 6
熱電偶 TCN 4
模數(shù)芯片 MAX6675 4
顯示器 LCD1602 1
排阻 10k 1
繼電器 5V 4
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
程序流程圖:
單片機(jī)源程序如下:
- #include "reg51.h"
- #include "max6675.h"
- #include "lcd1602.h"
- #include"pid_pwm.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit k1=P3^2;//按鈕
- sbit k2=P3^3;
- sbit k3=P3^4;
- sbit k4=P3^5;
- sbit k5=P3^6;
- sbit out1=P2^4;//加熱器
- sbit out2=P2^5;
- sbit out3=P2^6;
- sbit out4=P2^7;
- sbit beep=P3^7;//蜂鳴器
- uchar time=0;
- float wendu=0;//溫度
- uint lim=1100;//設(shè)置值
- uchar mode=0;//模式
- uchar pwm1=0,pwm2=0,pwm3=0,pwm4=0;
- uchar disp1[]="0000.0";
- uchar disp2[]="Set:0000 C ";
- //主函數(shù)
- void main()
- {
- uchar i=0;
- init_1602();//初始化顯示
- disp1[10]=0xdf;
- disp2[8]=0xdf;
- TMOD|=0X01;
- TH0=0X3C;
- TL0=0XB0;
- ET0=1;//打開定時(shí)器0中斷允許
- EA=1;//打開總中斷
- TR0=1;//打開定時(shí)器
- while(1)
- {
- if(!k1)//設(shè)置
- {
- mode=!mode;
- while(!k1);
- }
- if(mode==1)
- {
- if(!k2)//加
- {
- if(lim<1300)
- lim++;
- while(!k2);
- }
- if(!k3)//減
- {
- if(lim>0)
- lim--;
- while(!k3);
- }
- if(!k4)//加
- {
- if(lim<1300)
- lim+=10;
- while(!k4);
- }
- if(!k5)//減
- {
- if(lim>10)
- lim-=10;
- while(!k5);
- }
- }
- //控制輸出
- if(i<99)
- i++;
- else
- i=0;
- if(i<pwm1)
- out1=0;
- else
- out1=1;
- if(i<pwm2)
- out2=0;
- else
- out2=1;
- if(i<pwm3)
- out3=0;
- else
- out3=1;
- if(i<pwm4)
- out4=0;
- else
- out4=1;
- }
- }
- //定時(shí)器中斷
- void Timer0() interrupt 1
- {
- uint i;
- uchar j=0;
- if(time<10)//0.5s
- time++;
- else
- {
- time=0;
- if(mode==0)
- {
- j=0;
- wendu=max_read(1);//測(cè)溫1
- i=wendu*10;
- disp1[0]=i/10000+0x30;
- disp1[1]=i%10000/1000+0x30;
- disp1[2]=i%1000/100+0x30;
- disp1[3]=i%100/10+0x30;
- disp1[5]=i%10+0x30;
- write_string(1,0,disp1);
- pwm1=PID(lim,wendu);//PID控制
- //判斷報(bào)警
- if((wendu<1000)||(wendu>1250))
- j++;
- wendu=max_read(2);//測(cè)溫2
- i=wendu*10;
- disp1[0]=i/10000+0x30;
- disp1[1]=i%10000/1000+0x30;
- disp1[2]=i%1000/100+0x30;
- disp1[3]=i%100/10+0x30;
- disp1[5]=i%10+0x30;
- write_string(1,8,disp1);
- if(wendu<lim)//占空比計(jì)算
- {
- if(wendu>lim-100)
- pwm2=lim-wendu;
- else
- pwm2=100;
- }
- //判斷報(bào)警
- if((wendu<1000)||(wendu>1250))
- j++;
- wendu=max_read(3);//測(cè)溫3
- i=wendu*10;
- disp1[0]=i/10000+0x30;
- disp1[1]=i%10000/1000+0x30;
- disp1[2]=i%1000/100+0x30;
- disp1[3]=i%100/10+0x30;
- disp1[5]=i%10+0x30;
- write_string(2,0,disp1);
- if(wendu<lim)//占空比計(jì)算
- {
- if(wendu>lim-100)
- pwm3=lim-wendu;
- else
- pwm3=100;
- }
- //判斷報(bào)警
- if((wendu<1000)||(wendu>1250))
- j++;
- wendu=max_read(4);//測(cè)溫4
- i=wendu*10;
- disp1[0]=i/10000+0x30;
- disp1[1]=i%10000/1000+0x30;
- disp1[2]=i%1000/100+0x30;
- disp1[3]=i%100/10+0x30;
- disp1[5]=i%10+0x30;
- write_string(2,8,disp1);
- if(wendu<lim)//占空比計(jì)算
- {
- if(wendu>lim-100)
- pwm4=lim-wendu;
- else
- pwm4=100;
- }
- //判斷報(bào)警
- if((wendu<1000)||(wendu>1250))
- j++;
- if(j>0)
- beep=0;
- else
- beep=1;
- }
- else//設(shè)置模式
- {
- disp2[4]=lim/1000+0x30;
- disp2[5]=lim%1000/100+0x30;
- disp2[6]=lim%100/10+0x30;
- disp2[7]=lim%10+0x30;
- write_string(1,0,"SET: ");
- write_string(2,0,disp2);
- }
-
- }
- TH0=0X3C;
- TL0=0XB0;
- }
復(fù)制代碼
所有資料51hei提供下載:
資料.7z
(244.82 KB, 下載次數(shù): 79)
2021-5-9 21:46 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|