用C8051F330实现锯齿波的C程序

来源:百度文库 编辑:神马文学网 时间:2024/05/27 07:45:03
用C8051F330实现锯齿波的C程序(2006-08-25 10:33:36)   分类:单片机编程(我写的哟,呵呵)    锯齿波: #include                   
#include
//-----------------------------------------------------------------------------
// 定义16位寄存器
//-----------------------------------------------------------------------------
sfr16 DAC0     = 0x96;                 // 10位DAC寄存器地址
sfr16 TMR3RL   = 0xca;                 //  定时器3数据寄存器地址
sfr16 TMR3     = 0xCC;                 //  定时器3计数寄存器
//常量赋值
//-----------------------------------------------------------------------------
#define SYSCLK       49000000         
#define SAMPLE_RATE  50000 
// 定义函数
//------------------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer3_Init (int counts);
void DAC0_Init(void);
void Timer3_ISR (void);
void DAC0_CNVS_DAC0h(void);
// 定义全局变量
//-----------------------------------------------------------------------------long int i=0;                       // 函数
//------------------------------------------------------------------------------------
void main (void)
 {
   PCA0MD &= ~0x40;                                //关闭看门狗  
   SYSCLK_Init ();                                 //系统时钟初始化
   PORT_Init ();                                   //I/O口初始化   
 
   Timer3_Init (SYSCLK/SAMPLE_RATE);  //定时器3溢出作为DAC的转换启动信号
   DAC0_Init();                                   
   EA=1;
   while(1)
         
          }
}
 // 端口初始化
//------------------------------------------------------------------------------------void PORT_Init (void)
{
   P0SKIP  |= 0x41;             
   XBR1    = 0x40;               
}
//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------void SYSCLK_Init (void)
{
   OSCICN |= 0x03;          //SYSCLK为内部H-F振荡器的频率           
   RSTSRC  = 0x04;                    
}
//-----------------------------------------------------------------------------
// 定时器3初始化
//-----------------------------------------------------------------------------void Timer3_Init (int counts)
  
   TMR3CN = 0x00;                                    
   CKCON |= 0x40;                    
   TMR3RL  = -counts;              
   TMR3    = TMR3RL;                 
   EIE1 |= 0x80;                     
   TMR3CN |= 0x04;       
}// 数模转换初始化
//-----------------------------------------------------------------------------
void DAC0_Init (void)
 {
   IDA0CN = 0xb2;       //设置为0x82,0x92,0xa2,0xb2时分别是用定时器0,1,2,3          
   REF0CN = 0x03;       //的溢出作为IDAC的更新输出          
  }// 外部触发转换程序
//-----------------------------------------------------------------------------void DAC0_CNVS_DAC0h(void)

    IDA0H=i;                           
   i=i+16;
   if(i==0xffff)
   {
   i=0;}
}
 //-----------------------------------------------------------------------------
//  定时器3中断
//-----------------------------------------------------------------------------void Timer3_ISR (void) interrupt 14
  TMR3CN &= ~0x80;                             
   DAC0=i;
   i=i+16;
   if(i==0xfff)
   {
   i=0;}
}