基于CAN总线的通信系统实现_第1页
基于CAN总线的通信系统实现_第2页
基于CAN总线的通信系统实现_第3页
基于CAN总线的通信系统实现_第4页
基于CAN总线的通信系统实现_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 . . . 基于CAN总线的通信系统实现2901302001 景梦园CAN总线通信是一个非常实用的技术,无论在工业,制造业还是生活中都有相关的应用。这次我们所做的基于CAN总线的通信系统实现是一个最基本的应用。在这项技术中,我们采用了C51、SJA1000、TJA1050三种芯片来实现两个节点之间的通信。为了方便演示,加入MAX232芯片与单片机相连实现单片机与计算机的串口通信。1、 CAN总线节点技术:控制局域网络CAN(Controller Area Network)总线是德国BOSCH公司20世纪80年代初为解决汽车中众多控制与测试仪器间的数据交换而开发的串行数据通信协议。这是一种多主

2、总线,无论是在高速网络还是在低成本的节点系统,应用都很广泛。由于采用了许多新技术与独特的设计,与一般的通信总线相比,CAN总线的数据通信具有突出的可靠性、实时性和灵活性,其主要特点如下:   通信方式灵活,可以多主方式工作,网络上任意一个节点均可以在任意时刻主动向网络上的其他节点发送信息,不分主从。   CAN节点只需对报文的标识符滤波即可实现点对点、点对多点与全局广播方式发送和接收数据,其节点可分成不同的优先级,节点的优先级可通过报文标识符进行设置。CAN总线通信格式采用短帧格式,每帧字节数量多为8个字节,可满足一般工业领域中控制命

3、令、工作状态与测试数据的要求,同时,8个字节不会占用总线时间过长,保证了通信的实时性。   采用非破坏性总线仲裁技术,当多个节点同时向总线发送信息出现冲突时,优先级低的节点会主动退出数据发送,而优先级高的节点可不受影响地继续传输数据,大大节省了总线冲突仲裁时间,在网络重载的情况下也不会出现网络瘫痪。   直接通信距离最大可达10 km (速率在5 kb/s以下),最高通信速率可达1 Mb/s (此时距离最长为40 m);节点数可达110个,通信介质可以是双绞线、同轴电缆或光导纤维。   CAN总线采用CR

4、C检验并可提供相应的错误处理功能,保证数据通信的可靠性,其节点在错误严重的情况下具有自动关闭输出功能,使总线上其他节点的操作不受影响。2、89C51单片机芯片:89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压、高性能CMOS8位微处理器(MCU),俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。89C单片机为很多嵌入式控制系统提供了一种灵活性高且价

5、廉的方案。3、 SJA1000芯片:SJA1000是PHILIPS公司生产的一种独立控制器,用于移动目标和一般工业环境中的区域网络控制(CAN),支持CAN总线通信协议。 SJA1000有两种工作模式:基本模式和增强模式。在基本模式下,SJA1000只可收发标准数据帧(标准数据帧的标识符为11位),且错误报警的极限值不能修改;在增强模式下,SJA1000既可接收标准数据帧,也可接收扩展数据帧(扩展数据帧的标识符为29位),可修改错误报警的极限值,并且SJA1000具有更加灵活的滤波方式,能够根据数据帧的标识符有选择地接收一些数据帧。另外,增强模式下的SJA1000能够进行自检,即可通过自发自收

6、一组报文来判断该控制节点是否正常地挂在CAN总线上。使用者所要做的主要工作是SJA1000的初始化,收发报文的处理以与对节点脱离总线的检测量与处理。4、 TJA1050芯片:TJA1050 是控制器区域网络(CAN)协议控制器和物理总线之间的接口,是一种标准的高速CAN收发器。TJA1050可以为总线提供差动发送性能,为CAN控制器提供差动接收性能。TJA1050 是PCA82C250和PCA82C251高速CAN收发器的后继产品。5、 MAX232芯片:MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。具有如下特性:1、符合所有的RS-

7、232C技术标准2、只需要单一 +5V电源供电3、片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V电压V+、V-4、功耗低,典型供电电流5mA5、部集成2个RS-232C驱动器6、部集成两个RS-232C接收器电路图:C语言程序:/一号单片机程序#include<reg51.h>#include"lcd.h"/#include"DS1820'h"#include"SJA1000gai.h"#define key P22char table1="Message is sending"

8、;char table2="Sengding succeded"char table3="Receiveing succeded"/定义BUF数据结构/*struct BASICCAN_BUFstructunsigned char FrameID_H;/标识符高八位(信息功能2加节点号6)unsigned char FrameLENTH;/数据长度码unsigned char FrameKIND;/RTR位(1为远程帧,0为数据帧)unsigned char FrameID_L3;/低3位(信息格式)unsigned char FrameData;/数据

9、BASICCAN_FRAME,receive_BUF,send_BUF;*/*char temp_buffer2;/温度缓冲char disp_char="Temperature is: "char disp_temp=' ',' ',' ',' ','.',' ','c','e','n','t','i','g','r','a','d',

10、'e'/温度显示存储;uchar dot_temp=0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9;/温度精确到小数点一为以后void read_temp() init_ds1820(); write_byte(0xcc); write_byte(0x44); delay1ms(500); init_ds1820(); write_byte(0xcc); write_byte(0xbe); temp_buffer0=read_byte();temp_buffer1=read_byte(); void display_temp(void)uchar i;bit f

