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

📄 ccc.c

📁 C8051F020单片机内部ADC1的驱动程序的控制程序,采用C语言编写
💻 C
字号:
#include <c8051f020.h>                 // SFR declarations
#include <stdio.h>
#include <INTRINS.H>
#include <math.h>
xdata  unsigned char zhi[4096];
void SYSCLK_Init (void);
void PORT_Init (void);
void ADC1_Init(void);
void UART0_Init (void);
void Timer3_Init (int counts);
void ADC1_ISR (void);
sfr16 DP       = 0x82;                 // data pointer
sfr16 TMR3RL   = 0x92;                 // Timer3 reload value
sfr16 TMR3     = 0x94;                 // Timer3 counter
sfr16 ADC0     = 0xbe;                 // ADC0 data
sfr16 ADC0GT   = 0xc4;                 // ADC0 greater than window
sfr16 ADC0LT   = 0xc6;                 // ADC0 less than window
sfr16 RCAP2    = 0xca;                 // Timer2 capture/reload
sfr16 T2       = 0xcc;                 // Timer2
sfr16 RCAP4    = 0xe4;                 // Timer4 capture/reload
sfr16 T4       = 0xf4;                 // Timer4
sfr16 DAC0     = 0xd2;                 // DAC0 data
sfr16 DAC1     = 0xd5;                 // DAC1 data
void delay(unsigned char T)
{
     while(T)
   {
     _nop_();
     T--;
   }
}

#define SYSCLK       22118400            // SYSCLK frequency in Hz
#define BAUDRATE     115200              // Baud rate of UART in bps
#define SAMPLE_RATE  500000             // ADC1 Sample frequency in Hz
#define VREF1        3300                // Mv  
#define AV+          3300                // Mv 
sbit LED = P1^6;                         // LED='1' means ON
sbit SW1 = P3^7; 
unsigned int j=0;// SW1='0' means switch pressed
void main(void)
{
  unsigned char MUXSLECT=0;
  int ii,jk,kj;
  int i;
  float jj;
  float PI=3.141516*2; 
  WDTCN = 0xDE;
  WDTCN = 0xAD;
  EMI0CF=0x00;
  SYSCLK_Init();
  PORT_Init();
  UART0_Init();
  ADC1_Init();
  Timer3_Init (SYSCLK/SAMPLE_RATE);
  EA = 1;
  for(kj=0;kj<3555;kj++)
  for(jk=0;jk<3566;jk++);
    while (1) 
    {
      EA = 0;                          // disable interrupts
      zhi[i]=ADC1;
      i=i+1;
      if(i==4096)
	  {
	    i=0;
	    EA=0;
            for(kj=0;kj<3555;kj++)
            for(jk=0;jk<3566;jk++);
	    for(i;i<4096;i++)
	     {  
	        SBUF0=zhi[i];
	        while(TI0==0);
	        TI0=0;
	     }
	   while(1);
	  }
      EA = 1;                   
      while(j==0);
      j=0;     
   }
}
void SYSCLK_Init (void)
{
   int i;                              // delay counter
   OSCXCN = 0x67;                      // start external oscillator with,   22.1184MHz crystal                                     
   for (i=0; i < 256; i++);            // XTLVLD blanking interval (>1ms)
   while (!(OSCXCN & 0x80));           // Wait for crystal osc. to settle
   OSCICN = 0x88;                      // select external oscillator as SYSCLK
 }                                     // source and enable missing clock
                                       // detector

void PORT_Init (void)
{
   XBR0    = 0x04;                     // Enable UART0
   XBR1    = 0x00;
   XBR2    = 0x40;                     // Enable crossbar and weak pull-ups
   P0MDOUT |= 0x01;                    // enable TX0 as a push-pull output
   P1MDOUT |= 0x40;                    // enable P1.6 (LED) as push-pull output
}


void UART0_Init (void)
{
   SCON0   = 0x50;                     // SCON0: mode 1, 8-bit UART, enable RX
   TMOD    = 0x20;                     // TMOD: timer 1, mode 2, 8-bit reload
   TH1    = -(SYSCLK/BAUDRATE/16);     // set Timer1 reload value for baudrate
   TR1    = 1;                         // start Timer1
   CKCON |= 0x10;                      // Timer1 uses SYSCLK as time base
   PCON  |= 0x80;                      // SMOD00 = 1
   TI0    = 0;                         // Indicate TX0 ready
   RI0=0;
}

void ADC1_Init(void)
{
   ADC1CF  = 0x19;                     // SAR转换时间<=6MHz,取5.5,放大增益为0.5
   AMX1SL  = 0x00;                     // 暂时为AIN1.0,八路中可任选
   P1MDIN  = 0x00;                     // P1口为模拟输入
   REF0CN  = 0x0a;                     // ADC0电压取于DAC0,ADC1取于AV+,TEMPE关闭,内部偏压器工作,内部电压基准缓冲器关闭
   ADC1CN  = 0x82;                     // ADC1允许,一般工作方式,向ADC1BUSY写‘1’开始工作
   EIE2 |=   0x08;
}
void Timer3_Init (int counts)
{
   TMR3CN = 0x02;                      // Stop Timer3; Clear TF3;
                                       // use SYSCLK as timebase
   TMR3RL  = -counts;                  // Init reload values
   TMR3    = 0xffff;                   // set to reload immediately
   EIE2   &= ~0x01;                    // disable Timer3 interrupts
   TMR3CN |= 0x04;                     // start Timer3
}
void ADC1_ISR (void) interrupt 17
{
   EA = 0;
   j=1;
}

⌨️ 快捷键说明

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