打印
[CAN-bus/DeviceNet]

can_232串口程序(c)

[复制链接]
6489|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nnyt|  楼主 | 2007-7-17 15:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<REG52.H>                              //单片机头文件
#include<SJA1000_nnyt.H>                       //SJA存储器定义头文件
#include<SJA1000_nnyt.C>                       //SJA子程序文件
/*************************函数声明*******************************************/
void Init_T0(void);                            //初始化单片机T0
void Sja_1000_Init(void);                      //初始化SJA
//*******************************************************************
bit flag_sec;                                  //发送命令标志
unsigned char data  send_data[10],rcv_data[10];//发送和接收数组
unsigned char       sec_data,second;           //定时器记数变量,发送数据变量
unsigned char data  Tmod_data;                 //定时器T0工作方式变量
unsigned char bdata flag_init;                 //中断寄存器数据保存变量
sbit rcv_flag=flag_init^0;                     //接收中断标志
sbit err_flag=flag_init^2;                     //错误中断标志
sbit P2_0=P2^0;
sbit P3_4=P3^4;
sbit LED=P3^5;                                 //指示灯

//***********************************************************
void ex0_int(void) interrupt 0 using 1         //外部中断0
{
    SJA_BCANAdr=REG_INTERRUPT;                 //指针指向中断寄存器
    flag_init=*SJA_BCANAdr;                    //保持中断寄存器值
}
//***********************************************************
void T0_int(void) interrupt 1 using 2          //定时器T0中断服务子程序
{
    TR0=0;                                     //关闭定时器T0
    sec_data--;                                //秒计时变量减一
    if(sec_data==0)                            //2.25秒时间到了吗?
    {
        sec_data=0x50;                         //重新赋值
        TH0=0x80;
        TL0=0x60;
        flag_sec=1;                            //设置标志位
        second++;                              //发送的数据加一
    }
    TR0=1;                                     //启动定时器T0
}
//************************************************************
void Init_T0(void)                             //初始化定时器0
{
Tmod_data=TMOD;
Tmod_data&=0xf0;
Tmod_data|=0x01;
TMOD=Tmod_data;                                //定时器T0工作方式设置
TH0=0x80;
TL0=0x60;                                      //定时器T0初值设置
TR0=1;                                         //开放定时器T0
sec_data=0x20;                                 //记数值设置
second=0x00;                                   //发送数据初始化清零
}
//***********************************************************
void Sja_1000_Init(void)
{
    BCAN_ENTER_RETMODEL();                     //进入复位
    BCAN_SET_BANDRATE(0x0b);                   //800K
    BCAN_SET_OBJECT(0xaa,0xff);                //设置地址ID:557
    BCAN_SET_OUTCLK(0xaa,0x48);                //设置输出方式,禁止COLOCKOUT输出
    BCAN_QUIT_RETMODEL();                      //退出复位模式
    SJA_BCANAdr=REG_CONTROL;                   //地址指针指向控制寄存器
    *SJA_BCANAdr|=0x1E;                        //开放错误接收发送中断
}

//*******************************************************************
void main(void)
{
    P2_0=0;                                    //SJA1000退出硬件复位模式
    Sja_1000_Init();                           //initialize Sja100
    Init_T0();                                   //initialize T0
    PX0=1;                                     //外部中断0高优先级
    IT0=1;                                     //开放T0中断
    EX0=1;                                     //外部中断0开放
    ET0=1;                                     //开放外部中断0
    EA=1;                                      //开放全局中断
    P3_4=0;                                    //点亮指示灯
    flag_init=0x00;                            //变量清零

    while(1)
    {
        if(rcv_flag)                          //if there is receive interrupt                                
         {    rcv_flag=0;                       //接收标志位清零
            BCAN_DATA_RECEIVE(rcv_data);      //接收数据
            BCAN_CMD_PRG(0x04);               //释放接收缓冲区
         }
        if(flag_sec)                             
         {    flag_sec=0;                          //发送位清零                            
            send_data[0]=0xAA;                  //发送数据到ID为550的节点        
            send_data[1]=0x08;                //发送数据帧,8个字节长度
            send_data[2]=0x05;                //第一个字节内容为数据05H
            send_data[3]=second;              //第二个字节内容为变量值
            BCAN_DATA_WRITE(send_data);       //发送数据
            BCAN_CMD_PRG(0x01);               //置位发送请求位
            LED=~LED;
         }
        if(err_flag)                          //错误中断
         {     err_flag=0;                       //错误标志位清零
            Sja_1000_Init();                  //初始化SJA
         }
    }
}


CAN开发板使用说明

1、  实验板分为主节点和从节点;CAN通讯波特率设置为800K;最高可设置为1M,用户根据自己的需要进行设置.
2、  从节点每隔2.25秒钟向主节点发送一组8个字节的数据,数据格式为:05H  i  00H 00H 00H 00H 00H 00H ;其中变量I的范围是00H~FFH,他随着每发送一次数据而累加递增1;从节点指示灯1表示实验板工作正常,指示灯2以0.44Hz的频率闪烁,表示发送数据正常.
3、  主节点的ID为550,每当收到从节点发送的数据后,主节点便以9.6K波特率把收到的数据通过232串口发送给计算机,计算机上安装的用户界面(串口调试助手),可以实时显示接收到的数据,此数据用户可以存储于计算机上;主节点指示灯1表示实验板工作正常,指示灯2以1Hz的频率闪烁(如果是调用c语言程序,则以0.44Hz频率闪烁),表示接收和串口发送数据正常.
4、  单片机为AT89c51,适用于实验板(电源没有隔离); 主控单片机为ADuC812,适用于工程应用(电源隔离):ADuC812通过自带的12位精度的A/D采集传感器信号后,将采集结果通过can总线传输到“主控节点”,主控节点将数据通过串口传输给计算机;指示灯显示状态;可以通过串口给主控节点发送指令,来完成对某一节点的控制;通过串口下载程序到单片机ADuC812(详见ADuC812用户手册),可以不用编程器;
5、  串口调试助手的页面设置详见下图所示:

用户严格按照上图所示进行设置;
6、使用CAN开发板的用户请务必注意以下事项:
    A、开发板的供电电压为12V,插头处有+12V和GND标志;
B、SJA1000的地址为0X7E00;
C、注意P2_0=0;以便使SJA1000退出复位状态;
D、主节点的地址为550,通讯波特率为800K;
E、RS232串口三根线说明:白色线为地线;红色线为发送线;黑色线为接收线;
感谢您选用CAN开发板!真诚的希望您在短时间内掌握CAN的基本知识,如有任何问题请发至nnyt@tom.com,我将尽快给您答复;

本人同时提供can实验开发板给初学者
1   CAN控制器为SJA1000,驱动器为TJA1050,电源隔离;
2   提供详尽的源程序,可根据用户需求编写程序
联系我:13671387011(短信联系,QQ详谈)
       QQ: 531706356

相关帖子

沙发
nnyt|  楼主 | 2007-7-17 15:54 | 只看该作者

需要更多资料,联系我,发邮箱:nnyt@tom.com

需要更多资料,联系我,发邮箱:nnyt@tom.com

使用特权

评论回复
板凳
iamxzg| | 2007-7-17 21:19 | 只看该作者

索取基于SJA1000控制的CAN总线的更多资料

    哈,顶一个~!
    真的是无巧不成书.
    今天刚刚开始弄基于SJA1000的CAN总线控制,在网上找了好久的相关程序,没找着,看到你的贴就是2007/07/17,差点把我兴奋而倒.能发一些相关资料给我吧?恳请赐教,不胜感激~!

使用特权

评论回复
地板
nnyt|  楼主 | 2007-7-18 14:50 | 只看该作者

告诉我您的邮箱

告诉我您的邮箱

使用特权

评论回复
5
nnyt|  楼主 | 2007-7-19 10:05 | 只看该作者

can开发板图片:89c52+sja1000+tja1040

使用特权

评论回复
6
nnyt|  楼主 | 2007-7-19 10:06 | 只看该作者

can开发板图片:aduc812+sja1000+tja1040,带有12位ad

使用特权

评论回复
7
nnyt|  楼主 | 2007-8-4 10:43 | 只看该作者

ding ok

ding

使用特权

评论回复
8
soooooog| | 2007-8-13 17:08 | 只看该作者

为什么要2.25秒发送一组数据

为什么要2.25秒发送一组数据,怎么算出来的?
在这个程序中什么情况下会接收呢?
和计算机的通信怎么没有显示出来呢?
song-ql@163.com

