51单片机的can总线通讯程序

发布者:大树下的大白菜y最新更新时间:2016-10-21 来源: eefocus关键字:51单片机  can  总线通讯 手机看文章 扫描二维码
随时随地手机看文章
#i nclude                               //单片机头文件

#i nclude                        //SJA存储器定义头文件

#i nclude                        //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

                }

        }

}

关键字:51单片机  can  总线通讯 引用地址:51单片机的can总线通讯程序

上一篇:步进电机加速-匀速-减速运行程序(C51源程序)
下一篇:按键处理与按键防抖动例子

推荐阅读最新更新时间:2024-03-16 15:16

80C51单片机的startup.a51程序模块的作用
80C51在电源重置后(Power On Reset)所执行的第一个程序模块并不是使用者的主程序main(),而是一个隐藏在KEIL-C51标准链接库中称为startup.a51的程序模块。 startup.a51的主要工作是把包含idata、xdata、pdata在内的内存区块清除为0,并且初始化递归指针。接着startup.a51被执行的仍然是一个隐藏在KEIL-C51标准链接库中称为init.a51的程序模块。而init.a51的主要工作则是初始化具有非零初始值设定的变量。 在完成上述的初始化程序之后,80C51的控制权才会交给main()开始执行使用者的程序。
[单片机]
51 单片机实现温度计
通过温度感应元件 DS18B20 能感应周围的温度,然后再通过数码管显示当前的温度 它是这个样子的 当前我在室内,我开了取暖器,它显示温度是 下面是这个程序的源代码 /***************************************************************************** 程序功能:实时采集当前环境温度值,并显示于数码管上 *****************************************************************************/ #include reg52.h #define uchar unsigned c
[单片机]
51 单片机实现温度计
基于51单片机的串口中断发送数据帧
很少看到有资料写如何以中断的方式发送一帧数据,如果以等待的发送数据帧,对高速运行的单片机来说是很浪费时间的,下面就介绍一种使用中断方式发送数据帧,操作平台采用51 mcu 首先定义一个数据帧的结构体,该结构体可以做为一个全局变量,所有的发送都要经过这个结构体: //结构体 struct { char busy_falg;//忙标志,若在发送数据时置位1,即在开始发送置位1,发送结束置位0 int index;//索引,指向需要发送数组的位置 int length;//整个数据帧的长度 char *buf;//指向需要发送的数据帧,建议为全局变量,否则一旦开始发送,必须等到发送结束,即判断busy_falg为0
[单片机]
基于<font color='red'>51单片机</font>的串口中断发送数据帧
51单片机~流水灯的四种演示方法
简单粗暴法:(直接将地址写出) 利用左移简化语句: 利用 库函数 :(先讲解一下这个库函数) 之后写我们的代码(0X01是全亮一暗,稍微改动了一下): 4. 数组灵活操控:(先讲解 单片机 的数组 code只读不可写用来节约内存) 之后是代码:
[单片机]
<font color='red'>51单片机</font>~流水灯的四种演示方法
80C51单片机的定时器/计数器介绍
定时器/计数器介绍 定时/计数器T0和T1分别是由两个8位的专用寄存器组成,即定时/计数器T0由TH0和TL0组成,T1由TH1和TL1组成。此外,其内部还有2个8位的特殊功能寄存器TMOD和TCON,TMOD负责控制和确定T0和T1的功能和工作模式,TCON用来控制T0和T1启动或停止计数,同时包含定时/计数器的状态。 TF1:定时器1溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除。或用软件清除。 TF0:定时器0溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除,或用软件清除。 在现在很多新MCU中,不只有两个 定时/计数器,例如STC15系列就有四个定时/计数器,但是在使用上操作上是大同小异的。
[单片机]
80C<font color='red'>51单片机</font>的定时器/计数器介绍
51单片机玩转物联网基础篇02-点亮LED灯,实现跑马灯效果
前言 上一节,我们完成了51单片机开发环境的搭建,本节我们正式学习51单片机,编程语言的学习,通常是从第一个 hello world 开始,而点灯实验便是单片机学习的开始。 一、基础知识 1.单片机最小系统 一个最小的单片机系统,需要有单片机、电源电路、晶振电路、复位电路组成,这几部分存在就可以使单片机正常工作,如果需要频繁的下载程序,还需增加下载电路。 (1) 单片机 首先,我们先介绍下单片机, 引脚序号名称说明 以下为I/O端口: P0: 第一功能:8位,漏极开路的双向I/O口。用时要加上拉电阻,可驱动8个LS型负载。 第二功能:低8位地址线和8位数据线分时复用;此时为真正的双向三态口。 P1: 8位准
[单片机]
<font color='red'>51单片机</font>玩转物联网基础篇02-点亮LED灯,实现跑马灯效果
基于51单片机的数字音乐盒C语言驱动程序
SPK EQU P3.7 ; 蜂鸣器所在端口 COUNT50 EQU 39H SEC EQU R0 MIN EQU R1 SEG EQU P2 NUM EQU P0 SEG7 EQU 30H SEG6 EQU 31H SEG5 EQU 32H SEG4 EQU 33H SEG3 EQU 36H SEG1
[单片机]
关于51单片机外部中断响应
外部中断方式最好设为下降沿方式,特别是中断引脚接按键的情况。 外部下降沿中断:SETB IT0。每个机器周期都由硬件对引脚自动采样,若连续在2个周期采样到电平从高到低,则认定有中断请求,IE0=1。IE0会一直保持到该中断请求被CPU响应,响应前都不会自动清零,只有在响应后硬件才自动将IE0清零IE0=0。 外部低电平中断:CLR IT0。当中断引脚为低电平时,并保持一个机器周期,硬件自动置IE0=1。如果在下一个周期采样到中断引脚为高电平时,硬件自动将IE0清0。中断标志位自动清0条件:下降沿中断只有CPU响应中断同时才会清0,否则一直保持。低电平中断:任何时候当外部中断引脚为低电平时,IE0=1;为高电平时,IE0=0,所以不
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved