2021多路温度巡回检测显示仪表系统实习设计

上传人:小** 文档编号:21046948 上传时间:2021-04-23 格式:DOCX 页数:47 大小:42.95KB
收藏 版权申诉 举报 下载
2021多路温度巡回检测显示仪表系统实习设计_第1页
第1页 / 共47页
2021多路温度巡回检测显示仪表系统实习设计_第2页
第2页 / 共47页
2021多路温度巡回检测显示仪表系统实习设计_第3页
第3页 / 共47页
资源描述:

《2021多路温度巡回检测显示仪表系统实习设计》由会员分享,可在线阅读,更多相关《2021多路温度巡回检测显示仪表系统实习设计(47页珍藏版)》请在装配图网上搜索。

1、多路温度巡回检测显示仪表系统实习设计目录设计任务 (2)总体方案设计与方案论证 (2)总框图及总体软件设计说明 (6)系统资源分配说明 (8)局部程序设计说明 (9)系统功能与操作说明 (17)调试记录及调试结果 (18)课程设计总结 (18)源程序清单(详细注释) (19)设计任务:设计一个以单片机为核心的多路温度巡回检测显示仪表系统。通过多选一电子模拟开关及A/D转换器巡回采集各路温度传感及变送器的数据,进行信号处理及标度变换,以一定的节拍时间依序显示各检测回路的序号及温度值,并可通过按钮开关操控作冻结或切换显示,在单片机实验板台上模拟调试实现。这次我们设计的是八路温度巡检仪。八路温度可以

2、通过八位LED7段数码管分别显示当前检测回路的序号、温度值及温度单位“o C”或其他界面信息,温度显示单位为“o C”,保留一位小数。八路温度按节拍巡回显示,节拍范围为0.5S5.0S,温度范围-50 o C+50 o C。就是说,如果设定节拍位2S,那么在数码上显示的路数和温度每2S换一次,自动切换。还有手动切换功能,就是当要看指定的路数而当前显示的又不是指定的路数时可以通过按键强制切换路数,每按一次路数加1。还有冻结功能,就是当我要一直采集某一路的温度时让数码管一直显示这一路。通过按键,使该路冻结,停止自动切换,但是冻结之后手动切换功能依然有效,而且冻结后温度每1S更新一次。要有键盘扫描和

3、通过键盘输入来设定参数的功能。即按下“F”键调出参数设定界面,再按下“1”键调出原来设定的节拍,再先后按下如“0”、“5”两个键时则设定节拍数位0.5S,若再先后按下“1”、“5”两个键时则重新设定节拍为 1.5S,且每按对应的键则对应的位要闪烁显示,两位要巡回闪烁。当按下“S”键时则确定本次的设置,若按下“C”键则取消本次设定,返回到温度巡回显示界面。对于开关量的输入,如冻结、切换要进行软件消抖动处理。除此之外还可以进行功能的扩展。比如说当无操作时间超过10分钟后自动恢复为基本的温度巡显方式。还可以在每巡回显示一遍时穿插一个节拍显示实时钟,通过键盘设定时间。还可以增加温度超上限警告和超下限警

4、告功能。还可以有其他的功能扩展。总体方案设计与方案论证通过分析本设计的设计要求可以发现整个系统可以被分为若干个独立而又相互之间有联系的子程序模块,比如冻结路数功能,路数切换功能,对IN0-IN7A/D 的采集与数据采集值转换为T内、T内转换为BCD码等数据处理与显示内容送显示缓冲区等模块都可以独立编程。通过合理的系统资源分配及各储存单元相互间的联系,在主程序循环中调用各个模块实现设计的整体的功能实现。所以本设计决定采用模块化程序设计的方法来实现,首先用主程序、子程序等框架把软件的主要结构或用流程图描述出来,并定义和调试好各个框架之间的输入、输出链接关系,然后将各个模块连接起来实现所需功能。采用

5、模块化设计的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化,使系统条理更清晰。若要添加或删除某个功能只需要添加或删除所需的功能模块即可,也可以在主程序循环中屏蔽该模块。这是模块化程序设计的最大优点。本设计基本要求共分为以下十个模块,它们分别为系统初始化模块、系统自检模块、消抖动子程序、数据采集模块(用滚存的方法实现每路的四次采集)、数据处理模块(包括将每路的四次采集取平均后再转换成温度内码)、显示内容模块(包括温度拆字子程序和T内码转成BCD码子程序)、显示更新子程序、路数手动切换子程序、冻结路数子模块和定时器T0中断服务子程序。下面介绍有关几个模块的设计方案:系统初始化模块:在

6、系统初始化模块中需要向82C55芯片和A/D0809芯片的控制端口送入对应的控制字,完成各端口的输入输出设定,同时还要在系统初始化模块中给一些变量或存储单元赋初值,为系统开始工作做好准备。. 系统自检模块:系统自检模块主要是为了检测在系统上电初始化后检测数码管,LED灯,蜂鸣器等这几个提示部件,系统自检时中8盏LED灯能顺序独立点亮,八个数码管的8个段都能独立驱动,没有短路。还有就是在自检程序有各芯片的初始化功能。开关量输入消抖模块:对于开关量输入的消抖处理一般有以下两种种处理方法。方案1采用软件延时消抖:即检测出键闭合后执行一个延时程序,产生5ms10ms的延时,让前沿抖动消失后再一次检测键