使用特权

评论回复
9
nnyt|  楼主 | 2007-8-24 09:53 | 只看该作者

can,sja1000

冒个泡泡

使用特权

评论回复
10
太阳之母| | 2007-8-26 13:59 | 只看该作者

嘿嘿

LZ想挣点小钱啊!建议板子上RS232连接件整得结实一点才好呀!

使用特权

评论回复
11
nnyt|  楼主 | 2007-8-31 19:05 | 只看该作者

说明

绝对解释

使用特权

评论回复
12
nnyt|  楼主 | 2007-9-5 10:44 | 只看该作者

rs232/422/485转can,8路12位adc,2路12位da

rs232/422/485转can,8路12位adc,2路12位da

使用特权

评论回复
13
nnyt|  楼主 | 2007-9-5 11:10 | 只看该作者

rs232/422/485转can,8路12位adc,2路12位da

rs232/422/485转can,8路12位adc,2路12位da


1、电路板的供电电压为+5.7V,直流。
2、使用本开发板前,先要跳线选择好rs232,rs422,rs485功能。设置如下:

A、 外接rs422或rs485时,J6的2,3引脚短路,同时将J1,J4短路选择到TXD422和RXD422,可以外接传感器的电压,电压大小根据传感器需要而定.
注意:不选择外接rs422或rs485传感器时,不要给电路板供电压。
  
B、 外接rs232时,J6的1,2引脚短路,同时将J1,J4短路选择到TXD232和RXD232。
注意:将aduc812设置为通过rs232程序下载模式时,请选择跳线至rs232功能:通过短路端子将 拉到低电平,即S4对地短路。程序下载完毕后,恢复 高电平,以便程序运行。
3、P2^6高电平选择adc采集功能,低电平选择rs422或rs485功能,通过短路端子跳线实现选择。
4、BASIC_CAN模式(也有PELI-CAN模式),can波特率为800k(可以根据需要设置),can的id详见开发板标签。
5、某个can节点接收到  AA  AA  BB  XX  XX。 XX表示"任意数值",前两个数值AA表示任意相同的两个数值,BB表示第三个数值和前两个数值不同,则启动rs422,rs485或者adc采集功能(由第3点说明设置相应功能)。

例如:某个can节点接收到数据:01 01 02 XX XX,则启动相应rs422,rs485或者adc采集功能。
6、某个can节点接收到  BB  AA  AA  XX  XX。XX表示"任意数值",第二,三个AA表示任意相同的两个数值,BB表示第一个数值和后两个数值不同,则关闭rs422,rs485或者adc采集功能(由第3点说明设置相应功能)。

例如:某个can节点接收到数据:01 02 02 XX XX,则关闭相应rs422,rs485或者adc采集功能。

7、选择rs422或rs485时,串口的通讯波特率为9.6k(可以根据需要设定)。
8、adc采集的电压范围:0V~4.096V(可以设置为0~5V)。
本人出售can开发板,并且根据您的需要编写can程序,qq:531706356,短信发送至:13671387011,谢谢

使用特权

评论回复
14
nnyt|  楼主 | 2007-9-22 16:43 | 只看该作者

ding

ding

使用特权

评论回复
15
huziwang| | 2007-9-24 13:40 | 只看该作者

SAE J1939

发现这有关J1939 的资料很少,建议做一个这方面的专题!

使用特权

评论回复
16
nnyt|  楼主 | 2007-10-12 12:42 | 只看该作者

J1939

好的

使用特权

评论回复
17
nnyt|  楼主 | 2007-11-3 18:32 | 只看该作者

sja1000

冒个泡

使用特权

评论回复
18
nnyt|  楼主 | 2007-11-10 20:11 | 只看该作者

89c52+sja1000+tja1040

89c52+sja1000+tja1040

使用特权

评论回复
19
dgpolice| | 2007-11-13 19:54 | 只看该作者

做的挺好!

冒泡支持一下,卖多少钱啊

使用特权

评论回复
20
anjing620| | 2007-11-19 09:16 | 只看该作者

回复

我想请问一下SJA1000_nnyt.H SJA1000_nnyt.C这两个函数的内容能不能也贴出来共享一下或者是发给我参考参考啊,我目前正在做这个,但是不知从何入手。我的邮箱:niehuifang153@sohu.com

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

84

帖子

0

粉丝