1、课程设计报告目录引言 2第1章 技术指标 3 1.1基本功能要求 31.2提高功能要求 31.3 设计条件5第2章 系统设计方案 5 2.1 原理图设计5 2.2硬件设计5 2.3 软件设计6 第3章 单元电路设计18 3.1控制部分电路设计 18 3.2 矩阵键盘电路设计 183.3 显示部分电路设计 193.4 电源转换电路设计 193.5 温控炉加热驱动模块电路设计 203.6温度采集模块电路设计213.7电路图设计21第4章 测试与调整23 4.1 电源电路测试 23 4.2显示电路测试 23 4.3单片机控制电路测试 234.4矩阵键盘电路检测 234.5 PWM输出电路检测 234
2、.6温度采集电路检测244.7驱动电路检测24 4.8总体电路测试24第5章 设计小节 26 5.1设计任务完成情况 26 5.2问题及改进 26 5.3心得体会 27引言随着计算机技术的发展和普及,以单片机为核心的小型嵌入式设备,已经在工业自动化、办公自动化等领域得到了日益广泛的应用 本课题对工业对象中主要的被控参数电阻炉炉温进行研究,设计了硬件电路和软件程序。硬件电路选用STC89C52单片机及DS18B20, 以STC89C52单片机为主体,构成一个能进行较复杂的数据处理和复杂控制功能的智能控制器,使其既可与微机配合构成两级控制系统,又可作为一个独立的单片机控制系统,具有较高的灵活性和可
3、靠性。单片机根据输入的各种命令,进行智能算法得到控制值,输出PWM脉冲信号,通过驱动电路和整流桥驱动MOSFET,从而加热电阻炉。软件程序采用两重中断嵌套方式。提出了PID控制的方法,即调节三个参数,来实现控制,具有省时、高效的特点,为实现简易的自整定控制带来方便。关键词单片机;温度控制; 调节;计算机仿真;PID第1章 技术指标1.1 基本功能要求:内容:应用计算机的实时监控和温度测量技术,采用单片机、温度检测电路、温度控制电路等,实现电阻炉炉温的实时监控。要求: 1.1.1采用单片机及相应的组成部件完成电阻炉温度控制系统设计,包括硬件电路和软件程序设计; 1.1.2测温范围0100,使其系
4、统控制的温度保温值的变化范围为3060; 1.1.3可根据按键设定目标温度,能够显示控温时的实际炉温和恒温时间等信息。 1.2 提高功能要求:1.2.1 对其主电路和控制电路设计相应的保护电路,使其安全可靠地工作;1.2.2对影响温度控制时间和精度的因素进行分析,改进相应的计算机控制算法,完成计算机控制高效的算法设计。1.3设计条件1.3.1电源条件:双路稳压电源0V30V可调,220V直流电源1.3.2测试条件:双路示波器DS5062C,万用表1.3.2元件清单:如表1.1示。元件清单型号名称及功能数量DS18B20温度传感器1STC89C52单片机11602液晶显示器174HC20四输入与
5、非门19012三极管19013三极管2TLP521-1光电耦合器1PC1010整流桥1IRFP460MOSFET17805电源转换芯片(9V-5V)1按键按键10电阻电阻若干发光二极管发光二极管1电容(450V 220UF)电容1表1-1第二章 系统设计方案2.1原理图设计根据设计要求设计原理图如入2-1所示。图2-1原理图2.2硬件设计 该设计本系统由STC89C52RC 单片机最小系统及其外围电路组成,单片机系统有自己的电源模块、显示模块、温度采集模块,如图2-1所示。用单片机的P0口接上拉1K电阻接液晶1602的数据口,P36和P37口接液晶1602的RS和EN 端。P1口接4*3的矩阵
6、键盘,通过按键进行设定温度设置。键盘的列口通过7420四输入与非门接P32中端口。P20接DS18B20的数据口,用于采集温度。P22作为PWM输出,用于温度的控制。 电路图如图2-2所示。图2-2硬件电路方框图2.3软件设计2.3.1软件设计方案通过外部按键设置要求温控炉恒定的温度,用外部中断0扑捉按键。通过DS18B20采集温度,通过定时器1没10秒钟采集一次温度。通过定时器0输出PWM波。液晶时刻显示设定温度,当前采集温度,PWM输出占空比,温度恒定时间。温度控制采用PID控制,du=kp*(error2-error1)+ki*error2 +kd*(error2-2*error1+er
7、ror0);将采集回来的温度与设定温度进行比较,在设定温度差T1范围内采用纯P控制;当采集温度在温度差T2范围内采用PI控制;当采集温度在温度差T3范围内是PWM输出恒0,通过余热使温度升到设定温度范围内。2.3.2软件流程软件流程图如图2-5所示。图2-3软件流程图2.3.3程序清单(含必要的注释)#include#include#define uchar unsigned char#define uint unsigned intsbit ds=P20;sbit warn=P21;sbit pwm_output=P22;sbit p3_2=P32;sbit lcdrs=P36;sbit l
8、cden=P37;uchar code table=0123456789.;uchar receive2;int error3;uchar pwm_flag,clear_flag,key_flag,time_flag,ui_flag;uchar key,key_temp,keyscan,point,t1,t2,t3,collect_con,time_con;uint duty;int ui;int time;int du;float kp,ki;uint temp,temp1;float f_temp;uchar a,b;void delay(uint z)/延时函数 uint i,j; fo
9、r(i=z;i0;i-) for(j=110;j0;j-);void write_com(uchar com)/液晶显示驱动函数 lcdrs=0; lcden=1; P0=com; delay(5); lcden=0;void write_data(uchar date) lcdrs=1; lcden=1; P0=date; delay(5); lcden=0;void duty_input(char t_duty) /PWM输出 uchar i,j; i=t_duty/10; j=t_duty%10; write_com(0x80+0x40+13); write_data(i+0x30);
10、write_data(j+0x30); write_data(%); TR0=0; duty=100*t_duty; TH0=(65536-duty)/256; TL0=(65535-duty)%256; pwm_output=0; pwm_flag=1; TR0=1;void lcd_init() /液晶显示初始化 write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); write_data(t); write_data(1); write_data(:); write_data
11、(2); write_data(0); write_com(0x80+5); write_data(0xdf); write_data(0x43); write_com(0x80+9); write_data(t); write_data(2); write_data(:); write_data(0); write_data(0); write_com(0x80+14); write_data(0xdf); write_data(0x43); write_com(0x80+0x40); write_data(t); write_data(:); write_com(0x80+0x40+6);
12、 write_data(s); write_com(0x80+0x40+8); write_data(d); write_data(u); write_data(t); write_data(y); write_data(:);void init() EA=0; TMOD=0x11; /定时器初始化 TH1=0x3c; TL1=0xb0; ET0=1; ET1=1; EX0=1; IT0=1; PT0=1; TR1=1; EA=1; lcd_init(); pwm_flag=0; point=0; t1=20; t2=27; write_com(0x80+12); write_data(2);
13、 write_data(7); key_flag=0; time_flag=0; clear_flag=1; ui_flag=0; ui=0; time=0; duty_input(ui); receive0=0; receive1=0; error0=0; error1=0; error1=0; time_con=0; collect_con=0; P1=0xf0; /PID参数 kp=8; ki=0.6; warn=1;void delay1()/键盘消抖延时函数 uint i,j; for(i=50;i0;i-) for(j=110;j0;j-);uchar scan()/键盘扫描函数
14、uchar i; for(i=0;i=15) /大于15 KP ki=0; ui_flag=0; else /小于15 KP KI ki=0.6; ui_flag=1; if(t2=t1) TR0=0; pwm_output=1; write_com(0x80+0x40+13); write_data(0); write_data(0); ui=0; else if(ui_flag=0) du=kp*(error2-error1); /+kd*(error2-2*error1+error0);/P控制 ui=ui+du; if(ui99) ui=99; if(ui99) ui=99; if(u
15、i99) /温差在13C以上,pwm全速 pwm_output=0; write_com(0x80+0x40+13); write_data(O); write_data(N); write_data( ); TR0=0; else if(ui0)i-; ds=1; i=4; while(i0)i-;bit tempreadbit(void) /读1位函数 uint i; bit dat; ds=0;i+; /i+ 起延时作用 ds=1;i+;i+; dat=ds; i=8;while(i0)i-; return (dat);uchar tempread(void) /读1个字节 uchar
16、i,j,dat; dat=0; for(i=1;i=8;i+) j=tempreadbit(); dat=(j1); /读出的数据最低位在最前面,这样刚好一个字节DAT里 return(dat);void tempwritebyte(uchar dat) /向18B20写一个字节数据 uint i; uchar j; bit testb; for(j=1;j1; if(testb) /写 1 ds=0; i+;i+; ds=1; i=8;while(i0)i-; else ds=0; /写 0 i=8;while(i0)i-; ds=1; i+;i+; void tempchange(void
17、) /DS18B20 开始获取温度并转换 dsreset(); delay(1); tempwritebyte(0xcc); / 写跳过读ROM指令 tempwritebyte(0x44); / 写温度转换指令uint get_temp() /读取寄存器中存储的温度数据 dsreset(); delay(1); tempwritebyte(0xcc); tempwritebyte(0xbe); a=tempread(); /读低8位 b=tempread(); /读高8位 temp=b; temp=temp8; temp=temp|a; f_temp=temp*0.0625; temp=f_t
18、emp+0.5; return temp;void main() init(); while(1) if(key_flag=1) /有键按下 key_flag=0; if(keyscan!=11) /设定温度 if(point=t1*0.95&t2=t1*1.05) time_flag=1; else time_flag=0; /pwm输出void timer0() interrupt 1 using 1 TR0=0; switch(pwm_flag) case 0: TH0=(65536-duty)/256; TL0=(65535-duty)%256; pwm_output=0; pwm_f
19、lag=1; break; case 1: TH0=(65535-(10000-duty)/256; TL0=(65535-(10000-duty)%256; pwm_output=1; pwm_flag=0; break; TR0=1; /按键控制void int0() interrupt 0 using 3 EX0=0; p3_2=1; keyscan=scan(); key_flag=1; /有键按下 while(p3_2); EX0=1;void timer1() interrupt 3 /温度采集 uchar i,j,x,y,z; TR1=0; TH1=0x3c; TL1=0xb0; if(time_flag=1) /温度在稳定范围之内 time_con+; if(time_con=20) /稳定时间加一 time_con=0; time+; x=time/100; y=time%100/10; z=time%100%10; write_com(0x80+0x40+2); write_data(x+0x30); write_data(y+0x30); write_data(z+0x30); if(time_flag=0) time=0; time_con=0; collect_con+; if(collect_con=2
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1