电子标签上电后,首先执行自检程序,显示本机ID,该ID在电子标签辅助拣货系统中是唯一的。上位机发送指令也以此ID为目标。上位机群发指令,各电子标签根据ID判断,若一致,则响应该指令;若不一致,则放弃该指令。接收到指令后,电子标签根据通信协议确定要显示的信息,若为拣货信息,则拣货人员将指定数量的货物取走,并按下确认键,电子标签报告给上位机,并停止显示。若为其他指令,如信息更新或库存查询,则电子标签对EEPROM中的信息进行读取、更新等操作。因此,电子标签程序分为显示程序、按键程序、通信程序、存储程序及主程序等部分。
存储程序用于操作AT24C04。AT24C04采用I 2 C总线协议,其相关函数在前面的实例中有详细介绍,此处只列出函数名称及功能,如表7-2所示。
表7-2 I 2 C总线函数及其功能
显示程序用于控制数码管显示相关信息。单片机通过74HC164输出段码,通过ULN2003输出位码。函数shift164()用于向74HC164输入段码,代码如下。
数码管采用动态显示方法,函数displed()用于刷新数码管,其通过调用shift164()使3个数码管逐位显示,代码如下。
函数led_show_num()的功能是显示本机ID或显示数据,代码如下。
函数Led_show()是显示处理函数。该函数周期性地被调用,用于维持数码管的正常显示。该函数根据系统所处状态调用led_show_num()显示不同信息,代码如下。
程序中多处需要延时,延时函数delay_ms()根据输入参数延迟相应的时间,代码如下。
函数key_operating()负责处理键盘操作,根据data_p_flag标志产生处理决策,代码如下。
本实例的关键在于通信程序的设计。通信程序负责接收上位机发出的指令,根据指令完成相应操作。函数in_out_put()的功能是处理串口收发中断,代码如下。
函数rec_msg()是接收数据处理函数。该函数对串口接收到的数据进行检验并处理,首先判断接收到的ID是否与本机ID吻合,若吻合,则进行后续处理,否则放弃本包数据,代码如下。
函数feeding_dog()负责重置看门狗定时器,避免溢出,代码如下。
函数timer2()是定时器T2中断处理函数,用于定时刷新数码管显示,代码如下。
电子标签的部分主程序流程如图7-3所示。
图7-3 电子标签的部分主程序流程
主程序代码如下。
硬件引脚定义如下。
键盘、数码管及灯相关变量定义如下。
拣货信息缓冲区定义如下。
串口变量及相关设置定义如下。
其他变量定义如下。
主程序对各部分初始化后,即进入按键处理和数据接收处理的相应程序,代码如下。