炉温控制课程设计报告.doc

上传人:精*** 文档编号:851284 上传时间:2023-09-16 格式:DOC 页数:44 大小:1.96MB
下载 相关 举报
炉温控制课程设计报告.doc_第1页
第1页 / 共44页
炉温控制课程设计报告.doc_第2页
第2页 / 共44页
炉温控制课程设计报告.doc_第3页
第3页 / 共44页
炉温控制课程设计报告.doc_第4页
第4页 / 共44页
炉温控制课程设计报告.doc_第5页
第5页 / 共44页
点击查看更多>>
资源描述

1、 目 录目 录1引言3第1章 技术指标41.1基本功能要求:41.2 提高功能要求:41.3设计条件4第2章 系统设计方案62.1原理图设计62.2硬件设计672.3软件设计72.3.1软件设计方案72.3.2程序清单(含必要的注释)8第3章 单元电路设计263.1控制部分电路设计2632矩阵键盘电路设计263.3显示部分电路设计283.3.1数码管内部原理图293.4温度采集模块电路设计313.4.1 DS18B20通信程序373.5继电器电路设计39第4章 测试与调整404.1电源电路检测404.2显示电路测试404.3单片机控制电路测试404.4矩阵键盘电路检测404.5 控制信号输出电

2、路检测404.6温度采集电路检测404.7控制电路检测414.7总体电路测试41第5章 加热炉温控系统使用方法425.1系统连接方法425.2系统使用方法42第6章 设计小节436.1 设计任务完成情况436.2 问题及改进436.3 心得体会43参考文献44引言随着计算机技术的发展和普及,以单片机为核心的小型嵌入式设备,已经在工业自动化、办公自动化等领域得到了日益广泛的应用 本课题对工业对象中主要的被控参数电阻炉炉温进行研究,设计了硬件电路和软件程序。硬件电路选用STC12C5A60S2单片机及DS18B20, 以STC12C5A60S2单片机为主体,构成一个能进行较复杂的数据处理和复杂控制

3、功能的智能控制器,使其既可与微机配合构成两级控制系统,又可作为一个独立的单片机控制系统,具有较高的灵活性和可靠性。单片机根据输入的各种命令,进行智能算法得到控制值,输出控制和脉冲信号,从而加热电阻炉。软件程序脉冲采用中断方式。关键词单片机;温度控制;计算机仿真;第1章 技术指标1.1基本功能要求:内容:应用计算机的实时监控和温度测量技术,采用单片机、温度检测电路、温度控制电路等,实现电阻炉炉温的实时监控。要求: 1.1.1采用单片机及相应的组成部件完成电阻炉温度控制系统设计,包括硬件电路和软件程序设计; 1.1.2测温范围0100,使其系统控制的温度保温值的变化范围为3060; 1.1.3可根

4、据按键设定目标温度,能够显示控温时的实际炉温和恒温时间等信息。 1.2 提高功能要求:1.2.1 对其主电路和控制电路设计相应的保护电路,使其安全可靠地工作;1.2.2对影响温度控制时间和精度的因素进行分析,改进相应的计算机控制算法,完成计算机控制高效的算法设计。1.3设计条件1.3.1电源条件:稳压电源5V可调,220V直流电源1.3.2测试条件:万用表1.3.2元件清单:如表1.1示。元件清单元件名称数量电热杯1个SL1型51单片机综合试验箱1个DS18B20温度传感器1片STC12C5A60S2单片机1片USB下载线1条单线固态继电器1个导线若干另有剪刀、镊子等工具表1-1第2章 系统设

5、计方案2.1原理图设计根据设计要求设计原理图如2-1所示。图2-1原理图图2-12.2硬件设计该设计本系统由STC12C5A60S 单片机最小系统及其外围电路组成,单片机系统有自己的电源模块、显示模块、温度采集模块,如图2-1所示。根据实验箱设计电路图如图2-2所示。单片机最小系统显示按键控制信号输出驱动电路外围电路固态继电器温控炉温度采集电源模块图2-2硬件电路方框图2.3软件设计2.3.1软件设计方案为了更简单的完成温度控制的任务,采用如下算法控制继电器,程序的软件流程图如下:图2-3软件流程图首先在程序的开头先读取用户的按键命令,当没有按键时,数码管仅显示实际温度;若按下“b”键,则数码

6、管显示用户的设定温度;按下“c”键,则进入设置温度子程序,用户通过19数字键就可以设置用户所需温度,这样就完成了用户的操作。接下来读取DS18B20的数据,并按格式装配成数码管可以显示的类型。最后根据当前的温度值控制继电器的通断。主程序就是以上述流程往复运行。2.3.2程序清单(含必要的注释)#include#include#define uchar unsigned char#define DELAY_TIME1 8#define uint unsigned intextern unsigned char KeyCounter;extern bit KeyFlag;extern bit Se

7、tFlag;extern bit DisFlag;extern bit ShowTimeFlag;unsigned char data DisData2; /温度显示值unsigned char data SetData2; /温度设定值unsigned char KeyCounter; /设置温度位数计数器float RTValue; /实际温度值unsigned char STValue=50; /设置温度值unsigned char ShowTime3=0;/恒温时间值 unsigned int m;/定义粗略延迟变量unsigned int cc;/计数次数unsigned int C

8、ountFlag;unsigned int TimeCounter=0;/设置恒温时间计数器unsigned char code keycode16=0x77,0x7b,0x7d,0x7e, /1,2,3,A0xb7,0xbb,0xbd,0xbe, /4,5,6,B0xd7,0xdb,0xdd,0xde, /7,8,9,C0xe7,0xeb,0xed,0xee, /*,0,#,D;unsigned char code Seg_Table13 = 0xC0,/*0*/ 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*

9、/ 0xF8,/*7*/ 0x80,/*8*/ 0x90,/*9*/0x9c,/*10*/ /上框 代表实际温度 0xa3,/*11*/ /下框 代表设定温度 0xff/all off;unsigned char code Pos_Dis_Buf5 = 0xef,0xdf,0xbf,0x7f,0xff;unsigned char Digit3 = 0;bit ShowTimeFlag=0;/是否显示恒温时间bit KeyFlag=0;/是否接收到有用键值 1有bit SetFlag=0;/是否设定键按下 1按下bit DisFlag=0; /1显示设定值 0显示实际值sbit Beep = P

10、35;sbit Heat = P30;sbit DQ=P31; /改成P30sbit SegDin=P36; /显示数据高地位sbit SegClk=P37; /数据显示时钟void InitSys()TMOD=0X01;/MODE 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1; /开中断ET0=1;/开定时器0中断P4SW=0xf0; /*函数:Delay()功能:不精确延时参数:延时参数返回值:无*/void Delay(unsigned int n)while(-n);void ds18b20_delay(int time)/延时时间

11、为(time * 6 us) int i,temp;temp=time; for(i=0;i0;i-) DQ = 0; /拉低总线 _nop_(); /至少维持了1us,表示写时序(包括写0时序或写1时序)开始 DQ = dat&0x01; /从字节的最低位开始传输 /指令dat的最低位赋予给总线,必须在拉低总线后的15us内, /因为15us后DS18B20会对总线采样。 ds18b20_delay(10); /必须让写时序持续至少60us DQ = 1; /写完后,必须释放总线, dat = 1; ds18b20_delay(1); /18B20读1个字节函数uchar ReadOneCh

12、ar(void)uchar i = 0;uchar dat = 0;for(i=8;i0;i-) DQ = 0; /将总线拉低,要在1us之后释放总线 /单片机要在此下降沿后的15us内读数据才会有效。 _nop_(); /至少维持了1us,表示读时序开始 _nop_(); dat = 1; /让从总线上读到的位数据,依次从高位移动到低位。 DQ = 1; /释放总线,此后DS18B20会控制总线,把数据传输到总线上 ds18b20_delay(1); /延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分 if(DQ) /控制器进行采样 dat |= 0

13、x80; /若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0 ds18b20_delay(8); /此延时不能少,确保读时序的长度60us。return (dat);float ReadTemperature(void)uchar n = 0; /存储符号unsigned int t;uchar a,b; /读出温度函 Init_DS18B20(); /总线复位 WriteOneChar(0xCC); / 发Skip ROM命令 WriteOneChar(0xBE); / 发读命令a = ReadOneChar(); /温度低8位b = ReadOneChar(

14、); /温度高8位Init_DS18B20();WriteOneChar(0xCC); / Skip ROMWriteOneChar(0x44); / 发转换命令 t = (b 8) + a;return (t*0.0625);unsigned char Key_Scan() /返回的是keycode数组的位数unsigned char i,X,Y;unsigned char KeyCode;P2 = 0x0f;if(P2 != 0x0f)Delay(500);if(P2 != 0x0f)X = P2;P2 = 0xf0;if(P2 != 0xf0)Y = P2;while(P2!=0xf0)