11、lag;if(temp_buffer1&0xf8)=0xf8)temp_buffer1=temp_buffer1;temp_buffer0=temp_buffer0+1;if(temp_buffer0=0) temp_buffer1+;flag=1;disp_temp5=dot_temptemp_buffer0&0x0f+0x30;temp_buffer1=(temp_buffer0>>4)|(temp_buffer1&0x07)<<4);disp_temp3=temp_buffer1%10+0x30;disp_temp2=temp_buffer

12、1%100/10+0x30;disp_temp1=temp_buffer1/100+0x30;if(disp_temp1=0x30) disp_temp1=' 'if(disp_temp1=0x30&&disp_temp2=0x30) disp_temp2=' 'if(flag)disp_temp0='-'elsedisp_temp0=' 'for(i=0;i<16;i+) write_(0x80+i);write_data(disp_chari);write_(0xc0+i);write_data(disp

13、_tempi); */void send() uchar Data,sdat; uchar i,j; if(!key) Data=0xaa; for(i=0;i<18;i+) write_data(table1i); delay1ms(200); write_reg(0x10,0x41); write_reg(0x11,0x21); write_reg(0x12,Data); write_reg(0x01,0x01);/置位发送请求位 delay1ms(500); sdat=read_reg(0x02); if(sdat&0x10!=0) for(j=0;j<17;j+)

14、write_data(table21); delay1ms(200); void receive() uchar temp,sdat; uchar i; sdat=read_reg(0x02); if(sdat&0x01=1)/接受缓冲不为空 temp=read_reg(0x22); delay1ms(50); write_reg(0x01,0x04);/清除缓存 for(i=0;i<19;i+) write_data(table3i); delay1ms(200); write_(0x01);/清屏 write_data(temp); void main() init_lcd(

15、); init_SJA1000NO1(); /void read_temp(); /display_temp(); while(1) send(); receive(); /二号单片机程序#include<reg51.h>#include"lcd.h"#include"ser.h"#include"SJA1000gai.h"#define key P22char table1="Message is sending"char table2="Sengding succeded"cha

16、r table3="Receiveing succeded"void send() uchar Data,sdat; uchar i,j; if(!key) Data=0xaa; for(i=0;i<18;i+) write_data(table1i); delay1ms(200); write_reg(0x10,0x42); write_reg(0x11,0x21); write_reg(0x12,Data); write_reg(0x01,0x01);/置位发送请求位 delay1ms(500); sdat=read_reg(0x02); if(sdat&

17、0x10!=0) for(j=0;j<17;j+) write_data(table21); delay1ms(200); void receive() uchar temp,sdat; uchar i; sdat=read_reg(0x02); if(sdat&0x01=1)/接受缓冲不为空 temp=read_reg(0x22); delay1ms(50); write_reg(0x01,0x04);/清除缓存 for(i=0;i<19;i+) write_data(table3i); delay1ms(200); write_(0x01);/清屏 write_data

18、(temp); void sendser() if(flag) ES=0; flag=0; SBUF=0xaa; while(!TI); TI=0; ES=1; void main() init_lcd(); init_SJA1000NO2(); init_ser(); while(1) send(); receive(); sendser(); 头文件DS1802.H#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P33;vo

19、id init_ds1820();void delay_us(uchar us);void write_byte(uchar);uchar read_byte();void delay5us();void delay5us();void delay_us(uchar us)/调用函数24us,每一次计数16us(11.0592M晶振) uchar i; for(i=0;i<us;i+);void init_ds1820() DQ=0; delay_us(29);/480us DQ=1; delay_us(3);/等待DS1820回应void write_byte(uchar dat) u

20、char i,temp; for(i=0;i<8;i+) temp=dat&0x01; DQ=0; delay5us(); if(temp) DQ=1; delay_us(2); DQ=1; dat>>=1; uchar read_byte() uchar i; bit j; uchar dat=0; for(i=0;i<8;i+) DQ=0;/下降沿,读时间隙开始 delay5us(); DQ=1;/释放总线 delay5us(); j=DQ; if(j) dat=dat|0x80; delay_us(2); dat>>=1; return(dat

21、);LCD.H#include<reg51.h>sbit RS=P25;sbit RW=P24;sbit lcden=P23;void delay1ms(int s);void write_(int comd);void write_data(int dat);void init_lcd();void delay1ms(int s) int i,j; for(i=0;i<s;i+) for(j=0;j<110;j+);void write_(int comd) RS=0; P1=comd;delay1ms(5); lcden=1; delay1ms(5); lcden=

22、0;void write_data(int dat) RS=1; P1=dat;delay1ms(5); lcden=1; delay1ms(5); lcden=0; void init_lcd() RW=0; lcden=0; write_(0x38); write_(0x0f); write_(0x06); write_(0x01); write_(0x80+0x01);SER.H#include<reg51.h>void init_ser();void ser() interrupt 4;char flag,a;void init_ser() TMOD=0x20;/设置定时器

23、1为工作方式2TH1=0xfd;TL1=0xfd;TR1=1;REN=1;SM0=0;SM1=1;EA=1;ES=1;void ser() interrupt 4RI=0;P1=SBUF;a=SBUF;flag=1;SJA1000GAI.H#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit CS=P27;/T1=P35;sbit WR=P36;sbit RD=P37;void nop();void write_reg(uchar);uchar read_reg(uchar);void init_SJA1000NO1();void init_SJA1000NO2();void nop();/写寄存器void write_reg(uchar adr,uchar date ) ALE=1; P0=adr; nop(); ALE=0; CS=0; n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论