AVR单片机Can总线通信控制程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//================================================== =================================
// 工程名称:汽车041项目目标板3-6程序
// 功能描述:CAN通信,继电器控制,AD采集
// IDE环境: ICCAVR
// Init2515: 2515初始化程序
//================================================== =================================
#include "iom16v.h"
#include "bit.h"
#include "macros.h"
#include "stdio.h" //标准输入输出头文件
#include "2515.h"
#include "SPI_Ctrl.h"
#include "Function.h"
#include "CAN0.h"
#include "MAX518.h"
#include "AD.h"
#pragma interrupt_handler Extint0:2
#pragma interrupt_handler timer1_isr:9
#define uint unsigned int
#define uchar unsigned char
/******************外部中断常量******************/
#define GLOBAL 7 //全局中断位宏定义
#define EXTINT0 6 //外部中断0位宏定义
#define H_SRCLK PORTD|=(1<<6) //上升沿移位
#define L_SRCLK PORTD&=~(1<<6) //下降沿不移位
#define H_SER PORTD|=(1<<7) //595串行数据输
#define L_SER PORTD&=~(1<<7) //595串行数据输
#define H_RCLK PORTD|=(1<<5) //595数据锁存放开
#define L_RCLK PORTD&=~(1<<5) //595数据锁存
uchar Flag=0,Flag1=0,pp=0;
uchar Receive_Data=0,Start_Data=0;
uchar CAN_TX_Buf[8],CAN_RX_Buf[8];
//************************************************************* //* 函数说明:MCU端口初始化
//* 输入:无
//* 输出:无
//* 调用函数:
//************************************************************* void port_init(void) //IO端口初始化
{
DDRA=0x00;
PORTA=0x00;
DDRB=0xff;
PORTB=0xff;
DDRC=0xff;
PORTC=0xff;
DDRD=0xff;
PORTD=0xff;
}
/*******************************************
函数名称: Int_init
功能: 中断初始化
参数: 无
返回值 : 无
/********************************************/ void Int_init(void)
{
SREG|=BIT(GLOBAL); //使能全局中断
MCUCR|=0x02; //外部中断0采用下降沿触发 GICR|=BIT(EXTINT0);//使能外部中断0
DDRD&=~(BIT(PD2)); //配置中断管脚为输入
PORTD|=BIT(PD2); //使能中断管脚的上拉
}
void timer1_init(void)
{
TCCR1B=0x04;//256分频
TCNT1H=0Xff;//赋初值
TCNT1L=0Xfe;//赋初值
TIMSK|=0x04;//中断使能
SREG|=0x80;//总中断开关
}
/*******************************************
函数名称: WR_74ls595(uchar data)
功能: 控制继电器
/********************************************/
void WR_74ls595(uchar data)
{
uchar i,dat;
L_RCLK;
for(i=0;i<8;i++)
{ L_SRCLK;
if(data&0x80) H_SER;
else L_SER;
H_SRCLK;
data<<=1;
}
H_RCLK;
L_RCLK;
}
/*******************************************
函数名称: Data_get()
功能:对上位机发过来的数据分析后返回需要设置的故障代码
/********************************************/
void Data_get()
{
if(CAN_RX_Buf[0]==0x01) Start_Data=Start_Data|0x01;
if(CAN_RX_Buf[0]==0x00) Start_Data=Start_Data&0xfe;
if(CAN_RX_Buf[1]==0x01) Start_Data=Start_Data|0x02;