由PC机进行调时的电子时钟
这里介绍的电子时钟器为带RS232C串口调时和定时等多项功能的电子时钟器,通过RS232C接口与Pc机相连,Pc机的通讯软件使用vB软件制作。由于调时定时都是在Pc机前操作,可以解决挂在大厅较高的地方而造成的调时定时的不方便,且调时定时比较灵活,可一次设置多项定时时间(本文采用的是最多可一次设置10次定时时间项) .
单片机的硬件电路原理图单片机的硬件电路原理图如图1所示。其中,P1.0脚接一个LED用来指示定时振铃开关状态,LED亮时表示定时振铃开关打开,LED灭时表示定时振铃开关关闭;P1.7脚用来驱动振铃定时响;使用共阳数码管显示,采用动态刷新的方式,P0口用来输出数码显示的段码,P2.0~P2.5用来驱动数码管的位码;这里的单片机使用的是12MHz的晶振,如果采用2400bps或更高的波特率,建议使用11.059MHz的晶振,可使串口通讯更准确;通讯线使用的是屏蔽线。
观察PC机通讯软件的界面可知,该控制界面一共有6个Command命令按钮件,其中起到与单片机做成的电子时钟器(下位机)进行通讯作用的命令按钮控件有4个,分别为“调时时间确定”、“定时时间确定”、“读出定时时间”和“定时振铃开/关”,其余两个命令按钮控件为“添加定时项”和“删除定时项”,用于VB通讯软件的内部操作。现将各项命令按钮的功能及其通讯原理说明如下:
“调时时间确定”命令按钮:按下此命令按钮后,vB通讯软件即首先向电子时钟器发送命令字符“A”(ASCII码为41H),以通知电子时钟器接下来要发送的是调时时间信息,再把显示在调时时间区内的3个Text控件的Text属性值(分别为时值、分值和秒值)以及校验和组帧发送给电子时钟器。数据帧格式如下:
“定时时间确定”命令按钮:按下此命令按钮后,vB通讯软件即首先向电子时钟器发送命令字符“B”(ASCII码为42H),以通知电子时钟器接下来要发送定时时间信息,再把显示在定时时间区的定时各项(为List控件的List属性值)以及校验和组帧发送给电子时钟器。数据帧格式如下:
“读出定时时间”命令按钮:按下此命令按钮后,vB通讯软件即向电子时钟器发送字符命令“c”(ASCII码为43H),表示请求电子时钟器回送其定时区内的定时各项,vB通讯软件接收电子时钟器回送的定时时问各项后,把接收到的定时时间各项显示在VB通讯软件界面的定时区List中。
“定时振铃开/关”命令按钮:按下此命令按钮后,VB通讯软件即向电子时钟器发送字符命令“D”(ASCII码为44H),表示请求电子时钟器进行定时振铃开关的切换。
“添加定时项”命令按钮:按下此命令按钮后,即可向定时区的List内添加定时项。
“删除定时项”命令按钮:按下此命令按钮后,即可删除定时区的List内选定的定时项。
以上介绍的6个按钮控件在本设计中使用了控件数组,用Select Case语句处理每个命令按钮按下的过程,vB代码格式如下:
Private Sub Commandl一(;lICk(Index AsIntegei
Select Case IndexCaseO……‘处理命令按钮“添加定时项”按下的过程
Case1Case2……’处理命令按钮“删除定时项”按下的过程
Case3……‘处理命令按钮“定时时间确定”按下的过程
Case4……’处理命令按钮“调时时间确定”按下的过程
Case5……‘处理命令按钮“定时振铃开/关”按下的过程
End Select
图3为vB通讯控件Mscomm在本次设计期间的属性框,注意其中的~些属性设置,如
InputLen=1,
RTHreshold=1,
STHreshold=1.
Settings=“2400。N。8.1”

单片机片内RAM的20H到22H地址分别存储的是当前时间的小时值、分钟值和秒钟值,存储数据格式为压缩的BcD码,以便于查表显示用,VB讯软件对电子时钟器进行调时时,所传送过来的调时时间信息便是存储在这些地址内。
RAM的2FH地址内存储的是当前定时时间的项数,从RAM的30H地址开始依次存储的是定时时间的各项,存储格式也为压缩的BCD码,而用寄存器RO指向30H单元,存储格式如下:
该电子时钟器最多能一次设置多少个定时项由单片机的RAM存储空间决定。如本设计中,存储定时项时是从30H地址单元开始,每一项定时需要3个地址单元,这意味着存储10个定时项需要30(1EH)个地址单元,所以堆栈指针sP在程序初始化中应修改为30H+1EH地址单元之后,存储定时项时要考虑堆栈空间够不够用,51子系列的单片机只有128个片内数据RAM可用,而52子系列的单片机有256个片内数据RAM可用。
单片机的软件设计因为要使电子时钟器定时打铃,必须同时具备如上所述的两个条件,所以在单片机执行查询定时各项的程序段之前,主程序会首先查询这两个条件是否同时满足。如果满足的话,则进行一轮查询,所谓一轮查询定时,即将当前时间与定时各项一一比较,看是否相符,如果查到某项相符,则调用BEI.L的振铃子程序。每查完一项,寄存器R3中的值会自动减1(注意R3中的值在一轮查时之前是来自2FH单元,即为定时时间的项数)。当R3中的值自动减为0时,则表示这一轮查询定时时间完毕,只要条件允许(定时振铃开且定时项数不为0),又可以进行新的一轮查询定时时间。R0为查询定时时随查询进程而变化的指针,要特别注意R0的变化,稍没处理好,程序便大错了。单片机主程序的流程图如图4所示。
单片机的串口通讯软件采用中断和查询相结合的方式,即接收命令字符时为中断方式,而接收命令字符后的操作(如接收调时时间信息或接收定时时间信息)则调用子程序,在子程序中采用查询方式接收。设计流程如图5(使用了散转指令)。
接收调时时间信息的子程序与接收定时时间信息的子程序流程大致相同,只不过VB发送过来的调时时间信息对单片机的通讯软件是确定的,每次总是小时的高位、小时的低位、分钟的高位、分钟的低位、秒钟的高位和秒钟的低位以及校验和的十位和个位而vB发送过来的定时时间信息对单片机的通讯软件来说是不确定的,所以在接收定时时间信息时首先接收的是定时时间的项数。由VB发送的定时时问信息的数据帧格式知,单片机要分两次接收定时时间项数,第一次接收定时时间项数的十位,第二次接收定时时间项数的个位,例如vB通讯软件发送过来的是9项定时项,单片机接收的两个数据就是30t{和39H(分别为字符“0”和字符“9”的ASCII码),这在vB通讯软件发送之前就已经做了处理。单片机会把接收的这两个数据处理合为一个数据并把它存储于2FH单元,然后再根据这个项数依次接收其后的各项定时时间。单片机在接收定时时间信息的时候是每接收一个数据就累加接收的ASCII码值,并用一个寄存器保存这个值。最后单片机接收发送过来的校验和数据,发送过来的校验和数据为两个,分别为十位和个位,十位以上的百位、千位已在vB通讯软件发送之前就舍弃了,单片机将接收的校验和与前面接收期间的累加和比较,如果相等则表示前面接收正确,回送数据61H(字符“a”的ASCII码)给VB通讯软件;如果不相等则表示前面接收有误,回送数据62H(字符“b”的ASCII码)给VB通讯软件,请求vB通讯软件重发一次。整个接收过程采用的是查询方式,查询的是串口接收标志位RI,图6为流程图。
在VB通讯软件读出电子时钟器的当前定时时间各项的子程序中,VB通讯软件为接收的一方,和单片机接收定时时间一样,VB通讯软件也要对单片机发送过来的定时时间信息进行校验和操作。如果电子时钟器没有任何定时时间项可供读出,则会回送信息字符“c(小写)”,否则,发送所有的定时时间项,在发送完所有定时时间项及校验和数据之后,单片机会在最后再发送一个信息字符“d(小写)”,通知VB通讯软件所有定时项已经全部读出,vB通讯软件一检测到结束信息字符“d”后,便会结束本次接收,并把接收的读出数据经过校验和操作,如果校验和错误,则会在通讯信息框中告诉操作者;如果校验和正确,则处理接收到的数据,使之显示在vB通讯软件的可视化界面上。结束语整个程序设计有很多数据的处理,如16进制数转ASCII码,两个ASCII码合为一个数据等等,方法也不一定如本文所介绍,本文只是提供一个参考,也许还有更好的处理方法,但无论采用哪种方法,要慎重分析对待每一步设计,否则,“一招不慎,满盘皆输”。



评论