📄 main.c
字号:
/************************************************************************************
* Copyright (c) 2004,西安铭朗电子科技有限责任公司
* All rights reserved.
*
* 文件名称: main.C
* 文件标识: none
* 适用器件: C8051F040
*
* 摘 要: 本文件是LED灯闪硕实验程序;LED灯每隔1秒亮1秒;将跳线器JP4短接;使用外部
* 22.1184MHz晶振,应用PLL倍频到100MHZ.
*
* 当前版本:1.2
* 作 者:张宁强
* 完成日期:2006年1月10日
*
* 历史版本:1.0
* 原作者 : 李林利 卢阳
* 完成日期:2005年6月1日
*************************************************************************************/
/************************************************************************************/
// 引用外部头文件
#include "c8051f040.h"
#include "Const.h"
#include "timer.h"
#include "lcd.h"
/************************************************************************************/
// CAN Protocol Register Index for CAN0ADR, from TABLE 18.1 of the C8051F040
// datasheet
////////////////////////////////////////////////////////////////////////////////
#define CANCTRL 0x00 //Control Register
#define CANSTAT 0x01 //Status register
#define ERRCNT 0x02 //Error Counter Register
#define BITREG 0x03 //Bit Timing Register
#define INTREG 0x04 //Interrupt Low Byte Register
#define CANTSTR 0x05 //Test register
#define BRPEXT 0x06 //BRP Extension Register
////////////////////////////////////////////////////////////////////////////////
//IF1 Interface Registers
////////////////////////////////////////////////////////////////////////////////
#define IF1CMDRQST 0x08 //IF1 Command Rest Register
#define IF1CMDMSK 0x09 //IF1 Command Mask Register
#define IF1MSK1 0x0A //IF1 Mask1 Register
#define IF1MSK2 0x0B //IF1 Mask2 Register
#define IF1ARB1 0x0C //IF1 Arbitration 1 Register
#define IF1ARB2 0x0D //IF1 Arbitration 2 Register
#define IF1MSGC 0x0E //IF1 Message Control Register
#define IF1DATA1 0x0F //IF1 Data A1 Register
#define IF1DATA2 0x10 //IF1 Data A2 Register
#define IF1DATB1 0x11 //IF1 Data B1 Register
#define IF1DATB2 0x12 //IF1 Data B2 Register
////////////////////////////////////////////////////////////////////////////////
//IF2 Interface Registers
////////////////////////////////////////////////////////////////////////////////
#define IF2CMDRQST 0x20 //IF2 Command Rest Register
#define IF2CMDMSK 0x21 //IF2 Command Mask Register
#define IF2MSK1 0x22 //IF2 Mask1 Register
#define IF2MSK2 0x23 //IF2 Mask2 Register
#define IF2ARB1 0x24 //IF2 Arbitration 1 Register
#define IF2ARB2 0x25 //IF2 Arbitration 2 Register
#define IF2MSGC 0x26 //IF2 Message Control Register
#define IF2DATA1 0x27 //IF2 Data A1 Register
#define IF2DATA2 0x28 //IF2 Data A2 Register
#define IF2DATB1 0x29 //IF2 Data B1 Register
#define IF2DATB2 0x2A //IF2 Data B2 Register
////////////////////////////////////////////////////////////////////////////////
//Message Handler Registers
////////////////////////////////////////////////////////////////////////////////
#define TRANSREQ1 0x40 //Transmission Rest1 Register
#define TRANSREQ2 0x41 //Transmission Rest2 Register
#define NEWDAT1 0x48 //New Data 1 Register
#define NEWDAT2 0x49 //New Data 2 Register
#define INTPEND1 0x50 //Interrupt Pending 1 Register
#define INTPEND2 0x51 //Interrupt Pending 2 Register
#define MSGVAL1 0x58 //Message Valid 1 Register
#define MSGVAL2 0x59 //Message Valid 2 Register
////////////////////////////////////////////////////////////////////////////////
/************************************************************************************
// 常量及全局变量定义
*************************************************************************************/
sbit LED = P2^3; // LED='1' 灯亮
unsigned char flag;
unsigned int i;
void clear_msg_objects (void);
void init_msg_object_TX (char MsgNum);
void init_msg_object_RX (char MsgNum);
void start_CAN (void);
void transmit_Byte (char MsgNum);
/************************************************************************************
// 子函数声明
*************************************************************************************/
void SYSCLK_Init (void);
void PORT_Init (void);
void LED_state(unsigned char flag);
/************************************************************************************
// 主循环程序
*************************************************************************************/
void main (void)
{
char data SFRPAGE_SAVE;
WDTCN = 0xde; //关闭看门狗定时器
WDTCN = 0xad;
PORT_Init ();
lcd_init();
dis_clr();
dis_start0();
// Clear CAN RAM
clear_msg_objects();
// Initialize message object to transmit data
init_msg_object_TX (0x02);
// Initialize message object to receive data
init_msg_object_RX (0x01);
// Enable CAN interrupts in CIP-51
EIE2 = 0x20;
//Function call to start CAN
start_CAN();
//Global enable 8051 interrupts
EA = 1;
SYSCLK_Init (); //初始化
Timer0_init(SYSCLK/20); //50ms中断一次
i=0;
flag=0;
SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_0; // set SFR page 0
ET0=1;
TR0 = 1; // 打开定时器Timer0
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
while (1)
{
LED_state(flag); // 改变LED状态
}
}
/************************************************************************************
// 系统初始化功能子程序
*************************************************************************************/
/***********************************************************************************
* 函数名称:SYSCLK_Init;
*
* 函数功能描述:系统时钟初始化,使用外部22.1184MHz晶振作为时钟源,using the PLL;
* This routine initializes the system clock to use an external 22.1184 MHz
* crystal oscillator multiplied by a factor of 9/2 using the PLL as its
* clock source. The resulting frequency is 22.1184 MHz * 9/2 = 100(99.6) MHz
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void SYSCLK_Init (void)
{
int i; // delay counter
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = CONFIG_PAGE; // set SFR page
OSCXCN = 0x67; // start external oscillator with
// 22.1184MHz crystal
for (i=0; i < 256; i++) ; // Wait for osc. to start up
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
CLKSEL = 0x01; // Select the external osc. as
// the SYSCLK source
OSCICN = 0x00; // Disable the internal osc.
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
// Switch to external oscillator
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -