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

📄 ser_main.c

📁 机于s52的巡检系统的开发代码。从代码中可以看到整个系统的流程和上位机的通信协议的格式非常不错。
💻 C
字号:
/*=======================================================================
		系统的集成测试部分程序
		 Data:9/18/2006
		 Designed by:Crystal  Cumt
		              电科03-班
 注意:由于存储器的限制本模拟测试巡检系统的现在的最大巡检量为4094个地点.
       检测超过的部分现在还没有处理.. 在4094个巡检点之内是完全正确可靠...
       
=======================================================================*/
//////////////////////////////////////////////////////////////////////
#include<regx52.h>
#include<LCD1602.h>
#include<DS1302.h>
#include<EEProm.h>
#include<WDTRST.H>


///
//////////////////公有变量的生名 //////////////////////////// 
///
unsigned char Count,CardH,CardL ;
unsigned char EromLowBuf[2];
unsigned char data RxTxBuffer[8];//初始化发送接收缓冲区//
///
//////////////////函数原型的声明//////////////////////////////////////
/////////////////卡号的模拟读取子程序部分.完成卡号的读取工作 //////
unsigned char  ReadCardH(void);
unsigned char ReadCardL(void);
////
/// ////////////////////系统的鸣笛提示函数部分,发出一声短叫声//////////////
void Beep(void);
///
////////数据的发送函数声明,用于将EEProm中的数据全部都传送到计算机数据库中
//// 
void Send(void);
//////////////////////系统的时间和日期的同步函数.用于下位机的时间修改.////
void ChangeTime(void);
////
///////////////循环发送或接受num个字节的子程序部分////////////////
///
void GetData(unsigned char num );
void SendData(unsigned char num);
void WriteMessage(void);
void ReadMessage(void);
////////////////////////////////////////bit check(void);//////////////
void Delay_5ms(unsigned char Count)
	{
		unsigned char i,j;
		for (i=0;i<Count;i++){ //在11.0592M的时钟下的0.5MS的延时程序//
		FeedDog();  //喂狗
		for (j=0;j<150;j++);
		}
		FeedDog();  //喂狗
	}
///
//////////////////////////////////////////////////////////////////
///
void main (void)
	{	
		SYSTEMTIME CurrentTime;  //初始化结构时间数据类型
		FeedDog();  //喂狗
		CardH=0x00;
		CardL=0x00;	//初始化模拟卡号记录数据部分...//
		Beep(); 
        P2_7=0;
	    FeedDog();  //喂狗
 		LCD_Initial();	    //液晶显示的初始化部分
		Initial_DS1302();    //时钟的运行初始化
		IP=0X13; //串口的优先中断提高,中断的优先级很重要,决定了系统的工作是否未定(调试的结论)//
		TI=0;
		RI=0; //串口中断的复位//
		SCON=0x50; //串口的工作方式一  //
		TMOD=0x21; //定时器1的工作方式二,定时器0的工作方式1//
		TH1=0xFD;
		TL1=0xFD;//定时器的初值初始化//	
        TH0=0XB4; //在11.0592M的时钟下的50ms定时初值;
		TL0=0X04;
		IT0=0; //开外中断0用于卡的读取和触发方式的选择//
		EX0=1;
		TR0=1;
		FeedDog();  //喂狗
		TR1=1;//启动定时器
		ET0=1; //开启定时器中断
		ET1=0;//波特率发生。不开;//
		ES=1; //Serial_prot interrupt oppened here;
		EA=1; //Global interrupt oppened here;//
        I_Init();
		FeedDog();  //喂狗
		GotoXY(0,0);
		Print("DATE**TIME**MODE");
		DS1302_GetTime(&CurrentTime);
		DateToStr(&CurrentTime);
		TimeToStr(&CurrentTime);
		GotoXY(1,0);
		Print(CurrentTime.DateString );
		GotoXY(1,6);
		Print(CurrentTime.TimeString );
		GotoXY(1,12);
		Print("Time");
		Delay_5ms(60);
		ReadBlock(&EromLowBuf,0x0000,2);
        P2_7=1;
		Beep();		
		while(1){
		FeedDog();  //喂狗
		}				
	}
///
////////////串口的中断程序///////////////////////////////////////////
///
void serial(void) interrupt 4 
	{   
	    FeedDog();  //喂狗                     //	unsigned char node ;
	    ES=0;
		GetData(2);
		if(RxTxBuffer[0]!=RxTxBuffer[1])
		{
			SBUF='W';  //未能成功接收
			while(!TI);//可能是线路故障了。//
			TI=0;	   //复位中断标志位
			FeedDog();  //喂狗
			Beep();
			ES=1;  //开串口的中断//
		}
		else
		{	FeedDog();  //喂狗				
			switch(RxTxBuffer[0]) 
			/*说明:QQ是线路的检测命令
			       CC是时间的修改命令
				   SS是数据的上传命令
				   FF是磁盘的快速格式化命令
				   MM是写入人员编号命令,下位机的软件版本序列号和下位机编号
				   NN是读取人员的编号命令,下位机的软件版本序列号和下位机编号
			 */
			{
				case 'Q' : SBUF='Q';  //线路的故障检测;//
						   while(!TI);
						   FeedDog();  //喂狗
						   TI=0;
						   ES=1;
						   Beep(); //注意的是在线路检测中不能使用beep()函数。否则
						   break; //只能在多个测试中取其中之一。其余的被beep()的延时所丢弃。//
				case 'C' : FeedDog();  //喂狗
                           ChangeTime();//修改时间
						   SBUF='C';
                           while(!TI);
						   FeedDog();  //喂狗
                           TI=0;
						   ES=1;
						   break;
				case 'S' : FeedDog();  //喂狗
						   SBUF='S';
                           while(!TI);
						   FeedDog();  //喂狗
                           TI=0;
                           GotoXY(1,12);
	                       Print("TxRx");
                           Send(); 	//要求下位机数据发送//
						   SBUF='O';
                           while(!TI);
						   FeedDog();  //喂狗
                           TI=0;
						   ES=1;
                           GotoXY(1,12);
                           Print("Time");
						   FeedDog();  //喂狗
						   Beep();						     
						   break;
				case 'F' : FeedDog();  //喂狗
						   EromLowBuf[0]=0;
						   EromLowBuf[1]=0;
						   WriteBlock(&EromLowBuf,0x0000,2);
						   FeedDog();  //喂狗		
						   ReadBlock(&EromLowBuf,0x000,2); //初次使用时的磁盘格式化部分,不然不能正常数据的记录//
				           SBUF='F';
                           while(!TI);
						   FeedDog();  //喂狗
                           TI=0; 
						   ES=1;
						   Beep();  
						   break;
				case 'M' : 	FeedDog();  //喂狗
							WriteMessage();
							SBUF='M';
							while(!TI);
							FeedDog();  //喂狗
							TI=0;
							ES=1;
							Beep();
							break;
				case 'N' : 	FeedDog();  //喂狗
							ReadMessage();
							SBUF='N';
							while(!TI);
							FeedDog();  //喂狗
							TI=0;
							ES=1;
							Beep();
							break;
							
				default  : SBUF='W'; //说明有不能识别的命令出现//
						   while(!TI);
						   TI=0;
						   Beep();
				           ES=1;
						   break;			   
			} 
		}
	}	
//	
///
////////串口的多字节接收部分/////////////////////////////////////
///
void GetData(unsigned char num)
	{
		unsigned char loop;
		FeedDog();  //喂狗
		for(loop=0;loop<num;loop++)
			{	  //串口的多字节接收 //
				while(!RI);
				RxTxBuffer[loop]=SBUF;
				RI=0;
			}
			FeedDog();  //喂狗		
	}				

///
///////////串口的都字节发送////////////////////////////////////
///
void SendData(unsigned char num)
	{
		unsigned char loop;
		FeedDog();  //喂狗
		for(loop=0;loop<num;loop++)//数据的多字节发送程序部分//
		{
			SBUF=RxTxBuffer[loop];
			while(!TI);
			TI=0;
		}
		FeedDog();  //喂狗			
	}
///

///////////////时钟的时间修改函数调用实现部分/////////////
///
void ChangeTime()
	{
		FeedDog();  //喂狗
		GetData(7);	 //得到时钟数据//
		BurstWrite1302(&RxTxBuffer[0]);/////时钟的写入函数调用////////
		Beep();	
		FeedDog();  //喂狗
	}
