单片机通信电源监控器

  摘 要 本文主要阐述MCS51单片机软件和硬件设计的基本思路,根据经验,谈一些经常遇到的问题和对策。   关键词 单片机;软件设计;硬件设计;时间片;串口通信   中图分类号TP368.1 文献标识码A 文章编号 1674-6708(2013)96-0201-04   0引言   单片机在智能仪表,控制设备,机电一体化和自动化控制系统中的应用愈来愈广,很多仪表设备在升级换代的改造中都将单片机作为首选方案。单片机的优越性能使电路设计更加简单,但软件设计的任务相应的比较繁重。   系统设备中51单片机是在目前比较流行的单片机系统。是性能价格比较高的一种单片机系统。其软硬件设计,都比较成熟,是一种容易掌握的单片机系统。在实际开发中比较容易实现要求的控制功能和控制成本。本人在实际设计中摸索了一些经验和方法,对于系统软件和硬件设计有帮助。   对于大多数单片机的编程设计者,最初的经验多来自阅读其他程序员的软件,在此基础上进行自己的程序设计。   笔者设计的通信电源监控器,使用51单片机,采用MAX191进行模数转换,采用RS232方式通信,采用EDM12816液晶显示器进行信息显示,八位键盘。   该控制器的功能为检测电源系统的输出电压,当电压超过或低于设定值,报警,蜂鸣器鸣叫;输出将被使用继电器切断;通过串口送出按协议编码的报警信息,根据接收到的数据调整参数,控制动作。报警电压的上限和下限可以设定和修改。   1硬件系统设计   系统硬件设计采用了51系统的一般模式。   采用89C55内置20K程序存储空间,省去EPROM,同时大大加强系统程序的保密性。   采用窄DIP 封装62256,32K RAM作为系统的数据存储单元,供液晶显示的数据拼装,以及系统相关数据的存储资源。   采用MAX191完成模拟量数字量转换,数据为12位,使用CD4051作为模拟量通道,由译码电路完成通道的切换。   采用EDM12816,16*16点阵8个汉字作为液晶显示器,进行人机交流界面。LED背光源,背光亮度可以调节。   采用MAX813作为看门狗、复位控制电路,电压监视电路,集成度高。   采用DS1302作为时间计时器,为系统提供日期,时间以及31字节数据保存单元,需要使用3.6V电池的数据保存单元。   采用MAX232作为RS232通信的电平转换芯片。MAX232是RS232C收发器,这种收发器由于它的内部有电荷泵电压变换器,可将+5 V电源变换成RS-232所需的±10V电压,因而只需用单一的+5V电源就可实现电压的转换,符合RS-232的技术规范。   采用8255作为输出通道和键盘通道控制器。   2 软件设计   程序设计的步骤和基本方法。软件设计可以采用C51和PLM、汇编,本系统的软件设计采用汇编语言,主要基于时序控制实现简单,可以借鉴的相关资料丰富。   基于控制的考虑,系统采用时间片和循环相结合的方法进行程序控制。   根据时间片序号的不同置位时间片标志,通过时间片标志控制各个程序按照需要执行。这是一种类似高级语言的编程方式,比较有利于对程序的控制。系统可以根据任务的紧急程度,将紧急程度度最高的任务设置为每次循环都执行的工作方式,而将紧急程度低的任务设置为按相应时间片执行的方式。紧急程度的区分,由程序根据相应的位标志进行。在进行编程时,应当对每个由时间片标志控制的程序运行时间进行计算,确定占用的时间片具体数目,进行恰当的安排调度。   程序设计的主要部分:   1)系统初始化部分,包括资源的分配,单元的预定义。定义详细和完整可以对程序的设计起到事半功倍的效果;   2 )主程序循环基于时间片的跳转。充分使用51单片机丰富的位资源,为与每个时间片相对应的程序确定时间片运行标志位,控制程序运行;   3 )中断程序的处理,包括定时器0和串口中断。串口中断的优先级高于定时器中断。对定时器中断,和串口中断程序处理进行说明;   4 )键盘扫描程序,模数转换程序,时间芯片读写程序,端口处理程序,说明键盘扫描,延时处理;模数转换,以及计算处理,DS1302的读写,8255的读写;   5) 相应的数据处理程序,多字节乘法,多字节加减法。多字节加一,多字节减一程序。可以在参考资料上获取,仅需要修改入口和出口参数。在系统中直接调用。   下面分别详细介绍上述程序。   2.1系统初始化部分   首先要把系统使用的外部端口资源确定和分配好。   安排中断向量的跳转,预定义各个寄存器,内存单元,外部存储单元,相应的外部端口具体数值都应确切的设置。为了系统的稳定,系统使用的单元应当赋初始值。使用EQU,ORG,END,BIT,DB,SET等。可以把通用寄存器组的另外三组定义为连续的别名供使用,不用修改PSW中的RS0,RS1。一般仅在中断程序和程序调用中使用,这样可以不用入栈保护的相应的寄存器区,方便使用,节约了堆栈。   方便用户使用和方便记忆,可以采用拼音或英文缩写的方式进行定义。进行复杂的程序设计,作好预定义和赋初值处理会大大降低编程的难度。同时采用浮动方式进行预定义,方便后期修改.编制时应当加入文字说明以利使用和调试阅读。   初始化部分对内存进行刷新,对外部设备如8255进行初始化,在液晶显示屏上显示厂家标志,程序版本号。这里因为使用外部数据存储芯片,设定专门程序对外部数据存储芯片62256进行检测,同时对8255端口赋初值。对系统程序计算和保存数据需要用到的单元,初始化,保证系统数据的可靠性。   在进行初始化时有液晶显示,提示正在进行初始化。对于外部端口的处理应当置于安全的状态。包括继电器的吸合和开关量的设置应不会对人员和设备造成危害。   2.2 对于主程序循环的考虑   主程序循环的方法,通常采用下面的方法:   1)定时器0中断中,修改控制程序执行的时间片位标志。   根据当前Timeover的数值,判断哪些时间片标志应当被置位,进行置位。在退出中断后,在主程序循环中,根据标志位控制相应的程序的执行。如果控制程序执行的位单元置位,程序相应的执行,执行完毕清除控制程序执行的位标志。在全部标志位扫描完毕,转回循环开始,进行下一次循环。   2)采用纯循环方式   无限制的循环。执行完全部的指令,重新回到循环开始,这样反复循环。   3)事件激活方式   循环等待,检测到由外部状态的变化,相应执行某些操作,进行相应的处理。即在程序中循环检测相关标志位的变化。   本文所设计的程序采用时间片的方法,使用上述三种方法的结合。   电源监控器主程序循环具体如下。   2.2.1键盘处理   判断Keytime标志位,如果被置位,在主程序中,执行键扫描,确定有无键按下。如果有键按下,保存键值,修改相应的标志位。进行多次判断,确定有效,修改标志位执行按键执行程序。在确认键值后,转入相应的表处理程序决定执行哪个模块。若无键按下,顺序执行主循环的下一项程序。   2.2.2液晶显示处理   判断Displaytime标志位,如果被置位,在主程序中,显示状态刷新,执行内存中的数据拼装,确定菜单状态,当前显示第几层菜单(需要一字节),光标位置(需要一字节)。某些实时程序,产生的数据,应放在指定单元,直接取用进行内存的更新。   2.2.3模数转换   判断Adtime标志位,如果被置位,在主程序中,开始进行模数转换,调用多字节乘法,转换为要求的数值形式。同某些预设值进行比较,判断是否处于告警状态。   2.2.4时间扫描   判断Gettime标志位,如果被置位,读取DS1302中的时间数据,刷新在内存中的时间单元数据。供显示和数据记录使用。   2.2.5外部端口的扫描   判断8255time标志位,如果被置位,查询8255的B,C口数据,判断外部端口是否发生变化,并做出相应的处理。   2.2.6串口接收到的数据处理   判断Seriestime标志位,如果被置位,当串口接收到完整的一帧数据,修改接收串口接收完成标志,启动接收数据处理程序,修改数据。   2.2.7对于一些重要的,需要每周期都执行的实时程序可以在主程序中集中调用进行处理   2.3系统的中断设定   系统使用两个中断源   第一,定时器0中断,最重要的,用以确定时间片,控制程序运行。   第二,串口中断(串口,使用定时器1作为波特率发生器。)   2.3.1定时器中断功能   定时器0设定每个时间片为5ms,共20(保存在Timeover单元中)个时间片100ms,为一次大循环。每次定时器0中断,Timeover计数值减一,当此值为零时,程序重新赋初值。   根据计数器值,修改相应得标志,是主程序循环执行各个程序段。   1)断Timeover为1,进行键盘扫描.置位Keytime标志位。   2)判断Timeover为4,8,12,16,20,进行模数转换,置位Adtime标志位。由主程序循环进行程序调用。可以根据需要为安排某个程序多次执行。如在一个大循环中,安排模数转换4次以上执行,保证每100ms,有一次或多次有效的模数转换。   3)判断Timeover为6,进行显示刷新,置位Displaytime的位标志。   4)判断Timeover为2,读取DS1302时间,则置为位Gettime的标志位。   5)判断Timeover为3,进行端口数据的读取,8255端口的检测,则置为位8255time的标志位。   2.3.2 串口中断功能   串口通信是单片机系统的重要资源,不仅提高系统的功能,而且方便系统调试。为了保证接收数据的完整和实时,串口通信的接收采用中断方式。并且在内部存储器中开辟缓冲区保留数据。同时为了保障通信的实时、有效和完整,使用超时检测的功能和校验功能。   串口中断处理程序,将接收到的数据放到通讯缓冲区中,设有接收指针,确定已接收位,应接收的长度。在程序中,可以判断通信是否完成,未完成应当继续接收。如完成接收应当转入相应的处理程序。根据通信协议,当判断通信完成接收到全部字节。可以置位标志位,转入相应的校验处理。   通过校验后,修改相应的串口接收成功Serrecok位标志,由主程序循环中的相应程序调用进行处理。如果校验未通过,放弃本次接收的数据,转入相应的超时处理程序,释放占用的资源。也可以进行CRC 校验,用另外一个程序调用来完成循环冗余码校验,本文使用累加和校验方式。为尽量减少串口通信对程序运行的影响,不在中断程序中进行接收数据的相关处理。   在串口中断程序中,在指定区域设置接收缓冲区,使用mov @R0,a方式保存数据。Sertimov为接收超时标志。Checksum为校验和字节,即所接收到的数据的累加和,限定到一字节内。   程序说明:   串口通信(接收使用中断)(中断源设定中串口中断优先)。   判断Sersynok串口同步标志是否被置位,如果置位是正在接收状态。如是,继续判断是否收完。未接收完,接收数据保存在内存单元中,退出中断。   检测接收超Sertimov标志时,未超时退出,否则,恢复全部初始状态,送出错信息。   本系统中,通信需要考虑的寄存器和内存单元问题   1)使用一部分芯片内内存单元作为缓冲区,应有确定的首址,因为系统协议最长为8字节,应当有8字节长度的数据缓冲区,设置在内存38H-3FH单元;   2)设置正在进行通信的标志位,为Sersynok,只有完成接收同步头后才置位;   3)设置已经接收的串口通信数据字节数,保存在R0中;   4)超时计数单元Sercount,应当可以维持1s时间的计数,超过1s可以视为通信超时,有一字节。通信超时时间一般应当是最大接收数据所用时间的2~3倍或更长。本系统中,使用的波特率较低,协议长度为8字节,加上同步头和校验字节,一共10字节,超时计数器,应当可以维持1s时间的计数,超过1s可以视为通信超时。因为系统定时器中断时间设计为5MS,故超时Sercount字节设为200,即1s,也就是Sercount字节和Sertimov标志位(超时标志位)。   串口程序编制的一些考虑:   串口接收程序设计采用接收1个A作为有效同步的开始,建立正在接收标志,其后面是命令和数据,接收一字节,存储在自38H单元开始的8字节数据存储区内。   在全部接收完毕,对于数据进行累加和校验。只有通过累加和校验,才能置位Serrecok成功接收标志。在主程序执行中,执行串口接受数据处理程序,根据相应的散转程序进行解释和修改内存单元的字节和位单元,调用处理程序,完成串口数据处理。   在退出串口中断处理程序之前不要开放串口中断,以避免再次中断。应在出栈所有寄存器之后再开放串口中断,执行中断返回,有深刻的教训。   在定时器中断中,程序根据Sersynok标志判断是否在接收数据状态中,不是,略过。如果处在接收数据状态,则对Sercount超时计数器进行减一操作。当计数值为0时,转入超时处理。正常通信结束后,清除Sersynok正在接收标志,使在定时器中断0中不再进行通信超时计数值的处理。   入栈保护应当配对使用POP和PUSH,否则一定出错。同时没有必要保护的寄存器区不必保护,以免占用过多的存储空间。主程序中应当保留足够的堆栈空间,此外要限制调用的深度,不要超过三层。以避免发生不可预见的堆栈溢出。   2.4键盘扫描程序,模数转换程序,时间芯片读写程序,端口处理程序,显示程序   2.4.1 键盘扫描程序   键盘处理比较简单,一般是进行扫描,获取键值,延时,滤除干扰,等待释放,确认按键有效,最后转入键处理程序。   系统软件设计中,键盘接收处理程序,进行三种判断,检测有键按下,按键释放,按键按下有效次数。   程序中要求对按键进行20次循环以上的有效计数,对应大约10ms,才确认为有效键,不使用简单的延时等待。在检测到有按键按下时,键扫描程序执行完本次循环,不清除时间片标志,直到此次按键被判为有效或放弃之后才清键扫描时间片标志。也就是当系统检测到有键按下时,键扫描程序不再按时间片运行,而按20次主程序循环来进行。当按键有效按下达到20次修改标志,表明KEY_OK,按键被有效检出。此后,只要检出KEY_OFF键释放标志有效,即可转入键盘处理程序。键有效按下,程序进行异或比较,确定按下的键是同一个键,避免干扰。   设有NEW_KEY,OLD_KEY两个单元保存最近的两次按键键值。读取8255的A 端口,根据读取到的数值判断是否有按键按下。如果有键下,读取键值,保存在Newkeys单元中,将原来的键值保存在Oldkeys单元中。在以后的扫描程序中,判断按键是否达到了要求的按键按下次数。如果按键按下达到要求的保持时间,仅判断按键是否释放,检测到键盘释放,修改成功检测到按键标志。对于未达到规定的按键时间的按键放弃处理。   如果有效按键释放,修改标志,使主程序运行键处理程序。系统程序在主程序循环中根据当前处于哪种处理界面中,在键处理程序中可以修改相应的参数,调用相应的处理程序进行处理,修改相应的显示内容,进行按键处理。   2.4.2模数转换模数转换程序程序,A/D转换算法   模数转换的关键是滤除干扰和数值转换。   MAX191数摸转换芯片,是十二位数模转换。该芯片可以使用单电源方式和双电源方式。基准为4096mv。封装为窄24DIP。启动数模转换芯片,等待芯片的忙闲标志。在忙闲标志为低时,读取转换数值。高四位,低八位,可以放在内存单元中读取的转换值用二进制表示,进行计算,即使用多字节乘法,乘相应的系数。结果保存在内存单元,计算完毕转换为BCD码,确定小数点位。   模数转换程序应当使用数字滤波技术,去除干扰数据。本文采用四次取样,滤除最大值,最小值的,另外两个数据平均的方法作为一次有效数据的处理方法。为保证显示数据的不跳动本软件采用16次数据滑动方式,每次取样的有效数据冲消掉16次取样数据中最早的一个. 然后使用平均数据的方式,取得的数据为有效值。也可以根据具体情况使用冒泡法或其他方法。   数值转换采用的方法采用多字节二进制乘法,将获得的取样值乘相对应的系数,获得实际值。一般还要经过BCD码转换。变成可以供进行比较和转换的数值形式。   系统设置电压上下限比较功能,具有上下限输入值BCD码的加减法运算功能,主要进行加、减的运算,进行BCD码比较,判断电压过压或欠压,转为告警状态。   系统有相应的上下限数据设定程序,该值初始设定为某一固定值,每次按键,相应的数据加一或减一。同时该数据被保存在DS1302的存储空间中,在每次初始化后由DS1302读取后送入外部数据存储器中保存,供程序调用。   软件系统设有告警Alarmword字节,其中的每一位都代表一种告警错误。在主程序循环中,有专门程序对该字节进行位判断,驱动告警,相应的从串口送出错误告警码。模数转换修改其中的过、欠压标志。   对于使用数模转换的数据处理应当采用数据平滑,即对数具进行过滤数据超限。也不应进行过多的平均,以免电压变化过于慢,系统不能立即反应电压的变化。   2.4.3时间芯片读写程序   对于DS1302的读写,使用串行方式进行,比较并行端口的读写相对较耗时。并且需要对数据进行相应的格式变换。处理相对复杂。   2.4.4端口处理程序   8255的端口,采用扫描方式,按位进行逻辑处理,根据每个端口的状态进行相应的处理。   8255需要一定时间复位,半秒左右,再初始化。如果未能正确初始化,端口高阻状态,用发光二极管指示,不亮,低电平会被抬高。在8255运行时不要多次对命令寄存器单元设置,有时会出现混乱。8155应当也是这样的。许多外部设备都是这样的。应当注意。   在系统初始化时应当加入适当的延时,确保8255有效复位。   2.4.5显示程序   液晶显示作为一种显示方式,具有比LED显示可以提供更多的信息量和直观。以汉字方式显示信息,方便操作人员的理解和掌握。   本系统显示屏为点阵显示方式。显示的字符所需字模的获取,采用专用软件。液晶字库的取法,采用16X16点阵,字型采用小四号字,可以调整左右偏移。上下偏移,纵向取模,字节倒序。   根据显示屏的说明,对于EDM12816型液晶,每个字的前十六个字节放在第一页面中,后十六个字节放在第二个页面的相应位置。即每个汉字的上下两个部分不在连续存储单元。   液晶显示对于单个字符可以采用,指定页内地址的办法处理。即在外部存储器的指定区域内进行数据拼装。应注意对于EDM12816来说,16字节半个汉字,32字节一个汉字。显示的内容要在内存中进行拼装,通过每一幅显示画面相应的程序进行拼装,在外部数据存储区内指定的区域,将所要显示的字符和画面以字节为单位有序排列,拼装完毕后,调用显示程序将上述内容送到液晶显示屏。进行内存数据拼装时,根据要显示字符的位置,把字符对应的字节数据放到外部存储器相应单元。   显示程序按页面对显示内容进行处理和刷新,即根据当前的显示页面号,确定应当显示的内容,在内存中进行显示数据拼装,之后调用显示刷新程序,将指定的内存区的内容传送到液晶显示器中。这和按键的处理是一样的,即程序的操作应当根据当前的具体页面号,所处在的程序进程,进行相应显示程序处理。   系统所用到的显示字符,预先作成系统小字库,连续存储在程序存储器中。最好以整数存储单元作为存储单元的开始。   3 硬件设计过程中的一些考虑   3.1地址译码使用的考虑   在作地址译码和使用片选时,尽可能使用高字节地址,因为许多外部设备的通道或命令寄存器使用低位作为片选。译码时使用低位,会很难处理,有重叠。使用高位可以有效避免这种尴尬。译码电路最好使用多位控制译码电路的片选。地址译码,尽量选用低位开始的地址线,给高位留有余地。使用138译码器时,尽可能使用高位而不是低位地址线。   3.2电路设计上的考虑   CD4051应当使用双电源,模拟通道对AD转换还是有不同程度的影响。在模数转换之前,应当加入采样保持电路。   max191使用时应当注意其极性,双电源模式,或单电源模式,直接在端口接电压信号,可以正确检测,数值准确。为了提高精度可以使用可调节的外部基准源,确保基准源有较好的温度特性。模数转换的模拟地应尽量短,尽量粗与电源地连接。   液晶屏显示使用74ls245 驱动应注意门的开方向。控制不要仅采用WR,Rd控制,应当与片选译码信号共同作用。液晶屏接口电路,门电路尽可能使用高速门。地址线和读写信号要有确定的时序关系,尽量减少门延迟。   4结论   采用时间片循环的方法,进行51单片机程序设计,为一般小系统的开发提供了方便,使得程序的开发和移植变得相当容易。本文介绍的内容较为浅显,但实用性较强,开发人员可以在此基础上研发出更为复杂的单片机应用系统。   本文的经验也可以在其它单片机系统中使用,其中的键盘,A/D转换,液晶显示,串口通信对于其他单片机也是有参考价值的。   本系统的软件和硬件设计,在实际运行中稳定,达到了设计的要求。   参考文献   [1]周航慈编著.北京航空航天大学出版社.单片机应用程序设计技术.   [2]李勋,林广艳,卢景山编著.北京航空航天大学出版社.单片微型计算机.   [3]楼然苗,李光飞编著.北京航空航天大学出版社.51系列单片机设计实例.   [4]李勋,林广艳,卢景山编著.北京航空航天大学出版社.单片微型计算机.

  摘 要 本文主要阐述MCS51单片机软件和硬件设计的基本思路,根据经验,谈一些经常遇到的问题和对策。   关键词 单片机;软件设计;硬件设计;时间片;串口通信   中图分类号TP368.1 文献标识码A 文章编号 1674-6708(2013)96-0201-04   0引言   单片机在智能仪表,控制设备,机电一体化和自动化控制系统中的应用愈来愈广,很多仪表设备在升级换代的改造中都将单片机作为首选方案。单片机的优越性能使电路设计更加简单,但软件设计的任务相应的比较繁重。   系统设备中51单片机是在目前比较流行的单片机系统。是性能价格比较高的一种单片机系统。其软硬件设计,都比较成熟,是一种容易掌握的单片机系统。在实际开发中比较容易实现要求的控制功能和控制成本。本人在实际设计中摸索了一些经验和方法,对于系统软件和硬件设计有帮助。   对于大多数单片机的编程设计者,最初的经验多来自阅读其他程序员的软件,在此基础上进行自己的程序设计。   笔者设计的通信电源监控器,使用51单片机,采用MAX191进行模数转换,采用RS232方式通信,采用EDM12816液晶显示器进行信息显示,八位键盘。   该控制器的功能为检测电源系统的输出电压,当电压超过或低于设定值,报警,蜂鸣器鸣叫;输出将被使用继电器切断;通过串口送出按协议编码的报警信息,根据接收到的数据调整参数,控制动作。报警电压的上限和下限可以设定和修改。   1硬件系统设计   系统硬件设计采用了51系统的一般模式。   采用89C55内置20K程序存储空间,省去EPROM,同时大大加强系统程序的保密性。   采用窄DIP 封装62256,32K RAM作为系统的数据存储单元,供液晶显示的数据拼装,以及系统相关数据的存储资源。   采用MAX191完成模拟量数字量转换,数据为12位,使用CD4051作为模拟量通道,由译码电路完成通道的切换。   采用EDM12816,16*16点阵8个汉字作为液晶显示器,进行人机交流界面。LED背光源,背光亮度可以调节。   采用MAX813作为看门狗、复位控制电路,电压监视电路,集成度高。   采用DS1302作为时间计时器,为系统提供日期,时间以及31字节数据保存单元,需要使用3.6V电池的数据保存单元。   采用MAX232作为RS232通信的电平转换芯片。MAX232是RS232C收发器,这种收发器由于它的内部有电荷泵电压变换器,可将+5 V电源变换成RS-232所需的±10V电压,因而只需用单一的+5V电源就可实现电压的转换,符合RS-232的技术规范。   采用8255作为输出通道和键盘通道控制器。   2 软件设计   程序设计的步骤和基本方法。软件设计可以采用C51和PLM、汇编,本系统的软件设计采用汇编语言,主要基于时序控制实现简单,可以借鉴的相关资料丰富。   基于控制的考虑,系统采用时间片和循环相结合的方法进行程序控制。   根据时间片序号的不同置位时间片标志,通过时间片标志控制各个程序按照需要执行。这是一种类似高级语言的编程方式,比较有利于对程序的控制。系统可以根据任务的紧急程度,将紧急程度度最高的任务设置为每次循环都执行的工作方式,而将紧急程度低的任务设置为按相应时间片执行的方式。紧急程度的区分,由程序根据相应的位标志进行。在进行编程时,应当对每个由时间片标志控制的程序运行时间进行计算,确定占用的时间片具体数目,进行恰当的安排调度。   程序设计的主要部分:   1)系统初始化部分,包括资源的分配,单元的预定义。定义详细和完整可以对程序的设计起到事半功倍的效果;   2 )主程序循环基于时间片的跳转。充分使用51单片机丰富的位资源,为与每个时间片相对应的程序确定时间片运行标志位,控制程序运行;   3 )中断程序的处理,包括定时器0和串口中断。串口中断的优先级高于定时器中断。对定时器中断,和串口中断程序处理进行说明;   4 )键盘扫描程序,模数转换程序,时间芯片读写程序,端口处理程序,说明键盘扫描,延时处理;模数转换,以及计算处理,DS1302的读写,8255的读写;   5) 相应的数据处理程序,多字节乘法,多字节加减法。多字节加一,多字节减一程序。可以在参考资料上获取,仅需要修改入口和出口参数。在系统中直接调用。   下面分别详细介绍上述程序。   2.1系统初始化部分   首先要把系统使用的外部端口资源确定和分配好。   安排中断向量的跳转,预定义各个寄存器,内存单元,外部存储单元,相应的外部端口具体数值都应确切的设置。为了系统的稳定,系统使用的单元应当赋初始值。使用EQU,ORG,END,BIT,DB,SET等。可以把通用寄存器组的另外三组定义为连续的别名供使用,不用修改PSW中的RS0,RS1。一般仅在中断程序和程序调用中使用,这样可以不用入栈保护的相应的寄存器区,方便使用,节约了堆栈。   方便用户使用和方便记忆,可以采用拼音或英文缩写的方式进行定义。进行复杂的程序设计,作好预定义和赋初值处理会大大降低编程的难度。同时采用浮动方式进行预定义,方便后期修改.编制时应当加入文字说明以利使用和调试阅读。   初始化部分对内存进行刷新,对外部设备如8255进行初始化,在液晶显示屏上显示厂家标志,程序版本号。这里因为使用外部数据存储芯片,设定专门程序对外部数据存储芯片62256进行检测,同时对8255端口赋初值。对系统程序计算和保存数据需要用到的单元,初始化,保证系统数据的可靠性。   在进行初始化时有液晶显示,提示正在进行初始化。对于外部端口的处理应当置于安全的状态。包括继电器的吸合和开关量的设置应不会对人员和设备造成危害。   2.2 对于主程序循环的考虑   主程序循环的方法,通常采用下面的方法:   1)定时器0中断中,修改控制程序执行的时间片位标志。   根据当前Timeover的数值,判断哪些时间片标志应当被置位,进行置位。在退出中断后,在主程序循环中,根据标志位控制相应的程序的执行。如果控制程序执行的位单元置位,程序相应的执行,执行完毕清除控制程序执行的位标志。在全部标志位扫描完毕,转回循环开始,进行下一次循环。   2)采用纯循环方式   无限制的循环。执行完全部的指令,重新回到循环开始,这样反复循环。   3)事件激活方式   循环等待,检测到由外部状态的变化,相应执行某些操作,进行相应的处理。即在程序中循环检测相关标志位的变化。   本文所设计的程序采用时间片的方法,使用上述三种方法的结合。   电源监控器主程序循环具体如下。   2.2.1键盘处理   判断Keytime标志位,如果被置位,在主程序中,执行键扫描,确定有无键按下。如果有键按下,保存键值,修改相应的标志位。进行多次判断,确定有效,修改标志位执行按键执行程序。在确认键值后,转入相应的表处理程序决定执行哪个模块。若无键按下,顺序执行主循环的下一项程序。   2.2.2液晶显示处理   判断Displaytime标志位,如果被置位,在主程序中,显示状态刷新,执行内存中的数据拼装,确定菜单状态,当前显示第几层菜单(需要一字节),光标位置(需要一字节)。某些实时程序,产生的数据,应放在指定单元,直接取用进行内存的更新。   2.2.3模数转换   判断Adtime标志位,如果被置位,在主程序中,开始进行模数转换,调用多字节乘法,转换为要求的数值形式。同某些预设值进行比较,判断是否处于告警状态。   2.2.4时间扫描   判断Gettime标志位,如果被置位,读取DS1302中的时间数据,刷新在内存中的时间单元数据。供显示和数据记录使用。   2.2.5外部端口的扫描   判断8255time标志位,如果被置位,查询8255的B,C口数据,判断外部端口是否发生变化,并做出相应的处理。   2.2.6串口接收到的数据处理   判断Seriestime标志位,如果被置位,当串口接收到完整的一帧数据,修改接收串口接收完成标志,启动接收数据处理程序,修改数据。   2.2.7对于一些重要的,需要每周期都执行的实时程序可以在主程序中集中调用进行处理   2.3系统的中断设定   系统使用两个中断源   第一,定时器0中断,最重要的,用以确定时间片,控制程序运行。   第二,串口中断(串口,使用定时器1作为波特率发生器。)   2.3.1定时器中断功能   定时器0设定每个时间片为5ms,共20(保存在Timeover单元中)个时间片100ms,为一次大循环。每次定时器0中断,Timeover计数值减一,当此值为零时,程序重新赋初值。   根据计数器值,修改相应得标志,是主程序循环执行各个程序段。   1)断Timeover为1,进行键盘扫描.置位Keytime标志位。   2)判断Timeover为4,8,12,16,20,进行模数转换,置位Adtime标志位。由主程序循环进行程序调用。可以根据需要为安排某个程序多次执行。如在一个大循环中,安排模数转换4次以上执行,保证每100ms,有一次或多次有效的模数转换。   3)判断Timeover为6,进行显示刷新,置位Displaytime的位标志。   4)判断Timeover为2,读取DS1302时间,则置为位Gettime的标志位。   5)判断Timeover为3,进行端口数据的读取,8255端口的检测,则置为位8255time的标志位。   2.3.2 串口中断功能   串口通信是单片机系统的重要资源,不仅提高系统的功能,而且方便系统调试。为了保证接收数据的完整和实时,串口通信的接收采用中断方式。并且在内部存储器中开辟缓冲区保留数据。同时为了保障通信的实时、有效和完整,使用超时检测的功能和校验功能。   串口中断处理程序,将接收到的数据放到通讯缓冲区中,设有接收指针,确定已接收位,应接收的长度。在程序中,可以判断通信是否完成,未完成应当继续接收。如完成接收应当转入相应的处理程序。根据通信协议,当判断通信完成接收到全部字节。可以置位标志位,转入相应的校验处理。   通过校验后,修改相应的串口接收成功Serrecok位标志,由主程序循环中的相应程序调用进行处理。如果校验未通过,放弃本次接收的数据,转入相应的超时处理程序,释放占用的资源。也可以进行CRC 校验,用另外一个程序调用来完成循环冗余码校验,本文使用累加和校验方式。为尽量减少串口通信对程序运行的影响,不在中断程序中进行接收数据的相关处理。   在串口中断程序中,在指定区域设置接收缓冲区,使用mov @R0,a方式保存数据。Sertimov为接收超时标志。Checksum为校验和字节,即所接收到的数据的累加和,限定到一字节内。   程序说明:   串口通信(接收使用中断)(中断源设定中串口中断优先)。   判断Sersynok串口同步标志是否被置位,如果置位是正在接收状态。如是,继续判断是否收完。未接收完,接收数据保存在内存单元中,退出中断。   检测接收超Sertimov标志时,未超时退出,否则,恢复全部初始状态,送出错信息。   本系统中,通信需要考虑的寄存器和内存单元问题   1)使用一部分芯片内内存单元作为缓冲区,应有确定的首址,因为系统协议最长为8字节,应当有8字节长度的数据缓冲区,设置在内存38H-3FH单元;   2)设置正在进行通信的标志位,为Sersynok,只有完成接收同步头后才置位;   3)设置已经接收的串口通信数据字节数,保存在R0中;   4)超时计数单元Sercount,应当可以维持1s时间的计数,超过1s可以视为通信超时,有一字节。通信超时时间一般应当是最大接收数据所用时间的2~3倍或更长。本系统中,使用的波特率较低,协议长度为8字节,加上同步头和校验字节,一共10字节,超时计数器,应当可以维持1s时间的计数,超过1s可以视为通信超时。因为系统定时器中断时间设计为5MS,故超时Sercount字节设为200,即1s,也就是Sercount字节和Sertimov标志位(超时标志位)。   串口程序编制的一些考虑:   串口接收程序设计采用接收1个A作为有效同步的开始,建立正在接收标志,其后面是命令和数据,接收一字节,存储在自38H单元开始的8字节数据存储区内。   在全部接收完毕,对于数据进行累加和校验。只有通过累加和校验,才能置位Serrecok成功接收标志。在主程序执行中,执行串口接受数据处理程序,根据相应的散转程序进行解释和修改内存单元的字节和位单元,调用处理程序,完成串口数据处理。   在退出串口中断处理程序之前不要开放串口中断,以避免再次中断。应在出栈所有寄存器之后再开放串口中断,执行中断返回,有深刻的教训。   在定时器中断中,程序根据Sersynok标志判断是否在接收数据状态中,不是,略过。如果处在接收数据状态,则对Sercount超时计数器进行减一操作。当计数值为0时,转入超时处理。正常通信结束后,清除Sersynok正在接收标志,使在定时器中断0中不再进行通信超时计数值的处理。   入栈保护应当配对使用POP和PUSH,否则一定出错。同时没有必要保护的寄存器区不必保护,以免占用过多的存储空间。主程序中应当保留足够的堆栈空间,此外要限制调用的深度,不要超过三层。以避免发生不可预见的堆栈溢出。   2.4键盘扫描程序,模数转换程序,时间芯片读写程序,端口处理程序,显示程序   2.4.1 键盘扫描程序   键盘处理比较简单,一般是进行扫描,获取键值,延时,滤除干扰,等待释放,确认按键有效,最后转入键处理程序。   系统软件设计中,键盘接收处理程序,进行三种判断,检测有键按下,按键释放,按键按下有效次数。   程序中要求对按键进行20次循环以上的有效计数,对应大约10ms,才确认为有效键,不使用简单的延时等待。在检测到有按键按下时,键扫描程序执行完本次循环,不清除时间片标志,直到此次按键被判为有效或放弃之后才清键扫描时间片标志。也就是当系统检测到有键按下时,键扫描程序不再按时间片运行,而按20次主程序循环来进行。当按键有效按下达到20次修改标志,表明KEY_OK,按键被有效检出。此后,只要检出KEY_OFF键释放标志有效,即可转入键盘处理程序。键有效按下,程序进行异或比较,确定按下的键是同一个键,避免干扰。   设有NEW_KEY,OLD_KEY两个单元保存最近的两次按键键值。读取8255的A 端口,根据读取到的数值判断是否有按键按下。如果有键下,读取键值,保存在Newkeys单元中,将原来的键值保存在Oldkeys单元中。在以后的扫描程序中,判断按键是否达到了要求的按键按下次数。如果按键按下达到要求的保持时间,仅判断按键是否释放,检测到键盘释放,修改成功检测到按键标志。对于未达到规定的按键时间的按键放弃处理。   如果有效按键释放,修改标志,使主程序运行键处理程序。系统程序在主程序循环中根据当前处于哪种处理界面中,在键处理程序中可以修改相应的参数,调用相应的处理程序进行处理,修改相应的显示内容,进行按键处理。   2.4.2模数转换模数转换程序程序,A/D转换算法   模数转换的关键是滤除干扰和数值转换。   MAX191数摸转换芯片,是十二位数模转换。该芯片可以使用单电源方式和双电源方式。基准为4096mv。封装为窄24DIP。启动数模转换芯片,等待芯片的忙闲标志。在忙闲标志为低时,读取转换数值。高四位,低八位,可以放在内存单元中读取的转换值用二进制表示,进行计算,即使用多字节乘法,乘相应的系数。结果保存在内存单元,计算完毕转换为BCD码,确定小数点位。   模数转换程序应当使用数字滤波技术,去除干扰数据。本文采用四次取样,滤除最大值,最小值的,另外两个数据平均的方法作为一次有效数据的处理方法。为保证显示数据的不跳动本软件采用16次数据滑动方式,每次取样的有效数据冲消掉16次取样数据中最早的一个. 然后使用平均数据的方式,取得的数据为有效值。也可以根据具体情况使用冒泡法或其他方法。   数值转换采用的方法采用多字节二进制乘法,将获得的取样值乘相对应的系数,获得实际值。一般还要经过BCD码转换。变成可以供进行比较和转换的数值形式。   系统设置电压上下限比较功能,具有上下限输入值BCD码的加减法运算功能,主要进行加、减的运算,进行BCD码比较,判断电压过压或欠压,转为告警状态。   系统有相应的上下限数据设定程序,该值初始设定为某一固定值,每次按键,相应的数据加一或减一。同时该数据被保存在DS1302的存储空间中,在每次初始化后由DS1302读取后送入外部数据存储器中保存,供程序调用。   软件系统设有告警Alarmword字节,其中的每一位都代表一种告警错误。在主程序循环中,有专门程序对该字节进行位判断,驱动告警,相应的从串口送出错误告警码。模数转换修改其中的过、欠压标志。   对于使用数模转换的数据处理应当采用数据平滑,即对数具进行过滤数据超限。也不应进行过多的平均,以免电压变化过于慢,系统不能立即反应电压的变化。   2.4.3时间芯片读写程序   对于DS1302的读写,使用串行方式进行,比较并行端口的读写相对较耗时。并且需要对数据进行相应的格式变换。处理相对复杂。   2.4.4端口处理程序   8255的端口,采用扫描方式,按位进行逻辑处理,根据每个端口的状态进行相应的处理。   8255需要一定时间复位,半秒左右,再初始化。如果未能正确初始化,端口高阻状态,用发光二极管指示,不亮,低电平会被抬高。在8255运行时不要多次对命令寄存器单元设置,有时会出现混乱。8155应当也是这样的。许多外部设备都是这样的。应当注意。   在系统初始化时应当加入适当的延时,确保8255有效复位。   2.4.5显示程序   液晶显示作为一种显示方式,具有比LED显示可以提供更多的信息量和直观。以汉字方式显示信息,方便操作人员的理解和掌握。   本系统显示屏为点阵显示方式。显示的字符所需字模的获取,采用专用软件。液晶字库的取法,采用16X16点阵,字型采用小四号字,可以调整左右偏移。上下偏移,纵向取模,字节倒序。   根据显示屏的说明,对于EDM12816型液晶,每个字的前十六个字节放在第一页面中,后十六个字节放在第二个页面的相应位置。即每个汉字的上下两个部分不在连续存储单元。   液晶显示对于单个字符可以采用,指定页内地址的办法处理。即在外部存储器的指定区域内进行数据拼装。应注意对于EDM12816来说,16字节半个汉字,32字节一个汉字。显示的内容要在内存中进行拼装,通过每一幅显示画面相应的程序进行拼装,在外部数据存储区内指定的区域,将所要显示的字符和画面以字节为单位有序排列,拼装完毕后,调用显示程序将上述内容送到液晶显示屏。进行内存数据拼装时,根据要显示字符的位置,把字符对应的字节数据放到外部存储器相应单元。   显示程序按页面对显示内容进行处理和刷新,即根据当前的显示页面号,确定应当显示的内容,在内存中进行显示数据拼装,之后调用显示刷新程序,将指定的内存区的内容传送到液晶显示器中。这和按键的处理是一样的,即程序的操作应当根据当前的具体页面号,所处在的程序进程,进行相应显示程序处理。   系统所用到的显示字符,预先作成系统小字库,连续存储在程序存储器中。最好以整数存储单元作为存储单元的开始。   3 硬件设计过程中的一些考虑   3.1地址译码使用的考虑   在作地址译码和使用片选时,尽可能使用高字节地址,因为许多外部设备的通道或命令寄存器使用低位作为片选。译码时使用低位,会很难处理,有重叠。使用高位可以有效避免这种尴尬。译码电路最好使用多位控制译码电路的片选。地址译码,尽量选用低位开始的地址线,给高位留有余地。使用138译码器时,尽可能使用高位而不是低位地址线。   3.2电路设计上的考虑   CD4051应当使用双电源,模拟通道对AD转换还是有不同程度的影响。在模数转换之前,应当加入采样保持电路。   max191使用时应当注意其极性,双电源模式,或单电源模式,直接在端口接电压信号,可以正确检测,数值准确。为了提高精度可以使用可调节的外部基准源,确保基准源有较好的温度特性。模数转换的模拟地应尽量短,尽量粗与电源地连接。   液晶屏显示使用74ls245 驱动应注意门的开方向。控制不要仅采用WR,Rd控制,应当与片选译码信号共同作用。液晶屏接口电路,门电路尽可能使用高速门。地址线和读写信号要有确定的时序关系,尽量减少门延迟。   4结论   采用时间片循环的方法,进行51单片机程序设计,为一般小系统的开发提供了方便,使得程序的开发和移植变得相当容易。本文介绍的内容较为浅显,但实用性较强,开发人员可以在此基础上研发出更为复杂的单片机应用系统。   本文的经验也可以在其它单片机系统中使用,其中的键盘,A/D转换,液晶显示,串口通信对于其他单片机也是有参考价值的。   本系统的软件和硬件设计,在实际运行中稳定,达到了设计的要求。   参考文献   [1]周航慈编著.北京航空航天大学出版社.单片机应用程序设计技术.   [2]李勋,林广艳,卢景山编著.北京航空航天大学出版社.单片微型计算机.   [3]楼然苗,李光飞编著.北京航空航天大学出版社.51系列单片机设计实例.   [4]李勋,林广艳,卢景山编著.北京航空航天大学出版社.单片微型计算机.


相关内容

  • 保险柜密码锁的结构和工作原理
  • 文章由 天猫商城 友情提供 保险柜密码锁的结构和工作原理  多拨式 最简单的密码锁,常见於低安全设定的单车锁,使用多个拨圈.每个圈的中间有凹位.锁的中心的一条轴,上有数个凸出的齿,用来卡住拨圈.当拨圈转到正确的密码组合,锁便可以打开.这种锁是最容易打开的.很多这类锁根本无需知道密码都能开启.除非它 ...

  • 通信工程毕业设计题目精选
  • 不管怎样,生活还是要继续向前走去.有的时候伤害和失败不见得是一件坏事,它会让你变得更好,孤单和失落亦是如此.每件事到最后一定会变成一件好事,只要你能够走到最后. 通信工程毕业设计题目精选 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激 ...

  • 单片机毕业设计题目
  • 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6. 嵌入式激光打标机运动控制卡硬件系统设计 7. 基于单片机控制的数字气压计的设计与实现 8. 基于MSC1211的温度智能温度传感器 9. 机器视觉系统 ...

  • 自动化毕业设计论文题目
  • 自 动 化 毕 业 设 计 论 文 题 目 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6. 嵌入式激光打标机运动控制卡硬件系统设计 7. 基于单片机控制的数字气压计的设计与实现 8. 基于MSC12 ...

  • 组态王6.53与51单片机
  • 基于51单片机的智能仪表与组态王的通讯 1242人阅读 | 0条评论 发布于:2009-8-10 23:01:00 1.引言 随着工业自动化进程的不断加快,现场仪器.仪表.设备正不断向数字化.智能化和网络化方向推进. 单片机以其强大的现场数据处理能力,低廉的价格,紧凑的系统结构.高度的灵活性,微小的 ...

  • 电气自动化设计论文题目大全
  • 机电一体化 毕 业 设 计 论 文 题 目 第1-100个电气自动化毕业设计论文题目 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6. 嵌入式激光打标机运动控制卡硬件系统设计 7. 基于单片机控制的数 ...

  • 电气自动化毕业设计论文题目
  • 电 气 自 动 化 毕 业 设 计 论 文 题 目 第1-100个电气自动化毕业设计论文题目 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6. 嵌入式激光打标机运动控制卡硬件系统设计 7. 基于单片机 ...

  • PLC毕业设计论文题目
  • P L C 第1-100个PLC毕业设计论文题目 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6. 嵌入式激光打标机运动控制卡硬件系统设计 7. 基于单片机控制的数字气压计的设计与实现 8. 基于MS ...

  • 单片机的智能仪器监控平台设计应用
  • 工业燃烧过程所释放出的烟气是现代城市大气污染源,烟气检测是大气环境检测中必要的项目,它是确定重点污染源并对污染源进行检测和控制的基本手段.为了控制燃烧过程的燃烧空气比,提高燃烧效率,节约能源,减少大气污染,必须可靠地测量烟气中各种气体的含量.本文针对烟气分析,介绍了一种基于Intel单片机的智能仪器 ...