- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PIC单片机C语言编程实例五
PAGE
PAGE 163
第9章 PIC16F87X在CAN通信中的应用
9.3 软件清单
// ========CAN通信程序=======
#include pic.h
#include pic16f87x.h
#include mcp2510.h // MCP2510寄存器定义
// =========常数和变量定义=========
#define READ 0x03 // 读MCP2510指令代码
#define WRITE 0x02 // 写MCP2510指令代码
#define RESET 0xC0 // 复位MCP2510指令代码
#define RTS 0x80 // MCP2510请求发送指令代码
#define STA2510 0xA0 // 读MCP2510状态指令代码
#define BITMOD 0x05 // MCP2510位修改指令代码
int a[12]; // SPI发送或接收数据寄存器
int b[8]; // 发送或接收的数据
int c[8]; // 发送或接收的数据
int i; // 临时变量
int count; // 发送接收计数器
int count1=0; // for test
int RecID_H=0;
int RecID_L=0;
int DLC=8;
void SPIINT();
void TMR1INT();
void CCP1INT();
void SPIEXCHANGE(int count);
void WAIT_SPI();
void RESET2510();
int RD2510(int adress,int n);
void WR2510(int adress,int n);
void RTS2510(int RTSn);
int GETS2510();
void BM2510(int adress,int mask,int data);
void SETNORMAL();
void TXCOMPLETE(int adress);
void TXMSG(int DLC);
int RXMSG();
void INIT2510();
void INIT877();
void INITSPI();
void ACK();
void wait();
// ========主程序=======
main(void)
{
int l,detect=0;
SSPIE=1;
TMR1IE=1;
CCP1IE=1;
CCP2IE=1;
PEIE=1;
ei(); // 开中断
INIT877(); // 初始化PIC16F877芯片
INITSPI(); // 初始化SPI接口
INIT2510(); // 初始化MCP2510芯片
flag1=0;
flag2=0;
CCP1CON=0x05;
CCP2CON=0x04;
while(1) {
RXMSG();
TXMSG(8);
}
}
// ========中断服务程序=======
// SPI中断服务子程序
void SPIINT()
{
SSPIF=0;
a[i++]=SSPBUF; // 数据暂存a[]中
count-=1;
if(count0) SSPBUF=a[i];// 未发送完,继续
else RE2=1; // 否则,片选信号置高电平
return;
}
// TMR1中断服务子程序
void TMR1INT()
{
TMR1IF=0;
T1CON=0;
if(!flag1){
TMR1H=0xfe; // 512 μs 脉冲宽度
TMR1L=0x00;
T1CON=0x01;
PORTD=0xff; // 输出所有通道
flag1=1;
}
else {
flag1=0;
PORTD=0;
T1CON=0;
}
return;
}
// CCP1中断服务子程序
void CCP1INT()
{
CCP1IF=0;
T1CON=0x01;
return;
}
// CCP2中断服务子程序
void CCP2INT()
{
CCP2IF=0;
T1CON=0x01;
return;
}
// 中断入口,保护现场,判中断类型
void interrupt INTS()
{
di();
if(TMR1IF) TMR1INT(); // 定时器TMR1中断
else if(
您可能关注的文档
最近下载
- 第七章swing事件模型.pdf
- 公司行政岗位年终述职报告.pptx VIP
- 81404综采工作面作业规程6.pdf VIP
- 小学英语新人教版PEP三年级上册Unit 1 Making friends Part A第1课时教学课件(2024秋).pptx
- 洗煤厂年入洗60万吨原煤扩建项目可行性分析报告.pdf
- 车辆自适应巡航系统性能要求及测试方法.pdf VIP
- GB_T 3880.3-2024一般工业用铝及铝合金板、带材 第 3 部分尺寸偏差.docx VIP
- 半导体管图示仪操作说明.xls
- 东软NetEye防火墙V3.2.4 SNMP MIB参考指南.pdf VIP
- 广西三甲医院各地市分布.docx VIP
文档评论(0)