首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
基于MDB/ICP协议的自动售卖系统的主控制器
来源:本站整理  作者:佚名  2011-06-05 09:18:49




{
TMOD &=0xf0;
TMOD |=0x01; //设置定时器0为方式1(16位)
TH0=T_RESPONSE;
TL0=0x00; //设置超时门限
TF0=0;
TR0=1; //定时器0使能
While (!RI && !TF0)
; //等待接收字节直至超时
TF0=0;
if(RI){ //已接收字节
RI=0;
*byte=SBUF; //返回字节值
*bMode=RB8; //返回方式位
return 1;
}else{ //超时
RI=0;
return 0;
}
}
(3)数据块的传送
这部分与下面的会话部分放在一个函数体内实现。
(4)会话

   这是MDB会话控制的核心部分。根据需要传送数据包,计算校验字节,控制方式位,在时序允许的响应时间内接爱外设返回的数据,做出ACK或NAK等反应。并且按照MDB/ICP标准中堆荐的方式处理异常情况,当接受数据超时或校验和错时,重复发送命令多次,以增强容错性能。将接收到的数据返回给调用乾,并返回结果码。源程序如下:
//与外设会话,在调用之前确认译码器选通MDB总线
uchar Session(uchar add,uchar dat[],uchar count)
//形参:add——VMC发送的地址指令字节
// dat[]——VMC发送的数据块
// count——数据块的大小
//返回值:0——外设应答ACK
//非0且小于0x80——外设应答的数据块的大小
//大于等于0x80——会话中出错
//外设应答的数据块存放在全局数组uchar recBuff[]
{
uchar data check,i,j,err;
uchar data mode;
for(j=0;j<5;j++){ //最多重复发送命令5次
check=0;
err=0;
TransmitByte(add,1); //发送地址字节
Check +=add; //计算CHK
For(i=0;i<count,i++){ //发送数据字节
TransmitByte(dat[i],0);
check +=dat[i];
}
TransmitByte(check,0); //发送CHK
for (i=0,check=0,mode=0;
!mode && i<MAX_BLOCK_SIZE && !err;
i++)
{//反复接收字节直到方式位为1或出错
//接收到的数据存在全局数组recBuff[]里
if(!ReceiveByte(recBuff+i,&mode))
//超时。外设可用超时表示NAK
err=i?ERR_TIME_OUT:NAK;
else if (i= =0 && recBuff[i]= =NAK && mode)
//收到NAK
err = NAK;
else if (!mode)
//方式位为0表示还有数据
check +=recBuff[i];
} //for i
if(!err){ //未发生错误
if (!mode){
//收完36个字节还未结束
TransmitByte(NAK,0);
err=ERR_NO_MODE_BIT;
}else if (i>1) {
//收到数据块
if(check !=recBuff[i-1]){ //校验和错
TransmitByte(NAK,0);
err=ERR_CHECKSUM;
} else{
//一切正常,发送ACK后跳出循环
TransmitByte(ACK,0);
break;
}
} else
//收到外设传来的ACK
break;
}//if(!err)
Wait(T_RESPONSE); //防止与外设数据冲突
}//for j
//返回接收到的数据块大小或出错代码
return err?err:(i-1);
}
本文使用DS5002FP实现了对MDB总线的控制与访问。通过将MDB/ICP协议进行分解,很好地实现了总线驱动。实践证明该驱动程序稳定、可靠,大大降低了上层界面开发的难度,提高了系统的可维护性,节约了成本

上一页  [1] [2] [3] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:84,578.13000 毫秒