📄 20051130152364.c
字号:
//-----------------------------------------------------------------------------
// UART1_Int1.c
//-----------------------------------------------------------------------------
// Target: C8051F02x
// Tool chain: KEIL C51 6.03 / KEIL EVAL C51
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <c8051f020.h> // SFR declarations
#include <stdio.h>
#include <string.h>
#include <intrins.h>
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F02x
//-----------------------------------------------------------------------------
sfr16 DP = 0x82; // data pointer
sfr16 TMR3RL = 0x92; // Timer3 reload value
sfr16 TMR3 = 0x94; // Timer3 counter
sfr16 ADC0 = 0xbe; // ADC0 data
sfr16 ADC0GT = 0xc4; // ADC0 greater than window
sfr16 ADC0LT = 0xc6; // ADC0 less than window
sfr16 RCAP2 = 0xca; // Timer2 capture/reload
sfr16 T2 = 0xcc; // Timer2
sfr16 RCAP4 = 0xe4; // Timer4 capture/reload
sfr16 T4 = 0xf4; // Timer4
sfr16 DAC0 = 0xd2; // DAC0 data
sfr16 DAC1 = 0xd5; // DAC1 data
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define RX1_LENGTH 64 // 电力载波帧长
#define RX1_START 0X7E // 电力载波帧起始符
#define RX1_END 0X0D // 电力载波帧结束符
#define RX0_LENGTH 32 // command length of UART RX buffer
#define RX0_END 0X0D // command 帖结束符
#define fsa_init 0 //状态机初始状态
#define fsa_data 1
#define password_time 500 //定时8分钟
#define SYSCLK 22118400 // SYSCLK frequency in Hz
#define BAUDRATE 9600 // Baud rate of UART in bps
#define RX_LENGTH 16 // length of UART RX buffer
//-----------------------------------------------------------------------------
// Global VARIABLES
//-----------------------------------------------------------------------------
unsigned char xdata password[6]={'6','6','6','6','6','6'}; //集中器密码
bit TX1_Ready; // '1' means okay to TX
char *TX1_ptr; // pointer to string to transmit
bit RX1_Ready; // '1' means RX string received
bit TX0_Ready; // '1' means okay to TX
char *TX0_ptr; // pointer to string to transmit
bit RX0_Ready; // '1' means RX string received
char xdata RX1_Buf[RX1_LENGTH]; // receive string storage buffer
char xdata RX0_Buf[RX0_LENGTH]; // receive string storage buffer
static unsigned char RX1_index = 0; // uart1 receive buffer index
static unsigned char RX0_index = 0; // uart1 receive buffer index
bit password_flag;
bit sendinterva2; //T2定时到
sbit LED = P1^6; // LED = 1 means ON
unsigned char xdata SENDNUM1; //uart1要发送数据的数目
unsigned char xdata RECEIVENUM1; //uart1收到数据的数目
unsigned char xdata SENDNUM0; //uart0要发送数据的数目
unsigned char xdata RECEIVENUM0; //uart0收到数据的数目
unsigned int xdata time; //间隔采集时间累计
//unsigned int xdata tend; //设置间隔时间长短
//unsigned int xdata temp;
unsigned int xdata time2; //间隔采集时间累计
unsigned int xdata tend2; //设置间隔时间长短
unsigned int xdata temp2;
unsigned char xdata waddr[2]; //写传感器地址
unsigned char xdata raddr[2]; //读传感器地址
unsigned char xdata recv_state;
unsigned char xdata j;
unsigned char code valid_cmd0[256]={ //如果输入有效命令则为1
0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, //00--0F CR有效
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //10--1F
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //20--2F
1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, //30--3F 0_9有效
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //40--4F A_Z有效
1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, //50--5F
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60--6F
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70--7F
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80--8F
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90--9F
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //A0--AF
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //B0--BF
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //C0--CF
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //D0--DF
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //E0--EF
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //F0--FF
};
unsigned char code valid_cmd1[256]={ //如果输入有效命令则为1
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //00--0F
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //10--1F
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //20--2F
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //30--3F
0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1, //40--4F A_M有效,O_T有效,V_Z有效
1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0, //50--5F
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60--6F
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70--7F
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80--8F
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90--9F
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //A0--AF
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //B0--BF
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //C0--CF
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //D0--DF
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //E0--EF
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //F0--FF
};
unsigned char code NO[] ="NO\x0d\x0a";
unsigned char code OK[] ="OK\x0d\x0a";
unsigned char code Lock[] ="Lock\x0d\x0a";
unsigned char code UnLock[] ="UnLock\x0d\x0a";
unsigned char code CCE16[]="CCE16 v3.00xx0d\x0a"; //程序版本号
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer0_Init (void);
void Timer0_ISR (void);
void Timer2_Init(void);
void Timer2_ISR(void);
void UART0_Init (void);
void UART0_ISR (void);
void UART1_Init (void);
void UART1_ISR (void);
void RX0_BufClear(void);
void RX1_BufClear(void);
void FlashWrite(unsigned char xdata *pwrite,unsigned char *BufFrom);
void FlashRead(unsigned char code *pread,unsigned char *BufTo);
void send_string_com(unsigned char *str,unsigned char strlen);
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void)
{
WDTCN = 0xde; // 关闭看门狗
WDTCN = 0xad;
password_flag=0;
sendinterva2=1;
time=0x0000;
time2=0x0000;
temp2=0x0064;
SYSCLK_Init (); // initialize oscillator
PORT_Init (); // initialize crossbar and GPIO
UART1_Init (); // initialize UART0
Timer0_Init ();
UART0_Init ();
Timer2_Init();
EA = 1; // enable global interrupts
while (1)
{
//--------------------------------------------------------------------------------------
if(RX0_Ready == 1)
{
switch(RX0_Buf[0])
{
case'A': //A
break;
case'B':
break;
case'C':
break;
case'D':
break;
case'E':
break;
case'F':
break;
case'G':
break;
case'H':
break;
case'I':
break;
case'J':
break;
case'K':
break;
case'L':
break;
case'M':
break;
case'O':
break;
case'P':
switch(RX0_Buf[1])
{
case'A': //####PAMR手动启动补抄末成功表####要通过口令检测
if(RX0_Buf[2]=='M'&& RX0_Buf[3]=='R'&& RX0_Buf[4]==RX0_END && j==4)
{
if(password_flag)
{
//>>>>>
//>>>>>
send_string_com(OK,4);
time=0;
TR0=1; //定时8分钟
}
else
{
send_string_com(Lock,6);
}
}
break;
case'W':
switch(RX0_Buf[2])
{
case'R': //####PWR 口令检测####
if(RX0_Buf[3]==password[0] && RX0_Buf[4]==password[1] && RX0_Buf[5]==password[2] && RX0_Buf[6]==password[3]
&& RX0_Buf[7]==password[4] && RX0_Buf[8]==password[5] && RX0_Buf[9]==RX0_END && j==9)
{
password_flag=1; //命令检测通过
send_string_com(UnLock,8);
time=0;
TR0=1; //定时8分钟
}
else
{
send_string_com(NO,4);
password_flag=0;
}
break;
case'W': //####PWW设置新口令#### 要通过口令检测
if(RX0_Buf[9]==RX0_END && j==9)
{
if(password_flag)
{
password[0]=RX0_Buf[3];
password[1]=RX0_Buf[4];
password[2]=RX0_Buf[5];
password[3]=RX0_Buf[6];
password[4]=RX0_Buf[7];
password[5]=RX0_Buf[8];
send_string_com(OK,4);
time=0;
TR0=1; //定时8分钟
}
else
{
send_string_com(Lock,6);
}
}
break;
default:break;
}
break;
default:break;
}
break;
case'Q': //####QUIT暂停集中器工作####
if(RX0_Buf[1]=='U' && RX0_Buf[2]=='I' && RX0_Buf[3]=='T' && RX0_Buf[4]==RX0_END && j==4)
{
if(password_flag)
{
//>>>>>
//>>>>>
send_string_com(OK,4);
time=0;
TR0=1; //定时8分钟
}
else
{
send_string_com(Lock,6);
}
}
break;
case'R':
break;
case'S':
break;
case'T':
break;
case'V':
if(RX0_Buf[1]=='E' && RX0_Buf[2]=='R' && RX0_Buf[3]==RX0_END && j==3) //程序版本号检测
send_string_com(CCE16,14);
break;
case'W':
break;
case'X':
break;
case'Y':
break;
default:break;
}
RX0_BufClear();
j=0;
RX0_Ready=0;
}
//---------------------------------------------------------------------------------------
if(sendinterva2)
{
TR2=1;
sendinterva2=0;
}
//--------------------------------------------------------------------------------------
/*
if(sendinterval) //间隔采集定时时间到
{
sendinterval=0;
TR0=1;
} */
}
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use an 22.1184MHz crystal
// as its clock source.
//
void SYSCLK_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 22.1184MHz crystal
for (i=0; i < 256; i++) ; // wait for crystal osc. to start up
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
// detector
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports
//
void PORT_Init (void)
{
XBR0 = 0x05; // Enable UART0
XBR1 = 0x00;
XBR2 = 0x44; // Enable crossbar and weak pull-ups
P0MDOUT |= 0x11; // enable TX0 as a push-pull output
P2MDOUT |= 0x03; // enable P2 as push-pull output
P1MDOUT |= 0x40; // enable LED as push-pull output
P74OUT |=0Xf4;
}
//-----------------------------------------------------------------------------
// UART1_Init
//-----------------------------------------------------------------------------
//
// Configure UART1 using Timer1, for <baudrate> and 8-N-1.
//
void UART1_Init (void)
{
SCON1 |= 0x50; // SCON1: mode 1, 8-bit UART, enable RX
T4CON |=0X30; // Stop Timer; clear int flags; enable
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -