📄 ser_main.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 + -