7、的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms10ms的延时,待后沿抖动消失后才能转入该键的处理程序。方案2采用滚动滤波消抖法:滚动滤波消抖法就是利用29H-2FH七个存储单元来存放开关量输入值,29H单元内存放的始终是最新一次的输入,最新输入的值与2AH-2DH中存放的输入量进行比较,若29H-2DH这五个单元内存放的输入量相同则可以说明开关量属于一个稳定的状态,这是可以将2DH的内容作为最新的确定值,将2DH单元内容传送给2EH单元。2FH 单元中存放的则是上一次开关消抖处理后留下的确定值。通过比较2EH与2FH的关系就可以实现开关各种状态的判断,同

8、时也消除了开关输入量抖动的影响。本设计采用方案2,即滚动滤波法可以很好地解决消抖模块对整个程序的影响,所以开关量输入消抖模块采用滚动滤波消抖法实现。数据采集模块:先读取上次A/D转换结果,保存数据的转换的结果于指定的路数的采集数据单元,然后通道加1,在启动新通道转换。每路有4个储存单元按列队滚存。先每路采集一个数据,八路都采集完,循环4次,实现每路都采集四次,并实现滚动存取。每8ms采集一路,下一个8ms采集下一路,即每64ms每路各采集一次。每路采集4次,所以滚动一轮采集的时间为256ms。数据处理模块:首先将每路4次采集来的数据相加取平均值后再通过A/D转换,读取转换值。因为IN0和IN1

9、的变化范围是00FF,所以各路每次的采集值都是一个字节,当四个值相加后可能会有进位,变成两个字节。将相加的结果存在一个单元,比如说就存在累加器A中,将进位存在另一个单元比如说R2单元。因为温度范围-50 o C+50 o C对应的温度内码范围是01000,所以转换成温度T内码是应先将四次采集的平均值乘以1000再除以255。所以我们可以将四次采集的值相加后乘以250再除以255,为了计算方便可以将四次相加的值乘以251再除以256。计算是可以先将累加器A中的内容乘以251在除以256,得到两个字节的数,把低8为舍去,留下高8位。再将R2中的进位乘以251再除以256,得到两个字节的结果。再将前

10、面留下的高8位加到进位乘积的低8位中。这样就实现了一路的将采集值转换成T内码。接着转换下一路,循环。每路每当节拍到换路以及节拍内每1秒都要计算一遍。显示内容模块:目的是将T内码转换成BCD码。首先判断T内码是否大于500,因为500对应温度为0o C。如果小于500的话则温度为负,可以给显示缓存35H单元赋“-”号,可以通过查表得到与“-”对应的字段码。如果大于500的话则温度为正,可以将35H单元对应的数码管灭掉,同样通过查表法得到全灭的字段码。当T内码小于500时,用500-T内码,所得的结果再除以100得到温度的十位,余数除以10得到的温度的个位,再剩下的余数就是温度小数点后的数。若有借

11、位,那么最后还要在十位上补偿2,个位上补偿5,小数点后单元补偿6。同理,当T内码大于500时,则用T内码-500,所得的结果除以100得到温度的十位,余数再除以10得到温度的个位,最后剩下的余数就是小数点后的单元。若有借位的话在十位上补偿2,个位上补偿5,小数点后的单元补偿6显示更新子程序:本模块的功能是将转换以后得到的采集数据通过查表得相应字段码一一送往对应的显示缓冲单元显示。路数手动切换子程序:此模块是通过判断外部PB0按键是否有按下,若按键按下,则将当前显示的温度切换到下一路显示,若温度已经切换到第八路则将60H单元中的路数重新赋初值为第一路,如此周而复始循环有序切换路数温度显示。冻结路

12、数子程序:通过判断外部PB1按键是否有按下,若按键按下,则设定程序寄存器用户标志位清零,在定时中断服务子程序中通过判断用户标志位的状态来设定节拍以冻结该路温度显示。冻结期间温度仍然每1秒更新一次。若再次按下按键,则取消用户标志位,八路温度自动巡回显示。定时器T0中断服务子程序:主要是完成循环路数温度显示的节拍的设定,以及对冻结子模块中节拍单元的设定。11、在细节方面,就是个位加小数点也有两个方案:方案1:就是在显示缓冲中判断是否到了个位33H单元,如果是的话将33H单元赋给20H 单元,用位寻址并将其最高位取反,之后再送给33H单元。或者直接用指令ANL 33H,#7FH 也可以达到个位加小数

13、点。方案2:直接在查表得DB中加上一行09和小数点一起显示的字段码,然后用查表法显示个位对应的数,一样能实现个位加小数点的问题。通过比较,最后我使用了方案2,既简单又更容易实现。12、在硬件上的选择硬件上使用的是AT89S51单片机,82C55 I/O扩展芯片以及A/D转换器ADC0809,还有数码管、LED、电位器,蜂鸣器等等。总框图及总体软件设计说明: 总体软件设计说明:?主程序:主程序包括延迟一定时间等待芯片复位、设定栈底指针、数码管显示与矩阵键盘接口8255A初始化,使片选段接到单片机不同的接口上,实现不同的功能。?工作初始化:对数码管显示缓冲单元进行赋0、设定定时器的工作方式为2 ,

14、并赋给定时开始的起始数值、设定启动定时,以及允许中断的标志位,等待中断的来临。?自检:这一步的目的就是进行接口部件及数码显示器、指示灯、讯响器等的自检。通过自检我们可以得出每个数码管的各段LED不会出现串显现象,指示灯能够各自独立亮。?开关量输入以及消抖动:按键的弹跳现象是数字系统设计中存在的客观问题。按键是机械触点,当接触点断开或闭合时会产生抖动。为使每一次按键只做一次响应,就必须去除抖动。此次消抖动设计思路是将最近五次的输入量进行比较,如果输入量一致的话,就说明最近几次的输入就可以转化为有效地一次。从而达到消抖动的目的。?显示内容送显缓:就是将要现实的内容送到显示缓冲单元。送显缓的数据必须

15、是非压缩的BCD码。显示内容是:路数、温度数值、以及温度的单位。?显示更新驱动:就是将显示缓冲单元的内容通过8位数码管显示。每个大循环就要扫描更新一次。?温度滚动采集处理:采集8路INO AD数据,每次循回采集一路的数据。将采集到的数据分别放到对应的分配单元当中去。其中单元的分配方法是每一路分有4个单元,存取新的数据之前,将原来的数据采用滚存的形式移存到相应的下一个单元当中去,最后把新采集的数据存在该路对应的四个单元中的首地址中。?节拍控制及显示数据处理:每一路存取的4个数据都是在00FF之间的数据,所以需要经过相应的转化将其平均值转化成0-1000之间的T内码,然后把转化后的T内码存到对应的

16、地址当中,最后把当前路的T内码进行BCD转化,存到相应的显示缓冲单元当中。路数的转换是由节拍来控制的。节拍的大小在定时中断的子程序中进行设定,本程序设定的节拍是2秒,即每过2秒钟路数就加1。?冻结显示控制:当按一下冻结键,路数就不再改变,8位数码管显示的内容一直是某一路的温度,当再次按下冻结键时就会解除冻结。路数就会2秒钟加1。8位数码管循环显示8路的温度值。?手动切换控制:每次按下手动切换按键时路数就会自动加1,数码管显示加1后相应路的温度值。大循环:主程序中存在一个大的循环。此次设计的程序中:开关量输入及消抖动、显示内容送显缓、显示更新驱动、温度滚动采集存储、节拍控制及显示数据处理、冻结显

17、示控制、手动切换控制组成一个大的循环,在执行中断之外的时间一直运行大循环中的每一个子程序。系统资源分配说明70H 栈顶位置单元,以上单元作为堆栈。以上3个单元作为定时中断计数存储单元63H单元作为数据采集控制单元60H单元存储的数据为路数减140H-5FH存放8路AD转换数据37H 显示路数36H 数据使数码管不亮35H 温度的负号显示,正号不显示34H 温度的十位,为零时不显示33H 温度的个位,有显示小数点32H 温度的小数位31H30H31H显示温度的单位2FH 存前态数据2EH 存原新态数据2DH2CH2BH2AH29H2DH存储连续5次的数据28H.0作为冻结或者解冻的标志位10H1

18、FH 存放计算的8路温度T内码,每一路占两个字节R0R7作为数据暂存单元局部程序设计说明此次设计的程序一共有9个模块,下面对各个模块程序加以说明?定时器0服务子程序IT0P: PUSH ACC ;定时器0服务子程序。保护现场PUSH PSWINC 64H ;每200uS加1MOV A,64HCJNE A,#50,DONE ;满10mS?MOV 64H,#00H ;计数单元清0INC 65H ;满10MS加1MOV A , 65HCJNE A ,#100 ,DONEINC 66H ; 满1S加1MOV A, 66HCJNE A , #2 ,DONE ;满2秒,路数加1MOV 66H ,#00HJ

19、NB 28H.0 ,DONE ;28H.0=0则跳转,路数不变INC 60HITPPP: MOV A , 60HCJNE A ,#08H ,DONEMOV 60H ,#00HDONE: POP PSW ;恢复现场POP ACCRETI ;中断返回此定时器为每两秒钟6OH中的数据加1。在主程序中为定时器0赋的初值为48H,工作方式为方式2,所以00H-48H=184 184*TM=200US 即每200US进行中断一次(答辩时我说是调用中断,这样说法是不对的,请老师原谅)。每次中断64H的内容都会加1,当64H的内容与#50相等时,64H的内容清零,65H的内容加1;当65H的内容与#100相等

20、时,65H的内容清零,66H的内容加1;当66H的内容为2时,60H中的数据加1。所以60H中的数据加1需要200US*50*100*2=2000000US=2S时间。?自检子程序:总共分为2步:第一步是输出字位码#0FFH选中8位数码管,输出的字段码使每个数码管显示相同的一段LED,通过循环依次显示a段-h段LED,这样就可以得出同一个数码管中的8段LED不会发生串显现象。第二步是输出字段码#00H使选中的数码管全亮,输出字位码只选中8位数码管中的一位,通过循环依次显示每个数码管。?消抖子程序:XDPB: MOV 2FH,2EH ;PB口输入并消抖动子程序。原新态存为前态 MOV 2DH,2

21、CH ;前4次输入的电平值前推至2AH2DH单元MOV 2CH,2BHMOV 2BH,2AHMOV 2AH,29HMOV DPTR,#0FDFDH ;输入PB07新电平值存29H单元,MOVX A,DPTRMOV 29H, AMOV A,2DH ;比较近5次输入的电平值不一致则新态照旧,存放地址是29-2D单元CJNE A,2CH, XDRCJNE A,2BH, XDRCJNE A,2AH, XDRCJNE A,29H, XDRMOV 2EH,A ;近5次输入的电平值一致则存为新态XDR: RET首先把原新态存在2FH单元内,使原新态成为前态。由于每次按PB键,按键是机械触点,当接触点断开或闭

22、合时会产生抖动。这样当就会产生近5次的输入电平值,将这5个值进行比较,如果相等则最近5次抖动产生的电平值就作为新态存到2EH中。按键前与后比较2EH,2FH内相应的某一位存有的数值就会得到一个下降沿或上升沿。从而达到了消除抖动的效果。?数据采集子程序:128编写的程序中的63H单元的内容有两个作用,一是决定了将采集来的数据存放到哪部分单元中。前8条指令就是以40H单元为起始地址,同时参考60H单元的内容共同决定R0指向存放新采集数据的地址,不过在存放新采集的数据之前要将该路所采集的4个数据采用滚存的方法依次存到相应的下一位(SHUJUCAIJI1模块前六条指令就是实现的这种功能)。此时R0又回

23、到了存放新采集数据的首地址。二是决定了从哪一路采集AD转换结果,存放到R0指向的地址。这样63H使每一路都有相应的数据存储单元与之对应。另外63H的取值为#00H-#07H。每次存储了新采集的数据后,63H的内容加1在回到主程序前都要准备下一次的采集,SHUJUCAIJI5的几条程序就是为下一次采集做准备的。?数据处理子程序:下面4个地址是存放采集来的某一路的四个数据数据处理就是将每一路对应的4个单元内存储的数据先经过相加求和得到一个双字节的数字(SHUJUCHULI5、SHUJUCHULI1、SHUJUCHULI2程序就是实现的这种功能),其中高位放到R2中,而低位放在A中。然后高字节与低字

24、节分别乘以251(对应的程序是SHUJUCHULI3块程序),最后再除以256(SHUJUCHULI3中的一条程序MOV A ,R2是把低8位覆盖掉,就相当于整体除以256了)后得到的双字节数字(其中高位放在B中,低位放在A中)存到与路数对应的地址中去(该地址以10H单元为起始地址,每一路对应2个单元),其中B的内容放到低单元,而A的内容放到高单元中,SHUJUCHULI4块程序就是实现的这种功能,这样从AD 采集得到的数据(范围是#00H#FFH)经过转化变成了相应的T内码(范围是#0000H#03E8H).?显示内容子程序:XIANSHINEIRONG: MOV R1,#00H ;附初值M

25、OV R2,#00HMOV R3,#00HMOV R4,#00HMOV R5,#00HMOV R6,#00HMOV R0,#10HMOV A,60H ;(路数-1)数赋给AMOV B,#02HMUL ABADD A ,R0MOV R0 ,A ;R0指向该路的首地址MOV R7,A ;R7指向该路的首地址MOV A ,60HINC AMOV 37H ,A ;37单元数码管显示路数MOV 36H ,#12H ;36单元数码管不亮MOV 31H ,#13H ;31,30单元数码管显示单位MOV 30H ,#0CHMOV A ,R0 ;判断大于500还是小于500,先比较高位 CJNE A ,#01H

26、 ,XSNEIRONG1INC R0MOV A ,R0CLR CCJNE A ,#0F4H,XSNEIRONG1LJMP XIAOYU500XSNEIRONG1: JC XIAOYU500 ;C=1,则小于500LJMP DAYU500XIAOYU500: MOV 35H,#10H ;35单元数码管显示负号MOV R1 ,#01HMOV A,R7 ;首地址给AMOV R0,ACLR CINC R0 ;R0指向了该路的第二个地址MOV A ,#0F4HSUBB A ,R0 ;首先减低位MOV R2 ,A ;差值放在R2中DEC R0MOV A ,R1SUBB A ,R0 ;减高位MOV R3 ,

27、A ;结果放在R3中LCALL ZHUANHUANLJMP ENDDDAYU500: MOV 35H ,#12H ;35单元数码管不显示MOV A,R7 ;首地址给AMOV R0,AINC R0 ;R0指向该路对应的第二个地址MOV A ,R0 ;先让低位减CLR CSUBB A ,#0F4HMOV R2 ,A ;结果放在R2中DEC R0 ;回到低字节(高位)MOV A ,R0SUBB A ,#01HMOV R3 , A ;结果放在R3中LCALL ZHUANHUANENDD: MOV A ,34H ;如果34H单元的内容为0时,则34H单元对应的数码管不亮 CJNE A ,#00H,XSN

28、EIRONG2MOV 34H ,#12HXSNEIRONG2: MOV A ,33H ;使个位数字显示小数点ADD A ,#20MOV 33H,ARETZHUANHUAN: MOV A ,R2ZHUANHUAN0: SUBB A ,#100INC R4JNC ZHUANHUAN0 ;C=0,说明大于100,需继续减ADD A ,#100DEC R4MOV 34H ,R4 ;把100的个数存在34单元 CLR CZHUANHUAN1: SUBB A ,#10INC R5JNC ZHUANHUAN1 ;C=0,说明大于10,需继续减ADD A ,#10DEC R5MOV 33H ,R5 ;把10的

29、个数存在33单元 MOV 32H,A ;余数直接放到32单元MOV A ,R3 ;高位只有00或01这两种情况CJNE A ,#01H ,ZHUANHUAN2 ;如果等于01则相应位加2 5 6 MOV A ,32HADD A ,#6DA AMOV R6 ,A ;R6存有压缩的BCD码 ANL A ,#0FH ;拆字MOV 32H ,AMOV A ,R6ANL A ,#0F0HSWAP AADD A ,33H ;高4位进位 ADD A ,#5DA AMOV R6 ,A ;R6存有压缩的BCD码 ANL A ,#0FH ;拆字MOV 33H ,AMOV A ,R6ANL A ,#0F0HSWAP

30、 AADD A ,34H ;高4位进位ADD A ,#2MOV 34H ,AZHUANHUAN2: RET此程序的设计目的就是将T内码转换成对应的温度值,温度范围是从-50-+50。MOV R7,A 该条指令使R7指向该路的首地址,所以后面无论R0变还是不变,R7内都存有该路对应的首地址。500=01F4H,所以将T内码与500比较大小时,首先将高位与01H比较,如果高位相等则需要将低位与F4H比较,得出大于500还是小于500。XIANSHINEIRONG、XSNEIRONG1则共同实现T内码与500比较大小。当小于500时,35H单元数码管显示负号,并且用500减去T内码(首先用#F4减去

31、T内码的低位,结果存在R2中,然后再用#01减去T内码的高位,结果存在R3内)结果存在R3,R2中,具体程序为XIAOYU500块程序。当大于500时,35单元数码管不显示任何内容,并且用T内码减去500(首先用T内码的低位减去#F4,结果存在R2中,然后再用 T内码的高位减去#01,结果存在R3内)结果存在R3,R2中,具体程序为DAYU500块程序。ENDD块程序的作用就是:当34H单元的内容为#00H时,34H对应的数码管不亮。XSNEIRONG2块程序的作用就是使温度的个位数显示小数点。转换部分就是将R3,R2的内容除以100后商作为温度的十位,保存在34H单元中,余数再除以10后商作

32、为温度的个位保存在33H单元中,最后的余数作为温度的小数位,保存在32H 单元中。具体程序为ZHUANHUANA程序模块。首先将R2的内容进行以上操作,当R3内容为#01H时,32H,33H,34H单元分别对应加#6,#5,#2。加完后32H,33H的内容进行十进制调整,转化成压缩的BCD码,然后再经过拆字,使32H,33H,34H存有要显示相应温度的内容。?显示更新子程序:XIANSHI: MOV R0,#30H ;显示更新子程序。显示缓冲单元首地址 MOV R3,#01H ;字位码初值(从最右位起)MOV A,R3XIANSHI1: MOV DPTR,#0FEFDH ; 8255-B口(字

33、位码输出口) MOVX DPTR,A ; 输出当前字位码MOV A,R0 ; 取当前位显示数据码ADD A,#TAB-NEXTPC ; 加TAB与NEXTPC差址MOVC A,A+PC ; 查表得相应字段码NEXTPC: MOV DPTR,#0FEFCHMOVX DPTR,A ; 输出字段码LCALL DELAY1MS ; 保持显示1毫秒INC R0 ; 指向下一显示缓冲单元MOV A,R3 ; 取出字位码JB ACC.7,XIANSHI2 ; 判已显示到最左位否RL A ; 未完,字位码左移1位MOV R3,A ; 回存新字位码LJMP XIANSHI1 ; 转下一位的显示驱动XIANSHI

34、2: RETTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;09 显示字段码表 DB 88H,83H,0C6H,0A1H,86H,8EH ;A-FDB 0BFH,00H,0FFH,9CH ;-,全亮,全灭,符号0DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H,0F7H ;0.9.,_每一个大循环调用显示更新一次。30H37H显示缓冲单元的内容决定了查表后所得到的相应的字段码,把字段码送到此时的字位码选择的数码管上,使数码管显示相应的内容。这样一直循环下去,使所有的数码管都能显示相应的内容。?切换路数

35、子程序:ZHUANGHUANLUSHU: JNB 2FH.0 , ZHHLUSHUEND ;PB0输入下降沿有效JB 2EH.0 , ZHHLUSHUENDINC 60H ;路数加1MOV A , 60HCJNE A ,#08H ,ZHHLUSHUENDMOV 60H ,#00HZHHLUSHUEND: RET每次按下手动切换按键PB.0时路数就会自动加1,数码管显示加1后相应路的温度值。此程序是在消抖动子程序的基础上运行的。当按键PB.0按下时就会产生下降沿,不发生跳转,从而使路数加1。但是60H的内容为路数减1,所以60H单元的内容为00H07H。?冻结功能子程序:DONGJIELUSHU

36、: JNB 2FH.1 , DJLUSHUEND ;PB1输入下降沿有效JB 2EH.1 , DJLUSHUENDJNB 28H.0 ,DONGJIELUSHU1 ;使28H.0位取反,第一次按下冻结路数,再次按下则解冻 CLR 28H.0LJMP DJLUSHUENDDONGJIELUSHU1: SETB 28H.0DJLUSHUEND: RET当按一下冻结键PB.1,路数就不再改变,8位数码管显示的内容一直是某一路的温度,当再次按下冻结键PB.1时就会解除冻结。路数就会每2秒钟加1。8位数码管循环显示8路的温度值。其中冻结的标志位是28H.0。当冻结时,28H.0就会从开始1变为0,这样就

37、使定时中断子程序中JNB 28H.0 ,DONE 这一条指令执行时28H.0=0则跳转,从而不执行下一条改变路数的指令,所以路数不会改变,从而达到冻结的目的。当再次按下冻结键PB.1时28H.0从0变为1,这样就使定时中断子程序中JNB 28H.0 ,DONE 这一条指令执行时28H.0=1则不跳转,从而执行下一条改变路数的指令,所以路数会改变,从而达到解冻的目的。系统功能与操作说明:开机进行接口部件及数码显示器、指示灯、讯响器等自检。八位LED 7段数码管显示当前检测回路的序号、温度值及温度单位“o C”,温度显示单位为o C,保留一位小数。八路温度按节拍巡回检测显示,温度测量范围-50 o

38、 C+50 o C。当冻结了1路(或2路时),调节 INT0(或INT1)时数码管显示对应的1路(或2路)的温度值改变的情况。变化范围是-50 o C+50 o C。设置一个“冻结”按钮开关以操控进入与退出当前回路的冻结显示方式,冻结显示期间每0.5S更新一次温度值。“冻结”按钮设定为PB.1。当第一次按下时,则路数锁定,再次按下之前数码管一直显示冻结的回路号及温度值。再次按下后即“解冻”,路数每2秒加1。设置一个“切换”按钮开关以操控强行切换显示下一检测回路号及温度值。切换按键设定为PB.0。当按一下PB.0,则强行切换显示下一检测回路号及温度值。对开关量输入进行软件消抖动处理。7调试记录及

