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

📄 main.c

📁 CAN总线通信程序
💻 C
字号:
/******************************************************
**说明:此程序为Peli模式自测试程序,需要硬件四个LED,四个按键,
**      当然按键可以不要,LED只用一个也行,只是不够直观。
**      还有本程序是按一次按键,进入接收中断两次,也即是流水灯
**      会流动两次,串口也会收到两次数据,原因未知,看来对CAN的体
**      会还很有限。
**作者:桂电飞天鼠
**日期:2007。06。04
**邮件:mozhenhua211@tom.com
**备注:不知道为什么用STC的单片机老是没反应,郁闷~由于本人毕设验收在即,
**      所以暂时没继续寻找原因,待毕设完成再详细探讨。另外按键部分的处理
**      以及SJA的驱动部分感觉十分累赘,编程风格目前正在形成中,望各位前辈
**      指点一下。谢谢!
*******************************************************/

#include <at89x51.h>
#include "SJA1000_PELI.h"

sfr WDT_CONTR = 0xe1;

#define LED0     P1_0	
#define LED1     P1_1
#define LED2     P1_2
#define LED3     P1_3

#define KEY0     P1_4
#define KEY1     P1_5
#define KEY2     P1_6
#define KEY3     P1_7

extern bit g_RiFlag;


extern void SJAInit(void);
extern bit SJASendData(unsigned char *SendDataBuf);
extern bit SJAReceData(unsigned char *ReceiveDataBuf);

void RS232Init(void);
void DelayTime (unsigned char times);

unsigned char TX[11];
unsigned char RX[11];



void main(void)
{
	unsigned char i;
	unsigned char tempdata;

	P1 = 0xff;
	
						     
	SJA_RESET = 1;			      //SJA复位
    DelayTime(50);
    SJA_RESET = 0;
    DelayTime(500);
    SJA_RESET=1;

    RS232Init();				 //串口初始化,19200,1停止位,没校验
    SJAInit();					 //SJA初始化,自收自发模式,在模式寄存器修改(0x00)
	//WDT_CONTR = 0x3c;			 //STC单片机的看门狗,喂狗

	EX0 = 1;
	EA  = 1;
	
	while(1)
	{	
	    if (KEY0 ==0)			 //假如按键KEY0按下,则进入发送
		{
		    DelayTime(50);
			if (KEY0 ==0)
			{
			    TX[0] = 0x08;  	 //标准帧
				TX[1] = 0xff;	 //滤波全通
				TX[2] = 0xff;

			    TX[3] = 0xfe;	 //发送的数据,(在这里为流水灯的花式)
				TX[4] = 0xfd;
				TX[5] = 0xfb;
				TX[6] = 0xf7;
			    TX[7] = 0xf7;
				TX[8] = 0xfb;
				TX[9] = 0xfd;
				TX[10] = 0xfe;

				SJASendData(TX);		 //把要发送的内容放到SJA的发送缓冲区
				SJARegWrite(0x01,0x10);	 //启动自收发
				SJARegWrite(0x01,0x02);	 //中止发送,即为单次发送,按一下,发送一次
				//LED0 = !LED0;
			}
		}
	    if (KEY1 ==0)
		{
		    DelayTime(50);
			if (KEY1 ==0)
			{
			    TX[0] = 0x08;  
				TX[1] = 0xff;
				TX[2] = 0xff;

			    TX[3] = 0xf9;
				TX[4] = 0xf6;
				TX[5] = 0xf9;
				TX[6] = 0xf6;
			    TX[7] = 0xf9;
				TX[8] = 0xf6;
				TX[9] = 0xf9;
				TX[10] = 0xf6;

				SJASendData(TX);
				SJARegWrite(0x01,0x10);
				SJARegWrite(0x01,0x02);
			}
		}
	    if (KEY2 ==0)
		{
		    DelayTime(50);
			if (KEY2 ==0)
			{
			    TX[0] = 0x08;  
				TX[1] = 0xff;
				TX[2] = 0xff;

			    TX[3] = 0xf1;
				TX[4] = 0xf2;
				TX[5] = 0xf4;
				TX[6] = 0xf8;
			    TX[7] = 0xf1;
				TX[8] = 0xf2;
				TX[9] = 0xf4;
				TX[10] = 0xf8;

				SJASendData(TX);
				SJARegWrite(0x01,0x10);
				SJARegWrite(0x01,0x02);
			}
		}
	    if (KEY3 ==0)
		{
		    DelayTime(50);
			if (KEY3 ==0)
			{
			    TX[0] = 0x08;  
				TX[1] = 0xff;
				TX[2] = 0xff;

			    TX[3] = 0xfc;
				TX[4] = 0xf9;
				TX[5] = 0xf3;
				TX[6] = 0xf6;
			    TX[7] = 0xfc;
				TX[8] = 0xf9;
				TX[9] = 0xf3;
				TX[10] = 0xf6;

				SJASendData(TX);
				SJARegWrite(0x01,0x10);
				SJARegWrite(0x01,0x02);
			}
		}

		if (g_RiFlag)					//SJA接收中断标志
		{
		    g_RiFlag = 0;
			SJAReceData(RX);			//将接收到的内容从SJA的接收缓冲区读出
			SJARegWrite(1,0x04);		//释放缓冲区

			for (i=0; i<8; i++)			//用四个LED循环显示接收到的八个数据(每个数据只用低四位)
			{
			   tempdata = RX[i+3];
			   tempdata |= 0xf0;		//为了不改变键盘数值,加此句
			   P1 =tempdata;

			   SBUF =tempdata;		   	//在显示的同时,也把数据往串口发送
			   while(!TI);
			   TI = 0;
			   DelayTime(80); 
			}

			P1 = 0xff;
		}

		//WDT_CONTR = 0x3c;		        //STC单片机的喂狗,用S51不用加此句
    }
}

void RS232Init(void)
{
    SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 
    TMOD |= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload 
    PCON |= 0x80;       //SMOD=1; 
    TH1   = 0xFD;       //SMOD=1,Baud:19200  fosc=11.0592MHz
    //IE   |= 0x90;     //Enable Serial Interrupt 
    TR1   = 1;          // timer 1 run 
}

void DelayTime (unsigned char times)
{
     unsigned char i=0;
     while(times--)
     {
         for(i=0;i<50;i++)
         {;}
     }
}

⌨️ 快捷键说明

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