实验说明:若初始化SJA1000控制器成功,则LCD上显示susecss,否则显示error 实验步骤:
1、打开keil软件,建立工程,编辑C文件,配置并编译连接生成.Hex文件 2、将该.Hex文件烧写入单片机 3、观察实验结果,并思考。
实验1程序:
SJA1000_Init.C:
/********************************************************************************
文 件 名:CAN-RS232网桥.C
功 能:本网桥CAN1节点与上位机或其他CAN节点通信, 单 位:广西工学院电子信息与控制工程系 作 者:秦宗伟
编辑日期:2011年04月14日
*********************************************************************************/
#include /*============================宏定义================================*/ #define uchar unsigned char #define LCD P0 //LCD数据口 /*============================控制口定义=============================*/ sbit RS=P3^6; //LCD数据命令口 1:数据 0:命令 sbit RW=P3^7; //LCD读写控制口 1:读 0:写 sbit EN=P2^6; //LCD使能端 sbit CS=P2^7; //SJA1000的片选端 /*==============================函数声明============================*/ void Delay(uchar t1,uchar t2); //延时 sbit RST=P2^3; //SJA1000复位引脚,低电平有效 void SJA1000_Init(void); //初始化SJA1000 void Lcd_WD(uchar dat); //写数据到LCD void Lcd_WC(uchar com); //写命令到LCD void Lcd_Init(void); //初始化LCD void WriteString(uchar *s); //写字符串到LCD /*=============================子函数定义区=========================*/ /*---------------------------------------------------------------------------------- 名称:Delay 功能:延时 参数:uchar t1 uchar t2 返回值:无 -----------------------------------------------------------------------------------*/ void Delay(uchar t1,uchar t2) { for(;t1>0;t1--) for(;t2>0;t2--); } /*---------------------------------------------------------------------------------- 名称:SJA1000_Init 功能:初始化SJA1000 参数:无 返回值:无 -----------------------------------------------------------------------------------*/ void SJA1000_Init() { uchar i; MODE=0x01; //设置方式寄存器,进入复位模式 CDR=0x88; //设置时钟分频寄存器,选择PeliCAN模式关闭时钟输出 IER=0x0D; //设置中断允许寄存器,开放(发送,溢出,错误警告)中断) ACR0=0x00; //设置验收代码寄存器 ACR1=0x20; //本节点号为01 ACR2=0x00; ACR3=0x00; AMR0=0x00; //没有屏蔽 AMR1=0x00; //没有屏蔽 AMR2=0xff; //屏蔽 AMR3=0xff; //屏蔽 BTR0=0x00; //设置总线定时器0 BTR1=0x1C; //设置总线定时器1,16MHz,500kbps OCR=0xAA; //设置输出控制寄存器,正常输出 TXERR=0x00; //写指令清除发送错误计数寄存器 i=ECC; //读指令清除错误代码捕捉寄存器 MODE=0x00; //设置单滤波方式,并返回工作模式 MODE=0x00; Delay(255,255); //注意:硬件测试表明此句是必不可少的 ,必须有足够的延时以确保SJA1000可靠复位 } /*--------------------------------------------------------------------------------------- 名称:Lcd_WD 功能:向LCD写数据 参数:无 返回值:无 ----------------------------------------------------------------------------------------*/ void Lcd_WD(uchar dat) { RS=1; //数据 RW=0; //写 EN=1; //EN一个下降沿数据就被写入LCD LCD=dat; Delay(1,100); EN=0; } /*--------------------------------------------------------------------------------------- 名称:Lcd_WC 功能:向LCD写命令 参数:无 返回值:无 ----------------------------------------------------------------------------------------*/ void Lcd_WC(uchar com) { RS=0; //命令 RW=0; //写 EN=1; //EN一个下降沿命令就被写入LCD LCD=com; Delay(1,100); EN=0; } /*--------------------------------------------------------------------------------------- 名称:Lcd_Init 功能:初始化LCD 参数:无 返回值:无 ----------------------------------------------------------------------------------------*/ void Lcd_Init() { CS=1; //关SJA1000片选 RS=0; RW=0; EN=0; Lcd_WC(0x38); //功能设定选择8bit数据流 Lcd_WC(0x08); Lcd_WC(0x01); //清屏 Lcd_WC(0x06); //光标的移动右移 Lcd_WC(0x0C); //开显示,关游标,无反白 CS=1; RS=1; //硬件测试表明此句一定要 RW=1; //硬件测试表明此句一定要 EN=1; } /*---------------------------------------------------------------------------------------- 名称:WriteString 功能:向LCD写字符串 参数:无 返回值:无 ----------------------------------------------------------------------------------------*/ void WriteString(uchar *s) { uchar i; if(*s=='\\0') return; for(i=0;;i++) { if(*(s+i)=='\\0') break; Lcd_WD(*(s+i)); } } /*----------------------------------------------------------------------------------------- 名称:main 功能: 参数:无 返回值:无 ------------------------------------------------------------------------------------------*/ void main() { uchar MOD; uchar *s1=\"susecss\"; uchar *s2=\"error\"; CS=0; Delay(255,255); RST=1; Delay(255,255); RST=0; Delay(255,255); RST=1; Delay(255,255); CS=1; Delay(255,255); Lcd_Init(); MODE=0x01; Delay(255,255); MOD=MODE; if((MOD&0x01)==0x01) SJA1000_Init(); MOD=SR; Delay(255,255); Lcd_WC(0x80); if(MOD==0x0C) WriteString(s1); else WriteString(s2); while(1); } PeliCAN.h : #define SJA_ADR 0x4800 //基址 #define MODE XBYTE[SJA_ADR+0] //模式寄存器 #define CMR #define SR #define IR #define IER #define BTR0 #define BTR1 #define OCR #define TEST #define ALC #define ECC #define ELWR #define RXERR #define TXERR #define TXSFF #define TXID1 #define TXID2 #define TXDATA1 #define RXDATA1 #define ACR0 #define ACR1 #define ACR2 #define ACR3 #define AMR0 #define AMR1 #define AMR2 #define AMR3 #define CDR XBYTE[SJA_ADR+1] XBYTE[SJA_ADR+2] XBYTE[SJA_ADR+3] XBYTE[SJA_ADR+4] XBYTE[SJA_ADR+6] XBYTE[SJA_ADR+7] XBYTE[SJA_ADR+8] XBYTE[SJA_ADR+9] XBYTE[SJA_ADR+11] XBYTE[SJA_ADR+12] XBYTE[SJA_ADR+13] XBYTE[SJA_ADR+14] XBYTE[SJA_ADR+15] XBYTE[SJA_ADR+16] XBYTE[SJA_ADR+17] XBYTE[SJA_ADR+18] XBYTE[SJA_ADR+19] XBYTE[SJA_ADR+19] XBYTE[SJA_ADR+16] XBYTE[SJA_ADR+17] XBYTE[SJA_ADR+18] XBYTE[SJA_ADR+19] XBYTE[SJA_ADR+20] XBYTE[SJA_ADR+21] XBYTE[SJA_ADR+22] XBYTE[SJA_ADR+23] XBYTE[SJA_ADR+31] //命令寄存器 //状态寄存器 //中断寄存器 //中断使能寄存器 //时序寄存器0 //时序寄存器1 //输出控制寄存器 //测试寄存器 //仲裁丢失捕捉寄存器 //错误代码捕捉寄存器 //错误报警限额寄存器 //RX错误计数器 //TX错误计数器 //TX报文缓冲区(操作模式下)) //TX ID1(操作模式下) //TX ID2(操作模式下) //TX DATA1(操作模式下) //RX DATA1(操作模式下) //验收代码寄存器(复位模式下)) //验收代码寄存器(复位模式下)) //验收代码寄存器(复位模式下) //验收代码寄存器(复位模式下) //验收屏蔽寄存器 //验收屏蔽寄存器 //验收屏蔽寄存器 //验收屏蔽寄存器 //时钟分频器 因篇幅问题不能全部显示,请点此查看更多更全内容