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

📄 main.c

📁 stc单片机编程源代码,包括对led的操作和内部flash的读写操作等.
💻 C
📖 第 1 页 / 共 3 页
字号:
				{       
					 bSRCLK=0;
					 bDAT=num&0x80;
					 num=num<<1;          
					 bSRCLK=1;
					 _nop_();
					 bSRCLK=0;         		
				}
				num=tab2[g_chRecvBuf[11]];
				for(c=0;c<8;c++)
				{       
					 bSRCLK=0;
					 bDAT=num&0x80;
					 num=num<<1;          
					 bSRCLK=1;
					 _nop_();
					 bSRCLK=0;         		
				}
				num=tab[g_chRecvBuf[12]];
				for(c=0;c<8;c++)
				{       
					 bSRCLK=0;
					 bDAT=num&0x80;
					 num=num<<1;          
					 bSRCLK=1;
					 _nop_();
					 bSRCLK=0;         		
				}
				num=tab[g_chRecvBuf[13]];
				for(c=0;c<8;c++)
				{       
				 	 bSRCLK=0;
				     bDAT=num&0x80;
				     num=num<<1;          
				     bSRCLK=1;
				     _nop_();
				     bSRCLK=0;         							
				}						
		break;
		case 3:
			if(g_chRecvBuf[8]==0xa0)
			{
				for(i=1;i<4;i++)
				{
					num=tab[12];
					for(c=0;c<8;c++)
					{       
				 	    bSRCLK=0;
				    	bDAT=num&0x80;
				        num=num<<1;          
				        bSRCLK=1;
				        _nop_();
				        bSRCLK=0;         		
				    }
			    }
			}
			else if(g_chRecvBuf[8]==0xa1)
			{
				for(i=1;i<3;i++)
				{
					num=tab[12];
					for(c=0;c<8;c++)
					{       
				 	    bSRCLK=0;
				    	bDAT=num&0x80;
				        num=num<<1;          
				        bSRCLK=1;
				        _nop_();
				        bSRCLK=0;         		
				    }
			    }				
					num=tab[10];
					for(c=0;c<8;c++)
					{       
				 	    bSRCLK=0;
				    	bDAT=num&0x80;
				        num=num<<1;          
				        bSRCLK=1;
				        _nop_();
				        bSRCLK=0;         		
				    }
				    			    																	
			}
				num=tab2[g_chRecvBuf[11]];
				for(c=0;c<8;c++)
				{       
					 bSRCLK=0;
					 bDAT=num&0x80;
					 num=num<<1;          
					 bSRCLK=1;
					 _nop_();
					 bSRCLK=0;         		
				}
				num=tab[g_chRecvBuf[12]];
				for(c=0;c<8;c++)
				{       
					 bSRCLK=0;
					 bDAT=num&0x80;
					 num=num<<1;          
					 bSRCLK=1;
					 _nop_();
					 bSRCLK=0;         		
				}
				num=tab[g_chRecvBuf[13]];
				for(c=0;c<8;c++)
				{       
				 	 bSRCLK=0;
				     bDAT=num&0x80;
				     num=num<<1;          
				     bSRCLK=1;
				     _nop_();
				     bSRCLK=0;         							
				}											
		break;	
		default:
		break;			
	}	
TR0=0;
     bRCLK=0;
     _nop_();
	 _nop_();
     bRCLK=1;
     _nop_();
     _nop_();
     bRCLK=0; 
TR0=1;
}
//*********************************************************************
//** 函数名:   McuWriteFlash()
//*  输 入:    m_chDPH-待写入flash地址高位    m_chDPL-待写入地址低位    m_chWriteData-待写入数据
//*  输 出:    
//*  功能描述: 写单片机内部flash
//*  全局变量:
//*  调用模块: 
//*  作 者:    wzw
//*  日 期:    2006-07-27
//*  修 改:
//*  日 期:
//*  版 本:
//********************************************************************
void McuWriteFlash(Uchar m_chDPH,Uchar m_chDPL,Uchar m_chWriteData)
{
	Uchar m_chTestData1=0;
	Uchar m_chTestData2=0;
	Uint  m_nLoopCount=0;
	DPH=m_chDPH;
	DPL=m_chDPL;
	

	ISP_CONTR=ENABLE_ISP;
	ISP_CMD=0x02;		
	ISP_ADDRH=DPH;
	ISP_ADDRL=DPL;
	ISP_DATA=m_chWriteData;
	EA=0;
	ISP_TRIG=0x46;
	ISP_TRIG=0xb9;	
	_nop_();		
	EA=1;	
	ISP_DATA=0;
	
	do{
		McuReadFlash(m_chDPH,m_chDPL);
		m_chTestData1=g_chMcuFlashTemp1;
		McuReadFlash(m_chDPH,m_chDPL);
		m_chTestData2=g_chMcuFlashTemp1;	
		if(m_chTestData1==m_chTestData2)
		{
			g_bitWriteMcuFlashOK=1;
		}
		else
		{
			g_bitWriteMcuFlashOK=0;
			m_nLoopCount++;
		}
		McuReadFlash(m_chDPH,m_chDPL);
		m_chTestData1=g_chMcuFlashTemp1;
		McuReadFlash(m_chDPH,m_chDPL);
		m_chTestData2=g_chMcuFlashTemp1;	
		if(m_chTestData1==m_chTestData2)
		{
			g_bitWriteMcuFlashOK=1;
		}
		else
		{
			g_bitWriteMcuFlashOK=0;
			m_nLoopCount++;
		}
	}while(g_bitWriteMcuFlashOK==0&&m_nLoopCount<10000);	
}

//*********************************************************************
//** 函数名:   McuReadFlash()
//*  输 入:    m_chDPH-待读入数据的高位地址    m_chDPL-待读入数据的低位地址
//*  输 出:    
//*  功能描述: 单片机写内部flash
//*  全局变量:
//*  调用模块: 
//*  作 者:    wzw
//*  日 期:    2006-07-27
//*  修 改:
//*  日 期:
//*  版 本:
//********************************************************************
void McuReadFlash(Uchar m_chDPH,Uchar m_chDPL)
{
	DPH=m_chDPH;
	DPL=m_chDPL;
	ISP_CONTR=ENABLE_ISP;
	ISP_CMD=0x01;
	ISP_ADDRH=DPH;
	ISP_ADDRL=DPL;
	ISP_DATA=0;
	EA=0;
	ISP_TRIG=0x46;
	ISP_TRIG=0xb9;	
	_nop_();
	g_chMcuFlashTemp1=ISP_DATA;		
	EA=1;
	McuFlashDisable();
	
}
//*********************************************************************
//** 函数名:   McuFlashSectorErase()
//*  输 入:    
//*  输 出:    
//*  功能描述: 单片机内部flash扇区擦除
//*  全局变量:
//*  调用模块: 
//*  作 者:    wzw
//*  日 期:    2006-07-27
//*  修 改:
//*  日 期:
//*  版 本:
//********************************************************************
void McuFlashSectorErase(Uchar m_chDPH,Uchar m_chDPL)
{
	DPH=m_chDPH;
	DPL=m_chDPL;
	ISP_CONTR=ENABLE_ISP;
	ISP_CMD=0x03;
	ISP_ADDRH=DPH;
	ISP_ADDRL=DPL;	
	EA=0;
	ISP_TRIG=0x46;
	ISP_TRIG=0xb9;
	_nop_();		
	EA=1;
	McuFlashDisable();
}


//*********************************************************************
//** 函数名:   McuFlashDisable()
//*  输 入:    
//*  输 出:    
//*  功能描述: 单片机内部flash初始化
//*  全局变量:
//*  调用模块: 
//*  作 者:    wzw
//*  日 期:    2006-07-27
//*  修 改:
//*  日 期:
//*  版 本:
//********************************************************************
void McuFlashDisable()
{
	ISP_CONTR=0x0;
	ISP_CMD=0x0;
	ISP_TRIG=0x0;	
}
//*********************************************************************
//** 函数名:   DataOperation()
//*  输 入:    
//*  输 出:    
//*  功能描述: 数据计算(如合力、差力、操作、传动等数值的计算)
//*  全局变量:
//*  调用模块: 
//*  作 者:    wzw
//*  日 期:    2006-07-27
//*  修 改:
//*  日 期:
//*  版 本:
//********************************************************************
void DataOperation(void)
{
		Uint nTemp1=0;
		Uint nTemp2=0;
			
   		g_chRecvBuf[4]-=0xA0;
   		g_chRecvBuf[5]-=0xA0;
   		g_chRecvBuf[6]-=0xA0;
   		g_chRecvBuf[7]-=0xA0;				
		g_chRecvBuf[8]-=0xA0;
   		g_chRecvBuf[9]-=0xA0;
   		g_chRecvBuf[10]-=0xA0; 
   		g_chRecvBuf[11]-=0xA0;    		
		

  		if(g_chMcuFlashTemp1==0xa0)
   		{
   			g_chRecvBuf[8]=0xa0;
   			g_chRecvBuf[9]=0x0;
   			g_chRecvBuf[10]=g_chRecvBuf[7]; 
   			g_chRecvBuf[11]=g_chRecvBuf[6];
   			g_chRecvBuf[12]=g_chRecvBuf[5];   
   			g_chRecvBuf[13]=g_chRecvBuf[4];	
   		
   		}
   		else if(g_chMcuFlashTemp1==0xa1)
   		{
   			g_chRecvBuf[7]=g_chRecvBuf[11]; 
   			g_chRecvBuf[6]=g_chRecvBuf[10];
   			g_chRecvBuf[5]=g_chRecvBuf[9];   
   			g_chRecvBuf[4]=g_chRecvBuf[8]; 
   			
			g_chRecvBuf[8]=0xa0;
   			g_chRecvBuf[9]=0x0;
   			g_chRecvBuf[10]=g_chRecvBuf[7]; 
   			g_chRecvBuf[11]=g_chRecvBuf[6];
   			g_chRecvBuf[12]=g_chRecvBuf[5];   
   			g_chRecvBuf[13]=g_chRecvBuf[4];   
   				
   		}
   		else if(g_chMcuFlashTemp1==0xa2)
   		{	
   			nTemp1=g_chRecvBuf[8]+g_chRecvBuf[9]*10+g_chRecvBuf[10]*100+g_chRecvBuf[11]*1000;
   			nTemp2=g_chRecvBuf[4]+g_chRecvBuf[5]*10+g_chRecvBuf[6]*100+g_chRecvBuf[7]*1000;   		
   			nTemp1=nTemp1+nTemp2;
   		
   			g_chRecvBuf[8]=0xa0;
			g_chRecvBuf[9]=nTemp1/10000;
   			g_chRecvBuf[10]=nTemp1/1000%10; 
   			g_chRecvBuf[11]=nTemp1/100%10;
   			g_chRecvBuf[12]=nTemp1/10%10;  
   			g_chRecvBuf[13]=nTemp1%10;       		
        			
   		}   
   		else if(g_chMcuFlashTemp1==0xa3)
   		{
   			nTemp1=g_chRecvBuf[8]+g_chRecvBuf[9]*10+g_chRecvBuf[10]*100+g_chRecvBuf[11]*1000;
   			nTemp2=g_chRecvBuf[4]+g_chRecvBuf[5]*10+g_chRecvBuf[6]*100+g_chRecvBuf[7]*1000;    
   		
   			if(nTemp1>nTemp2)
   			{
   				nTemp1=nTemp1-nTemp2;
   				g_chRecvBuf[8]=0xa1;
   			}
   			else
   			{
   				nTemp1=nTemp2-nTemp1;
   				g_chRecvBuf[8]=0xa0;
   			}
			g_chRecvBuf[9]=0x0;
   			g_chRecvBuf[10]=nTemp1/1000; 
   			g_chRecvBuf[11]=nTemp1/100%10;
   			g_chRecvBuf[12]=nTemp1/10%10;  
   			g_chRecvBuf[13]=nTemp1%10;  
   		      		
   		}
    DeleteZeroFun();
	McuReadFlash(0x20,0x0);
    switch(g_chRecvBuf[3])
   	{
       	case 0xa0:
			if(g_chMcuFlashTemp1!=0xa0&&g_chMcuFlashTemp1!=0xa1&&g_chMcuFlashTemp1!=0xa2&&g_chMcuFlashTemp1!=0xa3)
			{
				g_chMcuFlashTemp1=0xa0;
			}
			else
			{
				DisplayData();
			}
        	break;            			
        case 0xa1: 
			if(g_chMcuFlashTemp1!=0xa0&&g_chMcuFlashTemp1!=0xa1&&g_chMcuFlashTemp1!=0xa2&&g_chMcuFlashTemp1!=0xa3)
			{
				g_chMcuFlashTemp1=0xa0;
			}   
			else
			{
				DisplayData();
			}            
			break;
        case 0xa5:
			if(g_chMcuFlashTemp1!=0xa0&&g_chMcuFlashTemp1!=0xa1&&g_chMcuFlashTemp1!=0xa2&&g_chMcuFlashTemp1!=0xa3)
			{

				g_chMcuFlashTemp1=0xa0;
			}        				
			else
			{
				DisplayData();
			}           	
			break;
        case 0xa6:
			if(g_chMcuFlashTemp1!=0xa0&&g_chMcuFlashTemp1!=0xa1&&g_chMcuFlashTemp1!=0xa2&&g_chMcuFlashTemp1!=0xa3)
			{
				g_chMcuFlashTemp1=0xa0;
			}
			else
			{
				DisplayData();
			}           	
			break;
        case 0xa2:
			if(g_chMcuFlashTemp1!=0xa0&&g_chMcuFlashTemp1!=0xa1&&g_chMcuFlashTemp1!=0xa2&&g_chMcuFlashTemp1!=0xa3)
			{
				g_chMcuFlashTemp1=0xa0;
			}
			else
			{
				DisplayData();
			}            
			break;
        case 0xa3:
			if(g_chMcuFlashTemp1!=0xa0&&g_chMcuFlashTemp1!=0xa1&&g_chMcuFlashTemp1!=0xa2&&g_chMcuFlashTemp1!=0xa3)
			{
				g_chMcuFlashTemp1=0xa0;
			}
			else
			{
				DisplayData();
			}            
			break;
        case 0xa7:
			if(g_chMcuFlashTemp1!=0xa0&&g_chMcuFlashTemp1!=0xa1&&g_chMcuFlashTemp1!=0xa2&&g_chMcuFlashTemp1!=0xa3)
			{
				g_chMcuFlashTemp1=0xa0;
			}
			else
			{
				DisplayData();
			}            
			break;
       case 0xa8:
			if(g_chMcuFlashTemp1!=0xa0&&g_chMcuFlashTemp1!=0xa1&&g_chMcuFlashTemp1!=0xa2&&g_chMcuFlashTemp1!=0xa3)
			{
				g_chMcuFlashTemp1=0xa0;
			}
			else
			{
				DisplayData();
			}            
			break;            
        case 0xa4:
			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();
			g_chMcuFlashTemp1=g_chMcuFlashTemp;
            break;
        default:	
            break;
    } 
    
       		
}
//*********************************************************************
//** 函数名:   SetRate()
//*  输 入:    
//*  输 出:    
//*  功能描述: 设置波特率
//*  全局变量:
//*  调用模块: 
//*  作 者:    wzw
//*  日 期:    2006-07-27
//*  修 改:
//*  日 期:
//*  版 本:
//********************************************************************
void SetRate(void)
{		    	  		
	McuFlashSectorErase(0x26,0x0);
	McuWriteFlash(0x26,0,g_chRecvBuf[4]);
	if(!g_bitWriteMcuFlashOK)
	{
		WriteMcuFlashError();
	}
	else
	{
		ComReturnData();		
	}

	switch(g_chRecvBuf[4])
	{
		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;
	}		
}
//*********************************************************************
//** 函数名:   SetLight()
//*  输 入:    
//*  输 出:    
//*  功能描述: 设置亮度
//*  全局变量:
//*  调用模块: 
//*  作 者:    wzw
//*  日 期:    2006-07-27
//*  修 改:
//*  日 期:
//*  版 本:
//********************************************************************
void SetLight(void)
{
	McuFlashSectorErase(0x28,0x0);
	McuWriteFlash(0x28,0,g_chRecvBuf[4]);
	if(!g_bitWriteMcuFlashOK)
	{
		WriteMcuFlashError();
	}
	else
	{
		ComReturnData();		
	}
	switch(g_chRecvBuf[4])
	{
		case 0x30:
			g_SetLightTime=100;
			g_SetGoOutTime=1;
			break;
		case 0x31:
			g_SetLightTime=200;
			g_SetGoOutTime=1;
			break;
		case 0x32:
			g_SetLightTime=300;
			g_SetGoOutTime=1;
			break;
		case 0x33:
			g_SetLightTime=400;
			g_SetGoOutTime=1;
			break;
		case 0x34:
			g_SetLightTime=500;
			g_SetGoOutTime=1;
			break;
		case 0x35:
			g_SetLightTime=800;
			g_SetGoOutTime=1;
			break;
		case 0x36:
			g_SetLightTime=1000;
			g_SetGoOutTime=1;
			break;
		case 0x37:
			g_SetLightTime=2000;
			g_SetGoOutTime=1;
			break;
        default:
            break;
	}
light_time=g_chRecvBuf[4]-0x30+1;
}
//*********************************************************************
//** 函数名:   WriteMcuFlashError()
//*  输 入:    
//*  输 出:    
//*  功能描述: 写flash错误返回信息
//*  全局变量:
//*  调用模块: 
//*  作 者:    wzw
//*  日 期:    2006-07-27
//*  修 改:
//*  日 期:
//*  版 本:
//********************************************************************
void WriteMcuFlashError(void)
{
	ES=1;
	g_sbitEn485=1;	
    SendCharToCom(0x00);
    SendCharToCom(0x00);         		
    SendCharToCom(0x00);   
    SendCharToCom(0x00);
    SendCharToCom(0x00);
    SendCharToCom(0x00);        
	g_sbitEn485=0;
	ES=0;		
}

void	timer0int()	interrupt 1	
{
	if(light_cnt==light_time)
	{
		bCS=1;
	}
	else if(light_cnt>=LIGHT_ALL)
	{
		bCS=0;
		light_cnt=0;
	}
	light_cnt++;
	TH0=0xfc;        
	TL0=0x55; 
}
void DeleteZeroFun(void)
{
	if(g_chRecvBuf[3]==0xa1||g_chRecvBuf[3]==0xa3)
	{
		if(g_chRecvBuf[9]==0x0)
		{
			g_chDataHighBitOffsetPos=2;
			if(g_chRecvBuf[10]==0x0)
			{
				g_chDataHighBitOffsetPos=3;
				if(g_chRecvBuf[11]==0x0)
				{
					g_chDataHighBitOffsetPos=4;
					if(g_chRecvBuf[12]==0x0)
					{
						g_chDataHighBitOffsetPos=5;		
					}					
				}				
			}			
		}
		else if(g_chRecvBuf[9]==0x1)
		{
			g_chDataHighBitOffsetPos=1;	
		}
	}
	else if(g_chRecvBuf[3]==0xa0||g_chRecvBuf[3]==0xa2)
	{
		if(g_chRecvBuf[9]==0x0)
		{
			g_chDataHighBitOffsetPos=2;
			if(g_chRecvBuf[10]==0x0)
			{
				g_chDataHighBitOffsetPos=3;
				if(g_chRecvBuf[11]==0x0)
				{
					g_chDataHighBitOffsetPos=4;				
				}				
			}			
		}
		else if(g_chRecvBuf[9]==0x1)
		{
			g_chDataHighBitOffsetPos=1;	
		}
	}
	else if(g_chRecvBuf[3]==0xa5||g_chRecvBuf[3]==0xa7)
	{
		if(g_chRecvBuf[9]==0x0)
		{
			g_chDataHighBitOffsetPos=2;
			if(g_chRecvBuf[10]==0x0)
			{
				g_chDataHighBitOffsetPos=3;				
			}			
		}
		else if(g_chRecvBuf[9]==0x1)
		{
			g_chDataHighBitOffsetPos=1;	
		}
	}
	else if(g_chRecvBuf[3]==0xa6||g_chRecvBuf[3]==0xa8)
	{
		if(g_chRecvBuf[9]==0x0)
		{
			g_chDataHighBitOffsetPos=2;			
		}
		else if(g_chRecvBuf[9]==0x1)
		{
			g_chDataHighBitOffsetPos=1;	
		}
	}
}

⌨️ 快捷键说明

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