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

📄 simboard.c

📁 单片机与DSP通信源程序
💻 C
字号:
#include "52init.h"
#include "iic.h"
#include "Lcd.h"
//#include "inittable.h"
sfr P4    = 0xE8;

unsigned int idata  ii;
sbit Rst4221=P1^3;
sbit LampEn =P1^6;

sbit BootSyn=P3^2;
sbit BootClk=P3^4;
sbit BootTx =P3^5;
sbit BootRx =P1^7;

sbit SpiSyn=P3^3;
sbit SpiClk=P4^3;
sbit SpiTx =P2^7;
sbit SpiRx =P2^6;

uchar idata EepromDat;
uchar idata systimer=100;
uint  idata LcdBlink=600;
uchar idata SendNum=64;
uchar xdata RecBuf[0xc0];
uchar xdata SecBootTab[64];
uint  idata CopyNum;
uint  idata BlockStart;
uint  idata BlockEnd;

uchar LoopTime=20;
uchar StartDisLine=0;

uint  xdata RecBufDis[64];
uchar xdata SendDatBuf[128];

bit bSerialCMD=0;
uchar xdata ch=0;
uchar xdata CmdStart=0;
uchar xdata bufreceive[5];
uchar xdata dskey[4];
uchar xdata StartLoad=0;
uchar xdata LoadComBuf[64];
uchar xdata CommRecNum=0;
uchar xdata OneBlockEnd=0;
uint  xdata filelenth=0;
uint  xdata BlockCnt=0;

void tdelay(uchar delay_num)  //22.1184 the loop time is 0.543us
   {
    uchar i,k;                //delay_num 0.1ms/num
    for(i=delay_num;i>0;i--)
     {
      for(k=100;k>0;k--)
       {;}
      }
    }
void timer_int(void) interrupt 1
   {
    TH0=0xb8;            //m=65536-22.1184*10^6*time/12;time=10ms;m=b800;
    TL0=0x00;
	if(systimer>0)
	  {
	    systimer--;
	   }
    if(LcdBlink>0)
      {
        LcdBlink--;
       }
    if(LoopTime>0)
      {
        LoopTime--;
       }
	}
void serial(void) interrupt 4
{
    uchar error;
	if(RI==1)
	{ 
	   RI=0;
	   if(StartLoad==0)
	   {
         if(SBUF==0xbb)
             {
                            ch=0; 
  						    CmdStart=1;
              }
         else
             {
			   if(CmdStart==1)
			    {
                  ch++;
				  if(ch<=3)
				       {
                         dskey[ch]=SBUF;
					     }
                  if(ch==3)
                    {
					    CmdStart=0;
                      	error=dskey[1]^dskey[2];
                     		if(error==dskey[3]) 
					   		 {			     
		                		 filelenth=dskey[1];
		                		 filelenth<<=8;
                                 filelenth+=dskey[2];
	                             StartLoad=1;
                                 TI=0;
                                 SBUF=0xbb;
					            }
                            else
                              {
                                 TI=0;
                                 SBUF=0xfe;  /*error*/
                                }
                       }
                   }
			   }
          }
		else
		  {
		    if(CommRecNum<64)
			{
		       SecBootTab[CommRecNum]=SBUF;
			   CommRecNum++;
			  }
			if(CommRecNum==64)
			{
			   CommRecNum=0;
			   OneBlockEnd=1;
			  }
		    }
		}
	else
	{   
	    TI=0;
		if(SendNum<63)
		 {
		   SendNum++;
		   SBUF=RecBuf[SendNum];
		   }
	  }
}

void Rst4221D(void)
   {
      Rst4221=0;
      tdelay(5);
      Rst4221=1;
     }
/*******************************/
/*SPI程序发送接收程序*/
/*******************************/
void SpiBusWr(uint WrData)
     {
       uchar i;
	   uint  Spitemp;
       SpiSyn=0;
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
       Spitemp=WrData;
       for(i=0;i<16;i++)
        {
          Spitemp&=0x8000;
          if(Spitemp==0x8000)
            {
              SpiTx=1;
              SpiClk=0;
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              SpiClk=1;
              WrData<<=1;
             }
          else
            {
              SpiTx=0;
              SpiClk=0;
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              SpiClk=1;
              WrData<<=1;              
              }
           Spitemp=WrData;      
          }
        SpiSyn=1; 
       }
unsigned long int SpiBusRd(void)
     {
       uchar i;
	   unsigned long int Spitemp;
       bit Rdbit;
       SpiSyn=0;
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
       Spitemp=0xffffffff;
       for(i=0;i<32;i++)
        {
              
              SpiClk=0;
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              SpiClk=1;
              SpiRx=1;
              Rdbit=SpiRx;
              Spitemp<<=1; 
              if(Rdbit==1)
                {Spitemp|=0x00000001;}
              else
                {Spitemp&=0xfffffffe;}     
          }
        SpiSyn=1; 
        return(Spitemp);
       }
/*******************************/
uchar sRd1Byte(void)
 {
       uchar i,RdDatTemp;
       bit Rdbit;
       RdDatTemp=0x00;
       for(i=0;i<8;i++)
        {
              BootRx=1;
              BootClk=0;
              BootClk=1;
              Rdbit=BootRx;
              RdDatTemp<<=1; 
              if(Rdbit==1)
                {RdDatTemp|=0x01;}
              else
                {RdDatTemp&=0xfe;} 
          }
        return(RdDatTemp);   
   }
void sWr1Byte(uchar WrDatP)
   {
     uchar WrDatPTmp,i;
	 WrDatPTmp=WrDatP;
	  for(i=0;i<8;i++)
	   {
	    WrDatPTmp&=0x80;
		 if(WrDatPTmp==0x80)
		  { 
		    BootTx=1;
		   }
         else
		  {
		    BootTx=0;
		    }
		  BootClk=0;
		  BootClk=1;
		  WrDatP<<=1;
		  WrDatPTmp=WrDatP;
	    } 
     }
void EepromWrEn(void)
   {
     BootSyn=1;
	 BootSyn=0;
     sWr1Byte(0x06);
     BootSyn=1;
    }
void EepromWrDi(void)
   {
     BootSyn=1;
	 BootSyn=0;
     sWr1Byte(0x04);
     BootSyn=1;
    }
uchar EepromRdReg(void)
   {
    uchar RdTemp;
     BootSyn=1;
	 BootSyn=0;
     sWr1Byte(0x05);
     RdTemp=sRd1Byte();
     BootSyn=1;	 
	 return(RdTemp);
    }
void EepromWrReg(uchar RegP)
   {
     BootSyn=1;
	 BootSyn=0;
     sWr1Byte(0x01);
     sWr1Byte(RegP);
     BootSyn=1;
    }
void ChkWIP(void)
   {
    uchar BusyTemp;
    BusyTemp=EepromRdReg();
   while(BusyTemp==0x01)
    {
	  BusyTemp=(BusyTemp&0x01);
	  }
    }
void EepromWr(uint WrAddr)
   {
     uint  Tmp;
     uchar WrDatTmp;
     uint  i;
     EepromWrEn();
	 BootSyn=1;
	 BootSyn=0;
     sWr1Byte(0x02);
 	 Tmp=WrAddr;
	 WrDatTmp=(Tmp>>8);
	 sWr1Byte(WrDatTmp);
     Tmp=WrAddr;
	 WrDatTmp=(Tmp&0x00ff);
     sWr1Byte(WrDatTmp);
      for(i=0;i<64;i++)
        {
          WrDatTmp=SecBootTab[i]; 
          sWr1Byte(WrDatTmp);
          }
	 BootSyn=1;
	 ChkWIP();
    } 
uchar EepromRd(uint RdAddr)
   {
     uint  Tmp;
     uchar WrDatTmp;
	 uchar RdDatTmp;
	 BootSyn=1;
	 BootSyn=0;
     sWr1Byte(0x03);
 	 Tmp=RdAddr;
	 WrDatTmp=(Tmp>>8);
	 sWr1Byte(WrDatTmp);
     Tmp=RdAddr;
	 WrDatTmp=(Tmp&0x00ff);
     sWr1Byte(WrDatTmp);
     RdDatTmp=sRd1Byte();
     BootSyn=1;
	 return(RdDatTmp);
    }
void serialInit(void)
{
    /*TMOD  00100001B M1M0=10 T1: MODE 2, 8 bit reload;M1M0=01 T0, MODE 1, 16 bit counter/Timer*/
    SCON=0x50;	      	/* 0101000B(SM0 SM1 SM2 REN TB8 RB8 TI RI): Mode 1, T&R */
    PCON=0x80;          /* SMOD=1 K=2, SMOD=0 K=1*/
    TH1=0xfd;           /* 0xFF;(22.118Mhz); Fref=(K*Fosc)/(32*12*(256-TH1))=38400 */
	TL1=0xfd;
    TR1=1;		        /* (TCON) timer 1 control 1=run, 0=stop*/
    ES=1;		        /* 1=serial interrupt enable, 0=serial interrupt disable*/
}
void DataSend(void)
 {
     uint kk=0;
	     SendNum=0x00;
	     for(kk=0;kk<64;kk++)
          {
		    RecBuf[kk]=EepromRd(BlockStart+kk);
			}	      
          TI=0;
          SBUF=RecBuf[0x00];
	  }
void DisLcd(void)
 {
   uchar i;
   unsigned long int ReadDatTmp;
   if(LcdBlink==0)
   {
      LcdBlink=25;
	  SpiBusWr(0x0805);
      tdelay(10);
	  ReadDatTmp=SpiBusRd();
       while((ReadDatTmp!=0xfff0fff0)&&(StartLoad==0))
           {
                  tdelay(5);
	              ReadDatTmp=SpiBusRd();
              }
       
      SpiBusWr(0x0806);
      tdelay(2);
      for(i=0;i<64;)
       {
         ReadDatTmp=SpiBusRd();
         RecBufDis[i]=(ReadDatTmp>>16);
         RecBufDis[i+1]=(ReadDatTmp&0x0000ffff);
         i=i+2;
        }
	  for(i=0;i<64;i++)
	   {
		 if(RecBufDis[i]<8)
		   {;}
         else if((RecBufDis[i]>=8)&&(RecBufDis[i]<24))
           {
              RecBufDis[i]=8+((RecBufDis[i]-8)>>1);
              }
		 else if((RecBufDis[i]>=24)&&(RecBufDis[i]<56))
           {
              RecBufDis[i]=16+((RecBufDis[i]-24)>>2);
              }
         else if((RecBufDis[i]>=56)&&(RecBufDis[i]<120))
           {
              RecBufDis[i]=24+((RecBufDis[i]-56)>>3);
              }
		 else if((RecBufDis[i]>=120)&&(RecBufDis[i]<248))
           {
              RecBufDis[i]=32+((RecBufDis[i]-120)>>4);
              }
         else if((RecBufDis[i]>=248)&&(RecBufDis[i]<504))
           {
              RecBufDis[i]=40+((RecBufDis[i]-248)>>5);
              }
		 else if((RecBufDis[i]>=504)&&(RecBufDis[i]<1016))
           {
              RecBufDis[i]=48+((RecBufDis[i]-504)>>6);
              }
         else if((RecBufDis[i]>=1016)&&(RecBufDis[i]<2040))
           {
              RecBufDis[i]=56+((RecBufDis[i]-1016)>>7);
              }
         if(RecBufDis[i]>63)
		   {RecBufDis[i]=63;}
	     PicBuf[i]=RecBufDis[i];
	     }
	     PicFft();/*
	  for(i=0;i<64;i++)
	   {
	    SendDatBuf[2*i]=(RecBufDis[i]>>8);
	    SendDatBuf[2*i+1]=(RecBufDis[i]&0x00ff);
		}
	   SendNum=0;
	   TI=0;
	   SBUF=SendDatBuf[0];*/
     }
   }
void DisRmon(void)
 {
    if(LoopTime==0)
	{
	 LoopTime=60;
     StartDisLine++;
	 if(StartDisLine==64)
	  {StartDisLine=0;}
     LcdCmdWr(1,StartDisLine|0xc0);
	 }
  }
void WrBlockDatInRom(void)
 {
	  BlockStart=BlockCnt*0x40;
	  BlockEnd  =BlockStart+0x40;
      EepromWr(BlockStart);
	  tdelay(40);
  }
main(void)
 {
  /*LampEn=0;*/
  BootSyn=1;
  BootClk=0;
  BootTx=0;
  BootRx=0;
  tdelay(255);
  tdelay(255);
  tdelay(255);
  tdelay(255);
   TMOD=0x21;
   TH0=0x0c;
   TL0=0xdc;
   ET0=1;
   TR0=1; 
   serialInit();
   EA=1;
  LcdInit();
  LcdClear();
  DisEcho();DisEq();DisFFT();DisLMS();
  Rst4221D();
  iic4221wr(0x00,0x00);
  iic4221wr(0x01,0x00);
  iic4221wr(0x02,0x4a);
  iic4221wr(0x03,0x00);
  iic4221wr(0x04,0x00);
  iic4221wr(0x05,0x65);
  /*
      EepromWrReg(0x00);
  for(BlockNum=0;BlockNum<122;BlockNum++)
    {
	  BlockStart=BlockNum*0x40;
	  BlockEnd  =BlockStart+0x40;
      for(CopyNum=BlockStart;CopyNum<BlockEnd;CopyNum++)
	   {
         SecBootTab[CopyNum-BlockStart]=BootTab[CopyNum];
        }
       EepromWr(BlockStart);
	   tdelay(40);
	   }
       EepromWrDi();
	   */
  while(1)
   {
      DisLcd();
	  DisRmon();
	  if(OneBlockEnd==1)
	      {
		   OneBlockEnd=0;
		   if(BlockCnt==0)
		    {
			  EepromWrReg(0x00);
		      WrBlockDatInRom();
			  BlockCnt++;
			  }
		   else if(BlockCnt<filelenth)
		    {
		      WrBlockDatInRom();
			  BlockCnt++;
			  }
		   if(BlockCnt==filelenth)
		    {
			  EepromWrDi();
			  BlockCnt=0;
			  StartLoad=0;
			 }
           TI=0;
           SBUF=0xfa;
           //DataSend(); 
		   }
     }
}

⌨️ 快捷键说明

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