15、; /如果不松键 则一直停在这边KeyCode = X|Y;elseKeyCode = 0xff; for(i=0;i16;i+)if(KeyCode=keycodei)return i;return 255; unsigned char Get_Code()unsigned char i=0xff,j=0xff;i=Key_Scan();switch(i)case 0:j=1;KeyFlag=1;break;case 1:j=2;KeyFlag=1;break;case 2:j=3;KeyFlag=1;break;case 3:break; /Acase 4:j=4;KeyFlag=1;br

16、eak;case 5:j=5;KeyFlag=1;break;case 6:j=6;KeyFlag=1;break;case 7:break; /Bcase 8:j=7;KeyFlag=1;break;case 9:j=8;KeyFlag=1;break;case 10:j=9;KeyFlag=1;break;case 11:break; /Ccase 12:j=a;KeyFlag=1;SetFlag=1;KeyCounter=0;break;case 13:j=0;KeyFlag=1;break;case 14:j=b;KeyFlag=1;DisFlag=DisFlag;break;case

17、 15:j=c;KeyFlag=1;ShowTimeFlag=ShowTimeFlag;break; /D /Ddefault:KeyFlag=0;break;return j;/*函数:Seg_Display()功能:数码管在指定位置显示指定的数参数:Pos 显示位置(0 1 2 3) ucDATA (09)待显示的数字 Point 为1则显示小数点,否则不显示返回值:无*/void Bit_Display(unsigned char Pos, unsigned char ucDATA, bit Point)unsigned char i;unsigned char ucTemp;ucTem

18、p = Seg_TableucDATA;/查段码表if(Point)ucTemp &= 0x7f; P4 = Pos_Dis_Buf4;/关闭所有显示for(i = 0; i 8; i+)SegDin = ucTemp & 0x80;/*每次取最高位,最高位为1,则SEG_DIN=1;反之亦然*/SegClk = 0;SegClk = 1; /*产生74164移位时钟上升沿*/ucTemp = 1;P4 = Pos_Dis_BufPos;/使能位选/*函数:Seg_Display()功能:数码管上显示指定的数参数:uiData (09999)待显示的数字返回值:无*/void Seg_Disp

19、lay(float uiData)unsigned char i;Digit0 = (unsigned int)(uiData/10)%10; /十位Digit1 = (unsigned int)uiData%10; /个位Digit2 = (unsigned int)(uiData*10)%10; /小数后一位for(i = 0; i 3; i+)if(i!=1)Bit_Display(i,Digiti,0); /不显示小数点elseBit_Display(i,Digiti,1); /显示小数点Delay(50);void main()unsigned char i,j,num,k;unsi

20、gned char Counter=0; unsigned int htime=0;unsigned int stime=0;InitSys();while(1) RTValue=ReadTemperature(); /获取实际温度num=Get_Code();if(DisFlag=0&SetFlag=0)/显示实际温度for(j=0;j50;j+)/每次用循环显示 也许可以提高亮度for(i=0;i50;i+)Bit_Display(3,10,0); /上方框 表示实际温度Seg_Display(RTValue);if(DisFlag=1&SetFlag=0)/显示设定温度for(j=0;j

21、50;j+)/每次用循环显示 也许可以提高亮度for(i=0;i50;i+)Bit_Display(3,11,0);/下方框 表示设定温度Seg_Display(STValue); if(TimeCounter=1000)TimeCounter=0;if(TimeCounter!=0)stime=TimeCounter;ShowTime0=stime/100;ShowTime1=(stime/10)%10;ShowTime2= stime%10;if(DisFlag=0&SetFlag=0&ShowTimeFlag=1)/显示恒温时间for(j=0;j50;j+)/每次用循环显示 也许可以提高

22、亮度for(i=0;i1)KeyCounter=0;SetFlag=0;STValue=10*SetData0+SetData1;if(RTValue(STValue-5) Beep=1; /不鸣叫Heat=0; /加热if(STValue-5)=RTValue&RTValue1)k=1;Heat=k;if(STValue-0.8)=RTValue&RTValue1)k=1;Heat=k;if(STValueRTValue&RTValue(STValue+0.5)if(CountFlag = 1)TR0=0;TimeCounter=0;CountFlag=0;Beep=0;/鸣叫Heat=1;

23、 /不加热while(Counter=1000)Counter=0; void timer0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;cc+;if(cc=20)cc=0;TimeCounter+;第3章 单元电路设计3.1控制部分电路设计控制部电路分即一个单片机最小系统板,如果需要,可以为单片机提供外部晶振电路和复位电路。如图3-1.图3-132矩阵键盘电路设计键盘用于外部输入,本设计采用4*3矩阵键盘。如图3-2示。弹性按键被按下时闭合,松手后自动断开。单片机检测按键的原理是:单片机的I/O口既可以作为输出也可作为输入

24、使用,当检测按键时使用的是它的输入功能,把按键的一端接地,另一端与单片机的某一个I/O口相连,开始时先给I/O口赋一高电平,然后让单片机不断地检测该I/O口是否变成低电平,当按键闭合时,即相当于该I/O口通过按键与地相连,变成低电平,程序一旦检测到I/O口变为低电平则说明按键被按下,然后执行相应的指令。图4.4 按键按下时电压的变化从图4.4可以看出,理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动现象,抖动时间的长短和按键的机械特性有关,一般为510ms。通常我们手动按时都要加上去抖动操作,有专用的去抖动电路,也有专用的去抖动芯片,但通常我们软件延时的方法就能很容易解决抖

25、动问题,而没有必要再添加多余的硬件电路。1. 按键检测流程图无论独立键盘还是矩阵键盘,单片机检测其是否被按下的依据都是一样的,也就是检测该键对应的I/O口是否为低电平。独立键盘有一端固定为低电平,单片机写程序检测时比较方便。而矩阵键盘两端都与单片机I/O口连接,因此在检测时需人为通过单片机I/O口送出低电平。检测时,先送一列为低电平,其余几列为高电平,然后然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平,就可以确定当前被按下的按键是哪一行哪一列的,用同样的方法轮流各列送一次低电平,再轮流检测一次各行是否变为低电平,这样既可检测完所有的按键。图3-2矩阵键盘3.3显示部分电路设计数码

26、管的显示原理不论是共阴还是共阳,其基本原理是一样的,都是靠点亮内部的LED来发光。一位数码管的引脚是十个,显示一个8字需要7个小段,另外还有一个小数点。3.3.1数码管内部原理图实际实验时,为了保证编程的方便和通常将数码管的数字所对应的八位数字记录在数组中,程序中直接使用查表的方法,可以提高程序的效率,也使程序的编写更加简单方便。符号编码符号编码00xC080x8010xF990x9020xA4A0x8830xB0B0xC740x99C0xC650x92D0xA160x82E0x8670xF8F0x8E我们实验箱中的LED数码管是四位数码管,因此为了控制方便,四个数码管的“段选端”是连在一起的

27、,他们的GND或VCC端作为“位选端”来输入控制信号,这样单片机就可以通过程序来控制显示的字符。下图是实验箱开发板中的数码管电路图:2. 实验箱数码管电路数码管显示段选码:unsigned char code Seg_Table13 = 0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/0x9c,/*10*/ /上框 代表实际温度 0xa3,/*11*/ /下框 代表设定温度 0xff/all off;3.4温度采集模块电路设计温度采集采用直接输

28、出数字量的DS18B20;如图3-6示图3-6DS18B20的主要特征: 􀂄 全数字温度转换及输出。 􀂄 先进的单总线数据通信。 􀂄 最高12位分辨率,精度可达土0.5摄氏度。 􀂄 12位分辨率时的最大工作周期为750毫秒。 􀂄 可选择寄生工作方式。 􀂄 检测温度范围为55C +125C (67F +257F) 􀂄 内置EEPROM,限温报警功能。 􀂄 64位光刻ROM,内置产品序列号,方便多机挂接。 􀂄 多样封装形式,适应不同硬件系

29、统。 DS18B20芯片封装结构: DS18B20引脚功能: GND 电压地 DQ 单数据总线 VDD 电源电压 NC 空引脚 DS18B20工作原理及应用: DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。其一个工作周期可分为两个部分,即温度检测和数据处理。在讲解其工作流程之前我们有必要了解18B20的内部存储器资源。18B20共有三种形态的存储器资源,它们分别是: ROM 只读存储器,用于存放DS18B20ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校验)。数据在出产时设

30、置不由用户更改。DS18B20共64位ROM。 RAM 数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第5个字节则是用户第3个EEPROM的镜像。第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并

31、在RAM都存在镜像,以方便用户操作。 RAM及EEPROM结构图:图2我们在每一次读温度之前都必须进行复杂的且精准时序的处理,因为DS18B20的硬件简单结果就会导致软件的巨大开消,也是尽力减少有形资产转化为无形资产的投入,是一种较好的节约之道。 控制器对18B20操作流程: 1, 复位:首先我们必须对DS18B20芯片进行复位,复位就是由控制器(单片机)给DS18B20单总线至少480uS的低电平信号。当18B20接到此复位信号后则会在1560uS后回发一个芯片的存在脉冲。 2, 存在脉冲:在复位电平结束之后,控制器应该将数据单总线拉高,以便于在1560uS后接收存在脉冲,存在脉冲为一个60

32、240uS的低电平信号。至此,通信双方已经达成了基本的协议,接下来将会是控制器与18B20间的数据通信。如果复位低电平的时间不足或是单总线的电路断路都不会接到存在脉冲,在设计时要注意意外情况的处理。 3, 控制器发送ROM指令:双方打完了招呼之后最要将进行交流了,ROM指令共有5条,每一个工作周期只能发一条,ROM指令分别是读ROM数据、指定匹配芯片、跳跃ROM、芯片搜索、报警芯片搜索。ROM指令为8位长度,功能是对片内的64位光刻ROM进行操作。其主要目的是为了分辨一条总线上挂接的多个器件并作处理。诚然,单总线上可以同时挂接多个器件,并通过每个器件上所独有的ID号来区别,一般只挂接单个18B

33、20芯片时可以跳过ROM指令(注意:此处指的跳过ROM指令并非不发送ROM指令,而是用特有的一条“跳过指令”)。ROM指令在下文有详细的介绍。 4, 控制器发送存储器操作指令:在ROM指令发送给18B20之后,紧接着(不间断)就是发送存储器操作指令了。操作指令同样为8位,共6条,存储器操作指令分别是写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。存储器操作指令的功能是命令18B20作什么样的工作,是芯片控制的关键。 5, 执行或数据读写:一个存储器操作指令结束后则将进行指令执行或数据的读写,这个操作要视存储器操作指令而定

34、。如执行温度转换指令则控制器(单片机)必须等待18B20执行其指令,一般转换时间为500uS。如执行数据读写指令则需要严格遵循18B20的读写时序来操作。数据的读写方法将有下文有详细介绍。 若要读出当前的温度数据我们需要执行两次工作周期,第一个周期为复位、跳过ROM指令、执行温度转换存储器操作指令、等待500uS温度转换时间。紧接着执行第二个周期为复位、跳过ROM指令、执行读RAM的存储器操作指令、读数据(最多为9个字节,中途可停止,只读简单温度值则读前2个字节即可)。其它的操作流程也大同小异,在此不多介绍。DS18B20芯片与单片机的接口:图3图4如图所示,DS18B20只需要接到控制器(单

35、片机)的一个I/O口上,由于单总线为开漏所以需要外接一个4.7K的上拉电阻。如要采用寄生工作方式,只要将VDD电源引脚与单总线并联即可。但在程序设计中,寄生工作方式将会对总线的状态有一些特殊的要求。图5DS28B20芯片ROM指令表: Read ROM(读ROM)33H (方括号中的为16进制的命令字) 这个命令允许总线控制器读到DS18B20的64位ROM。只有当总线上只存在一个DS18B20的时候才可以使用此指令,如果挂接不只一个,当通信时将会发生数据冲突。 Match ROM(指定匹配芯片)55H 这个指令后面紧跟着由控制器发出了64位序列号,当总线上有多只DS18B20时,只有与控制发出的序列号相同的芯片才可以做出反应,其它芯片将等待下一次复位。这条指令适应单芯片和多芯片挂接。 Skip ROM(跳跃ROM指令)CCH 这条

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 技术资料 > 课程设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922