?? 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 + -