39、调试结果调试也是一个富有挑战的过程,更能体现出我们解决问题的能力。在调试过程中也遇到了许多意想不到的情况,通过请教老师,通过与同学合作,通过自己的努力最后还是把问题都一一解决了。调试过程中发现芯片初始化部分与自检模块混在了一块。当把自检模块屏蔽掉后,数码管就不会显示。在老师的指导下我及时进行改正,把芯片初始化部分从自检模块中调出来,这样把自检程序屏蔽掉后依然能够显示出其他现实的内容。同时也符合了设计的要求(将芯片初始化部分与自检模块分开,让它们各自独立)。调试时1路与2路的温度显示范围并不是-50 o C +50 o C,在23.40之间不会显示。这种问题就出在XIANSHINEIRONG程序

40、块中,小于500的T内码有一部分没有取到。这就需要在执行XIAOYU500块程序时,要确保R0从该路对应的T内码的低位开始计算。但是我发现先前编的程序很不严密,不能确保在执行XIAOYU500块程序的时候R0指向该路对应的T内码的低字节。所以经过修改,在初始化中加了一条:MOV R7,A ;R7指向该路对应的T内码首地址。在XIAOYU500块程序中加了两条指令:MOV A,R7 ;首地址给A MOV R0,A ;RO指向首地址这样就确保了执行XIAOYU500块程序时R0从该路对应的T内码的首地址开始的。经过改正,程序达到了预期的设计效果,挺令人欣慰的。路数不能够转换这个问题就是出现在定时中

41、断子程序中,路数不能够自动按照设定的每2秒路数加1,不能循环显示各路温度。我看到这种情况,脑子里真的乱糟糟的,原本对编写的程序胸有成竹,信誓旦旦,但现在出现这种情况我也是有点不知从何处下手。在老师的引导下,我成功的找到了问题的所在地方,原来让路数加1所用的时间我计算错了,不是2秒而是200秒。这是一个低级的错误,不过还是能学到很多东西。谢谢老师。8课程设计总结此次课程设计很具有挑战性,非常能够锻炼我们的各方面的能力。通过这次设计我也学到了许多,感触颇深,我就向老师说一下我的感受吧!此次设计过后我明白了通过课程设计全面系统的了解单片机的程序设计.,能够加深对单片机程序的充分理解,而且也认识到了单

42、片机程序的许多细节所在。通过此次实习设计我明白了编写程序的步骤:首先要根据设计要求以及各种功能列出程序流程图,构思出整个程序包含的每一个模块。这样我们就从部分着手一一解决每一个。小的模块,整个程序就慢慢浮现了。这一步是必须的,也是最重要的,决定了我们设计的成与败。这也是我们着重培养的方面。设计过程中我们会遇到很多的意想不到的情况,例如有的时候就是下不去手,不知道从哪儿写起,有的时候也会犯一些简单的错误。这就需要我们充分理解设计要求外,还要拥有熟练地程序设计的意识。通过这两周的实习设计我感觉在培养编程的意识上有了一定的进步。我以后会更加努力。熟悉程序调试的全过程,学会处理调试过程中出现的问题。这

43、是在检验我们编写的程序。我看到程序没有出现预期的效果的时候心里真的很挺不舒服的。不过调试过程中遇到一些意想不到的问题是在所难免的,这就需要我冷静下来,好好的思考,找到问题的源头,去解决遇到的每一个问题。在解决问题过程中如果自己始终都不能找到出问题的地方,我们可以去请教老师,请教我们周围的同学,通过他们的点播,我们就能很快找到程序出错的地方。这时就体现了我们与周围人的团结合作,共同解决遇到的任何问题。我认为实习的一个环节是答辩,这种的形式真的很好。通过答辩我能够更加清楚的认识自己在答辩方面的真正缺陷,通过答辩可以帮助我不再害怕以后的人生道路上的“答辩”,也为以后的答辩积累了宝贵的财富。在这次答辩

44、中我感觉我答辩的很不好,一是头脑不够清醒,有点语无伦次,这应该就是答辩中最容易出现的情况吧!要解决这种情况我认为我们需要更多的答辩机会,在答辩中提高自己的能力。另外我们平时要注意锻炼我们的表达能力,做到冷静思考,表达严密。答辩之前我们需要充分的做好准备,准备回答老师对自己设计的课题程序提出的任何问题,这儿就需要我们要好好整理一下思路,对我们设计的程序要从整体以及细节整理清楚。这样才会回答的游刃有余。编程思想的培养,语言很重要,但究竟只是工具,思想才是精髓。所以思想掌握了我们就会在以后的道路上以不变应万变。所以我们培养编程思想是重要的。这就需要我们好好的理解单片机的典型程序的编写思路,以及掌握程

45、序编写中的任何细节。程序的编写存在着许多细节,某一个细节出错都会影响到最后的结果。生活中亦是如此,这就需要我们做一位有心人,认真做好每一件事。9源程序清单(详细注释)ORG 0000H ;复位入口LJMP MAINORG 000BH ;定时器0服务子程序入口(进行实时钟计时)LJMP IT0PORG 0030HMAIN:MOV SP,#70H ;总初始化。设定栈底指针LCALL D1S ;稍加延时(12mS),等待各芯片均上电复位结束CLR P3.2 ;蜂鸣器响1秒MOV P1,#00H ;P1口驱L0-7灯全亮1秒LCALL D1S ;延时1SSETB P3.2 ;关蜂鸣器MOV P1,#0

