“基于485总线的评分系统”程序设计说明
1 工程文件下载:
2 程序设计思路与方法
本案例程序设计主要分为:485通信接收数据包处理、导航按键AD转换、按键检测与处理以及数码管LED显示4个部分。
首先通过模数转换模块启动AD转换,对P1.7口的模拟值不断进行采集和处理,由此判断五个方向的哪个方向被按下,从而对数码管相应位进行数值修改;按下KEY1,KEY2键触发外部中断0和外部中断1,使设置完成标志位flag_num和flag_score置1;根据上位机主控制器发送数据包的格式(五个字节的数据),下位机将接收到的数据不断存入缓存数组rec[]中,下位机对接收的数据包进行处理和判断(包头、功能码以及自定义数据有效性),将发给上位机的数据包存入缓存数组send[]中,上位机主控制器根据反馈回来的信息做出相应的处理,若数据发送正常上位机将接收显示下位机传送的从机编号和评分。由于挂载在总线上的从机数在一定范围内不受限制,从而可以达到多个下位机同时独立评分的功能。
2.1 数据包相关功能码及附加数据定义:
功能码:
#define Fun_ReadInfo 0X03 //读下位机功能码
#define Fun_CheckSlave 0X08 //检测功能码
#define Fun_AddError 0X10 //地址错误功能码
#define Fun_Reset 0X01 //复位功能码
附加数据:
#define ErrorInfo 0X6f //错误码
#define Packet_Head 0X5A //包头
#define Broadcast_Add 0X00 //广播地址
#define Check_Content 0X13 //自定义内容
2.2 宏定义
#defineFOSC 11059200L //系统时钟频率
#defineBAUD 9600 //串口波特率
#defineS2TI 0X02 //串行口发送完成标志
#defineS2RI 0X01 //串行口接收完成标志
#defineADC_POWER 0X80 //启动A/D转换器电源
#defineADC_SPEED 0X60 //模数转换器转换速度
#defineADC_FLAG 0X10 //模数转换器转换结束标志位
#defineADC_START 0X08 //模数转换器转换启动控制位
#defineADC_CHANNEL 0X07 //模拟输入通道选择
2.3 定义变量
uint8rec[5]; //下位机接收数据缓存数组
uint8send[5]; //下位机发送数据缓存数组
uint8count=0; //缓存数组地址控制变量
bitbusy; //串口发送忙信号标志(1表示正忙,0表示空闲)
bitflag_receive; //串口接收完成标志位
bitflag_NumError; //从机号获取标志位
bitflag_ScoreError; //从机分数获取标志位
bitflag_set; //设置模式标志位
bitflag_num; //从机编号设置完成标志
bitflag_score; //评分设置完成标志
uint8key; //获取按下的按键
uint8num_0,num_1,score_0,score_1,score_2; //从机编号与评分个十百位
uint8number,score; //从机编号与评分
uint8set[]={0,0,0,0,0}; //小数点显示控制
uint8location; //设置数码管位
uint8dula[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段选
2.4 相关函数
void Init_INT() //外部中断初始化函数
void Init_IO() //系统IO口初始化函数
extern void Init_uart2(); //串行口2初始化函数
extern void data_process(); //串行口2接收数据处理函数
extern void Init_ADC(); //AD转换初始化函数
extern unsigned char Get_ADC() //AD数据处理函数
extern void Keyscan(); //按键扫描函数
extern void Display_SMG(); //数码管显示函数
extern void Delay_ms(unsigned char ms); //延时函数

图1 基于485总线的评分系统设计流程图
3 相关寄存器配置
3.1 选择485芯片引脚:
P_SW2:外围设备功能切换控制寄存器2(不可位寻址)

串口2可在2个地方切换,由S2_S控制位来选择。

该开发板485芯片使用串口2的第2组引脚:
P_SW2|= 0x01 ;
3.2 设置串口2的工作模式:
S2CON:串行口2的控制寄存器

S2SM0指定串行口2的工作方式。

设置串行口2为:8位UART,波特率可变;允许串行口2接收
S2CON= 0x10 ;
3.3 选择定时器工作模式:
AUXR:辅助寄存器(不可位寻址)

T2R:定时器2运行控制位
T2_C/T:控制定时器2用作定时器或计数器;
T2x12:定时器2速度控制位。
设置定时器2为1T模式,并启动定时器2
AUXR|= 0x14 ;
3.4 串行口2中断允许:
IE2:中断允许寄存器2(不可位寻址)
![]()
ES2为串行口2中断允许位
IE:中断允许寄存器(可位寻址)中的EA为CPU的总中断允许控制位。
允许串行口2中断:
IE2|= 0x01 ; EA = 1 ;

