|
//************************************************************ //The pragram for DS1801 //design by 铁皮蚂蚁 //QQ:84117692 //Email:wsf999@Gmail.com //2005-10-20 //************************************************************ //+++++++++++++++++ hardware +++++++++++++++++++++++++++++++++ // // +++++++++ +-------------+ +++++ ++++++ // rst+-------+p0.2 + + 2 + + // CLK +-------+p0.0 TXD +-----+ 3 +---+ R S // Data+-------+p0.1 RXD +-----+ 2 +---+ 232 // DS1801 + + 89c51 + + + + // +++++++++ +-------------+ +++++ ++++++ // //++++++++++++++++ Audio-DS1801 ++++++++++++++++++++++++++++++ // // audio_R_IN>>----+H0---MWMWMWM+MWMWM----L0+----|AGND // +W0------>>audio_R_OUT // // audio_L_IN>>----+H1---MWMWMWM+MWMWM----L1+----|AGND // +W1------>>audio_L_OUT // // +5v|--+----------------------------|VCC // | // === 0.1uF // | 100R // GND|--+--------+MWMWMWWMWM+--------|AGND // //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #i nclude <reg52.h> #define Uchar unsigned char #define Tdc 0x8f #define Tcdh 0x8f #define BUFFER_SIZE 32 #define TX_BUFFER_SIZE 32 #define COMMD_SIZE 4 #define MYADDR 0xfe #define MYCOMMD 0xfe
sbit DS_RST= P0^2; sbit DS_CLK= P0^0; sbit DS_DATA= P0^1;
unsigned char Serial_Buff[BUFFER_SIZE]; unsigned char Buff_Count,USED_count;
unsigned char TDX_Buffer[TX_BUFFER_SIZE]; unsigned char TDX_Buffer_Count,Sended_count; unsigned char TDX_flag;
//++++++++++++++++++++wait for IIC+++++++++++++++++++ void wait(Uchar times) { Uchar i,wait_time; wait_time=times; for(i=0;i<wait_time;i++); }
//+++++++++++++++++End wait for IIC++++++++++++++++++
//+++++++++++++++++write ds1801 +++++++++++++++++++++ void write_ds1801(Uchar channels_R,Uchar channels_L) { Uchar i; Uchar chan_R,chan_L; Uchar chan_temp; chan_R=channels_R; chan_L=channels_L; DS_RST = 0; DS_CLK = 0; DS_DATA = 0; DS_RST = 1; for(i=0;i<8;i++) { chan_temp=chan_R&(1<<i); if (chan_temp==0) {DS_DATA=0;} else {DS_DATA=1;} wait(Tdc); DS_CLK=1; wait(Tcdh); DS_CLK=0; } for(i=0;i<8;i++) { chan_temp=chan_L&(1<<i); if (chan_temp==0) {DS_DATA=0;} else {DS_DATA=1;} wait(Tdc); DS_CLK=1; wait(Tcdh); DS_CLK=0; } DS_RST=0; DS_CLK=0; DS_DATA=0; }
//+++++++++++++End write ds1801 +++++++++++++++++++++
//+++++++++++++Uart init 9600bps ++++++++++++++++++++ void Init_uart(void) { EA = 0; TMOD=0x22; PCON=PCON&0x7f; TH1=0xfd; TL1=0xfd; SCON=0x50; //11.0592Mhz 9600bps ES=1; EX0=1; PX0=0; RI=0; TI=0; IT0=1; TR1=1; EA=1; } //+++++++++End Uart init 9600bps ++++++++++++++++++++
//+++++++++++++++ Uart interrupt ++++++++++++++++++++ void rcv_com(void) interrupt 4 using 2 { if(RI) { RI = 0; Serial_Buff[Buff_Count] = SBUF; Buff_Count++; Buff_Count=Buff_Count%BUFFER_SIZE; } else if(TI) { TI = 0; if (TDX_Buffer_Count-Sended_count==0) TDX_flag=0; else { SBUF=TDX_Buffer[Sended_count]; Sended_count=(Sended_count+1)%TX_BUFFER_SIZE; } } } //+++++++++++End Uart interrupt +++++++++++++++++++++
//++++++++++++++send data +++++++++++++++++++++++++++ Uchar send_char (Uchar *send_data,Uchar data_long) { Uchar *send_D,D_long,i; Uchar unused_buffer_size,unsend_data_long;
send_D=send_data; D_long=data_long; unsend_data_long=TDX_Buffer_Count-Sended_count; if (unsend_data_long>=0) { unused_buffer_size=TX_BUFFER_SIZE-unsend_data_long; } else { unused_buffer_size=Sended_count-TDX_Buffer_Count; } if (unused_buffer_size<=D_long) return 0xff; else { if (TDX_flag==0) { SBUF=*send_D; send_D++; D_long--; TDX_flag=0xff; } EA=0; for(i=0;i<D_long;i++) { TDX_Buffer[TDX_Buffer_Count]=*send_D; send_D++; TDX_Buffer_Count=(TDX_Buffer_Count+1)%TX_BUFFER_SIZE; } EA=1; return 0; } } //+++++++++++++ end send data +++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++send brack_message +++++++++++++++++++++++++++++++++++++++++++
void back_message(Uchar channels_R,Uchar channels_L) { Uchar chan_R,chan_L; chan_R=channels_R; chan_R=channels_L; EA=0; SBUF = MYADDR; while(!TI); TI = 0; SBUF = MYCOMMD; while(!TI); TI = 0; SBUF = chan_R; while(!TI); TI = 0; SBUF = chan_L; EA=1; } //+++++++++++End send brack_message++++++++++++++++++ void test_send () { Uchar test[4]={31,32,33,34}; Uchar *P,a; P=test; a=send_char(P,4); }
void main (void) { int long_count; Buff_Count=0; USED_count=0; TDX_Buffer_Count=0; Sended_count=0; TDX_flag=0; Init_uart(); test_send (); while(1) { long_count=Buff_Count-USED_count; if (long_count<0) { long_count=BUFFER_SIZE-USED_count+Buff_Count; } if (long_count>=COMMD_SIZE) { if (Serial_Buff[USED_count]==MYADDR) { USED_count=(USED_count+1)%BUFFER_SIZE; if (Serial_Buff[USED_count]==MYCOMMD) { write_ds1801(Serial_Buff[(USED_count+1)%BUFFER_SIZE],Serial_Buff[(USED_count+2)%BUFFER_SIZE]); back_message(Serial_Buff[(USED_count+1)%BUFFER_SIZE],Serial_Buff[(USED_count+2)%BUFFER_SIZE]); USED_count=(USED_count+3)%BUFFER_SIZE; } } else USED_count=(USED_count+1)%BUFFER_SIZE; } } } |