46、FFH ;熄L0-7灯MOV A,#89H ;数码管显示与矩阵键盘接口8255A(U3)初始化MOV DPTR,#0FEFFH ;8255A(U3),(接在P2.0)MOVX DPTR,A ;A、B口输出驱动字段、字位,C口输入MOV A,#8BH ;LED显示、开关、按键接口8255A(U5)初始化MOV DPTR,#0FDFFH ;8255A(U5) (接在P2.1)MOVX DPTR,A ;A口输出驱L8-15,B口输入按键PB0-7,C口输入电SW0-7LCALL ZIJIAN ;调用自检子程序MOV 30H,#00H ;30H-37H为显示缓冲单元MOV 32H,#00HMOV 33

47、H,#00HMOV 34H,#00HMOV 35H,#00HMOV 36H,#00HMOV 37H,#00HSETB IT0 ;设INT0中断信号输入下降沿有效SETB EA ;CPU允许中断(总允许)MOV TMOD,#02H ;初始化T0为定时方式2,TM=121/11.0592MHZ=1.085US MOV TL0,#48H ;00H-48H=184,184TM200uSMOV TH0,#48HSETB ET0 ;开T0中断SETB TR0 ;启动T0定时工作SETB 28H.0 ;28H单元首位置1MOV 60H ,#00H ;60H单元存储路数-1MOV 63H, #00H ;数据采

48、集控制MOV 64H, #00H ;中断计数单元MOV 65H ,#00HMOV 66H ,#00HLOOP: LCALL XDPB ;调用消抖程序LCALL SHUJUCAIJI ;调用数据采集程序LCALL SHUJUCHULI ;调用数据处理程序(把采集到的数据转为T内码)LCALL XIANSHINEIRONG ;将T内码转换为要显示的温度值 LCALL XIANSHI ;调用显示更新程序LCALL ZHUANGHUANLUSHU ;调用转换路数程序LCALL DONGJIELUSHU ;调用冻结路数程序LJMP LOOP ;反复循环主流程XDPB: MOV 2FH,2EH ;PB口输

49、入并消抖动子程序。原新态存为前态MOV 2DH,2CH ;前4次输入的电平值前推至2AH2DH单元MOV 2CH,2BHMOV 2BH,2AHMOV 2AH,29HMOV DPTR,#0FDFDH ;输入PB07新电平值存29H单元,MOVX A,DPTRMOV 29H, AMOV A,2DH ;比较近5次输入的电平值不一致则新态照旧,存放地址是29-2D单元CJNE A,2CH, XDRCJNE A,2BH, XDRCJNE A,2AH, XDRCJNE A,29H, XDRMOV 2EH,A ;近5次输入的电平值一致则存为新态XDR: RETSHUJUCAIJI: MOV R0 ,#40H

50、 ;存采集数据首地址MOV R1 ,#03H ;小循环MOV B ,#04HMUL ABADD A ,R0 ;使R0指向某一路的首地址ADD A ,#03HMOV R0 ,A ;使R0指向某一路的末地址SHUJUCAIJI1: DEC R0 ;将内容按队列滚存MOV A ,R0INC R0MOV R0 ,ADEC R0DJNZ R1 ,SHUJUCAIJI1 ;跳出时R0指向首地址MOV DPTR,#0FBF8H ;连接P2.2口,选择INTO口MOV A ,63HADD A ,DPLMOV DPL ,AMOVX A ,DPTR ;读取A/D转换结果值MOV R0,A ;将读取的结果值存放到首

51、地址INC 63HMOV A ,63HCJNE A ,#08H ,SHUJUCAIJI5 ;循环存放数据MOV 63H ,#00HSHUJUCAIJI5: MOV DPTR,#0FBF8H ;准备下一次采集MOV A ,63HADD A ,DPLMOV DPL ,AMOVX DPTR,ARETSHUJUCHULI: MOV R1,#00H ;数据处理前初始赋值MOV R2,#00HMOV R3,#00HMOV R4 ,#00HMOV R5 ,#00HMOV R6 ,#00HMOV R0 ,#40HMOV R5 ,#04HMOV R1 ,#10HMOV R6 ,#08HSHUJUCHULI5:

52、MOV A ,R0 ;将该路的4个数据相加求和SHUJUCHULI1: DJNZ R5 ,SHUJUCHULI2SJMP SHUJUCHULI3SHUJUCHULI2: INC R0 ;R0指向4个数据所占地址的末地址JNC SHUJUCHULI1CLR CINC R2 ;把和的进位放到R2中,而低位在A中 LJMP SHUJUCHULI1SHUJUCHULI3: MOV B ,#251MUL AB ;让和的低位乘以251MOV R4 ,B ;乘积的高位放在R4中MOV A ,R2 ;让和的进位乘以251MOV B ,#251MUL ABADD A ,R4 ;进位乘积的低位与R4相加JNC S

53、HUJUCHULI4CLR CINC B ;B的内容是:和的进位乘以251结果的进位 SHUJUCHULI4: MOV R1 ,B ;把B A 分别存在T内码相应的地址中,低字节存高位INC R1MOV R1 ,AINC R1 ;R1指向下一地址,作为下一次存储T内码的首地址 MOV R5 ,#04HMOV R2,#00HINC R0 ;R0指向后面4个数据的首地址DJNZ R6 ,SHUJUCHULI5 ;大循环8次SHUJUCHULIEND: RETXIANSHINEIRONG: MOV R1,#00H ;附初值MOV R2,#00HMOV R3,#00HMOV R4,#00HMOV R5

