欢迎光临 ,“重庆易用科技21IC_blog”......

  ----------- 本站产品购买请访问我们的淘宝店


载入中...

最新日志

载入中...

最近的评论

载入中...

友情链接

 


 


C51串口中断收发带缓冲(控制数字电位器例子)
cqwangsf 发表于 2006-1-25 17:46:00

//************************************************************
//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;
    }    
  }
 }



回复:C51串口中断收发带缓冲(控制数字电位器例子)
cqwangsf发表评论于2006-7-24 16:57:00

cqwangsf数字电器做音量调节源代码
个人主页 | 引用 | 返回 | 删除 | 回复


回复:51控制DS1801的程序(串口收发带缓冲)
x(游客)发表评论于2006-1-26 9:52:00

x(游客)
个人主页 | 引用 | 返回 | 删除 | 回复

发表评论:
载入中...



公告

载入中...

专题

载入中...

留言

载入中...

统计

载入中...

 


站长:重庆易用

站长QQ:910887181

站长邮箱:910887181QQ.COM

站长个人入口