📄 main.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 + -