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

📄 33xdac.c

📁 一些C8051f330的C程序
💻 C
字号:
//-----------------------------------------------------------------------------
// DAC0.c
//-----------------------------------------------------------------------------
// 版权归新华龙电子有限公司所有
//
// 作者:Robi Ken 
// 日期: 2004.12.28
// 功能:DAC输出
// 目标板: C8051F33x
// 开发工具: Silicon Laboratories  IDE 
//
//--------------------------------------------------------------------------------------
// 此程序为D/A转换程序,转换启动信号可以为定时器0、1、2、3(在主程序中选择相应的函数,并对
// D/A程序中的“IDA0CN”寄存器进行相应的更改便可)

//------------------------------------------------------------------------------------
//包含头文件
//-----------------------------------------------------------------------------------

#include <c8051f330.h>                   
#include <stdio.h>

//-----------------------------------------------------------------------------
// 定义16位寄存器
//-----------------------------------------------------------------------------
sfr16 DAC0     = 0x96;                 // 10位DAC寄存器地址
sfr16 TMR0RL   = 0xca;                 //  定时器0数据寄存器地址
sfr16 TMR1RL   = 0xca;                 //  定时器1数据寄存器地址
sfr16 TMR2RL   = 0xca;                  // 定时器2数据寄存器地址
sfr16 TMR3RL   = 0xca;                  // 定时器3数据寄存器地址
sfr16 TMR0     = 0xCC;                 //  定时器0计数寄存器
sfr16 TMR1     = 0xCC;                 //  定时器1计数寄存器
sfr16 TMR2     = 0xcc;                 //  定时器2计数寄存器
sfr16 TMR3     = 0xcc;                 //  定时器3计数寄存器
//-----------------------------------------------------------------------------
//常量赋值
//-----------------------------------------------------------------------------
#define SYSCLK       49000000          
#define SAMPLE_RATE  50000           
//------------------------------------------------------------------------------------
// 定义函数
//------------------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer0_Init (int counts);
void Timer1_Init (int counts);
void Timer2_Init (int counts);
void Timer3_Init (int counts);
void DAC0_Init(void);
void Timer0_ISR (void);
void Timer1_ISR (void);
void Timer2_ISR (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口初始化    
 
    //Timer0_Init (SYSCLK/SAMPLE_RATE);            //定时器0溢出作为DAC的转换启动信号
   //Timer1_Init (SYSCLK/SAMPLE_RATE);             //定时器1溢出作为DAC的转换启动信号
   //Timer2_Init (SYSCLK/SAMPLE_RATE);             //定时器2溢出作为DAC的转换启动信号
   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;                    
   RSTSRC  = 0x04;                  
}
//-----------------------------------------------------------------------------
// 定时器0初始化
//-----------------------------------------------------------------------------

void Timer0_Init (int counts)
{
    TMOD=0x11;                        
    CKCON |= 0x08;                     
    TMR0RL  = -counts;             
    TMR0    = TMR0RL;                  
    ET0= 1;                     
    TR0=1;                     

}
//-----------------------------------------------------------------------------
//  定时器1初始化
//-----------------------------------------------------------------------------

void Timer1_Init (int counts)
{
   TMOD=0x11;                      
   CKCON |= 0x04;                     
   TMR1RL  = -counts;                
   TMR1    = TMR1RL;                 
   ET1= 1;                       
   TR1=1;                       

}
//-----------------------------------------------------------------------------
//  定时器2初始化
//-----------------------------------------------------------------------------
void Timer2_Init (int counts)
{
    TMR2CN = 0x00;                                                                                           
    CKCON |= 0x10;                  
    TMR2RL  = -counts;                  
    TMR2    = TMR2RL;                  
    ET2= 1;                         
    TR2=1;                     

}

//-----------------------------------------------------------------------------
//  定时器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,0xb0时分别是用定时器0,1,2,3           
   REF0CN = 0x03;       //的溢出作为IDAC的更新输出           
  }

//-----------------------------------------------------------------------------
// 外部触发转换程序
//-----------------------------------------------------------------------------

void DAC0_CNVS_DAC0h(void)
  {
    IDA0H=i;
   i=i+16;
   if(i==0xffff)
   {
   i=0;}
   }
//-----------------------------------------------------------------------------
//  定时器0中断
//-----------------------------------------------------------------------------

void Timer0_ISR (void) interrupt 1
{
   TF0=0;                           
   DAC0=i;
   i=i+16;
   if(i==0xfff)
   {
   i=0;}
}
//-----------------------------------------------------------------------------
//  定时器1中断
//-----------------------------------------------------------------------------

void Timer1_ISR (void) interrupt 3
{
   TF1=0;                            
   DAC0=i;
   i=i+16;
   if(i==0xfff)
   {
   i=0;}
}
//-----------------------------------------------------------------------------
//  定时器2中断
//-----------------------------------------------------------------------------

void Timer2_ISR (void) interrupt 5
{
   TMR2CN &= ~0x80;                             
   DAC0=i;
   i=i+16;
   if(i==0xfff)
   {
   i=0;}
}

//-----------------------------------------------------------------------------
//  定时器3中断
//-----------------------------------------------------------------------------

void Timer3_ISR (void) interrupt 14
{
   TMR3CN &= ~0x80;                              
   DAC0=i;
   i=i+16;
   if(i==0xfff)
   {
   i=0;}
}

⌨️ 快捷键说明

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