下载

2下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 用单片机实现温度远程显示

用单片机实现温度远程显示.doc

用单片机实现温度远程显示

紫馨轩
2018-09-07 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《用单片机实现温度远程显示doc》,可适用于工程科技领域

wwwsfmcucomwwwsfeducn盛方整理用单片机实现温度远程显示作者:刘楚浩*发表于《单片机与嵌入式系统应用》年第期摘要:文章介绍了用ATS单片机的串行接口与智能温度巡回检测仪(XJS)通过RS总线相互通讯实现热水温度远程显示的一种低成本解决方案内容涉及RS总线通讯、单片机驱动数码管显示、数据转换以及键盘处理软硬件设计等内容。关键词:单片机RS总线数码管显示数据转换键盘处理一、前言目前检测温度一般采用热电偶或热敏电阻作为传感器这种传感器至仪表之间一般都要用专用的温度补偿导线而温度补偿导线价格很贵并且线路太长也会影响测量精度。在实际应用中往往需要对较远处(KM左右)的温度信号进行监视。现有的解决方案有很多例如:、在现场用智能仪表对温度信号进行测量用计算机作上位机与智能仪表进行通讯来实现远程温度监测(采用这种方案要增加计算机设备及相关计算机软件)。、NCUDDC实现远程温度监测。用两个DDC一个安装在现场测量温度另一个安装在监视地两个DDC通过NCU进行通讯从而实现远程温度监测。但以上方案都存在成本高的问题有没有低成本的解决方案呢?其实在单片机应用日益广泛的今天完全可以用单片机以极低的成本来实现远程温度监测。二、问题的提出我单位管理的锅炉房同时给两栋建筑物内的两家酒店供应蒸汽由安装在两栋建筑物地下室的热交换器进行热交换后产生热水送给客房。从锅炉房至两个热交换站的距离分别约米值班人员要不停地奔波于两个热交换站与锅炉房之间进行设备巡视检查热水温度是否控制在规定的范围这样不仅增加了值班人员的劳动强度同时也使锅炉房经常无人(因每班人值班)。如果能在锅炉房显示两个热交换站内各热交换器的热水温度则值班人员仅在热水温度异常时才需到各热交换站检查设备这样便可解决上述问题。我公司曾就此问题找专业公司作过方案其报价在人民币10万元左右后因种种原因该项目未实施。经过分析本人发现可以用单片机智能仪表以低成本实现温度远程显示并且经过实验取得了成功现将设计方案简述如下:三、控制要求及解决方案选择、两个热交换站分高低区共安装有个热交换器正常水温在oC至oC之间两个热交换站与锅炉房的距离分别为米和米左右。、要求在锅炉房能以巡回及定点两种方式显示个热交换器的热水温度巡回方式以秒为周期轮流更新及显示各热交换器热水温度。定点方式时每按上键或下键一次则显示上或下一个热交换器热水温度每秒自动更新数据一次。、根据控制要求选择单片机智能仪表的解决方案:用带通讯接口的智能仪表安装在现场测量温度设计制作一个单片机装置完成与智能仪表的通讯及数据显示。四、通讯协议、智能仪表选择及其参数介绍因热水温度信号变化较慢因而对通信的速度要求不高对于这种低速率远距离的通讯选用RS总线适宜。RS是EIA(美国电子工业联合会)在年公布的新的平衡传输标准是工业界使用最为广泛的双向、平衡传输线标准接口它以半双工方式通信支持多点连接传统驱动器允许创建多达个节点的网络且其具有传输距离远(最大传输距离为M)传输速度快(M时为KBPS)等优点。其连接方法如下图所示。为了满足现场温度检测及与单片机装置通讯的要求必须选择至少有个温度检测点及具有RS通讯端口的智能仪表。经过对市场上常用的温度检测仪进行分析选择由重庆川仪十八厂生产的XJS型巡回检测仪作现场测量仪表。(一)该仪表主要特点如下:、多量程方式热电偶、热电阻V标准信号混合输入可通过键盘进行设置、最多个测量通道(能测量个温度信号)、采用RS通讯标准可将各通道最新数据向上位机传送。重要的是该仪表的说明书详细介绍了与该仪表进行数据交换的命令及格式其通讯协议也相对较简单这给我们用单片机实现温度远程显示降减低了难度(虽然有RS端口的仪表很多但大多没有通讯命令的详细说明给我们用单片机编程增加了难度)。(二)XJS巡回检测仪通讯协议、通讯口设置·通讯方式:RS标准电平·同步方式:起停同步方式·波特率:BPS·通讯距离:不大于M·通讯线:二线·数据代码:ASCII码·数据格式:每字符位个起始位个数据位个停止位、数据传输格式·地址:字节(高字节在前低字节在后)·数据:按地址顺序仪表数据传输格式为十六进制字节定点数字节定点数=低字节高位(ASCII码)低字节低位(ASCII码)高字节高位(ASCII码)高字节低位(ASCII码)若数据为负数则采用补码方式传输·在传输实时测量值时传输完字节定点数后紧接着又传输字节定点数其中高字节低位为小数点位数。例:()表示为低字节高字节小数位数、仪表通讯格式:DE帧类型帧数据CRCCR·:通讯起始符·DE:仪表设备号(地址)·帧类型:操作命令·帧数据:各种操作命令所对应的命令及数据·CRC:校验字节(除外CRC之前的其他几个字节的异或值)·CR:结束符(回车符)、应用中用到的命令及数据格式:·读仪表全部动态数据命令帧DERDCRCCR·命令回送帧正确DERD帧数据CRCCR错误DE**CRCCR例:读号仪表的全部动态数据命令:’CRD’,D(ASCII码d)错误返回码‘C**’,D(ASCII码AAD)正确返回数据’CRDXXXXXXXXXXXXXXXXXXXXXXXX第通道第通道第通道XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX第通道第通道第通道第通道XXXXXXXXXX’,D第通道校验五、单片机选择及硬件电路设计、选用ATMEL公司生产的ATSPC单片机其主要参数及特点如下:·与MCS产品兼容(其引脚图见原理图)·具有K字节可擦写的FLASH内部程序存储器可擦写次K字节EEPROM可擦写次SPI口(用PC机的并口连接5条线即可通过SPI口下载程序下载软件可从网上下载这样可节省购买编程器的费用)。注:笔者现已制作成了ISP三合一烧写器详情见http:wwwmcudiycom·字节RAM根可编程IO线可编程串行口内置看门狗。与看门狗有关的特殊功能寄存器WMCON地址=H与看门狗有关的控制位为h第、、、、位第、、位用于设置看门狗定时时间(具体见第页表格)本应用中第、、位均置设置看门狗溢出时间为ms第位为看门狗使能控制位该位置将使能看门狗其第位为复用位向第位写将复位看门狗定时器具体操作如下:a,使能看门狗并将其溢出时间设定为ms:ORLH,#EHb,看门狗定时器清:ORLH,#、按键设计:为方便使用设计了三个按键分别为巡回定点切换键、上键、下键。切换键用于巡检与定点模式的切换上键向上切换通道下键向下切换通道其中巡检定点切换键通过外部中断以中断方式工作中断程序将巡回定点标志取反后直接跳到主程序中巡回定点标志判断程序前运行由判断程序完成巡回定点的切换。按键信号由单片机PPP引脚输入。、显示电路设计为方便观察选用三个二位共阳级段数码显示管(TODAE)动态显示一位显示仪表地址(从A至F)一位显示通道号(从至通道)其余四位用来显示实时温度值用单片机P口驱动一片HC以吸收电流的方式控制段码用单片机P至P引脚驱动六个PNP三极管()控制位选。、电源选用VA市售成品开关电源。、根据智能仪表通讯协议的要求串行口定义为方式工作一帧位:个起始位、个数据位、一个停止位用一片完成数据的发送与接收由于RS为半双工故用单片机P引脚控制发送与接收的切换两个智能仪表处于RS总线的两个端点为提高可靠性在RS总线的两个端点上分别并联一个Ω、W终端电阻。·系统方框图如右示:·单片机装置电原理图见下页:六、单片机软件设计说明及程序流程图为方便调试采用模块化编程共分个主模块及个子模块各模块功能说明及流程图如下(源程序见附录):、主模块(randmaina)上电后程序显示初始化标志并等待秒然后进入巡回模式自动检测地址为A()至F()的智能仪表对在线的仪表及已使用通道以秒为周期自动巡回读取实时温度并送数码管显示仪表未在线或未用通道则自动跳过定点模式时根据上、下按键情况自动向前或向后移动一个通道后等待下一次按键(向上至最高通道号时跳到上一个仪表的最低在用通道向下至最低通道号时跳到下一个仪表的最高在用通道)等待期间以秒为周期读取当前仪表当前通道实时温度并送数码管显示另外为了区分巡回、定点工作模式定点工作模式时最低位数码管以约Hz的频率闪烁显示。当检测到巡回定点切换键按下时自动在巡回及定点模式间转换当检测到温度值低于-度时显示度。主模块流程图见下页:、数据转换子模块(randdataa)功能:本模块先将ASCII码转换成BIN码然后将BIN码转换成BCD码并将数据转换成可直接显示的格式入口:a=通道号出口:r=个位,r=十位,r=百位,r=千位(显示数据)a=非表示该通道未用注:本子模块中直接将小数点信息加到相应位数据上如需在某位显示小数点则将该位数据加H显示子模块根据此信息显示小数点。各子程序功能介绍:·bcdbcd:将r,r中的位bcd码由低至高分别存入r,r,r,r中·asciibcd:将(r)为首地址的4字节ascii码转换成bcd码并将bcd码由低至高依次存放在r,r,r中r,r中各存放位bcd码r中存放一位bcd码·binbcd:将r,r中的bin码转换成bcd码并将bcd码由低至高依次存放在r,r,r中r,r中各存放位bcd码r中存放一位bcd码·asciibin:将(r)为首地址的4字节ascii码转换成位bin码存放在r(低字节),r(高字节)中注:(r)指r中内容·asciibin:将(r)为地址的一位ascii码转换成bin码存A中。(高级子程序调用低级子程序以实现更强的功能源程序中对各子程序有较详细的注释故此处仅画出主流程图)、显示、软件看门狗、ms定时器子程序(randdispa)功能:通过定时器以MS为周期动态显示缓冲区中的内容同时完成ms定时器及软件看门狗计数当软件看门狗定时器溢出时自动复位。入口:以dispbuf为首地址依次存放从个位至十万位待显示数据以dispwc为首地址(位地址)依次存放个位至千位闪烁控制位信息为''常亮,为''闪烁出口:wdt中存放软件看门狗计数值timems中存放ms的计数值。Wdt溢出时跳至程序存储器H单元·将定时器设定为模式定时工作每ms产生一次中断即显示一位每ms位数据轮流显示ms为进一步提高可靠性在该模块中设计了软件看门狗实现方法见源程序。模块流程图如本页所示:4、命令发送及接收控制子模块(randsenda)功能:发送命令缓冲区中命令并等待接收完毕,然后检查接收到的数据,接收错误则重发命令,达到设定的次数仍错则存入错误码后退出入口:A=仪表地址出口:A=表示接收正确表示校验错'*'表示命令错'N'表示无回应模块流程图如下:5、串行接收子模块(randreca)功能:串行接收模块通过中断自动执行程序检测到时置rif标志并开始接收检测到回车符时清rif后退出,接收到的数据存放在以recbuf为首地址的缓冲区中。串行中断(randreca)流程图巡回定点键中断(randkeya)流程图6、巡回/定点转换检测模块(randkeya)功能:模块通过外部中断1自动执行检测到巡回/定点按键后先延时去抖动并等待按键释放后将巡回/定点标志位取反然后自动跳至主模块中start处并不返回原中断点。模块流程图如见本页:七、调测及运行情况介绍、调试步骤:·硬件连接:将各芯片插在面包板上并用导线按原理图连接·软件开发环境:KeiluVisionforWindows该软件的模拟调试器支持C语言及汇编语言源代码调试其汇编程序支持宏汇编及模块化编程使用方便。·首先在模拟调试器中调试各子模块各子模块调试正常后再将各子模块及主模块全部汇编连接成目标文件最后将目标代码下载到单片机中并连接智能仪表进行统调。、该系统软件部分除报警子模块外已全部开发完成并实际测试通过测试时用一对长度约M的mm普通电话线作为单片机装置与两个智能仪表的通讯线经过一个多星期的连续运行观察运行可靠稳定完全满足使用要求。注:报警子模块的开发及硬件制版工作正在进行中。八、结束语用单片机智能仪表构成的温度远程显示系统总造价约人民币元(两块智能仪表温度传感器约元通讯电缆约元单片机装置及施工费用约元)与采用其它方案的系统比较造价较低其硬件及软件的设计、制作都较简单有一定的电子及单片机知识便可完成。同时对该装置软件稍加修改即可与其他带有RS通讯端口的仪器仪表通讯(如变频器、电路传感器等)实现远程测量、监视及控制。与发达国家相比我国单片机应用的普及程度较低。通过该实例说明我们完全可以把我们学到的单片机知识应用到实际工作中直接创造经济效益。九、参考资料<<单片机高级语言CWindows环境编程与应用>>电子工业出版社徐爱钧彭秀华编著<<ATMEL系列Flash单片机原理与应用>>电子工业出版社余永权主编<<标准集成电路数据手册高速CMOS电路>>电子工业出版社<<ATMELATS数据手册>>ATMEL公司<<XJH(S)巡回检测仪使用说明书>>重庆川仪十八厂<<工业控制计算机组成原理>>清华大学出版社孙廷才王杰孙中健编著<<电子技术>>年期十、附录(源程序)1、主模块(randmaina)randmainanamerandmainEXTRNCODE(IT,sendorder,recsi,asciibcd,key)extrndata(DISPbuf,dispwc,timems,wdt)extrnidata(recbuf)publicTHH,TLL,START,rif,wdttime,keywork,keyfprogSEGMENTCODE定义代码段bytebuffsegmentdata定义字节数据段bytebuffIsegmentidata定义字节数据段bitbuffsegmentdatabitaddressable定义位数据段bitflagsegmentbitstacksegmentidata定义堆栈数据段rsegstack为堆栈保留个字节dsCSEGATH定义绝对代码段USING选择工作寄存器组第组lJMPrand复位时程序执行执行点CSEGATH外部中断RETICSEGATBH定时器中断lJMPITCSEGATH外部中断ljmpkeyRETICSEGATBH定时器中断RETICSEGATH串行中断ljmprecsiRSEGBYTEBUFFtdtemp:dsTDn:DS通道号YDn:ds仪表地址rsegbitflagkeywork:dbitrif:dbit串行口正在接收标志主程序RSEGprog符号定义keyfequpkeyupequpkeydownequpwdttimeequ软件看门狗定时器计数值sconcequb串行口设置为位UART,允许接收thhequfdh晶振为M,波特率为时初值tmodnequh设置定时器(T作为波特率发生器工作在模式T为模式)ienequh设置串行,定时器中断ipnequh设置串行,定时器中断为高级中断THHEQUFCHTLLEQUBH设定定时器为MS中断初值初始化代码clearwdtmacro清硬看门狗宏定义orlh,#ENDMrand:ORLH,#EH启动硬件看门狗movp,#ffhmovr,#hmova,#start:movr,aincrcjner,#,startsetbkeywork置巡回/定点标志movp,#ffhmovp,#ffhmovdispwc,#初始化闪烁控制位movip,#ipn设置串行,定时器中断为高级中断movscon,#sconcMOVTMOD,#tmodnMOVTH,#THH设定定时器初值MOVTL,#TLLmovth,#thhmovtl,#thhmovie,#ienmovpcon,#SETBtrSETBTR显示初始化提示acallchuhaoCLEARWDTstart:clreamovsp,#stacksetbeaclrrif清接收中标志clrp置为接收状态jnbkeywork,dbworksetbexmovydn,#ahmovtdn,#s:anldispwc,#fhmovwdt,#清看门狗定时器clearwdtmova,ydnlcallsendorderJNZsmovdispbuf,ydnmova,tdnlcallasciibcdjnzsmovdispbuf,tdnacallmovtodispmovwdt,#clearwdtmova,#adda,timemscjnea,timems,$movwdt,#clearwdtmova,#adda,timemscjnea,timems,$s:inctdnmova,tdncjnea,#,smovtdn,#s:incydnMOVA,YDNcjnea,#h,smovydn,#ahajmpsdbwork:setbexorldispwc,#hd:movwdt,#清看门狗定时器clearwdtjbkeyup,dmova,#adda,timemscjnea,timems,$jbkeyup,dd:movwdt,#clearwdtjnbkeyup,d等待向上键松开d:mova,tdncjnea,#,dmovtdn,#d:incydnmova,ydncjnea,#h,dmovydn,#ahajmpdd:inctdnd:mova,ydnlcallsendorderJNZdmovdispbuf,ydnmova,tdnlcallasciibcdjnzdmovdispbuf,tdnacallmovtodispmova,#秒钟定时设定adda,timemsajmpdd:jbkeydown,dmova,#adda,timemscjnea,timems,$jbkeydown,dd:movwdt,#clearwdtjnbkeydown,d等待向下键松开d:mova,tdncjnea,#,dmovtdn,#d:decydnmova,ydncjnea,#h,dmovydn,#fhajmpdd:dectdnd:mova,ydnlcallsendorderJNZdmovdispbuf,ydnmova,tdnlcallasciibcdjnzdmovdispbuf,tdnacallmovtodispmova,#秒钟定时设定adda,timemsajmpdd:cjnea,timems,dmova,ydnlcallsendorderjnzdmova,tdnlcallasciibcdjnzdacallmovtodispmova,#adda,timemsd:ajmpdmovtodisp:movdispbuf,rmovdispbuf,rmovdispbuf,rmovdispbuf,rretchuhao:movr,#eh初始化等待提示movr,#hmovr,#hmovr,#fhmovdispbuf,#hmovdispbuf,#hacallmovtodispmova,#adda,timemscjnea,timems,$movwdt,#clearwdtmova,#adda,timemscjnea,timems,$retend2、数据转换子模块(randdataa)randdataanameranddataextrnidata(recbuf)publicasciibcdprogSEGMENTCODE定义代码段bytebuffsegmentdata定义字节数据段bytebuffIsegmentidata定义字节数据段bitbuffsegmentdatabitaddressable定义位寻址区字节数据段rsegprogusingASCIIBCD:movb,#计算该通道数据偏移首地址mulabadda,#movr,#recbufadda,rmovb,amovr,aacallasciibcdmova,b还原小数位数adda,#movr,aacallasciibinmovr,a小数位数暂存在R中mova,rjzascoKmova,dplcplaclrcincamovdpl,amova,dphcplaaddca,#movdph,ajnzascbasc:mova,dpldecajnzascbmovr,#fhmovr,#fhmovr,#fhmovr,#fhmova,#fhajmpascoutascb:movr,dpl为负数处理movr,dphacallbinbcdmova,b还原小数位数adda,#movr,aacallasciibinmovr,a小数位数暂存racallbcdbcdmova,rdecajnzasc数据小于时显示movr,#hajmpascswasc:movr,#hmovr,#movr,#hmovr,#ajmpascswascok:acallbcdbcd正常数据处理程序ascsw:mova,r清除有效位前面的jnzascswmovr,#chmova,rjnzascswmovr,#chascsw:clraascout:ret每字节两位BCD码转换为每字节一位BCD码子程序入口:r=个位及十位BCD码,r=百位及千位BCD码,r=小数位数出口:r=个位BCD码,r=十位BCD码,r=百位BCD码,r=千位BCD码bcdbcd:mova,r个位及十位BCD数处理anla,#fhmovr,amova,ranla,#fhswapamovr,amova,r百位及千位BCD数处理anla,#fhmovr,amova,ranla,#fhswapamovr,amova,r加入小数点信息jzbcdoutadda,#armovr,amova,radda,#hmovr,abcdout:retASCiiBCD转换子程序入口:r=四字节ASCII码首地址出口:r,r,r从高至低依次存放BCD码(r,r各存位r存位)asciibcd:acallasciibinmovdpl,rmovdph,racallbinbcdretBINBCD转换子程序入口:r=BIN低字节,r=BIN高字节共字节出口:r=低位BCD码r=高位BCD码,r=可能的最高位BCD码binbcd:PUSHACCPUSHPSWmovr,#BCD单元清movr,#movr,#movr,#设置二进制数位数clrcbin:mova,rrlcamovr,amova,rrlcamovr,amovr,#armovr,#设置BCD字节数bin:mova,raddca,rdaamovr,aincrdjnzr,bindjnzr,binPOPPSWPOPACCretASCIIBIN转换子程序入口:R=ASCII码首地址(共四字节ASCII码)出口:r=BIN码低字节R=BIN码高字节asciibin:PUSHACCacallasciibinanla,#fhswapamovr,aincracallasciibinanla,#fhorlar,aincracallasciibinanla,#fhswapamovr,aincracallasciibinanla,#fhorlar,aPOPACCretASCIIBIN转换子程序入口:R=ASCII地址出口:A=BIN码asciibin:mova,rclrcsubba,#ahjncasciiadda,#ascii:adda,#retend3、显示、软件看门狗及ms定时器子模块(randdispa)randdispanameranddispextrnnumber(THH,TLL,wdttime)PUBLICIT,dispbuf,dispwc,timems,wdtprogSEGMENTCODE定义代码段BYTEBUFFsegmentdata定义字节数据段bytebuffIsegmentidata定义字节数据段bitbuffsegmentdatabitaddressable定义位数据段RSEGBYTEBUFFwdt:dstimesc:dstimems:dsDISPC:ds显示位dispbufdatadispc个位缓冲区此个位并非真正的个位指最右一位以下类推dispdatadispc十个位缓冲区dispdatadispc百位缓冲区dispdatadispc千位缓冲区dispdatadispc通道位缓冲区dispdatadispc地址位缓冲区dispdatadispc无dispdatadispc无dispsdatadispc闪烁计数器rsegbitbuffdispwc:dsdispcbitdispwc个位闪烁标志位闪烁dispcbitdispwc十位闪烁标志位dispcbitdispwc百位闪烁标志位dispcbitdispwc千位闪烁标志位dispscbitdispwc闪烁控制位闪烁RSEGPROGusingdsbequpcrnotequpcpequpIT:pushaccpusharpushdphpushdplpushpswmovth,#thhmovtl,#tllmovdptr,#tabdjnzdisps,dcpldispscd:INCDISPCMOVR,DISPCCJNER,#,DISPr=显示个位movc,dispcmovA,dispbufmovp,#FFHmovp,#fehajmpdDISP:CJNER,#,DISP显示十位setbpmovc,dispcmovA,dispmovp,#FFHmovp,#fdhajmpdDISP:CJNER,#,DISP显示百位movc,dispcmovA,dispmovp,#FFHmovp,#fbhajmpdDISP:CJNER,#,DISP显示千位movc,dispcmovA,dispmovp,#FFHmovp,#fhajmpdDISP:CJNER,#,DISP显示通道号movA,dispmovp,#FFHmovp,#efhajmpdDISP:CJNER,#,DISP显示仪表地址movA,dispmovp,#FFHmovp,#dfhajmpdDISP:CJNER,#,DISP无movA,dispmovp,#FFHmovp,#bfhajmpdDISP:CJNER,#,d无movA,dispmovp,#FFHmovp,#fhd:acalldispwmovr,dispccjner,#,d若dispc=则清dispcmovdispc,#inctimescMS,S计数处理程序mova,timesccjnea,#,dmovtimesc,#inctimemsincwdt软看门狗处理程序mova,wdtcjnea,#wdttime,dmovwdt,#mova,#pushaccpushaccretid:poppswpopdplpopdphpoparpopaccRETIdispw:jncdjnbdispsc,dmovp,#FFHajmpdd:movca,adptrcplamovp,aD:retTAB:DBFH,H,BH,FH,H,DH,DH,H,FH,FHdbH,CH,H,EH,H,HABCDEFDBBFH,H,DBH,CFH,EH,EDH,FDH,H,FFH,EFHdbH,H,H,h,ch,ch,h,h,dch,h空nouchaabcdefEND4、命令发送及接收控制子模块(randsenda)randsendanamesendorderextrnidata(recbuf)recbuff接收缓冲区extrndata(timems)extrnbit(rif)rif正在接收标志PUBLICsendorderprogSEGMENTCODE定义代码段bytebuffsegmentdata定义字节数据段bytebuffIsegmentidata定义字节数据段bitbuffsegmentdatabitaddressable定义位数据段rsegbytebuffsendn:dsorderbuf:dsrsegprogddcequ等待回应m数cwnequ设置允许错误次数using清命令缓冲区sendorder:movdpl,#movr,#orderbufsend:movr,#incrdjnzdpl,sendMOVDPL,#清接收缓冲区MOVR,#RECBUFSENDA:MOVR,#INCRDJNZDPL,SENDA发送命令控制程序movsendn,#cwn设置允许错误次数movb,#clrcsubba,bmovb,#mulabmovdptr,#aordermovr,#orderbufmovr,#startmov:incrpushaccmovca,adptrmovr,aincdptrpopacccjner,#dh,startmov发送命令子程序sendstart:setbp切换至发送状态movr,#orderbufsend:incrmovsbuf,rjnbti,$等待一帧数据发完CLRTIcjner,#dh,send检测到结束标志退出检测接收标志movr,#延时uS等待停止位发送完毕djnzr,$setbesclrp切换至接收状态mova,#ddc延时检测仪表有无回应adda,timemssend:jbrif,sendcjnea,timems,sendmova,#'N'ajmpsend检测接收是否正确send:mova,#延时MS等待接收结束adda,timemssend:jnbrif,sendcjnea,timems,sendclrrifMS仍未结束清接收中标志send:movr,#recbufcjner,#'*',sendmova,#'*'send:djnzsendn,sendstart达到允许错误次数退出ajmpsendoutsend:movr,#recbufcjner,#dh,send接收缓冲区第字节不为回车符转出错处理还原校验码movr,#recbufmova,rclrcsubba,#ahjncSENDadda,#send:adda,#movr,adecrmova,rclrcsubba,#ahjncSENDadda,#send:ADDA,#swapaincrxchda,rdecrxcha,rincrmovr,#dh检验码后加回车符检验接收缓冲区数据movr,#recbufmova,rincrsend:xrla,rincrcjner,#dh,sendcjnea,#,send接收校验未通过转出错处理sendout:clresretsend:mova,#ajmpsendaorder:db'ARD',DH读A表全部动态数据命令border:db'BRD',DH读B表全部动态数据命令corder:db'CRD',DH读c表全部动态数据命令dorder:db'DRD',DH读d表全部动态数据命令eorder:db'ERD',DH读e表全部动态数据命令forder:db'FRD',DH读f表全部动态数据命令END5、串行接收子模块(randreca)randrecanamerecsiextrnbit(rif)publicrecsi,recbufprogSEGMENTCODE定义代码段bytebuffsegmentdata定义字节数据段bytebuffIsegmentidata定义字节数据段bitbuffsegmentdatabitaddressable定义位数据段rsegbytebuffrecbufz:ds接收区指针recerr:ds接收缓冲区溢出计数器rsegbytebuffirecbuf:dsrsegprogusingrecsi:PUSHPSWpusharpushaccJNBRI,RECOUT为发送中断跳出clrrijbrif,recmova,sbufcjnea,#'',recout无效命令过滤处理setbrif置接收中标志movrecbufz,#recbuf接收缓冲区首地址给接收指针movrecerr,#设置最大接收字节数ajmprecrec:mova,sbufcjnea,#dh,recclrrifrec:movr,recbufzmovr,aincrecbufzdjnzrecerr,recout接收溢出清接收标志clrrifrecout:popaccpoparPOPPSWretiend6、巡回定点转换检测子模块(randkeya)randkeyanamekeyEXTRNCODE(START)extrnbit(keywork,keyf)EXTRNDATA(DISPbuf,dispwc,timems,wdt)PUBLICKEYprogSEGMENTCODE定义代码段RSEGPROGKEY:mova,#adda,timemscjnea,timems,$key:movwdt,#orlh,#ehjnbkeyf,keymova,#adda,timemscjnea,timems,$jnbkeyf,keyclreaclrexcplkeyworkkeyout:movdptr,#startpushdplpushdphretiend、randjshex:DFAA:DFAFACF:FADACEFABD:DEBDFDBFDC:BDFEDFEDACCBFF:BFFAEAFB:BFFACBAADCBF:CBDFECAED:AFECACF:BDCDEBDFB:CBCACD:DDD:EDD:AFDD:CECCCCDCFCAB:CDDBABCA:EFFFECBEDFB:AEFFFDCBCAF:EFFFBCBCA:EFFFCBAE:FFEFCBAEFF:DFCBAEFFBFB:CBEFFFBEABF:BAEEEBE:AFDEDBADCEFF:BCEDDDDDDEE:CFFCCFFFB:DFDDFFCEBFDBF:ECFEEDFDFFEFCCDCE:FC:FFBFFDDEBFD:FBFFDBEDCAFCAABDB:CC:E:CA:BEF:FC:BB:E:EFFFBFBD:BFFAFFB:CFCABDFDBFDBE:ADEDCCAFB:DAFCCBDAADB:ACFDEDB:DECDFCB:DBFBFFDDE:DBFBFFDCEBE:ACBCCDEDBBDC:BADDAADBC:CFBFFDBBDAB:DBFECBFCDED:EBDAFCEDF:FEBDECDDCE:FCBFBFFDF:BADBFECBC:FCDEDBDFB:CEDEBDEC:DDCFCBFF:EDDECDB:FCABCD:EABCF:BFBFFDDBF:FBFFDD:ECDCCECFE:AEBBDEFCEB:BEDCAEFEDFCDEA:CEDDD:DFAFFFAEF:EFAFEEDEFCF:FEFFECFF:AFBFCFFCAAABF:EFFAFEDECCC:CBABDECF:CCEBBCEEBFFEBA:FCFAECFFBECFCFCEE:FEFA:CECDBCDECEFF:EAFAFEDFDFFDEEDD:DDDECEAFCFABD:FAFCFAAFAD:ADEECAF:fΩXJS巡回检测仪BABGndΩXJS巡回检测仪AABGndΩ热水温度远程显示器上ABGnd实时温度通道号仪表地址下巡回定点实时温度通道号仪表地址上键处理流程与下键相似此处从略。送显示、置S定时初值NYYNN调用数据转换程序正确吗?正确吗?调用命令发送程序Tdn=>tdnYYNNfh=>ydYdn=Ydn=>yd=>tdnYNNY送显示正确吗?正确吗?调用数据转换程序调用命令发送程序YYYNNN上键?下键?秒定时到?清软硬看门狗开外部中断并置最低位闪烁Tdn=startah=>ydnYdn=hYdn=>ydnYN=>TdnNYTdn=Tdn=>tdn送显示并延时秒NY正常吗调用数据转换程序接收正确吗定时值msmsmsmsmsmsmsmsΩD-发送器R-接收器T-接收/发送器DTRRDT返回校验错信息清闪烁、调用命令发送模块#ah=>ydn,#=>tdn巡回定点标志=置SP上电初始化开始NYYDN=仪表地址TDN=通道号负数处理当数据小于时显示返回数据正确信息有效位前的零消除处理转换成可显示数据存RR退出NNYY返回该通道未用信息该通道数据为Xffff吗?还原小数位数存R调用数据转换程序计算通道数据首地址BCD码超过位吗?开始T中断返回恢复现场闪闪烁跳至H�a闪闪烁NY软看门狗计数溢出=>dispcms计数处理YNDispc=YR=NYR=NYR=NYR=NYR=NYR=NYR=N输出处理�a闪闪烁千万位数据=>A(未用)�a闪闪烁百万位数据=>A(未用)�a闪闪烁十万位数据=>A�a闪闪烁万位数据=>A�a闪闪烁千位数据及闪烁信息=>A,C�a闪闪烁百位数据及闪烁信息=>A,C�a闪闪烁十位数据及闪烁信息=>A,C�a闪闪烁YR=N个位数据及闪烁信息=>A,C�a闪闪烁NYDisps=>disps,Disps=Dispc=>dispcDispc=>RDispsc取反Disps:闪烁控制计数器Dispsc:闪烁控制标志Dispc:显示控制计数器显示码表地址=>dptr保护现场T中断入口退出返回正确信息校验接收缓冲区中数据返回错误信息清正在接收标志NY缓冲区结束标志符正确?NY允许错误次数允许错误次数=?返回命令错信息NY接收到命令错信息?NY在ms内检测到接收结束标志?NY在ms内检测到正在接收标志?发送命令NY校验通过?计算仪表命令偏移地址取出命令及送入命令缓冲区设置允许错误次数清除命令及接收缓冲区开始清RI恢复现场保护现场=>RIFNY接收缓冲区溢出?=>RIFNNNYYY接收到dh数据存入接收缓冲区=>RIF接收到RIF=N中断返回断返RIF:正在接收标志RECBUFZ:接收指针Y接收缓冲区首地址=>recbufz接收中断?串行中断入口断跳至主程序start处断巡回定点标志取反关中断清看门狗定时器延时ms去抖延时ms去抖YN按键释放?外部中断入口断下巡回定点Y看门狗溢出时间表PAGE

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/28

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利