📄 plc_demo.c
字号:
/**********************************************
Mini_PLC Demo program
By Wangjue
2005.1.12
**********************************************/
#include <intrins.h>
#include <stdio.h>
#include <reg52.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
//sfr WDTC = 0xE1;
//sfr WDTD = 0x85;
sfr P4 = 0xC0;
//sbit SWDT = WDTC^0;
//sbit WDT = WDTC^1;
//sbit WDTS = WDTC^2;
//sbit WDRE = WDTC^3;
//sbit WDOUT = WDTC^4;
void SetFirPhoneNo( unsigned char *str, int len );
void SetSecPhoneNo( unsigned char *str, int len );
unsigned char GetFirPhoneNo( unsigned char *str, const char mode );
unsigned char GetSecPhoneNo( unsigned char *str, const char mode );
void SetDisconnectTime( unsigned char ch );
unsigned char GetDisconnectTime();
void SetSMSSendTimes( unsigned char ch );
unsigned char GetSMSSendTimes();
void StrCatChar( unsigned char *str, unsigned char ch );
void JudgePCString( );
void JudgeModuleString( );
unsigned char ReadEEPROMonebyte(unsigned char addr);
void WriteEEPROMonebyte( unsigned char addr, unsigned char ch );
void WriteEEPROMonestring( unsigned char *str, int len, unsigned char addr );
unsigned char GetStringFromEEPROM( unsigned char *str, unsigned char addr );
void SendStringToPC( );
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
#define uchar unsigned char
#define uint unsigned int
#define _Nop() _nop_()
#define Timer0H 0xFE //500 us interval
#define Timer0L 0x33
#define LCD_IR 0xA000 //RS=0
#define LCD_DR 0xA001 //RS=1
unsigned char xdata *LCD_addr;
unsigned char data LCD_data;
#define SRAM_BASEADDR 0xC000;
unsigned char xdata *SRAM_addr;
unsigned char data SRAM_data;
/* define the EEPRom map Location
#define Tel1_addr 0x00 //00-0f for tel number 1
#define Tel2_addr 0x10 //10-1f for tel number 2
#define netfox_addr 0x20
#define alert_threshold_addr 0x21
#define alert_num_addr 0x22
*/
/* define the EEPRom(24lc32) parameters */
#define EEPRom_SLA 0xA0
#define EEPRom_SUBA 0x00 //select Page0
#define Addr_16c550 0x8000
#define RHR_16c550 Addr_16c550 + 0x00 //Read operation
#define ISR_16c550 Addr_16c550 + 0x02
#define LSR_16c550 Addr_16c550 + 0x05
#define MSR_16c550 Addr_16c550 + 0x06
#define THR_16c550 Addr_16c550 + 0x00 //Write operation
#define IER_16c550 Addr_16c550 + 0x01
#define FCR_16c550 Addr_16c550 + 0x02
#define LCR_16c550 Addr_16c550 + 0x03
#define MCR_16c550 Addr_16c550 + 0x04
#define SPR_16c550 Addr_16c550 + 0x07 //Both Read and Wite
#define DLL_16c550 Addr_16c550 + 0x00 //when LCR.7=1 can read and write
#define DLM_16c550 Addr_16c550 + 0x01
//define baud rate in 16C550
//16C550 crystal is 14.7456Mhz
#define DLM_1200 0x03
#define DLL_1200 0x00
#define DLM_2400 0x01
#define DLL_2400 0x80
#define DLM_4800 0x00
#define DLL_4800 0xC0
#define DLM_9600 0x00
#define DLL_9600 0x60
#define DLM_19200 0x00
#define DLL_19200 0x30
unsigned char xdata *Reg_16c550_Tx;
unsigned char xdata *Reg_16c550;
#define MAXBYTES 128
sbit LCD_BL = P4^0;
sbit led1 = P4^2;
//sbit led2 = P1^2;
sbit SDA = P3^4;
sbit SCL = P3^5;
sbit Beep = P4^1;
sbit PWR_det = P3^2;
//sbit M_OnOff = P3^4;
//sbit M_Rst = P3^5;
bit ack; /*应答标志位*/
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
/*固定数据宏定义*/
#define LINE_LENGTH 700
#define TOTAL_CMD_NUMBER 34
/* 片内ram 共有128个字节可用,用data定义,全局变量*/
unsigned char data ModuleWaitFlag;
unsigned char data PCWaitFlag;
unsigned char data Initialized;
unsigned char data PowerOffFlag;
unsigned char data RePowerOffFlag;
unsigned char data PCDisconnectFlag;
unsigned char data RePCDisconnectFlag;
unsigned char data RXReg_data;
unsigned char data TXReg_data;
unsigned char data RXPC_data;
unsigned char data TXPC_data;
unsigned char data ModuleReceiveCount;
unsigned char data PCReceiveCount;
unsigned char data ModuleTxCount;
unsigned char data PCTxCount;
unsigned char data NetFoxPowerOpenFlag;
unsigned char data NetFoxConnectOpenFlag;
unsigned char data NetFoxUseNameOpenFlag;
unsigned char data Sms_send_type;
unsigned long data PCConnectCount;
unsigned char data ConnectSmsHasSent;
unsigned char data PowerSmsHasSent;
unsigned char data LCDRefreshFlag;
//unsigned char data BeepFlag;
unsigned char data LedFlashFlag;
unsigned char data ReceiveSMSFlag;
/* 片内扩展ram 共有256 个字节可用,用pdata定义,全局变量*/
unsigned int pdata DelayCount;
unsigned int pdata LedFlashCount;
unsigned int pdata ModuleSendDelayCount;
unsigned int pdata PowerOffDelayCount;
unsigned char pdata EEPR_AT_data;
unsigned char pdata EEPR_DT_data;
unsigned char pdata Sms_edit_mode;
unsigned char pdata Phone1[32];
unsigned char pdata Phone2[32];
unsigned char pdata Name[64];
unsigned char pdata Lcd_buffer[41];
//unsigned char xdata PCTxBuffer[128]; /*发送到PC的数据缓冲池*/
//unsigned char xdata PCRxBuffer[128]; /*从PC接收的数据缓冲池*/
//unsigned char xdata ModuleTxBuffer[128]; /*发送到模块的数据缓冲池*/
//unsigned char xdata ModuleRxBuffer[128]; /*从模块接收的数据缓冲池*/
unsigned char xdata *PCTxBuffer; /*发送到PC的数据缓冲池*/
unsigned char xdata *PCRxBuffer; /*从PC接收的数据缓冲池*/
unsigned char xdata *ModuleTxBuffer; /*发送到模块的数据缓冲池*/
unsigned char xdata *ModuleRxBuffer; /*从模块接收的数据缓冲池*/
//unsigned char xdata *ContentBuffer[LINE_LENGTH];
/* 常量数据定义,CODE 区*/
const unsigned char code pc_cmd[TOTAL_CMD_NUMBER][32] =
{
/*00*/ "~NF:RDCSQ",
/*01*/ "~NF:Hello,netfox",
/*02*/ "~NF:SENDSMS1(",
/*03*/ "~NF:SENDSMS2(",
/*04*/ "~NF:LCD1(",
/*05*/ "~NF:LCD2(",
/*06*/ "~NF:LCDFree",
/*07*/ "~NF:RDALARM",
/*08*/ "~NF:PCAlarm(",
/*09*/ "~NF:PCAlarmOff",
/*10*/ "~NF:ChkVer",
/*11*/ "~NF:RDNO1",
/*12*/ "~NF:RDNO2",
/*13*/ "~NF:WRNO1(",
/*14*/ "~NF:WRNO2(",
/*15*/ "~NF:WRDT(",
/*16*/ "~NF:RDDT",
/*17*/ "~NF:WRAT(",
/*18*/ "~NF:RDAT",
/*19*/ "~NF:NFPWRON",
/*20*/ "~NF:NFPWROFF",
/*21*/ "~NF:NFCONON",
/*22*/ "~NF:NFCONOFF",
/*23*/ "~NF:WRCSCA(",
/*24*/ "~NF:RDCSCA",
/*25*/ "~NF:MODEGSM",
/*26*/ "~NF:MODEUCS2",
/*27*/ "~NF:RESET",
/*28*/ "~NF:WRName(",
/*29*/ "~NF:RDName",
/*30*/ "~NF:EnName",
/*31*/ "~NF:DisName",
/*32*/ "~NF:PaganiWsr(",
/*33*/ "~NF:RDSerial"
};
const unsigned char code dog_reply[TOTAL_CMD_NUMBER][32] =
{
"NF:CSQ: ",
"NF:Hello,sever\r\n",
"NF:OK\r\n",
"NF:OK\r\n",
"NF:OK\r\n",
"NF:OK\r\n",
"NF:OK\r\n",
"NF:ALARM(",
"NF:OK\r\n",
"NF:OK\r\n",
"NF:Sw Ver1.1 Hw Ver2.0\r\n",
"NF:NO1(",
"NF:NO2(",
"NF:OK\r\n",
"NF:OK\r\n",
"NF:OK\r\n",
"NF:DT(",
"NF:OK\r\n",
"NF:AT(",
"NF:OK\r\n",
"NF:OK\r\n",
"NF:OK\r\n",
"NF:OK\r\n",
"NF:OK\r\n",
"NF:CSCA(",
"NF:OK\r\n",
"NF:OK\r\n",
"NF:RESET\r\n",
"NF:OK\r\n",
"NF:Name(",
"NF:OK\r\n",
"NF:OK\r\n",
"NF:OK\r\n",
"NF:Serial("
};
const unsigned char code module_reply[5][32] =
{
"OK",
"+CPIN: READY",
"+CSQ:",
"+CMGS:",
"+CMTI:"
};
const unsigned char code Module_AT[9][32] =
{
"AT\r\n",
"ATE0\r\n",
"AT\r\n",
"AT\r\n",
"AT+CMGF=1\r\n",
"AT+CPIN?\r\n",
"AT+CSCS=\"UCS2\"\r\n",
"AT+CSMP=17,167,0,25\r\n",
"AT+CSQ\r\n"
};
const unsigned char code Sms_PowerOff1[] = "AT+CMGS=\"";
/*警告:NETFOX电源中断*/
const unsigned char code Sms_PowerOff2[] = "8B66544A003A004E004500540046004F0058FF1A75356E904E2D65AD";
/*警告:NETFOX与服务器通信中断*/
const unsigned char code Sms_PowerOff3[] = "8B66544A003A004E004500540046004F0058003A901A4FE14E2D65AD";
/*警告:NETFOX电源恢复*/
const unsigned char code Sms_PowerOff4[] = "8B66544A003A004E004500540046004F0058FF1A75356E906062590D";
/*警告:NETFOX与服务器通信恢复*/
const unsigned char code Sms_PowerOff5[] = "8B66544A003A004E004500540046004F0058003A901A4FE16062590D";
/*Title on Display*/
unsigned char code LCD_Title[ 40 ] = " Welcome to NetFox! Sw Ver1.1 Hw Ver2.0 ";
unsigned char code Sys_Title[ 40 ] = " Welcome to NetFox! Initialize System...";
unsigned char code Gsm_Title[ 40 ] = " Welcome to NetFox! Initialize Gsm......";
unsigned char code Wait_Title[ 40] = " NetFox is waiting! Zzz...... ";
unsigned char code Work_Title[ 40] = " NetFox is working! Work hard...... ";
unsigned char code WorkAC_Title[ 40] = " NetFox is working! Work hard...(AC) ";
unsigned char code WorkLink_Title[ 40] = " NetFox is working! Work hard...(Link) ";
unsigned char code SysErr_Title[ 40] = " NetFox Alarm! System Error... ";
unsigned char code AandLErr_Title[ 40] = " NetFox Alarm! AC OFF & Link Error ";
unsigned char code ACErr_Title[ 40] = " NetFox Alarm! AC OFF ";
unsigned char code LinkErr_Title[ 40] = " NetFox Alarm! Link Error... ";
unsigned char code Alarm_Title[ 40] = " NetFox Alarm! ";
/*-----------------------------------------------------------------------------------------------------------
PC发出命令名称 NETDOG返回信息
~NF:Hello,netdog NF:Hello,sever
~NF:bye,netdog NF:bye
~NF:Chk hd ver NF:V3.1
~NF:WRNO1(+8613602509314) NF:OK
~NF:WRNO2(+8613602509314) NF:OK
~NF:RDNO1 NF:NO1(+8613602509314)
~NF:RDNO2 NF:NO2(+8613602509314)
~NF:WRDT(3) NF:OK
~NF:RDDT NF:DT(3)
~NF:WRAT(3) NF:OK
~NF:RDAT NF:AT(3)
~NF:NFON NF:OK
~NF:NFOFF NF:OK
功能、参数解释
切换到"协议通信状态"命令:
1) 可以用于PC寻找NETDOG硬件;
2) 切换到"协议通信状态",NETDOG收到该命令,无论出于何种工作状态,都必须切换到"协议通信状态"
切换到"透明传输状态"命令:
该命令使NETDOG切换到透明传输状态
查询硬件版本号命令:
用于查询NETDOG的硬件版本
设置紧急报警电话号码1(必须设置)
设置紧急报警电话号码2(必须设置)
读取紧急报警电话号码1
读取紧急报警电话号码2
设置通信中断报警时间门限(1到10分钟)
读取通信中断报警时间门限
设置报警短信发送次数(1到3次)
读取报警短信发送次数(1到3次)
打开NETDOG的监控和报警功能
将该工作状态记录到EEPROM,上电恢复相应状态
关闭NETDOG的监控和报警功能
-----------------------------------------------------------------------------------------------------------*/
/*******************************************************************************************************/
/* EEPROM Read and Write */
/* EEPROM 总共存储66个字节,两个电话号码,一个通讯中断报警门限(1-10分钟),一个报警次数(1-3次)*/
#define EEPROM_CHECKSUM 0
#define FIR_PHONE_NUMBER_ADDR 1
#define SEC_PHONE_NUMBER_ADDR 33
#define DISCONNECT_TIME_ADDR 65
#define SMS_SEND_TINE_ADDR 66
#define NETDOG_POWER_OPEN_ADDR 67
#define NETDOG_CONNECT_OPEN_ADDR 68
#define USE_NAME_OPEN_ADDR 70
#define NETDOG_SERIAL_NO_ADDR 72
#define NETDOG_NAME_ADDR 88
/*******************************************************************************************************/
/*------------------------------------------------
Init_LCD()
初始化LCD显示屏
------------------------------------------------*/
void Init_LCD()
{
DelayCount = 0;
while( DelayCount < 40 );
LCD_addr = LCD_IR;
LCD_data = 0x38;
*LCD_addr= LCD_data;
DelayCount = 0;
while( DelayCount < 10 );
*LCD_addr= LCD_data;
DelayCount = 0;
while( DelayCount < 5 );
*LCD_addr= LCD_data;
DelayCount = 0;
while( DelayCount < 5 );
LCD_data = 0x38; //function setup
*LCD_addr= LCD_data;
DelayCount = 0;
while( DelayCount < 5 );
LCD_data = 0x08; //turn off display
*LCD_addr= LCD_data;
DelayCount = 0;
while( DelayCount < 5 );
LCD_data = 0x01; //clear the screen
*LCD_addr= LCD_data;
DelayCount = 0;
while( DelayCount < 10 );
LCD_data = 0x06; //input method setup
*LCD_addr= LCD_data;
DelayCount = 0;
while( DelayCount < 5 );
LCD_data = 0x0c;
*LCD_addr= LCD_data;
DelayCount = 0;
while( DelayCount < 5 );
}
/*------------------------------------------------
Display characters
Display testing on LCD screen
------------------------------------------------*/
void Display_LCD( unsigned char *str )
{
unsigned char Display_count;
LCD_addr = LCD_IR;
LCD_data = 0x01; //clear the screen
*LCD_addr= LCD_data;
DelayCount = 0;
while( DelayCount < 10 );
// LCD_data = 0x30; //function setup
// *LCD_addr= LCD_data;
// DelayCount = 0;
// while( DelayCount < 5 );
// LCD_data = 0x0E;
// *LCD_addr= LCD_data;
// DelayCount = 0;
// while( DelayCount < 5 );
// LCD_data = 0x06; //input method setup
// *LCD_addr= LCD_data;
// DelayCount = 0;
// while( DelayCount < 5 );
// SRAM_addr = SRAM_BASEADDR;
LCD_addr = LCD_DR;
/*
*SRAM_addr = Initialized + 0x30;
SRAM_addr ++;
*SRAM_addr = Initialized + 0x30 + 1;
SRAM_addr --;
*LCD_addr = *SRAM_addr;
DelayCount = 0;
while( DelayCount < 10 );
SRAM_addr ++;
*LCD_addr = *SRAM_addr;
SRAM_addr[2] = 0x35;
SRAM_addr[3] = 0x36;
strcpy( SRAM_addr + 2, "ab" );
*LCD_addr = SRAM_addr[2];
DelayCount = 0;
while( DelayCount < 10 );
*LCD_addr = SRAM_addr[3];
*/
//display at line 1( address range is from 0x00 to 0x27)
for( Display_count = 0; Display_count < 20; Display_count ++ )
{
// SRAM_data = *SRAM_addr;
// LCD_data = SRAM_data;
// LCD_data = str[ Display_count ];
// *LCD_addr = LCD_data;
*LCD_addr = str[Display_count];
DelayCount = 0;
while( DelayCount < 10 );
SRAM_addr ++;
}
LCD_addr = LCD_IR; //Locate to line 2( 0x40 )
LCD_data = 0xC0; //0xC0 = 11000000b
*LCD_addr= LCD_data;
DelayCount = 0;
while( DelayCount < 10 );
//display at line 2( address range is from 0x40 to 0x67 )
for( Display_count = 20; Display_count < 40; Display_count ++ )
{
LCD_addr = LCD_DR;
*LCD_addr = str[Display_count];
DelayCount = 0;
while( DelayCount < 10 );
}
}
void Display_LCD1(unsigned char *str)
{
unsigned char Display_count;
LCD_addr = LCD_IR; //Locate to line 2( 0x40 )
LCD_data = 0x80; //0xC0 = 11000000b
*LCD_addr= LCD_data;
DelayCount = 0;
while( DelayCount < 10 );
//display at line 2( address range is from 0x40 to 0x67 )
for( Display_count = 0; Display_count < 20; Display_count ++ )
{
LCD_addr = LCD_DR;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -