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

📄 com.c

📁 本人自己写的用C8051F020驱动的DAC8541程序,直接对口操作,信号非常好,已经完全经过调试
💻 C
字号:
#pragma  REGPARMS

#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <absacc.h>
#include <c8051f020.h>  
#include <intrins.h>
#define   SDA   0x20//BIT0
#define   SCL   0x10//BIT1
#define   _NOP()  _nop_()
#define   DIN   P4
#define uchar unsigned char
#define uint  unsigned int
#define   S_SDA P4|=SDA//DDIR|=SDA,DOUT|=SDA
#define   C_SDA P4&=~SDA//DDIR|=SDA,DOUT&=~SDA
#define   S_SCL P4|=SCL//DDIR|=SCL,DOUT|=SCL
#define   C_SCL P4&=~SCL//DDIR|=SCL,DOUT&=~SCL
//#define   SDA_IN _NOP//DDIR&=~SDA
#define   READ_SDA  _nop_()//(DIN&SDA)
//#define   delay() _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_()
/***************************************************/
unsigned char ack=0;
/********************************************/

#include "com.h"

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

//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------

#define BAUDRATE     9600              // Baud rate of UART in bps
#define SYSCLK       11059200          // SYSCLK frequency in Hz
#define SAMPLE_RATE  50000             // Sample frequency in Hz
#define INT_DEC      256               // integrate and decimate ratio


unsigned int ii,j;
unsigned int xdata chii;
float f;
unsigned int VCH0,VCH1,VCH2,VCH3,VCH4,VCH5,VCH6,VCH7;
unsigned int xdata BB[1024];
unsigned char bufer[8];
//**************----------------------------------------
/*void chad(int buffer[],int n)      //invert the array BB
{ 
 int i,j,temp,m=(n-1)/2;
 for(i=0;i<=m;i++)
 {j=n-1-i;
  temp=buffer[i];buffer[i]=buffer[j];buffer[j]=temp;}
  return;
 
 }
/**************------------------------------------------
*/

void delay()
{
	uchar i,j;
	for(i=0;i<=100;i++)
		{
			for(j=0;j<=100;j++)
				;
		}
}

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

//-----------------------------------------------------------------------------
// PORT_Init   use cpumodel.pcb
//-----------------------------------------------------------------------------

void PORT_Init (void)
{
   	XBR0    = 0x06;  //Enable UART0      P0.0=TXD0      P0.1=RXD0
                     //Enable SPI        P0.2=SCK       P0.3=MISO
                     //                  P0.4=MOSI      P0.5=NSS
					
   	XBR1    = 0x00;  //
                     
                    

	XBR2    = 0x42;  //Enable pin on 
					
  					 //Enable UART1      P0.4=TXD1     P0.5=RXD1 
					                
   

    P1MDOUT |= 0x40;  // Enable          P1.6 output
    
//	EMI0CF=0x37;
    EMI0CF=0x3B;      //RAM set: D5=1   外部Ram on p4-p7              
                      //         d4=1   不复用
                      //         d3d2=10 <4k use in chip , >4k:use outside
//	EMI0CF=0x3F;	  //         d3d2=11 only use outside  To:NP441 2006.8.8
                   
}

//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.

void UART0_Init (void)
{
   SCON0   = 0x50;                     // SCON0: mode 1, 8-bit UART, enable RXD
   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    = 1;                         // Indicate TX0 ready
}


//-------------------------------------------------------
//      ADC0初始化
//-------------------------------------------------------

void ADC0_init (void)
{
   	ADC0CN=0x81;    // ADC0 d7=1:开,      d6=0:跟踪方试,
	                //      d5:AD0 INT标志,d4:AD0BUSY
	                //     d3d2=00:AD)BUSY=1起动,
					//     d0=1:数据左对齐  
                    
   	ADC0CF=0x48;    //ADC0时钟为系统时钟 5分频  放大器=1
	AMX0CF=0x00;    //Ain0-Ain7 单端输入0-3.3v
	
	AMX0SL=0x07;    //转换CH7
	for(ii=0;ii<40;ii++){;}
	AD0BUSY=1;
	for(ii=0;ii<400;ii++){;}
	ADC0CN =0x81;
	VCH7=ADC0>>4;
	
	AMX0SL=0x06;    //转换CH6
	for(ii=0;ii<40;ii++){;}
	AD0BUSY=1;
    for(ii=0;ii<400;ii++){;}
	ADC0CN =0x81;
	VCH6=ADC0>>4;


}

//-----------------------------------------------------
//DAC_init
//-----------------------------------------------------
void DAC_init(void)
{
   DAC0CN=0x80;//DAC0 enable 更新数据在写DAC0 高字节时,高4位在DAC0H中,低8位在DAC0L中
   DAC1CN=0x80;//有问题,在C中高位在前,低位在后,而SFR中低位在前,
   REF0CN=0x0b;//
}


 /******************************************
启动总线函数
**************************************/
void  start()
{     
      S_SDA;
      _NOP();
      S_SCL;
      delay();
      C_SDA;
      delay();
      C_SCL;
      _NOP();
      _NOP();
}
/************************************
停止总线函数
**************************************/
void stop()
{   
     C_SDA;
	 _NOP();
	 S_SCL;
	 _NOP();

    // C_SCL;
    _NOP();
     //C_SDA;
      delay();
   //   S_SCL;
      delay();
      S_SDA;   
    _NOP();
    _NOP();
    _NOP();
    _NOP();     
}
/************************************
发送一个字节函数
**************************************/
void SendByte(uchar c)
{
      uchar i;    
      for(i=0;i<8;i++)
          {
            if((c<<i)&0x80)
                S_SDA;
            else
                C_SDA;
            delay();
            S_SCL;
            delay();
            C_SCL;
            delay();
          }
         _NOP();
       _NOP();
       _NOP(); 
		S_SDA;
  		_NOP();
       _NOP();
       _NOP(); 
		 S_SCL;
       _NOP();
       _NOP();
       _NOP();  
 	   i=P4;
      if(i==0xff)
          ack=0;
      else
          ack=1;

       delay();
      C_SCL;
     
      _NOP();
     _NOP();
}
/************************************
停止总线函数
**************************************/
void send_ack(uchar a)
{     
      if(a==0)       
       { 
       C_SDA;
       delay();
       S_SCL;
       delay();
       C_SCL;
       delay();
       S_SDA;
      }
      else
       { 
        S_SDA;          
        delay();
        S_SCL;
        delay();
        C_SCL;
        delay();
      }      
}
/************************************
接收一个字节函数
**************************************/
uchar RcvByte()
{
      uchar retc;
      uchar i,j;
      retc=0;   
//      SDA_IN;
		S_SDA;
      for(i=0;i<8;i++)
        {       
		 _nop_();
		  C_SCL;
          delay();
          S_SCL;
          delay();       
          retc=retc<<1;
     //     SDA_IN;
        //  if(READ_SDA==SDA)//read p4in 
		j=P4;
		if(P4&SDA==SDA)
              retc+=1;                         
         delay();
         C_SCL;
         delay();
         }     
      return(retc);        
}
/************************************
接收一个字节函数
**************************************/
uchar ISendByte(uchar sla,uchar c)
{
      start();
      SendByte(sla);
      if(ack==0)
          return(0);
      SendByte(c);
      if(ack==0)
          return(0);
      stop();
      return(1);
}
/************************************
发送一个数据串函数
**************************************/
uchar ISendstr(uchar sla,uchar suba,uchar *s,uchar no)
{
      uchar i;     
      start();
      SendByte(sla);
      if(ack==0)
          return(0);
      SendByte(suba);
      if(ack==0)
          return(0);
     for(i=0;i<no;i++)
          {
            SendByte(*s);
            if(ack==0)
              return(0);
            s++;
            suba++;
          }
      stop();     
      return(1);  
}
/************************************
接收多个数据串函数
**************************************/
uchar IRcvbyte(uchar sla,uchar *c)
{
      start();
      SendByte(sla+1);
      if(ack==0)
	  {
          return(0);
		  }

      *c=RcvByte();
      send_ack(1);
      stop();
      return(1);
}
//check
uchar IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
      uchar i;
      start();
      SendByte(sla);
      if(ack==0)
          return(0);
      SendByte(suba);
      if(ack==0)
          return(0);
      start();
      SendByte(sla+1);
      if(ack==0)
          return(0);
      for(i=0;i<no-1;i++)
          {
              *s=RcvByte();
              send_ack(0);
              s++;             
          }
      *s=RcvByte();
      send_ack(1);
      stop();
      return(1);
}

 

/*******************************************************************
*			    moli-1				                               *
*			     Ver 0.0				                           *
*				  by ren jia fu		                               *
*				   2007.9.8			                               *
*********************************************************************/
uchar  rom_rec[7];
main()
{
  
 
    /***********************************************
	  初始化系统
	*************************************************/
   
   
   	WDTCN = 0xde;    	// disable watchdog timer
   	WDTCN = 0xad;
      
   	SYSCLK_Init ();  	// initialize oscillator
   	PORT_Init ();    	// initialize crossbar and GPIO
   //*******************----------------------------- 
	
    //******************-------------------------------
	UART0_Init (); 		// initialize UART0
  
   	DAC_init();		    // initialize DAC0 DAC1

    /***********************************************
	  测试DAC0 DAC1
	*************************************************/
  	chii=1023;
   	OUTDAC0();
   	chii=0;
   	DAC1=chii;

 
 /***********************************************
	  主程序
  *************************************************/
 
  P2=0x00;
  P2=0x01;
  
   for(ii=0;ii<1024;ii++)
   {
   	f=0.0061357*ii;
    f=32767*sin(f);
   	chii=f;
	BB[ii]=chii;
   //BB[ii]=ii;
	}
 
   DAC8541();
/*

	for(ii=0;ii<1024;ii++)
   {
	 DAC0=BB[ii];
	 DAC1=DAC0;
     bufer[0]=ii/256;
	 bufer[1]=ii-256*bufer[0];

	 P6=bufer[0];
     P7=bufer[1];
     
	 }
	 */
begin1:
        DAC712();

   goto begin1;
  
}

⌨️ 快捷键说明

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