⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myuart.c

📁 单片机CAN总线接口通讯程序
💻 C
字号:

#include <ADuC7026.h>
#include <sja1000.h>


#define uchar 	unsigned char


uchar	iRecData[10];
uchar   flagdata=0;	
uchar	dlc;



void Delay(int);
void Reset();
void rsvmessage();
void sendmessage(uchar,uchar,uchar,uchar,uchar,uchar,uchar,uchar,uchar,uchar);


void Init()
{
	
	GP1CON=0x11;
	GP2CON=0x22222222;
	GP3CON=0x22222222;
	GP4CON=0x22222222;


	XMCFG = 0x01;
	XM0CON = 0x01;
	XM0PAR = 0x70FF;

    COMCON0=0x080;
 	COMDIV0=0x088;
 	COMDIV1=0x000;
 	COMCON0=0x007;

	
	Reset();

	Delay(2000);

   	while((reg_CR&0x01)==0x00)    	//进入复位模式
	{	
		reg_CR=reg_CR|0x01;

	}

	reg_CDR=0x41;				 	 //时钟分频寄存器,控制CLKOUT的输出频率,BASIC模式,CLKOUT输出fosc/2
	reg_AMR=0xF0;				 	 //验收屏蔽寄存器,全部屏蔽
	reg_ACR=0x07;				 	 //验收代码寄存器,与报文标志码的高8位相等
	reg_BTR0=0x80;				 	 //总线时序寄存器0,系统的时钟周期Tscl是2Tclk同步跳转宽度3Tscl
	reg_BTR1=0xFA;				 	 //总线时序寄存器1,总线采样3次,时间段1=11Tscl,时间段2=8Tscl
	reg_OCR=0x1A;
		
	
	while((reg_CR&0x01)==0x01)
	{
		reg_CR=reg_CR&0x00;
		reg_CR=reg_CR|0x1E;		

	}
	

}

			  
void Delay(int dly)
	{	
		int j;
		for(;dly>0;dly--)
            for(j=0;j<50;j++){};
	} 

/****************************************sja1000软件复位************************************/

void Reset()
{
	GP0DAT=0x02000000;
	Delay(2000);
	GP0DAT=0x02020000;
}


void sendmessage(uchar a0,uchar a1,uchar a2,uchar a3,uchar a4,uchar a5,uchar a6,uchar a7,uchar a8,uchar a9)
{
	uchar	len=0;
	while(reg_SR&0X10);
	while((reg_SR&0X08)==0);
	while((reg_SR&0X04)==0);
	reg_Sendone=a0;
	reg_Sendtwo=a1;
	len=a1&0x0f;
	switch(len)
	{
		case 0x00: break;
		case 0x01: reg_Senddata1=a2;break;
		case 0x02: reg_Senddata1=a2;reg_Senddata2=a3;break;
		case 0x03: reg_Senddata1=a2;reg_Senddata2=a3;reg_Senddata3=a4;break;
		case 0x04: reg_Senddata1=a2;reg_Senddata2=a3;reg_Senddata3=a4;reg_Senddata4=a5;break;
		case 0x05: reg_Senddata1=a2;reg_Senddata2=a3;reg_Senddata3=a4;reg_Senddata4=a5;reg_Senddata5=a6;break;
		case 0x06: reg_Senddata1=a2;reg_Senddata2=a3;reg_Senddata3=a4;reg_Senddata4=a5;reg_Senddata5=a6;reg_Senddata6=a7;break;
		case 0x07: reg_Senddata1=a2;reg_Senddata2=a3;reg_Senddata3=a4;reg_Senddata4=a5;reg_Senddata5=a6;reg_Senddata6=a7;reg_Senddata7=a8;break;
		case 0x08: reg_Senddata1=a2;reg_Senddata2=a3;reg_Senddata3=a4;reg_Senddata4=a5;reg_Senddata5=a6;reg_Senddata6=a7;reg_Senddata7=a8;reg_Senddata8=a9;break;
		default: reg_Sendtwo=reg_Sendtwo&0xe8;reg_Senddata1=a2;reg_Senddata2=a3;reg_Senddata3=a4;reg_Senddata4=a5;reg_Senddata5=a6;reg_Senddata6=a7;reg_Senddata7=a8;reg_Senddata8=a9;break;
	}
	reg_CMR=0X01;
}

void rsvmessage()
{
	uchar	i;
	uchar	flag_IR;
	if(reg_SR&0x03)
	{
		flag_IR=reg_IR;
		if(flag_IR&0x01)
		{
			do{}while(reg_SR&0x10);
			iRecData[0]=reg_Rsvone;
			iRecData[1]=reg_Rsvtwo;
			dlc=iRecData[1]&0x0f;
			for(i=0;i<dlc;i++)
			{
				iRecData[i+2]=*(&reg_Rsvdata1+i);
			}
			reg_CMR=0x04;
			flagdata=1;
		}
		else
		{
			if(reg_SR&0x02)	reg_CMR=0x0c;
		}
	}
}


uchar hex2ascii(uchar toconv) 
{
	if (toconv<0x0A)							
	{									   		
		toconv += 0x30;			  				
	}									   
	else 								    
	{								
		toconv += 0x37;
	}
	
	return (toconv);
}


void senddata(uchar to_send) {
	while(!(0x020==(COMSTA0 & 0x020))){}
		COMTX = 0x0A;							//Output LF 
	while(!(0x020==(COMSTA0 & 0x020))){}
		COMTX = 0x0D;							//Output CR 
	while(!(0x020==(COMSTA0 & 0x020))){}
		COMTX = hex2ascii ((to_send >> 4) & 0x0F);						
	while(!(0x020==(COMSTA0 & 0x020))){}
		COMTX = hex2ascii (to_send & 0x0F);
}


void main()
{	
	int k=1;
	uchar temp1=1;
	Init();

	sendmessage(0x39,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x06,0x08);
	Delay(1);
	while(temp1)
	{
	sendmessage(0x37,0x08,k,0x02,0x03,0x05,0x05,0x06,0x06,0x08);
	Delay(100000);
	Delay(100000);
    Delay(100000);
	k++;
	if(k==100)k=1;
}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -