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

📄 tech.c

📁 单片机做的录音机控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define NULL   0
#define STOP   1
#define PLAY   2
#define REC    3
#define FFW    4
#define REW    5
#define PAUSE  6
#define RET    7
#define EJECT  8
#define MEM    9
#define Reset  0x10
#define MTEST  0xf0
#define SetVol 0xf1
#define COPY   0xF2

#define WAIT { _nop_(); _nop_(); _nop_(); _nop_();  }

//#define  FALSE           0
//#define  TURE            1
//#define ADDRESS       0x88
//#define TWO_CHAN1DB   0xDF
//#define TWO_CHAN10DB  0xE7
//#define L_Chan1DB     0xAF
//#define L_Chan10DB    0xB7
//#define R_Chan1DB     0x2f
//#define R_Chan10DB    0x37
//#define CLEAR         0xf0
//#define OPENVOLUME    0x74

#define PT2259_START  {SCL = 1; SDA = 1; SDA = 0;}
#define PT2259_STOP   {SCL = 1; SDA = 0; SDA = 1;}

 sbit  SCL  = P3^5 ;
 sbit  SDA = P3^4 ;
// uchar code AdjustDB [10] = {0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9};

//-----------------------------------------

sbit PIN_CD5508_DATAOUT  =   P2^0;
sbit PIN_CD5508_CLOCK    =   P2^1;
sbit PIN_CD5508_DATAIN   =   P2^2;
sbit PIN_CD5508_RESET    =   P2^5;

sbit SOLEA = P0^6; //MOTOR FFW 
sbit SOLEB = P0^7; //MOTOR REW 
sbit RecEn = P2^3;

sbit CS = P0^2; //CS------------------
sbit CLK = P0^1;//CLK-------------------
sbit DI = P0^0; //DI-----------------

sbit copy1=P3^6; //rec prog con
sbit copy2=P3^7;//rec prog con
sbit speed=P0^5;
sbit DOpen=P0^3;  
sbit RecX=P0^4;
sbit RecX1=P2^7;
sbit TapeEN=P2^4;

bdata char CF1,CF,CF2;
sbit  RUN = CF^5;
sbit  RF  = CF^7;
sbit  SetMem = CF^2;
sbit  MODI = CF^3;
sbit  duibi=CF^4;
sbit  Ccopy=CF^6;
sbit  IsA = CF^0;
sbit  IsB = CF^1;


sbit  setAuto = CF1^0;
sbit  setFollow =CF1^1;
sbit  setRepeat1 =CF1^2;
sbit  ST5508 = CF1^3;
sbit  setSpeed = CF1^4;
sbit  setRepeat2 =CF1^5;
sbit  playend =CF1^6;
sbit  followend =CF1^7;
sbit  Setvol_C=CF2^0;
//sbit  pR=CF2^1;
sbit  high =CF2^2;


uchar code  BASE=8;
//uchar code LED[]={0x5f,0x6,0x6b,0x2f,0x36,0x3d,0x7d,0x7,0x7f,0x3f,0x59};
//uchar code LED[]={0xf5,0x60,0xb6,0xf2,0x63,0xd3,0xd7,0x70,0xf7,0xf3,0xf5};
//uchar code LED[]={0xf5,0x60,0xb6,0xf2,0x63,0xd3,0xd7,0x70,0xf7,0xf3,0x77,0xc7,0x95,0xe6,0x97,0x17};
uchar code LED[]={0xbe,0x06,0x7c,0x5e,0xc6,0xda,0xfa,0x0e,0xfe,0xde,0xee,0xf2,0xb8,0x76,0xf8,0xe8,0xba,0xe6};//S7001A


uchar  LCDdat[16];
uchar  IsAorB[] = {0x00,0x10,0x20};

uchar  CurrentFUN,LastFUN,CurrentVol,LastVol,RemoteFUN,RevDat,AutoRew;MDat,data_1db,CurrentPL; //TapeEN;
uint   MemNub,OldNub,AutoStop;
uint  CountNub;
uchar ucState,Fspeed,dkeyvol;
uint wTime;

bit RevOK;
//void play() reentrant;
void Pause();

void delay(uint x)
{
 unsigned char j;
 while(x--){
   for(j=0;j<125;j++);//...........200..............//
 }
}


//-----------------------------------------

void PT2259_Start(void)
{
  //SCL  = 0;
  SCL  = 1;
  SDA = 1;

  WAIT;
  SDA = 0;
 // WAIT;
  //SCL = 0;
}
//-----------------------------------------

void PT2259_Stop(void)
{

    SCL  = 1;
    SDA = 0;
    WAIT;
    SDA = 1;

}
//-----------------------------------------
/*
bit Check_Acknowledge(void)
{
   SDA = 1;
   SCL  = 1;
   WAIT;
   if(SDA)
      return 0;
   else
      return 1;

}
//-----------------------------------------
*/
void PT2259_WriteByte( uchar ucData )
{
 uchar i;

    for( i = 0; i < 8; i++)
    {
      SCL  = 0;
      WAIT;
      SDA = ((ucData & 0x80) == 0x80);
      WAIT;
      SCL  = 1;
      WAIT;
      ucData <<= 1;

    }
     SCL  = 0;
     SDA = 1;
     SCL  = 1;


}
//-----------------------------------------

void PT2259_Set( uchar ucData10DB,uchar ucData1DB )
{
  PT2259_Start();
  PT2259_WriteByte( 0x88 );
  PT2259_WriteByte( ucData10DB );
  PT2259_WriteByte( ucData1DB  );
  PT2259_Stop();
}

//-----------------------------------------

void PT2259_Clear()
{
 PT2259_Start();
 PT2259_WriteByte( 0x88);  // is PT2259 address
 PT2259_WriteByte( 0xf0 ); // clear register
 PT2259_Stop();
}

void PT2259_OpenVolume(uchar Data)
{
 PT2259_Start();
 PT2259_WriteByte( 0x88);  // is PT2259 address
 PT2259_WriteByte( Data ); // clear register
 PT2259_Stop();


}
//-----------------------------------------

void CD5508_SendCommand(uint wData)
{
    uchar i,j;
    i = j = 0;
    do {
       PIN_CD5508_CLOCK    = 1;                       //同步
       PIN_CD5508_DATAIN   = 1;
       delay(1);
       PIN_CD5508_CLOCK    = 0;
       delay(1);///////////////////////////add new
    
   // while ((PIN_CD5508_DATAOUT == 1) && (i++ < 32));  //等待回应信号
    if (PIN_CD5508_DATAOUT == 0) 
	{
        for (j=0; j<12; j++) {
        PIN_CD5508_CLOCK = 1;
        delay(1);
        if (((wData >> j) & 0x0001) == 0x0001)
           PIN_CD5508_DATAIN = 1;
        else PIN_CD5508_DATAIN = 0;
        PIN_CD5508_CLOCK = 0;
        delay(1);
           }
    i=40;
	    } 
        } 
    while(i++<32);

      PIN_CD5508_CLOCK    = 1; 
      PIN_CD5508_DATAIN = 1;
      
}

////////////////////////////////////////////////////////////////////////////////////////////////
uchar CD5508_ReadState()
{
   uchar i,j,sum;
   uint wData;
   wData = 0x0000;
   wTime=0;
   i = j = 0;
   sum = 0;
   CD5508_SendCommand( 0x0077 );//发送读数据命令 
      delay(1);	  
    for (i=0; i<=15; i++) {
        PIN_CD5508_CLOCK = 0;
        delay(1);                     
        if (PIN_CD5508_DATAOUT == 1)
	        {
           wData = ((wData>>1)|0x8000);
            }
		else{
		    wData = ((wData>>1)|0x0000);
		    }

        PIN_CD5508_CLOCK = 1;
        delay(1);
             }//////接收16位数据存入--WDATA--中
       for (j=0; j<=7; j++) {
        PIN_CD5508_CLOCK = 0;
        delay(1);

        if (PIN_CD5508_DATAOUT == 1) {
           sum = ((sum>>1)|0x80);
        }
		else{		
		sum = ((sum>>1)|0x00);
		}
        PIN_CD5508_CLOCK = 1;
        delay(1);

    }/////////接收8位数据存入--SUM--中

    PIN_CD5508_DATAIN = 1;
    PIN_CD5508_CLOCK    = 1;
    ucState = ((wData & 0xFC00)>> 10);
    wTime   = (wData & 0x03FF);
    return(ucState,wTime);   
}


void bitLCD(uchar mod)
{
  CLK = 1; CLK = 1;
  if (mod==1)
    DI = 1;
  else
  DI = 0;
  CLK = 1; CLK = 1;
  CLK = 0; CLK = 0;
  CLK = 1; CLK = 1;
  DI = 1;
  }


void CommandLCD(uchar ord)
{
 uchar i;
 CS = 0;
 bitLCD(1);
 bitLCD(0);
 bitLCD(0);
 bitLCD(0);

 for (i=0;i<8;i++)
  if ((ord & (0x80>>i))==(0x80>>i))
   bitLCD(1);
  else
   bitLCD(0);
  bitLCD(0);
  CS = 1;
}

void WriteLCD()
{
 uchar i,j;
 CS = 0;
 bitLCD(1);
 bitLCD(0);
 
 bitLCD(1);
for (i=0;i<6;i++)
    bitLCD(0);
for ( j=0;j<16;j++)
 for( i=0; i<8; i++)
  if ((LCDdat[j] & (0x80>>i))==(0x80>>i))
   bitLCD(1);
  else
   bitLCD(0);
 CS = 1;
}


void ShowLCD(void)
{
 uchar i;
 for (i=0;i<16;i++)
    LCDdat[i] = 0;    //clear
  LCDdat[10] = LED[ wTime % 10];
  LCDdat[9] =  LED[(wTime % 100)/10];
  LCDdat[8] =  LED[(wTime % 1000)/100];
  LCDdat[7] =  LED[(wTime % 10000)/1000];
 // LCDdat[10] = LED[CountNub % 10];
 // LCDdat[9] =  LED[(CountNub % 100)/10];
 //LCDdat[8] =  LED[(CountNub % 1000)/100];
 // LCDdat[7] =  LED[(CountNub % 10000)/1000];//display"0000"  countnumb
 // LCDdat[5] = 0x08; //display"TAPE"
  
  //LCDdat[13] = LCDdat[13] | LED[0];
  //LCDdat[14] = LCDdat[14] | LED[0];
           
  if(IsA)LCDdat[0] =LCDdat[0] | 0x08; //display"A"
  if(IsB)LCDdat[0] =LCDdat[0] | 0x04; //display"B"
  switch(CurrentPL)
  { case 0: 
     PT2259_OpenVolume(0x74);
     switch(CurrentVol&0x0f){
     case 0: LCDdat[2] = 0xff;         //01
             LCDdat[3] = 0xff;   break;//80
     case 1: LCDdat[2] = 0x7f;         //03
             LCDdat[3] = 0xfe;   break;//c0
     case 2: LCDdat[2] = 0x3f;         //07
             LCDdat[3] = 0xfc;   break;//e0
     case 3: LCDdat[2] = 0x1f;         //0f
             LCDdat[3] = 0xf8;   break;//f0
     case 4: LCDdat[2] = 0x0f;         //1f
             LCDdat[3] = 0xf0;   break;//f8
     case 5: LCDdat[2] = 0x07;         //3f
             LCDdat[3] = 0xe0;   break;//fc
     case 6: LCDdat[2] = 0x03;         //7f
             LCDdat[3] = 0xc0;   break;//fe
     case 7: LCDdat[2] = 0x01;         //ff
             LCDdat[3] = 0x80;   break;//ff
     default:                    break;
       }; break;
     
    case 1: 
	     PT2259_OpenVolume(0x75);

         switch(CurrentVol&0x0f){
     case 0: LCDdat[2] = 0xff;  break;//01
     case 1: LCDdat[2] = 0x7f;  break;//03
     case 2: LCDdat[2] = 0x3f;  break;//07
     case 3: LCDdat[2] = 0x1f;  break;//0f
     case 4: LCDdat[2] = 0x0f;  break;//1f
     case 5: LCDdat[2] = 0x07;  break;//3f
     case 6: LCDdat[2] = 0x03;  break;//7f
     case 7: LCDdat[2] = 0x01;  break;//ff
     default:                    break;
        }; break;
		

    case 2: 
  PT2259_OpenVolume(0x76);
  switch(CurrentVol&0x0f){
     case 0:  LCDdat[3] = 0xff;   break;//80
     case 1:  LCDdat[3] = 0xfe;   break;//c0
     case 2:  LCDdat[3] = 0xfc;   break;//e0
     case 3:  LCDdat[3] = 0xf8;   break;//f0
     case 4:  LCDdat[3] = 0xf0;   break;//f8
     case 5:  LCDdat[3] = 0xe0;   break;//fc
     case 6:  LCDdat[3] = 0xc0;   break;//fe
     case 7:  LCDdat[3] = 0x80;   break;//ff
     default:                    break;

      }; break;
      default:                    break; 

}


if (ST5508) 
{
  LCDdat[14] = LCDdat[14] | LED[ucState&0x0f];
  LCDdat[13] = LCDdat[13] | LED[(ucState>>4)&0x0f]; 
}


else{
if(high)
    {LCDdat[13] =  0x40;
     LCDdat[12] =  0xe6;
     LCDdat[11] =  0x40; }       //显示“H”
if(!high)	
    {LCDdat[13] =  0x40;
     LCDdat[12] =  0xb0;
     LCDdat[11] =  0x40; }       //显示“L”
}

if (Ccopy)
 {
    LCDdat[14]= 0x59;// SHOW COPY
	LCDdat[13]= 0x5f;
	LCDdat[12]=0x73;
	LCDdat[11]=0x3e;
  }


if(setAuto)
    {
    LCDdat[5]=LCDdat[5]|0x80;
    }

if(setFollow)
{
LCDdat[5]=LCDdat[5]|0x40;
  LCDdat[10] = LED[ wTime % 10];
  LCDdat[9] = LED[(wTime % 100)/10];
  LCDdat[8] = LED[(wTime % 1000)/100];
 // LCDdat[7] = LCDdat[7] | LED[(wTime % 10000)/1000];//显示跟度时间

}else{followend=0;}

if(duibi)
{LCDdat[5]=LCDdat[5]|0x10;
  LCDdat[10] = LED[wTime % 10];
  LCDdat[9] = LED[(wTime % 100)/10];
  LCDdat[8] = LED[(wTime % 1000)/100];
}

if(setSpeed){

LCDdat[6]=LCDdat[6]|0x28;
switch(Fspeed){
        case 0: LCDdat[7] = LED[0]; LCDdat[6]=LCDdat[6]|0x28;     break;
        case 1: LCDdat[7] = LED[1]; LCDdat[6]=LCDdat[6]|0x04;     break;
        case 2: LCDdat[7] = LED[2]; LCDdat[6]=LCDdat[6]|0x04;     break;
        case 3: LCDdat[7] = LED[1]; LCDdat[6]=LCDdat[6]|0x40;     break;
        case 4: LCDdat[7] = LED[2]; LCDdat[6]=LCDdat[6]|0x40;     break;
        case 5: LCDdat[7] = LED[3]; LCDdat[6]=LCDdat[6]|0x40;     break;
        default:          break;
         }
}



if(setRepeat1)
{
LCDdat[5]=LCDdat[5]|0x20;

  //LCDdat[10] =  LED[wTime &0x000f];
  //LCDdat[9] = LED[(wTime>>4)&0x000f];
  //LCDdat[8] = LED[(wTime>>8)&0x000f];
  LCDdat[10] =  LED[ wTime % 10];
  LCDdat[9] =  LED[(wTime % 100)/10];
  LCDdat[8] =  LED[(wTime % 1000)/100];
  //LCDdat[7] = LED[(wTime>>12)&0x000f];   //显示复度时间



}

 if (SetMem) LCDdat[5]=LCDdat[5] | 0x02;

 switch(CurrentFUN){
  case STOP:   LCDdat[4] = 0x02; break;
  case PLAY:   LCDdat[4] = 0x40; break;
  case FFW:    LCDdat[4] = 0x10; break;
  case REW:    LCDdat[4] = 0x01; break;
  case PAUSE:  if (LastFUN==PLAY) LCDdat[4] = 0x20; else LCDdat[4] = 0x40; break;
  case REC:    LCDdat[0] = 0x80; break;
//  case FOLLOW: LCDdat[5] = 0x40; break;				//LCDdat[2]=LCDdat[2] | 0x08; break;
 

  default: break;
     }
/*
if (ST5508) 
{
  LCDdat[14] = LCDdat[14] | LED[ucState&0x0f];
  LCDdat[13] = LCDdat[13] | LED[(ucState>>4)&0x0f]; 

⌨️ 快捷键说明

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