还剩35页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
摘要随着微机测量和控制技术的迅速发展与广泛应用,以单片机为核心的温度采集与控制系统的研发与应用在很大程度上提高了生产生活中对温度的控制水平本设计论述了一种以STC89C52单片机为主控制单元该控制系统可以实时存储相关的温度数据系统设计了相关的硬件电路和相关应用程序硬件电路主要包括STC89C51单片机最小系统,测温电路、实时时钟电路、LED显示以及通讯模块电路等系统程序主要包括主程序,读出温度子程序,计算温度子程序、按键处理程序、LCD显示程序以及数据存储程序等关键词STC89C52单片机;DS18B20;显示电路AbstractAlongwiththecomputermeasurementandcontroltechnologyoftherapiddevelopmentandwideapplicationbasedonsinglechiptemperaturegatheringandcontrolsystemdevelopmentandapplicationgreatlyimprovetheproductionoftemperatureinlifelevelofcontrol.ThisdesignSTC89C52describesakindofmainlybyMCUcontrolunitfortemperaturesensorDS18B20temperaturecontrolsystem.Thecontrolsystemcanreal-timestoragetemperaturedataandrecordrelatedtothecurrenttime.Systemdesignrelatedhardwarecircuitandrelatedapplications.STC89C52microcontrollerhardwarecircuitincludetemperaturedetectioncircuitsmallestsystemandreal-timeclockcircuitLCDdisplaycircuitcommunicationmodulecircuitetc.SystemprogrammingmainlyincludemainprogramreadtemperaturesubroutinethecalculationoftemperaturesubroutineskeyprocessingproceduresLCDdisplayproceduresanddatastorageproceduresetc.Keywords STC89C52microcontroller;DS18B20;displaycircuit第1章51单片机结构和原理单片微型计算机简称单片机,也称为微控制器MicroControllerUnit英文缩写为MCU.单片机的结构及功能均是按照工业控制要求而设计的,它把微型计算机的宫格功能部件(中央处理器CPU、随机存取存储器RAM、只读存储器ROM、输入输出I/O接口、定时器/计数器以及串行通信接口等)集成在一块芯片上,构成一个完整的微型计算机,故又称为单片微型计算机除工业领域外,单片机还广泛应用于各种民用电子、电器之中MCS-51是由美国INTEL公司20世纪80年代生产的一系列8位单片机的总称,此系列单片机包括很多型号,如
8031、
8051、
8751、
8032、8052等,其中8051是最早最典型的产品该系列其他单片机都是在8051的基础上进行功能的增、减改变而来的,所以人们习惯用8051来称呼MCS-8051系列单片机,而其中的8031在20世纪80年代末90年代初是我国最流行的单片机之一INTEL公司后来将MCS-51的核心技术授权给了其他公司,现在生产8051内核单片机的公司,主要有ATMEL、WINBOND、NXP、NC DRAGON等随着技术的发展,各种高性能的16位、32位MCU不断出现,但以8051、PIC、AVG以及MC68HC等系列为典型代表的8位MCU,由于成本低、开发工具完善、易学易用等特点,仍具有强大的生命力和极高的实使用价值1.151单片机的结构
1.
1.1基本结构8位CPU,片内振荡器4KB程序存储器ROM(4096个8位淹没ROM)128字节的数据存储器RAM(128个8位淹没RAM)21个特殊功能寄存器32条I/O口线外部数据存储器寻址空间为64KB外部程序存储器寻址空间为64KB2个16位的可编程定时/计数器中断结构具有5个中断源,2个优先级一个全双工串行通信口有位寻址功能,适于布尔处理的位处理机制
1.
2.18051单片机引脚图图1-1at89c51单片机第2章相关编程与仿真软件的介绍常用的单片机语言有很多,如汇编、C语言、BASIC、C++等,对51单片机而言,使用最为广泛的还是汇编语言和C语言有经验的程序员用汇编语言可以写出高效率的程序,但每种语言都有自己个子的特点
2.1从标准C转向KeilCC51是专门为51系列单片机设计的,根据51单片机自身的特点进行了若干扩展,与ANSIC在语法和库函数方面存在稍许差别,但绝大部分是兼容的但在学习中,使用最多的还是KeilC
8.08uVision
32.2KeilC上机的基本方法
2.
2.1uVision3中编程的基本步骤在uVision3集成开发环境中创建一个新项目(Project),并为该项目选定合适的单片机型号利用uVision3的文件编译器编写C语言(或者汇编语言)源程序文件,并将文件添加到项目中去通过uVision3的各种选项,配置Cx51编译器、Ax51宏编译器、BL51/Lx51连接定位器以Debug调试器的功能利用uVision3的构造功能对项目中的源程序文件进行编译链接,生成绝对目标代码和可选的HEX格式的可执行文件,如果出现编译链接错误则返回上一步,修改源程序中的错误后重新构造整个项目将没有错误的绝对目标代码装入uVision3调试器进行仿真调试,调试成功后用编程器将可执行文件写入到单片机应用系统的程序存储器或者单片机内部的FlashROM中
2.
2.2uVision上机注意事项C51源程序汗汉字注释内容时,删除、插入汉字会出现乱码解决方法为选择Edit|Configuration菜单项,弹出界面,将C源程序文本字体选择为DotumChe此字体可避免出现汉字乱码现象原版的KeilC编译器会忽略编码为0xFD的字符,当编写中文显示程序时会出现问题,应安装针对这一问题的专用补丁,许多KeilC安装包都含有该补丁程序,安装时间可根据帮助文件安装该补丁
2.3Proteus简介Proteus是英国Labcenter公司开发的嵌入式系统仿真软件,组合了高级原理图设计工具ISIS、混合模式SPICE仿真、PCB设计以及自动布线而形成了一个完整的电子设计系统它运行于Windows操作系统上,可以仿真、分析各种模拟和数字电路,并且对PC机的硬件配置要求不高
2.
3.1Proteus 与KeilC的联合仿真目前,单片机仿真软件很多,ProteusISIS与其他单片机仿真软件不同的是,它不仅能仿真单片机CPU的工作情况,也能够仿真单片机外围电路或没有单片机参与的其他电路的工作情况一次在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程师的角度直接看程序运行和电路工作的过程和结果同事,当原理图调试成功后,利用ProteusARES软件,很容易获得PCB图,为今后的制造提供了方便Keil是美国KeilSoftware公司开发的,是目前世界上最好的51单片机的汇编和C语言的开发工具它支持汇编、C语言以及混合编程,同时具备功能强大的软件仿真,在软件模拟仿真方式下不需要任何单片机硬件即可完成用户程序仿真调试;虽然Keil也提供了硬件仿真(用Monitor51协议,需要硬件支持)功能,但我们在利用它的硬件仿真功能的时候,它会受到一定的限制如果我们将ProteusISIS与Keil整合起来使用,充分利用各自的仿真功能,单片机软硬件的调试将变的十分有效打开LED.dsn,删除LED设计页中的ULA2003A驱动部分,在LED设计页新建一个子电路LED_DRIVER,为该子电路见撒谎那个输入/输出端子移动鼠标指针带子电路上按Ctrl+C计入子电路所在的设计页,原ULA2003驱动部分加上相应的端子由于LED的驱动部分有多中方案,将来采用别的方案时不需要做任何的修改用BUTTON元件绘出键盘的部分,并为行扫描线和列扫描线上的端子命名,此处不采用Proteus中现成的键盘模型是为了是读者更透彻的理解键盘的设计和按键识别的原理,但在商业产品的开发中可购买现成的键盘模块第3章基于单片机的PID温度控制系统
3.1PID温控器简介#0;#0;#0;放大A/D8051LED显示键盘交流电过零检测220V电源电炉热电阻电热丝K220V电源图3-1PID温控器原理图电炉内的热电阻温度传感器测出的温度信号经运算放大器放大和模/数转换后,由8051读出电阻炉炉温,控制程序根据当前炉温和目标温度的偏差,按照一定的控制方法控制开关K的开与断,提供适当的加热功率,以使炉温尽快趋近目标温度本设计是接口技术、应用系统设计、Proteus仿真的结合,介绍存储系统、数据采集、串口通信等知识及其在PID温控器设计中的应用于仿真,从个子系统开始,设计并逐步完善,直至整个应用系统的实现
3.28051存储系统扩展和PID温控器的存储系统设计
3.
2.1PID温控器存储系统设计PID温控器的存储系统设计中使用了一片3-8译码器74LS138来产生各芯片所需的片选信号要是为低电平选中6264,则C、B、A的输出应为011,由此可以计算出6264的二进制地址范围为0110000000000000~0111111111111111写成十六进制为0x6000~0x7fff,2764的地址范围为0x0000~0x1fff图3-2温控系统扩展图
3.3人机接口和PID温控器的输入/输出设计及仿真键盘和显示器是最常用的人机交互设备,在单片机系统中显示器常用笔段式LED或者多段式液晶LCD做显示设备,如微波炉、洗衣机、DVD等家用电器采用此类显示方式输出内容较复杂的系统也有才有字符型点阵式LED、字符型LCD等,这里只介绍八段LED显示器,可用于数字和部分字符显示
3.
3.1八段LED显示器下图为笔段式八段LED数码管原理图LED显示器有共阴极和共阳极之分,其中的每段为一个发光二极管,常用的有红绿两种共阴极LED的com公共端应接低电平,割断引脚接高电平则该段点亮,接低电平则该段熄灭共阳极LED与其相反图3-3笔段式八段LED数码管原理图不考虑com端,可知共阳极显示字符0时的各段二进制编码为11000000,写成十六进制为0xC0C语言形式给出的共阳极LED能显示的部分数字和字符编码,可直接用在C51程序中图3-4段位置及编号图3-5共阳极LED图3-6共阴极LED
3.
3.2LED显示器的显示方式实际使用LED时,一般将几个八段显示器排列成一组使用,其中的一个LED显示器被称为一位多位LED显示器的显示方式分为静态方式和动态扫描方式静态方式中各LED的段引脚和com端都独立接线,这种方式的好处是程序相对简单,显示无闪烁;缺点是功耗大采用动态扫描时,各LED的段引脚链接在一起,而com段独立,程序是通过控制各LED的com端的电平来决定点亮某一位LED其优点是功耗小,缺点为编程相对复杂,当CPU负担较重时可能达不到理想的刷新速度,导致效果变差图3-7试验硬件图图3-8LED静态显示仿真图试验程序#includeabsacc.hunsignedcharcodeLED_CODES[]={0xc00xf90xa40xb00x990x920x820xf80x800x900x880x830xc60xa10x860x8e0xff0x0c0x890x7f0xbf};voidmain{XBYTE[0x0000]=LED_CODES
[1];XBYTE[0x0200]=LED_CODES
[2];XBYTE[0x0400]=LED_CODES
[8];while1;}图3-9试验仿真图
3.
3.3PID温控器LED显示及仿真图3-10LED程序流程图下图为PID温控器LED显示部分的Proteus仿真原理图8255A是一个教复杂的并行接口芯片,在PID温控器主要用作I/O口扩展,用于LED的显示在编程时应注意,由于8255A的复位时间较长,字应用程序访问8255A之前,应有足够的延时保证8255A已正确复位图3-11PID温控器LED显示仿真原理图图3-11中有6位动态扫描共阴极LED,它们的段引脚A~G、DP是并联在一起的;引脚1~6位是各位LED的com端,相互独立8255A端口C经74LS244的相同输出S0~S7作为LED的段驱动信号,当某位LED各段全部点亮时,com端电流会达到120~150mA,所以,选用驱动能力较强的ULN2003A作为驱动器件8255A端口B的PB0~PB5经ULN2003A反相后的输出B0~B5,作为LED的位选信号,排阻R10~R15作为ULN2003A的下拉电阻实验程序DISPLAY.H程序#defineBASE0x0000#definePORT_ABASE#definePORT_BBASE+1#definePORT_CBASE+2#definePORT_CONTROLBASE+3#defineLEDS6#defineCA0#defineCC1voidturn_oncharledcharChNumbercharmode;voidLedsOff;voidoneByonechardatas[];externvoidInit8255;unsignedcharcodeSetect[];unsignedcharcodeLED_CODES[];DISPLAY.C程序#includeabsacc.h#includereg
51.h#includedisplay.hunsignedcharcodeSelect[]={0x010x020x040x080x100x20};unsignedcharcodeLED_CODES[]={0xc00xF90xA40xB00x990x920x820xF80x800x900x880x830xC60xA10x860x8E0xFF0x0C0x890x7F0xBF};voidInit8255{unsignedcharij;forj=0;j10;j++fori=0;i255;i++;XBYTE[PORT_CONTROL]=0x90;LedsOff;}voidturn_oncharledcharChNumbercharmode{ifmode==CAXBYTE[PORT_C]=LED_CODES[ChNumber];elseXBYTE[PORT_C]=~LED_CODES[ChNumber];XBYTE[PORT_B]=Select[led];}voidLedsOff{XBYTE[PORT_B]=0x00;}MIAN.C程序#includereg
51.h#includedisplay.hvoidmain{unsignedintm;unsignedchari;Init8255;i=LEDS-1;while1{LedsOff;form=50;m!=0;m--;turn_oniiCC;form=50;m!=0;m--;ifi==0i=LEDS-1;elsei--;}}图3-12PID温控器LED动态显示运行效果图3.3.4 键盘监测基本原理键盘犹如一个开关,当键盘未闭合时,A点为高电平,当K闭合后,电路导通,A点电平拉低,如将A点以某种方式介入计算机系统,计算机就可以通过检测A点电平的高低来判别K键是否闭合在键的按下和松动过程中,电平都有一个抖动的过程,会引发键的误检测电平抖动过程一般持续5~10ms,对抖动过程的处理有硬件消抖和软件消抖,在键较少时可采用硬件方式但当按键较多时适合用软件消抖方式,如矩阵式键盘a.独立式键盘下图是独立式键盘的接线示意图其优点是电路简单,检测方便;缺点是与矩阵键盘相比,占用太多I/O口浪费资源图3-13独立式键盘b.矩阵式键盘下图是矩阵式键盘原理图图中的键盘为4行4列共16个键,行扫描线为X
0、X
1、X2,X3,列扫描线为Y
0、Y
1、Y
2、Y3矩阵键盘的识别有行扫描法和行反转法两种图3-14矩阵式键盘原理图
3.
3.5PID温控器的键盘设计及其Proteus仿真在6位LED上利用矩阵式键盘实现将按键的行、列显示在LED的第
1、2位和
5、6位上行扫描信号R0~R3来自于51单片机P1口的P
1.0~P
1.3,列扫描来自于51单片机的P
1.
4、P
1.7本次用到的是行反转法识别按键,也就是说将行、列各接至一个端口,编程使CPU往行线说连端口全部输出低电平,然后从列线所连端口读入列线值如果有某一个键被按下,则必有一条列线位低电平,在进行反转,即将读入的列线值从列线所连的端口输出,在从行线所连端口读入行线的值,那么闭合键所对应的行线必位低电平在通过程序对所得列线值和行线值的处理,就可以识别出按键所对应的列号和行号图3-15键盘程序流程图如下图3-16PID温控器键盘原理图实验程序;DISPLAY.H程序(如前)DISPLAY.C程序(如前)按键检测程序#includeabsacc.h#includedisplay.h#includeReg
51.hvoiddelay{chari;fori=1000;i!=0;i--;}charkeyCheckchar*rowchar*col{unsignedchart1t2t3i;unsignedcharResult=0;P1=0xf0;t1=P1;ift1==0xf0gotoexit;fori=11;i!=0;i--delay;t1=P1;ift1==0xf0gotoexit;Result=1;t2=0x80;t1=~t1;fori=4;i!=0;i--{t3=t2t1;ift3!=0{*col=i-1;break;}elset2=t21;}t1=~t1;t1=t1|0x0f;P1=t1;t1=P1;t2=0x08;t1=~t1;fori=4;i!=0;i--{t3=t2t1;ift3!=0{*row=i-1;break;}elset2=t21;}exit:returnResult;}mian源程序#includedisplay.h#includeabsacc.h#includeReg
51.hexterncharkeyCheckchar*rowchar*col;voidmain{charrowcolr;charstrIndexs
[6]={202020202020};unsignedcharik;Init8255;while1{r=keyCheckrowcol;ifr==0{strIndexs
[5]=20;strIndexs
[4]=20;strIndexs
[1]=20;strIndexs
[0]=20;}else{strIndexs
[5]=0;strIndexs
[1]=0;strIndexs
[4]=row;strIndexs
[0]=col;}fork=6;k!=0;k--{LedsOff;fori=250;i!=0;i--;turn_onk-1strIndexs[k-1]CC;fori=250;i!=0;i--;}}}图3-17程序仿真图第4章PID温控器的炉温采样接口及仿真在计算机实时测量和智能化仪表等应用系统中,经常会遇到从时间到数值均连续变化的模拟量,如温度、压力、位移、速度等,与此相对应的电信号称为模拟信号因单片机只能处理数字量,因此这些模拟电信号必须转化为离散的数字信号,才能被送给单片机进行相应的处理将模拟信号转化为数字量的器件称为A/D转换器,简称A/D
4.
4.1A/D转化器的主要技术指标a.分辨率分辨率是指输出数字量变化的一个相邻数码所需要输入模拟电压的变化量习惯上用输出的二进制位数或BCD码位数表示例如,分辨率为12位的A/D转换器,表示该转化器的输出数据可以用2^12个二进制数进行量化分辨率用呗分数表示如下1/2^12*100%=1/4096*100%=
0.0244%故一个满刻度为10V的12位A/D转换器能够分辨输入电压变化的最小值为
2.4Vb.量化误差量化误差是指由A/D转换器的优先分辨率多引起的误差若不考虑其他误差的影响,一个分辨率有限的A/D转换器的阶梯状转移特性曲线与具有无限分辨率的A/D转换器转移特性曲线(直线)之间的最大误差,称为误差量化提高分辨率能够减少量化误差c.转换精度转换精度是指A/D转换器的时间量化值与理想A/D转换器的差值转换精度可以分为绝对精度和相对精度,是由非线性、零点刻度、满量程刻度以及温漂等因素所引起的误差d.转换速率转换速率就是指能够重复进行数据转换的速度,即每秒转换的次数而完成一次的A/D转换所需要的时间,则是转换速率的倒数
4.
4.2PID温控器A/D转换编程方法采用的是端口查询方式,先向51单片机P
3.3写入1,然后读入P3口检查P
3.3是为位0,不为0则重新读入P3在检测,直到P
3.3为0,此时表示数据转换过程已结束,读片外地址0x2XXX,P1,/RD为低电平,经74LS02反向为高电平,向ADC0808的OE送读数据的信号,ADC0808将转换结果从Out7~Out0送到数据总线并读入CPU实现在LED上显示读取的A/D转换值程序流程图如下;实验硬件图实验程序DISPLAY.H程序和DISPLAY.C程序(如前)主程序ADC
0808.c#includedisplay.h#includeabsacc.h#includereg
51.h#defineADC_08081#defineADC0808_DATA_PORT0x2000#defineADC0808_QUERY_PORT0x4000#defineADC0808_START_PORT0x2000unsignedchargetData2unsignedcharADC_Chipunsignedcharchannel{unsignedcharflag=0;unsignedcharvalue=-1;unsignedxdataale;switchADC_Chip{caseADC_0808:P3=P3|0x08;XBYTE[ADC0808_START_PORT]=channel;P3=P30xdf;P3=P3|0x20;P3=P30xdf;flag=P3;while1{ale=1;flag=flag0x08;ifflag==0break;flag=P3;}value=XBYTE[ADC0808_DATA_PORT];returnvalue;break;}}voiddispStrcharstrIndexs[]unsignedcharvaluecharchannel{charik;fori=0;i3;i++{strIndexs[i]=value%10;value=value/10;}strIndexs
[4]=channel;LedsOff;fori=250;i!=0;i--;fork=6;k!=0;k--{LedsOff;fori=250;i!=0;i--;turn_Onk-1strIndexs[k-1]CC;fori=250;i!=0;i--;}}voidmain{unsignedcharvalue;unsignedintk;charstrIndexs
[6]={20202020112};Init8255;while1{value=getData2ADC_08081;fork=100;k!=0;k--dispStrstrIndexsvalue1;LedsOff;}}实验仿真图AD转换(总线查询方式和中断方式)读片外地址0x4XXX,P2和/RD位低电平,经74LS02反相后打开三态门74LS125,将转换是否完成的标志EOC通过数据总线D7读入CPU,检查D7是否为1,若不为1,则重新读端口0x4XXX在检测,直到D7为1为止,读片外地址0x2XXX,P1,/RD为低电平,经74LS02反向为高电平,向ADC0808的OE送读数据的信号,ADC0808将转换结果从Out7~Out0送到数据总线并读入CPU实验硬件图总线查询方式硬件图中断方式硬件图实验程序
1、总线查询方式程序A、DISPLAY.H和DISPLAY.C程序同上次实验B、主程序ADZX.C#includedisplay.h#includeabsacc.h#includereg
51.h#defineADC_08081#defineADC0808_DATA_PORT0X2000#defineADC0808_QUERY_PORT0x4000#defineADC0808_START_PORT0x2000unsignedchargetData1unsignedcharADC_Chipunsignedcharchannel{unsignedcharflag=0;unsignedcharvalue=-1;unsignedxdataale;switchADC_Chip{caseADC_0808:XBYTE[ADC0808_START_PORT]=channel;P3=P3|0x08;P3=P30xdf;P3=P3|0x20;P3=P30xdf;flag=P3;while1{ale=1;flag=flag0x08;ifflag==0break;flag=P3;}value=XBYTE[ADC0808_DATA_PORT];returnvalue;break;}}voiddispStrcharstrIndexs[]unsignedcharvaluecharchannel{charik;fori=0;i3;i++{strIndexs[i]=value%10;value=value/10;}strIndexs
[4]=channel;LedsOff;fori=250;i!=0;i--;fork=6;k!=0;k--{LedsOff;fori=250;i!=0;i--;turn_Onk-1strIndexs[k-1]CC;fori=250;i!=0;i--;}}voidmain{unsignedcharvalue;unsignedintk;charstrIndexs
[6]={20202020112};Init8255;while1{value=getData1ADC_08080;fork=100;k!=0;k--dispStrstrIndexsvalue0;LedsOff;}}中断方式程序A、DISPLAY.H和DISPLAY.C程序同上次实验B、主程序ADC0808ZD.C#includedisplay.h#includeabsacc.h#includereg
51.h#defineADC_08081#defineADC0808_DATA_PORT0X2000#defineADC0808_QUERY_PORT0x4000#defineADC0808_START_PORT0x2000unsignedcharvalue;voiddispStrcharstrIndexs[]unsignedcharvaluecharchannel{charik;fori=0;i3;i++{strIndexs[i]=value%10;value=value/10;}strIndexs
[4]=channel;LedsOff;fori=250;i!=0;i--;fork=6;k!=0;k--{LedsOff;fori=250;i!=0;i--;turn_Onk-1strIndexs[k-1]CC;fori=250;i!=0;i--;}}voidmain{unsignedxdataale;Init8255;EX1=1;IT1=1;EA=1;XBYTE[ADC0808_START_PORT]=5;P3=P30xdf;P3=P3|0x20;P3=P30xdf;while1{ale=1;}}voidEX1_Intinterrupt2{unsignedcharvalue;charstrIndexs
[6]={20202020112};EX1=0;value=XBYTE[ADC0808_START_PORT];dispStrstrIndexsvalue5;LedsOff;EX1=1;P3=P30xdf;P3=P3|0x20;P3=P30xdf;}实验仿真图总线查询方式仿真图总线查询方式仿真图中断方式仿真图第5章测温放大电路利用的是热电阻测温的原理,金属热电阻的电阻值与其温度成线性关系,将热电阻Rt介入电桥中,设在某一温度t0时,Rt的阻值为R0,将电桥调整平衡,即R1/R0=R2/R3此时Ul=
0.当Rt的温度偏离t0而变为t时,其阻值将发生变化,电桥失去平衡,若测出此时的Ul,则可根据Ul和Rt的关系,算出在温度为t时热电阻的阻值Rt,再根据热电阻的温度-阻值关系线,换算出热电阻的温度t0若电桥的输出电压Ul于Rt的阻值变换成线性关系,则通过运算放大、A/D转换后可方便地将Ul转换为热电阻所测温度程序流程图如下实验硬件图试验程序
1、Display.h#defineBASE0x0000#definePORT_ABASE#definePORT_BBASE+1#definePORT_CBASE+2#definePORT_CONTROLBASE+3#defineLEDS6#defineCA0#defineCC1voidturn_OncharledcharChNumbercharmode;voidLedsOff;voidOneByOnechardatas[];voidturn_On_WithDotcharledcharChNumbercharmode;externvoidInit8255;unsignedcharcodeSelect[];unsignedcharcodeLED_CODES[];
2、Display.c#includeabsacc.h#includereg
51.h#includedisplay.hunsignedcharcodeSelect[]={0x010x020x040x080x100x20};unsignedcharcodeLED_CODES[]={0XC00xF90xA40xB00x990x920x820xF80x800x900x880x830xC60xA10x860x8E0xFF0x0C0x890x7F0xBF};voidInit8255{unsignedcharij;forj=0;j10;j++fori=0;i255;i++;XBYTE[PORT_CONTROL]=0x90;LedsOff;}voidturn_OncharledcharChNumbercharmode{ifmode==CAXBYTE[PORT_C]=LED_CODES[ChNumber];elseXBYTE[PORT_C]=~LED_CODES[ChNumber];XBYTE[PORT_B]=Select[led];}voidLedsOff{XBYTE[PORT_B]=0x00;}voidturn_On_WithDotcharledcharChNumbercharmode{ifmode==CAXBYTE[PORT_C]=LED_CODES[ChNumber]|~0x80;elseXBYTE[PORT_C]=~LED_CODES[ChNumber]|0x80;XBYTE[PORT_B]=Select[led];}Main.c#includedisplay.h#includeabsacc.h#includereg
51.h#defineADC_08081#defineADC0808_DATA_PORT0x2000#defineADC0808_QUERY_PORT0x4000#defineADC0808_START_PORT0x2000unsignedchargetData2unsignedcharADC_Chipunsignedcharchannel{unsignedcharflag=0;unsignedcharvalue=-1;unsignedxdataale;switchADC_Chip{caseADC_0808:P3=P3|0x08;XBYTE[ADC0808_START_PORT]=channel;P3=P30xdf;P3=P3|0x20;P3=P30xdf;flag=P3;while1{ale=1;flag=flag0x08;ifflag==0break;flag=P3;}value=XBYTE[ADC0808_DATA_PORT];returnvalue;break;}}voidmain{unsignedcharvalue;unsignedlongt;unsignedcharimn;Init8255;while1{value=getData2ADC_08080;t=200*unsignedlongvalue*100/255+5/10;LedsOff;fori=50;i!=0;i--form=50;m!=0;m--;fori=0;i3;i++{m=t%10;ifi==1turn_On_WithDotimCC;elseturn_OnimCC;forn=250;n!=0;n--;t=t/10;LedsOff;}}}实验仿真图炉温闭环PID控制系统仿真模型到目前为止,整个PID控制的硬件设计已经完成,但对闭环控制而言,控制量u作用与被控对象(电炉)的控制效果我们却不得而知,因为还缺乏被控对象的仿真模型按自动控制的知识,被控对象可以用一个传递函数表示,传递函数的确定既可用数学推导的方法,也可用实验的方法确定一般而言,电炉的传递函数为K/1+Ts*e-〆s,式中的K为增益,T位时间常数,〆为延时时间,在仿真模型中,K取为2,T取为10,〆取为2;传递函数的输入量为电压U,输出量为温度在Proteus中,在元件选择页面中输入Laplace关键字在按照需要选择所需的传递函数模型,在本设计中,选择“1?ORD:LP”和“OP:Delay”两种传递函数模型来表示电炉对象,他们分别在1storder和Operators子类中,两模块如下图所示用压控电阻表示PT100传感器,在元件选择页面输入VCR,在元件列表区域选择VCR器件,其符号如上图所示1?ORD:LP参数设置对话框OP:Delay参数设置对话框VCR参数设置对话框实验硬件图实验程序
1、Display.c#includeabsacc.h#includereg
51.h#includedisplay.hunsignedcharcodeSelect[]={0x010x020x040x080x100x20};unsignedcharcodeLED_CODES[]={0XC00xF90xA40xB00x990x920x820xF80x800x900x880x830xC60xA10x860x8E0xFF0x0C0x890x7F0xBF};voidInit8255{unsignedcharij;forj=0;j10;j++fori=0;i255;i++;XBYTE[PORT_CONTROL]=0x90;LedsOff;}voidturn_OncharledcharChNumbercharmode{ifmode==CAXBYTE[PORT_C]=LED_CODES[ChNumber];elseXBYTE[PORT_C]=~LED_CODES[ChNumber];XBYTE[PORT_B]=Select[led];}voidLedsOff{XBYTE[PORT_B]=0x00;}voidturn_On_WithDotcharledcharChNumbercharmode{ifmode==CAXBYTE[PORT_C]=LED_CODES[ChNumber]|~0x80;elseXBYTE[PORT_C]=~LED_CODES[ChNumber]|0x80;XBYTE[PORT_B]=Select[led];}
2、Display.HdefineBASE0x0000#definePORT_ABASE#definePORT_BBASE+1#definePORT_CBASE+2#definePORT_CONTROLBASE+3#defineLEDS6#defineCA0#defineCC1voidturn_OncharledcharChNumbercharmode;voidLedsOff;voidOneByOnechardatas[];voidturn_On_WithDotcharledcharChNumbercharmode;externvoidInit8255;unsignedcharcodeSelect[];unsignedcharcodeLED_CODES[];main.c#includereg
51.h#includeabsacc.h#includedisplay.h#defineADC_08081#defineADC0808_DATA_PORT0x2000#defineADC0808_QUERY_PORT0x4000#defineADC0808_START_PORT0x2000#defineTchar50*255/200voiddelayunsignedchart{unsignedchari;fori=t;t!=0;t--;}unsignedchargetData2unsignedcharADC_Chipunsignedcharchannel{unsignedcharflag=0;unsignedcharvalue=-1;unsignedxdataale;switchADC_Chip{caseADC_0808:P3=P3|0x08;XBYTE[ADC0808_START_PORT]=channel;P3=P30xdf;P3=P3|0x20;P3=P30xdf;flag=P3;while1{ale=1;flag=flag0x08;ifflag==0break;flag=P3;}value=XBYTE[ADC0808_DATA_PORT];returnvalue;break;}}voidmain{unsignedcharvaluek;unsignedlongt;Init8255;LedsOff;while1{value=getData2ADC_08080;t=200*unsignedlongvalue*100/255+5/10;ift=TP3=P30xef;elseP3=P3|0x10;fork=0;;k++{ifk==1turn_On_WithDotkt%10CC;elseturn_Onkt%10CC;delay250;LedsOff;delay250;t=t/10;ift==0break;}}}试验仿真图到目前为止,我们的设计已经可以完全通过仿真了但是能否得到一个线性的结果我们还要进一步分析,下表是对输入与输出的数据的列表输入电压值单位(V)
2.
45722.
61812.
75152.
92433.0962输出温度值单位(℃)125133141149158从上图可以看到输入电压值与输出温度值是线性关系,到此整个PID温控器的设计的全部内容已经完成第四章总结与展望本次次毕业设计对我们即将找工作的毕业生来说,是非常有意义的在这个过程中,我们重新学习并深化了对单片机技术的理解,更加熟练地掌握了各种仿真软件比如说KeilC
51、Proteus等等学会了怎样去仿真和调试,懂得了发现错误后怎么去解决另外,单片机技术在现实生活中应用的越来越多,几乎所有的电子产品都必不可少如智能洗衣机、电冰箱、各种类型的传感器以及控制系统等因此,学好这门课对我们来说是十分有用的然而,由于本人的水平有限,并未完全掌握,在今后的学习过程中仍然需要花费大量的时间去深化特别是,在实际使用时更重要的才是硬件连接,需要自己动手制作各种电路板,开发各种不同的系统所以,今后的时间里将会更多的注重这一方面参考文献【1】李朝青.单片机原理及接口技术.北京北京航空航天大学出版社【2】胡汉才.单片机原理及其接口技术.北京清华大学出版社【3】丁明亮、唐前辉.51单片机应用设计与仿真 北京北京航空航天大学出版社【4】王燕.单片机原理与应用 北京北京航空航天大学出版社【5】张靖武.单片机系统的Proteus设计与仿真 北京电子工业大学出版社【6】夏路易.电路原理图与电路板设计教程 北京北京希望电子出版社【7】Atmel公司.Atmel8051MicrosoftrollerHardwareManul.2005【8】周立功.增强型80C51单片机速成与实践.北京:北京航空航天大学出版社设置选通信号选中最左边LED取输入数据查表取字型码显示一个数字最右边的显示没?结束NOYES开始YES关闭全部LED1ms延时取输入数据查表送取字型码送字选通信号显示一个数据是否是最后一位显示结束设置显示位数i初始化8255A开始开始YESNOYESNO初始化8255A求出行列号六个显示数据都为“-”判断有无键按下保存行列号送选通信号查表送取字型码显示一个数据是否是最后一位显示结束YES初始化8255A启动AD转换保存通道号和数据组取输入数据设置显示位数i关闭全部LED1ms延时查表送取字型码显示一个数据是否是最后一位显示结束送字选通信号开始开始YESNO初始化8255A启动AD转换保存通道号和数据组取输入数据设置显示位数i关闭全部LED1ms延时查表送取字型码显示一个数据是否是最后一位显示结束送字选通信号YESNO开始初始化8255A通道0读入数据启动AD转换标度换算出温度值关闭所有LED1ms延时用%和/运算分别得到各位数据是第二位吗数据或上80H送选通信号查表送取字型码最后一位显示吗结束YESNOYESNO开始初始化8255A通道0读入数据启动AD转换标度换算出温度t关闭所有LED1ms延时用%和/运算分别得到各位数据是第二位吗数据或上80H送选通信号查表送取字型码最后一位显示吗结束t200关闭电炉电源即P3与上0xEF打开电炉电源即P3或上0x10。