?? com.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 + -