📄 main.c
字号:
#include<reg52.h>
#include<stdio.h>
#include "Intrins.h"
#include<absacc.h>
#include<math.h>
#include<string.h>
#define Uchar unsigned char
#define Uint unsigned int
#define Ulong unsigned long
#define ENABLE_ISP 0x80
sfr ISP_DATA=0xe2;
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
sfr WDT_COUNT=0xe1;
sbit g_sbitEn485 = P3^4;
sbit bSRCLK=P1^4;
sbit bRCLK=P1^5;
sbit bDAT=P1^6;
sbit bCS=P1^7;
Uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x80,0x00};//0-9,-,.,全灭
Uchar code tab2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40,0x00};//0-9,带点的
void SetLight(void);
void SetRate(void);
void DelayMS(Uint nDelayTime);
void DisplayData(void);
void DisplayDataGun(void);
void McuReadFlash(Uchar m_chDPH,Uchar m_chDPL);
void McuFlashSectorErase(Uchar m_chDPH,Uchar m_chDPL);
void McuFlashDisable();
void McuWriteFlash(Uchar m_chDPH,Uchar m_chDPL,Uchar m_chWriteData);
void SelectDisplayMode(void);
void ComReturnData(void);
void DataOperation(void);
void SysInit(void);
void InitSerial(Uchar m_chTH1,Uchar m_chTL1);
void WDTContr(void);
void RecvDataVerify(void);
void WriteMcuFlashError(void);
void DeleteZeroFun(void);
Uchar g_chRecvBuf[14];
Uchar g_chRecvCount=0;
Uchar g_chMcuFlashTemp=0xa0;
Uchar g_chMcuFlashTemp1=0;
Uchar m_chVerify=0;
Uchar g_chDataHighBitOffsetPos=3;
Uint g_SetLightTime=2000;
Uint g_SetGoOutTime=1;
bit g_bitComDataSet=1;
bit g_bitComSendFlag=0;
bit g_bitWriteMcuFlashOK=0;
bit g_bitReadBuffTag=0;
#define LIGHT_ALL 0x09
Uchar light_cnt;
Uchar light_time;
//*********************************************************************
//** 函数名: main()
//* 输 入:
//* 输 出:
//* 功能描述:
//* 全局变量:
//* 调用模块:
//* 作 者: wzw
//* 日 期: 2006-07-27
//* 修 改:
//* 日 期:
//* 版 本:
//********************************************************************
void main(void)
{
SysInit();
g_chRecvBuf[3]=0xa5;
g_chRecvBuf[8]=0xa0;
g_chRecvBuf[9]=0;
g_chRecvBuf[10]=0;
g_chRecvBuf[11]=0;
g_chRecvBuf[12]=0;
g_chRecvBuf[13]=0;
g_chDataHighBitOffsetPos=3;
DisplayData();
McuReadFlash(0x20,0x0);
if(g_chMcuFlashTemp1>0xa4||g_chMcuFlashTemp1<0xa0)
{
McuFlashSectorErase(0x20,0x0);
McuWriteFlash(0x20,0x0,0xa0);
g_chRecvBuf[3]=0xa5;
g_chRecvBuf[8]=0xa0;
g_chRecvBuf[9]=0;
g_chRecvBuf[10]=0;
g_chRecvBuf[11]=0;
g_chRecvBuf[12]=0;
g_chRecvBuf[13]=0;
g_chDataHighBitOffsetPos=3;
DisplayData();
}
while(1)
{
WDTContr();
if(g_bitReadBuffTag)
{
ES=0;
RecvDataVerify();
}
if(g_bitReadBuffTag)
{
if(g_chRecvBuf[2]==0x0a&&g_chRecvBuf[3]!=0xa4)
{
McuReadFlash(0x20,0x0);
DataOperation();
}
else if(g_chRecvBuf[2]==0x03&&g_chRecvBuf[3]==0xa4&&g_chRecvBuf[4]!=0xa4)
{
McuFlashSectorErase(0x20,0x0);
McuWriteFlash(0x20,0x0,g_chRecvBuf[4]);
while(!g_bitWriteMcuFlashOK)
{
g_chRecvBuf[8]=0xa0;
g_chRecvBuf[9]=1;
g_chRecvBuf[10]=9;
g_chRecvBuf[11]=9;
g_chRecvBuf[12]=9;
g_chRecvBuf[13]=9;
DeleteZeroFun();
DisplayData();
}
ComReturnData();
McuReadFlash(0x20,0x0);
}
else if(g_chRecvBuf[2]==0x08&&g_chRecvBuf[3]==0xa3)
{
SelectDisplayMode();
}
else if(g_chRecvBuf[2]==0x03&&g_chRecvBuf[3]==0x37)
{
SetRate();
}
else if(g_chRecvBuf[2]==0x03&&g_chRecvBuf[3]==0x38)
{
SetLight();
}
else if(g_chRecvBuf[2]==0x03&&g_chRecvBuf[3]==0x39)
{
ComReturnData();
}
g_bitReadBuffTag=0;
}
ES=1;
}
}
//*********************************************************************
//** 函数名: SysInit()
//* 输 入:
//* 输 出:
//* 功能描述: 系统初始化
//* 全局变量:
//* 调用模块:
//* 作 者: wzw
//* 日 期: 2006-07-27
//* 修 改:
//* 日 期:
//* 版 本:
//*********************************************************************
void SysInit(void)
{
g_sbitEn485=0;
bCS=0;
memset(&g_chRecvBuf, 0, sizeof g_chRecvBuf);
McuReadFlash(0x26,0x0);
if(g_chMcuFlashTemp1>=0x31&&g_chMcuFlashTemp1<=0x35)
{
switch(g_chMcuFlashTemp1)
{
case 0x31:
InitSerial(0xa0,0xa0);//1200
break;
case 0x32:
InitSerial(0xd0,0xd0);//2400
break;
case 0x33:
InitSerial(0xe8,0xe8);//4800
break;
case 0x34:
InitSerial(0xf4,0xf4);//9600
break;
case 0x35:
InitSerial(0xfa,0xfa);//19200
break;
default:
break;
}
}
else
{
InitSerial(0xf4,0xf4);
}
McuReadFlash(0x28,0x0);
if(g_chMcuFlashTemp1>=0x30&&g_chMcuFlashTemp1<=0x37)
{
light_time=g_chMcuFlashTemp1-0x30+1;
}
else
light_time=5;
TH0=0XFF;
TL0=0Xe0;
TR0=1;
ET0=1;
}
void RecvDataVerify(void)
{
if(g_chRecvBuf[2]==0x0a)
{
m_chVerify=g_chRecvBuf[1];
m_chVerify^=g_chRecvBuf[2];
m_chVerify^=g_chRecvBuf[3];
m_chVerify^=g_chRecvBuf[4];
m_chVerify^=g_chRecvBuf[5];
m_chVerify^=g_chRecvBuf[6];
m_chVerify^=g_chRecvBuf[7];
m_chVerify^=g_chRecvBuf[8];
m_chVerify^=g_chRecvBuf[9];
m_chVerify^=g_chRecvBuf[10];
m_chVerify^=g_chRecvBuf[11];
if(m_chVerify==g_chRecvBuf[12])
{
g_bitReadBuffTag=1;
}
else
{
g_bitReadBuffTag=0;
}
}
else if(g_chRecvBuf[2]==0x03)
{
if(g_chRecvBuf[3]==0xa4)
{
m_chVerify=g_chRecvBuf[1];
m_chVerify^=g_chRecvBuf[2];
m_chVerify^=g_chRecvBuf[3];
m_chVerify^=g_chRecvBuf[4];
if(m_chVerify==g_chRecvBuf[5])
{
g_bitReadBuffTag=1;
}
else
{
g_bitReadBuffTag=0;
}
}
else if(g_chRecvBuf[3]==0x37||g_chRecvBuf[3]==0x38||g_chRecvBuf[3]==0x39)
{
m_chVerify=g_chRecvBuf[1];
m_chVerify^=g_chRecvBuf[2];
m_chVerify^=g_chRecvBuf[3];
m_chVerify^=g_chRecvBuf[4];
if(m_chVerify==g_chRecvBuf[5])
{
g_bitReadBuffTag=1;
}
else
{
g_bitReadBuffTag=0;
}
}
else
{
g_bitReadBuffTag=0;
}
}
else if(g_chRecvBuf[2]==0x08)
{
m_chVerify=g_chRecvBuf[1];
m_chVerify^=g_chRecvBuf[2];
m_chVerify^=g_chRecvBuf[3];
m_chVerify^=g_chRecvBuf[4];
m_chVerify^=g_chRecvBuf[5];
m_chVerify^=g_chRecvBuf[6];
m_chVerify^=g_chRecvBuf[7];
m_chVerify^=g_chRecvBuf[8];
m_chVerify^=g_chRecvBuf[9];
if(m_chVerify==g_chRecvBuf[10])
{
g_bitReadBuffTag=1;
}
else
{
g_bitReadBuffTag=0;
}
}
}
//*********************************************************************
//** 函数名: Serial()
//* 输 入:
//* 输 出:
//* 功能描述: 串口接收中断函数
//* 全局变量:
//* 调用模块:
//* 作 者: wzw
//* 日 期: 2006-07-27
//* 修 改:
//* 日 期:
//* 版 本:
//*********************************************************************
void Serial () interrupt 4 using 3
{
Uchar ch=0;
ES=0;
if(RI)
{
RI=0;
ch=SBUF;
switch (ch)
{
case 0x7f:
g_chRecvBuf[0]=0x7f;
g_chRecvCount=1;
break;
case 0xff:
if(g_chRecvCount==1)
{
g_chRecvBuf[1]=0xff;
g_chRecvCount=2;
}
else if(g_chRecvCount==5)
{
g_chRecvBuf[5]=0xff;
g_chRecvCount=6;
}
else
{
g_chRecvCount=0;
}
break;
case 0x0a:
if(g_chRecvCount==2)
{
g_chRecvBuf[2]=0x0a;
g_chRecvCount=3;
}
else
{
g_chRecvCount=0;
}
break;
case 0x03:
if(g_chRecvCount==2)
{
g_chRecvBuf[2]=0x03;
g_chRecvCount=3;
}
else
{
g_chRecvCount=0;
}
break;
case 0x08:
if(g_chRecvCount==2)
{
g_chRecvBuf[2]=0x08;
g_chRecvCount=3;
}
else
{
g_chRecvCount=0;
}
break;
case 0xcc:
if(g_chRecvCount==13)
{
g_chRecvBuf[13]=0xcc;
g_bitReadBuffTag=1;
g_chRecvCount=0;
}
else if(g_chRecvCount==6)
{
g_chRecvBuf[6]=0xcc;
g_bitReadBuffTag=1;
g_chRecvCount=0;
}
else if(g_chRecvCount==11)
{
g_chRecvBuf[11]=0xcc;
g_bitReadBuffTag=1;
g_chRecvCount=0;
}
else
{
g_chRecvCount=0;
}
break;
default:
if(g_chRecvCount>2)
{
g_chRecvBuf[g_chRecvCount]=ch;
g_chRecvCount++;
}
else
{
g_chRecvCount=0;
}
break;
}
}
if(TI)
{
TI=0;
g_bitComSendFlag=1;
}
ES=1;
}
//*********************************************************************
//** 函数名: SendCharToCom()
//* 输 入:
//* 输 出:
//* 功能描述: 向串口发送一个字符
//* 全局变量:
//* 调用模块:
//* 作 者: wzw
//* 日 期: 2006-07-27
//* 修 改:
//* 日 期:
//* 版 本:
//*********************************************************************
void SendCharToCom(Uchar chRecv)
{
SBUF = chRecv;
while(!g_bitComSendFlag)
{
}
g_bitComSendFlag=0;
}
//*********************************************************************
//** 函数名: ComReturnData()
//* 输 入:
//* 输 出:
//* 功能描述: 串口返回给上位机数据
//* 全局变量:
//* 调用模块:
//* 作 者: wzw
//* 日 期: 2006-07-27
//* 修 改:
//* 日 期:
//* 版 本:
//********************************************************************
void ComReturnData(void)
{
Uchar m_chVerify=0x7e;
ES=1;
g_sbitEn485=1;
if(g_chRecvBuf[3]==0xa4)
{
m_chVerify^=0x0;
m_chVerify^=0xff;
m_chVerify^=0x02;
m_chVerify^=0xa4;
SendCharToCom(0x7e);
SendCharToCom(0x0);
SendCharToCom(0xff);
SendCharToCom(0x02);
SendCharToCom(0xa4);
SendCharToCom(m_chVerify);
SendCharToCom(0xcc);
}
else if(g_chRecvBuf[3]==0x37)
{
SendCharToCom(0x7e);
SendCharToCom(0xff);
SendCharToCom(0x03);
SendCharToCom(0x37);
SendCharToCom(g_chRecvBuf[4]);
SendCharToCom(g_chRecvBuf[5]);
SendCharToCom(0xcc);
}
else if(g_chRecvBuf[3]==0x38)
{
SendCharToCom(0x7e);
SendCharToCom(0xff);
SendCharToCom(0x03);
SendCharToCom(0x38);
SendCharToCom(g_chRecvBuf[4]);
SendCharToCom(g_chRecvBuf[5]);
SendCharToCom(0xcc);
}
else if(g_chRecvBuf[3]==0x39)
{
m_chVerify=0xff;
m_chVerify^=0x05;
m_chVerify^=0x39;
m_chVerify^=0x31;
m_chVerify^=0x30;
m_chVerify^=0x30;
SendCharToCom(0x7e);
SendCharToCom(0xff);
SendCharToCom(0x05);
SendCharToCom(0x39);
SendCharToCom(0x31);
SendCharToCom(0x30);
SendCharToCom(0x30);
SendCharToCom(g_chRecvBuf[4]);
SendCharToCom(g_chRecvBuf[5]);
SendCharToCom(0xcc);
}
g_sbitEn485=0;
ES=0;
}
//*********************************************************************
//** 函数名: InitSerial()
//* 输 入:
//* 输 出:
//* 功能描述: 串口接收中断函数
//* 全局变量:
//* 调用模块:
//* 作 者: wzw
//* 日 期: 2006-07-27
//* 修 改:
//* 日 期:
//* 版 本:
//*********************************************************************
void InitSerial(Uchar m_chTH1,Uchar m_chTL1)
{
TMOD |= 0x21;
TH1 = m_chTH1;
TL1 = m_chTL1;
TR1 = 1;
SCON = 0x50;
IE |= 0x90;
PCON |= 0x00;
TR1=1;
PCON=0X80;
SCON=0XD0;
TMOD=0X21;
}
//*********************************************************************
//** 函数名: SelectDisplayMode()
//* 输 入:
//* 输 出:
//* 功能描述: 选择显示模式
//* 全局变量:
//* 调用模块:
//* 作 者: wzw
//* 日 期: 2006-07-27
//* 修 改:
//* 日 期:
//* 版 本:
//********************************************************************
void SelectDisplayMode(void)
{
Uchar temp0=0;
g_chRecvBuf[4]-=0xA0;
g_chRecvBuf[5]-=0xA0;
g_chRecvBuf[6]-=0xA0;
g_chRecvBuf[7]-=0xA0;
g_chRecvBuf[8]-=0xA0;
temp0=g_chRecvBuf[9];
g_chRecvBuf[13]=g_chRecvBuf[4];
g_chRecvBuf[12]=g_chRecvBuf[5];
g_chRecvBuf[11]=g_chRecvBuf[6];
g_chRecvBuf[10]=g_chRecvBuf[7];
g_chRecvBuf[9]=g_chRecvBuf[8];
g_chRecvBuf[8]=temp0;
DisplayDataGun();
}
//*********************************************************************
//** 函数名: WDTContr()
//* 输 入:
//* 输 出:
//* 功能描述: 看门狗
//* 全局变量:
//* 调用模块:
//* 作 者: wzw
//* 日 期: 2006-07-27
//* 修 改:
//* 日 期:
//* 版 本:
//********************************************************************
void WDTContr(void)
{
WDT_COUNT=0x35;
}
//*********************************************************************
//** 函数名: DelayMS()
//* 输 入: nDelayTime:延时毫秒数
//* 输 出:
//* 功能描述: 延时(毫秒)
//* 全局变量:
//* 调用模块:
//* 作 者: wzw
//* 日 期: 2006-07-27
//* 修 改:
//* 日 期:
//* 版 本:
//*********************************************************************
void DelayMS( Uint nDelayTime )
{
Uint i;
for ( i=nDelayTime; i>0; i-- )
{
}
}
//*********************************************************************
//** 函数名: DisplayData()
//* 输 入:
//* 输 出:
//* 功能描述: 可控制亮度的数据显示
//* 全局变量:
//* 调用模块:
//* 作 者: wzw
//* 日 期: 2006-07-27
//* 修 改:
//* 日 期:
//* 版 本:
//*********************************************************************
void DisplayData(void)
{
Uchar num;
Uchar c;
Uchar i=0;
bCS=0;
num=tab[12];
for(c=0;c<8;c++)
{
bSRCLK=0;
bDAT=num&0x80;
num=num<<1;
bSRCLK=1;
_nop_();
bSRCLK=0;
}
switch(g_chDataHighBitOffsetPos)
{
case 1:
if(g_chRecvBuf[8]==0xa0)
{
num=tab[1];
for(c=0;c<8;c++)
{
bSRCLK=0;
bDAT=num&0x80;
num=num<<1;
bSRCLK=1;
_nop_();
bSRCLK=0;
}
if(g_chRecvBuf[3]==0xa6||g_chRecvBuf[3]==0xa8)
{
num=tab2[g_chRecvBuf[10]];
}
else
{
num=tab[g_chRecvBuf[10]];
}
for(c=0;c<8;c++)
{
bSRCLK=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -