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

📄 main.c

📁 stc单片机编程源代码,包括对led的操作和内部flash的读写操作等.
💻 C
📖 第 1 页 / 共 3 页
字号:

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