⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plc_demo.c

📁 该原代码应用在cpu(st89le516AD+)上,控制GPRS模块sim100,通过检测系统状态(通电状态,运行状态,AD采样值),通过GPRS模块的短信功能,实现无线报警.
💻 C
📖 第 1 页 / 共 5 页
字号:
/**********************************************
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 + -