高温测控系统,具有良好的人机交互,PWM控制
里面有Proteus仿真图,源程序,元器件清单
元件 型号 数量
单片机 AT89C51 1
电容 30pf 2
电容 10uf 1
晶振 12MHZ 1
电阻 10k 1
电阻 1k 5
电阻 100欧 1
三极管 PNP 5
蜂鸣器 有源 1
LED 红色 1
按钮 6
热电偶 TCN 4
模数芯片 MAX6675 4
显示器 LCD1602 1
排阻 10k 1
继电器 5V 4
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
程序流程图:
单片机源程序如下:
- #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;//设置值
- uchar mode=0;//模式
- uchar pwm1=0,pwm2=0,pwm3=0,pwm4=0;
- uchar disp1[]="0000.0";
- uchar disp2[]="Set:0000 C ";
- //主函数
- void main()
- {
- uchar i=0;
- init_1602();//初始化显示
- disp1[10]=0xdf;
- disp2[8]=0xdf;
- TMOD|=0X01;
- TH0=0X3C;
- TL0=0XB0;
- ET0=1;//打开定时器0中断允许
- EA=1;//打开总中断
- TR0=1;//打开定时器
- while(1)
- {
- if(!k1)//设置
- {
- 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;
- }
- }
- //定时器中断
- 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);//测温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控制
- //判断报警
- if((wendu<1000)||(wendu>1250))
- j++;
- wendu=max_read(2);//测温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)//占空比计算
- {
- if(wendu>lim-100)
- pwm2=lim-wendu;
- else
- pwm2=100;
- }
- //判断报警
- if((wendu<1000)||(wendu>1250))
- j++;
- wendu=max_read(3);//测温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)//占空比计算
- {
- if(wendu>lim-100)
- pwm3=lim-wendu;
- else
- pwm3=100;
- }
- //判断报警
- if((wendu<1000)||(wendu>1250))
- j++;
- wendu=max_read(4);//测温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)//占空比计算
- {
- if(wendu>lim-100)
- pwm4=lim-wendu;
- else
- pwm4=100;
- }
- //判断报警
- if((wendu<1000)||(wendu>1250))
- j++;
- if(j>0)
- beep=0;
- else
- beep=1;
- }
- else//设置模式
- {
- 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;
- }
复制代码
所有资料51hei提供下载:
资料.7z
(244.82 KB, 下载次数: 78)
|