54、,#00HMOV R6,#00HMOV R0,#10HMOV A,60H ;(路数-1)数赋给AMOV B,#02HMUL ABADD A ,R0MOV R0 ,A ;R0指向该路的首地址MOV R7,A ;R7指向该路的首地址MOV A ,60HINC AMOV 37H ,A ;37单元数码管显示路数MOV 36H ,#12H ;36单元数码管不亮MOV 31H ,#13H ;31,30单元数码管显示单位MOV 30H ,#0CHMOV A ,R0 ;判断大于500还是小于500,先比较高位 CJNE A ,#01H ,XSNEIRONG1INC R0MOV A ,R0CLR CCJNE A

55、 ,#0F4H,XSNEIRONG1LJMP XIAOYU500XSNEIRONG1: JC XIAOYU500 ;C=1,则小于500LJMP DAYU500XIAOYU500: MOV 35H,#10H ;35单元数码管显示负号MOV R1 ,#01HMOV A,R7 ;首地址给AMOV R0,ACLR CINC R0 ;R0指向了该路的第二个地址MOV A ,#0F4HSUBB A ,R0 ;首先减低位MOV R2 ,A ;差值放在R2中DEC R0MOV A ,R1SUBB A ,R0 ;减高位MOV R3 ,A ;结果放在R3中LCALL ZHUANHUANLJMP ENDDDAYU

56、500: MOV 35H ,#12H ;35单元数码管不显示MOV A,R7 ;首地址给AMOV R0,AINC R0 ;R0指向该路对应的第二个地址MOV A ,R0 ;先让低位减CLR CSUBB A ,#0F4HMOV R2 ,A ;结果放在R2中DEC R0 ;回到低字节(高位)MOV A ,R0SUBB A ,#01HMOV R3 , A ;结果放在R3中LCALL ZHUANHUANENDD: MOV A ,34H ;如果34H单元的内容为0时,则34H单元对应的数码管不亮CJNE A ,#00H,XSNEIRONG2MOV 34H ,#12HXSNEIRONG2: MOV A ,

57、33H ;使个位数字显示小数点ADD A ,#20MOV 33H,ARETZHUANHUAN: MOV A ,R2ZHUANHUAN0: SUBB A ,#100INC R4JNC ZHUANHUAN0 ;C=0,说明大于100,需继续减ADD A ,#100DEC R4MOV 34H ,R4 ;把100的个数存在34单元 CLR CZHUANHUAN1: SUBB A ,#10INC R5JNC ZHUANHUAN1 ;C=0,说明大于10,需继续减 ADD A ,#10DEC R5MOV 33H ,R5 ;把10的个数存在33单元 MOV 32H,A ;余数直接放到32单元MOV A ,R

58、3 ;高位只有00或01这两种情况 CJNE A ,#01H ,ZHUANHUAN2 ;如果等于01则相应位加2 5 6 MOV A ,32HADD A ,#6DA AMOV R6 ,A ;R6存有压缩的BCD码ANL A ,#0FH ;拆字MOV 32H ,AMOV A ,R6ANL A ,#0F0HSWAP AADD A ,33H ;高4位进位ADD A ,#5DA AMOV R6 ,A ;R6存有压缩的BCD码ANL A ,#0FH ;拆字MOV 33H ,AMOV A ,R6ANL A ,#0F0HSWAP AADD A ,34H ;高4位进位ADD A ,#2MOV 34H ,AZH

59、UANHUAN2: RETXIANSHI: MOV R0,#30H ;显示更新子程序。显示缓冲单元首地址 MOV R3,#01H ;字位码初值(从最右位起)MOV A,R3XIANSHI1: MOV DPTR,#0FEFDH ; 8255-B口(字位码输出口) MOVX DPTR,A ; 输出当前字位码MOV A,R0 ; 取当前位显示数据码ADD A,#TAB-NEXTPC ; 加TAB与NEXTPC差址MOVC A,A+PC ; 查表得相应字段码NEXTPC: MOV DPTR,#0FEFCHMOVX DPTR,A ; 输出字段码LCALL DELAY1MS ; 保持显示1毫秒INC R0

60、 ; 指向下一显示缓冲单元MOV A,R3 ; 取出字位码JB ACC.7,XIANSHI2 ; 判已显示到最左位否RL A ; 未完,字位码左移1位MOV R3,A ; 回存新字位码LJMP XIANSHI1 ; 转下一位的显示驱动XIANSHI2: RETTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;09 显示字段码表 DB 88H,83H,0C6H,0A1H,86H,8EH ;A-FDB 0BFH,00H,0FFH,9CH ;-,全亮,全灭,符号0 DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,1

61、0H,0F7H ;0.9.,_ZHUANGHUANLUSHU: JNB 2FH.0 , ZHHLUSHUEND ;PB0输入下降沿有效JB 2EH.0 , ZHHLUSHUENDINC 60H ;路数加1MOV A , 60HCJNE A ,#08H ,ZHHLUSHUENDMOV 60H ,#00HZHHLUSHUEND: RETDONGJIELUSHU: JNB 2FH.1 , DJLUSHUEND ;PB1输入下降沿有效JB 2EH.1 , DJLUSHUENDJNB 28H.0 ,DONGJIELUSHU1 ;使28H.0位取反,第一次按下冻结路数,再次按下则解冻CLR 28H.0LJMP DJLUSHUENDDONGJIELUSHU1: SETB 28H.0DJLUSHUEND: RETIT0P: PUSH ACC ;定时器0服务子程序。保护现场PUSH PSWINC 64H ;每200uS加1MOV A,64HCJNE A,#50,DONE ;满10mS?MOV 64H,#00H ;计数单元清0INC 65H ;满10MS加1MOV A , 65HCJNE A ,#100 ,DONEINC 66H ; 满1S加1MOV A, 66HCJNE A , #2 ,DONE ;满2秒,路数加1MOV 66H ,#00HJNB 2

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!