📄 main.c
字号:
/*------------------------------------------------------------------------------
;CAN总线大坝监测系统
;底层节点
;文件名称: main.c
;函数功能:接收上层命令,采集返回数据
;MCU支持: C8051F040
;上海富方软件合肥自动化分公司
;-----------------------------------------------------------------------------*/
#include "c8051F040.h"
#include "wdt_port_clk_init.h"
#include "can.h"
////////////////////////////////////////////////////////////////////////////////
// 变量定义
////////////////////////////////////////////////////////////////////////////////
unsigned char SFRPAGE_SAVE; // SFR页面保存
unsigned char Wang_Data[6] = {0xc1,0xc2,0xc3,0xc4,0xc5,0xc6}; // 下层测量数据
unsigned char Can_sdata[8]; // CAN发送数组
unsigned char Can_rdata[8]; // CAN接收数组
unsigned char Answer_Data[6] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; // 底层应答数组
bit Rec_From_CAN; // 标志从CAN收到命令
////////////////////////////////////////////////////////////////////////////////
//主函数
////////////////////////////////////////////////////////////////////////////////
void main(){
/* 关看门狗,端口及时钟初始化 */
Watchdog_Close ();
Port_Config ();
Sysclk_Init ();
/* CAN消息块初始化 */
Can_Msg_Init();
/* 开中断 */
EA = 1;
/* 正常运行 */
while(1){
Rec_From_CAN = 0;
while(!Rec_From_CAN);
/* 如果是所有模块复位 */
if( (Can_rdata[0]&0xE0) == 0x60 ){
SFRPAGE = LEGACY_PAGE; // 跳至复位寄存器页0x00
RSTSRC |= 0x10; // 软件复位
}
/* 如果是全体测量 */
else if( (Can_rdata[0]&0xE0) == 0xE0 ){
/*以下为实际测量操作
*/
}
/* 如果是单个模块复位 */
else if( (Can_rdata[0]&0xE0) == 0x80){
SFRPAGE = CAN0_PAGE;
CAN0STA &= 0xf7; // TxOk置零,未传送完报文
Can_Tx_Back(Answer_Data); // 应答
while( ! (CAN0STA & 0x08) );
SFRPAGE = LEGACY_PAGE; // 跳至复位寄存器页0x00
RSTSRC |= 0x10; // 软件复位
}
/* 如果是单个模块测量 */
else if( (Can_rdata[0]&0xE0) == 0xC0 ){
Can_Tx_Back(Answer_Data); // 应答
/*以下为实际测量操作
*/
}
/* 如果是单个模块取数 */
else if( (Can_rdata[0]&0xE0) == 0xA0 ){
/*此处应修改为实际数据 */
Can_Tx_Back(Wang_Data); // 应答
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -