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

📄 main.c

📁 用Freescale的8位单片机做的RS232-CAN的通讯转换板.包含固件程序,原理图,PCB图和一个说明文件.
💻 C
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GZ32.h> /* include peripheral declarations */
#include <stdio.h>

#include "system.h"
#include "can.h"
#include "main.h"
#include "sci.h"
#include "time.h"

int nTime;

extern unsigned char cSCIRecBuf[];		//接收缓冲区,收到的数据会存在这里
extern unsigned char cSCITraBuf[];		//发送缓冲区,把要发送的数据存在这里
extern unsigned char cSCITraLen;	//发送数据长度寄存器
extern unsigned char cSCIRecLen;


extern unsigned char bCANState;

void main(void) 
{

	CONFIG1_COPD = 1;		//禁止看门狗
	
	/* include your code here */

	
	InitSystem();
	InitTimer();
	InitSCI();
	InitCAN();
	
	EnableInterrupts;
	
	PTA = 0x000;
	Delay(500);
	LED0 = 1;
	Delay(500);
	LED1 = 1;
	LED0 = 0;
	Delay(500);
	LED2 = 1;
	LED1 = 0;
	Delay(500);
	LED3 = 1;
	LED2 = 0;
	Delay(500);
	LED3 = 0;
	
	nTime = 0;

	for(;;) 	//main loop	
	{
		if(nTime > 10000)
		{
			LED0 = !LED0;
			nTime = 0;
		}
		else
		{
			nTime++;
		}
		
		if(SCIState_RecFull)	//SCI有数据到达
		{
			Communication(cSCIRecBuf,cSCIRecLen);
			
			SCIState_RecFull = 0;
		}
		
		

		if(SCIState_RecCRC)
		{
			cSCITraBuf[0] = 'E';	//错误
			cSCITraBuf[1] = 'C';
			cSCITraBuf[2] = 'R';
			cSCITraBuf[3] = 'C';
			cSCITraBuf[4] = ' ';
			cSCITraBuf[5] = 'E';
			cSCITraBuf[6] = '\n';
			cSCITraLen = 7;
			SCC2_SCTIE = 1;
			
			SCIState_RecCRC = 0;
		}
		
		if(SCIState_RecOverTime)
		{
			cSCITraBuf[0] = 'E';	//错误
			cSCITraBuf[1] = 'O';
			cSCITraBuf[2] = 'V';
			cSCITraBuf[3] = 'E';
			cSCITraBuf[4] = 'R';
			cSCITraBuf[5] = 'T';
			cSCITraBuf[6] = 'I';
			cSCITraBuf[7] = 'M';
			cSCITraBuf[8] = 'E';
			cSCITraBuf[9] = '\n';
			
			cSCITraLen = 10;
			SCC2_SCTIE = 1;
		
			SCIState_RecOverTime = 0;
		}
		
		if(SCIState_RecOver)
		{
			cSCITraBuf[0] = 'E';	//错误
			cSCITraBuf[1] = 'O';
			cSCITraBuf[2] = 'V';
			cSCITraBuf[3] = 'E';
			cSCITraBuf[4] = 'R';
			cSCITraBuf[5] = '\n';
			
			cSCITraLen = 6;
			SCC2_SCTIE = 1;
		
			SCIState_RecOver = 0;
		}

		if(CRFLG_RXF)		//CAN有数据到达
		{
			cSCITraBuf[0] = 'R';	//CAN发送的数据
			cSCITraBuf[1] = RBIDR0;
			cSCITraBuf[2] = RBIDR1;
			cSCITraBuf[3] = RBIDR2;
			cSCITraBuf[4] = RBIDR3;
			cSCITraBuf[5] = RBDSR0;
			cSCITraBuf[6] = RBDSR1;
			cSCITraBuf[7] = RBDSR2;
			cSCITraBuf[8] = RBDSR3;
			cSCITraBuf[9] = RBDSR4;
			cSCITraBuf[10] = RBDSR5;
			cSCITraBuf[11] = RBDSR6;
			cSCITraBuf[12] = RBDSR7;
			
			cSCITraLen = (RBDLR & 0x0F) + 5;
			
			SCC2_SCTIE = 1;
			
			CRFLG = 0x01;	//清RXF标志
		
			LED3 = 0;		//指示要发送数据
			CANState_RecFull = 0;
		}


		__RESET_WATCHDOG(); /* kicks the dog */
	}
	 /* loop forever */
}


void Communication(char *p,char nLen)
{
	switch(p[0])
	{
		case 'S':	//发送CAN消息
			CanSendMsg(p + 1,nLen - 1);
			break;
		case 'V':	//读取硬件版本
			if(cSCIRecLen == 1)
			{
				cSCITraBuf[0] = 'V';
				cSCITraBuf[1] = 'H';
				cSCITraBuf[2] = '1';
				cSCITraBuf[3] = '.';
				cSCITraBuf[4] = '0';
				cSCITraBuf[5] = '0';
				cSCITraBuf[6] = 0;

				cSCITraLen = 7;
				
				LED2 = 0;
				
				SCC2_SCTIE = 1;
			}
			else
			{
				cSCITraBuf[0] = 'E';
				cSCITraBuf[1] = 'V';
				
				cSCITraLen = 2;
				
				LED2 = 0;
				
				SCC2_SCTIE = 1;
				
			}
			break;
		case 'F':	//读取软件版本
			if(cSCIRecLen == 1)
			{
				cSCITraBuf[0] = 'V';
				cSCITraBuf[1] = 'S';
				cSCITraBuf[2] = '1';
				cSCITraBuf[3] = '.';
				cSCITraBuf[4] = '0';
				cSCITraBuf[5] = '0';
				cSCITraBuf[6] = 0;

				cSCITraLen = 7;
				
				LED2 = 0;
				
				SCC2_SCTIE = 1;
				
			}
			else
			{
				cSCITraBuf[0] = 'E';
				cSCITraBuf[1] = 'F';
				
				cSCITraLen = 2;
				
				LED2 = 0;
				
				SCC2_SCTIE = 1;
				
			}
		
			break;
		case 'B':	//设置CAN速率
			if(cSCIRecLen == 2)
			{
				CBTR0 = cSCIRecBuf[1];
			}
			else
			{
				cSCITraBuf[0] = 'E';
				cSCITraBuf[1] = 'B';
				
				cSCITraLen = 2;
				
				LED2 = 0;
				
				SCC2_SCTIE = 1;
				
			}
		
			break;
		case 'C':	//读取CAN速度
			if(cSCIRecLen == 1)
			{
				cSCITraBuf[0] = 'C';
				cSCITraBuf[1] = CBTR0;
				
				cSCITraLen = 2;
				
				LED2 = 0;
				
				SCC2_SCTIE = 1;
			}
			else
			{
				cSCITraBuf[0] = 'E';
				cSCITraBuf[1] = 'C';
				
				cSCITraLen = 2;
				
				LED2 = 0;
				
				SCC2_SCTIE = 1;
				
			}
		
			break;
		case 'T':	//开始通讯
			if(cSCIRecLen == 1)
			{
				CMCR0 = 0x000;	//MSCAN08 正常.
				while(!CMCR0_SYNCH); //等待同步
				CRIER = 0x000;	//
				
			}
			else
			{
				cSCITraBuf[0] = 'E';
				cSCITraBuf[1] = 'T';
				
				cSCITraLen = 2;
				
				LED2 = 0;
				
				SCC2_SCTIE = 1;
				
			}
			break;
		case 'P':	//停止通讯
			if(cSCIRecLen == 1)
			{
				CMCR0_SFTRES = 0x001;	//软复位
				while(!CMCR0_SFTRES);	//等待进入复位状态
			}
			else
			{
				cSCITraBuf[0] = 'E';
				cSCITraBuf[1] = 'P';
				
				cSCITraLen = 2;
				
				LED2 = 0;
				
				SCC2_SCTIE = 1;
				
			}
			break;
		case 'M':	//设置MASK
			if(cSCIRecLen == 10)
			{
				CIDAR0 = cSCIRecBuf[1];
				CIDAR1 = cSCIRecBuf[2];
				CIDAR2 = cSCIRecBuf[3];
				CIDAR3 = cSCIRecBuf[4];
				CIDMR0 = cSCIRecBuf[5];
				CIDMR1 = cSCIRecBuf[6];
				CIDMR2 = cSCIRecBuf[7];
				CIDMR3 = cSCIRecBuf[8];
				
				LED2 = 0;
				
				SCC2_SCTIE = 1;
			}
			else
			{
				cSCITraBuf[0] = 'E';
				cSCITraBuf[1] = 'M';
				
				cSCITraLen = 2;
				
				LED2 = 0;
				
				SCC2_SCTIE = 1;
				
			}		
			break;
		case 'N':	//读取MASK
			if(cSCIRecLen == 1)
			{
				cSCITraBuf[0] = 'N';
				cSCITraBuf[1] = CIDAR0;
				cSCITraBuf[2] = CIDAR1;
				cSCITraBuf[3] = CIDAR2;
				cSCITraBuf[4] = CIDAR3;
				cSCITraBuf[5] = CIDMR0;
				cSCITraBuf[6] = CIDMR1;
				cSCITraBuf[7] = CIDMR2;
				cSCITraBuf[8] = CIDMR3;
				
				cSCITraLen = 9;
				
				LED2 = 0;
				
				SCC2_SCTIE = 1;
				
			}
			else
			{
				cSCITraBuf[0] = 'E';
				cSCITraBuf[1] = 'N';
				
				cSCITraLen = 2;
				
				LED2 = 0;
				
				SCC2_SCTIE = 1;
			}
			break;
		default:
			break;
	}
	
}

void Delay(unsigned int uTime)
{
	unsigned char i;
	for(;uTime ; uTime--)
	{
		__RESET_WATCHDOG();
		for(i = 0; i < 200; i++)
			__asm NOP
	}
}

⌨️ 快捷键说明

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