///
//////////////动态时间刷新/////////////////////////////
///
void dispflash(void) interrupt 1 using 0
	{
		SYSTEMTIME CurrentTime;  //初始化结构时间数据类型
		TH0=0XB4;
		TL0=0X04;
		Count++;
		FeedDog();  //喂狗
		if(Count>=50)
			{	
				P2_7=!P2_7;
				Count=0;
				DS1302_GetTime(&CurrentTime);
				DateToStr(&CurrentTime); //读取时间//
				TimeToStr(&CurrentTime);//取得字符时间串//
				GotoXY(1,0);
				Print(CurrentTime.DateString);
				GotoXY(1,6);  //显示部分//
				Print(CurrentTime.TimeString);
			}
			FeedDog();  //喂狗
	}
//
///////////数据的上传程序模块.功能见程序的书写///////////////////////////////
///
void Send(void)
	{
		unsigned int i,meme;
		FeedDog();  //喂狗
        ReadBlock(&EromLowBuf,0x0000,2);
		ReadBlock(&RxTxBuffer,0x0000,2);
        SendData(2);
        SendData(2);
		meme=EromLowBuf[0]|(unsigned int)(EromLowBuf[1]<<8);
		for(i=0;i<meme;i++)
			{
				ReadBlock(&RxTxBuffer,i*8+8,8);
				SendData(8);
			}
			EromLowBuf[0]=0;
			EromLowBuf[1]=0;
			FeedDog();  //喂狗
			WriteBlock(&EromLowBuf,0x0000,2);	

	}
///
////////////////中断0的数据的读取和记录模块程序部分///////////////////////////////
///
void int0(void) interrupt 0 
	{	unsigned int i;
		EX0=0;
		FeedDog();  //喂狗
        RxTxBuffer[0] = Read1302(DS1302_SECOND);
		RxTxBuffer[1] = Read1302(DS1302_MINUTE);
		RxTxBuffer[2] = Read1302(DS1302_HOUR);
		RxTxBuffer[3] = Read1302(DS1302_DAY);//时间和日期的获取//
		RxTxBuffer[4] = Read1302(DS1302_MONTH);
		RxTxBuffer[5] = Read1302(DS1302_YEAR);
		RxTxBuffer[6] = ReadCardL();
		RxTxBuffer[7] =	ReadCardH();
		i=EromLowBuf[0]|(unsigned int)(EromLowBuf[1]<<8);
		WriteBlock(&RxTxBuffer,i*8+8,8);//写入8字节 //
		i++;
		EromLowBuf[0]=i&0x00ff;
		EromLowBuf[1]=i>>8;
		 //记录计数加1;////
       	WriteBlock(&EromLowBuf,0x0000,2);  	//写入系统参数字节部分///
		
			//Read the cardnummber here//
			FeedDog();  //喂狗
			Beep();//鸣笛提示 
          //	Delay_5ms(254);
          //注意(再次用延时函数是为了调试时的成功读取消抖,实际情况中要视情况而定)
			EX0=1;
		
	}
///
///////////////////   鸣笛函数  //////////////////////
///
void Beep(void)
	{
		P1_0=0; //鸣笛提示函数//
		P1_1=0;
		FeedDog();  //喂狗
		Delay_5ms(140);	
		FeedDog();  //喂狗		
		P1_0=1;
		P1_1=1;

	}
///
/////////////// 仿真模拟卡号的高字节读取函数 ///////////////////////////////
///
unsigned char ReadCardH(void)
	{	FeedDog();  //喂狗
		if(CardL>=255)
			return CardH++;
		else
			return CardH;
	    FeedDog();  //喂狗
	}
///
////////////////仿真模拟卡号的低字节读取函数 //////////////////////////////
unsigned char ReadCardL(void)
	{
		FeedDog();  //喂狗
		return CardL++;
	}
void WriteMessage(void){
	 FeedDog();  //喂狗
	 GetData(3);
	 WriteBlock(&RxTxBuffer,0x0002,3);
	 FeedDog();  //喂狗
	}
void ReadMessage(void){
     FeedDog();  //喂狗
   	 ReadBlock(&RxTxBuffer,0x0002,3);
	 SendData(3);
	 FeedDog();  //喂狗	
	}	
///


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -