首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 维修教程知识 > 单片机栏
CAN总线与PC机串口通信适配器设计与实现
来源:本站整理  作者:佚名  2009-09-16 10:12:13





以下为VB的发送接收程序:
Private SuBcmdSendàClick() 使用按钮控件
MSComm1. Output= txtSend. Text 将传送区内的字符串以Output属性送出
End Sub
Private SuBFormàLoad() 窗体的加载事件
MSComm1. PortOpeN= True  将通讯断口开启,通讯参数也可以在开启前先设定
MSComm1. RThreshold = Val (txtThreshold. Text) 设定引发接收事件的接收阈值,使程序一执行便开启通讯端口,将接收的阈值设定为阈值,设定文本框内的值。
End Sub
Private SuBMSComm1. OnComm() 通讯控件的OnComm事件。引发接收事件后,将字符收进来并放在接收的文本框中
SelectCase MSComm1. CommEvent 根据下面每一个case 语句处理每个事件和错误事件
  Case comEvCD  CD 线的状态发生变化
  Case commEvReceive  收到Rthreshold # of
  txtReceive. Text= txtReceive. Text+ Trim(MSComm1. Input)&vbCrLf
  Case comEvSend  传输缓冲区有Sthreshold 个字符
End Select
End Sub
Private SuBtxtThreshold Change ( ) p阈值设定文本框的Change事件
MSComm1. Rthreshold = Val (txtThreshold. Text) p当设定的阈值变化时,实时改变通讯对象的属性
End Sub

AT89C51单片机部分
单片机部分采用C语言编程。C语言编程具有快捷、模块功能强大、可靠性好、效率高等优点。其中程序初始化包括设定串口工作方式,定时器、中断寄存器初始化,各变量的初始化。

TMOD = 0x20; //定时器1为发生器
SCON= 0x50; //串口工作方式1
TH1= 0xfd ; //设定波特率= 9600bit/s
TL1= 0xfd ;
EA= 1; //开中断
ES= 1; //允许串口中断
TR1= 1; //启动定时器T1
SPECHAR = 0xff ; //设定通讯开始标志

程序采用中断接收,查询发送的方式。串口中断服务程序流程图如图3所示。


SJA1000控制器部分

初始化子程序CANINIT()
选用CAN2. 0协议构建CAN总线控制网络,对SJA1000的初始化主要包括工作方式的设置、验收代码寄存器ACR、验收屏蔽寄存器AMR、波特率的参数设置等。
void canàinit(void) /*SJA1000的初始化子函数*/
{control = 1; /*禁止超载、出错及接收中断,并置复位请求位使其进入复位状态*/
 while (control&0x01== 0);
 acceptanceàcode = 0x01; /*验收码寄存器(存机号1号)*/
 acceptanceàmask= 0xfe ; /*验收屏蔽码寄存器*/
 busàtimingà0= 0x03; /*总线定时寄存器0,同步跳转宽度
T0= T,BPS= 125 k*/
 busàtimingà1= 0x18; /*总线定时寄存器1,T1= 9T,T2=2T,波特率为500kbit/S*/
 outputàcontrol = 0x1A; /*正常输出方式,TX1引脚悬浮*/
 clockàdivider = 0x40; /*BASICCAN模式,RX1接固定电平*/
 control = 0x1A; /*清复位请求,使其进入工作状态*/
}

发送canàsend()
发送子程序负责节点报文的发送,由CAN控制器SJA1000独立完成,将命令寄存器里的发送请求标志置位,即可发送SJA1000发送缓冲区中的报文。
void canàsend(unsigned char ID ,char*xdata) /*该子函数完成一帧数据的发送*/
{while ( (status&0x10)>> 4 == 1)àNOPà; /*检查上次请求发送是否完成*/
while ( (status&0x04)>> 2== 0)àNOPà;
Transmitbuffer1= ID;
Transmitbuffer2= 0x08;
Transmitbuffer3= txdata[0] ;
Transmitbuffer10= txdata[7] ;
Command = 0x05 ; /*发送请求*/
while ( (status&0x08)>> 3== 0);
}

接收子程序canàreceive ()
接收子程序负责节点报文的接收。SJA1000自动接收发往该节点的数据并将收到的数据放到它的接收缓冲器中。
SJA1000的报文接收主要有2种方式:中断接收方式和查询接收方式。系统采用的是中断接收方式。
{unsigned char ir ;
 ir = interrupt; /*获得SJA1000的中断状态*/
 EA= 0;
 If ( (ir&0x04)>> 2== 1)error ( ); /*如果是出错中断,则调出错处理函数*/
 If ( (ir&0x08)>> 3== 1)overruN( ); /*如果是超载中断,则调超载处理函数*/
 While ( ( (ir&0x04)>> 2== 1)‖( ( (ir&0x08)>> 3)== 1){àNOPà;}
  RxID[0] = Receivebuffer1;
  RxID[0] = Receivebuffer2;
If ( ( (Receivebuffer2&0x10)>> 4)== 0) /*如果是数据帧,则接收数据*/
  {Rxdata[0] = Receivebuffer3;
  .
  Rxdata[7] = Receivebuffer10;
  Command = 0x04 ; /*SJA1000的接收缓存器被释放*/
  }
 else if ( ( (Receivebuffer2&0x10)>> 4)== 1) /*如果是远程帧,则作相应处理*/
  {  /*相应处理程序*/
  EA= 1;
  }
}

结束语

介绍了一种低成本、高可靠性、快捷的通用型CAN总线与PC机通过RS-232串口互连方案。该互连方案很好地保证了管理监控层和现场生产测控层之间的连接,方便了上下层信息交流,满足工厂、变电站等工业场合的应用要求。

上一页  [1] [2] 

关键词:

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

   评论摘要(共 0 条,得分 0 分,平均 0 分)

推荐阅读

图文阅读

热门阅读

Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:61,488.28000 毫秒