?? adc1.c
字號:
/***************************************************************
功能:實現ADC采樣芯片外的模擬電壓,通過LCD顯示,并通過串口發送到PC機
注:插上短路環J4、J10、J12、J21,拔掉短路環J8。在J18-4腳輸入一小于5V的電壓。
版本:V1.0
***************************************************************/
#include <c8051f330.h> // SFR declarations
#include <stdio.h>
#include <INTRINS.H>
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F02x
//-----------------------------------------------------------------------------
sfr16 DP = 0x82; // data pointer
sfr16 TMR3RL = 0x92; // Timer3 reload value
sfr16 TMR3 = 0x94; // Timer3 counter
sfr16 ADC0 = 0xbd; // 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
#define BAUDRATE 9600 // Baud rate of UART in bps
#define SYSCLK 24500000 // SYSCLK frequency in Hz 22118400
#define SAMPLE_RATE 50000 // Sample frequency in Hz
#define INT_DEC 256 // integrate and decimate ratio
void PORTb_Init (void);
void UART0_Init (void);
void ADC0_Init (void);
void Timer3_Init (int counts);
void ADC0_ISR (void);
void Write_CHAR(unsigned char yjchar);
void Write_COM(unsigned char yjcom );
void YJ_Init(void);
unsigned long temp;
int k;
unsigned long result;
unsigned char NCDdata[10]={0x30};
unsigned char xdata tab2[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
void main (void) {
unsigned int i; // integer and fractional portions of
unsigned int m1,m2,m3,m4;
unsigned char aa,bb,cc,dd; // Disable Watchdog timer
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)
OSCICN |= 0x03; // Set internal oscillator to highest
// setting (24500000)
PORTb_Init (); // 初始化交叉開關和 GPIO
UART0_Init (); // 初始化UART0
Timer3_Init (SYSCLK/SAMPLE_RATE); // initialize Timer3 to overflow at
// sample rate
ADC0_Init (); // ADC 初始化
AD0EN = 1; // 使能 ADC
EA = 1;
while(result==0); //等于0,則等待
while (1) {
EA = 0; // 關中斷
temp = result;
temp &=0x000fff;
EA = 1; //開中斷
temp = temp*3300;
temp=temp/1024;
temp =(1850000-1000l*temp)/205;
printf ("V_input is %ldmV\n", temp);
for(k=0;k<4000;k++);
for(k=0;k<4000;k++);
for(k=0;k<4000;k++);
m1=temp/1000;
m2=(temp-1000*m1)/100;
m3=(temp-1000*m1-100*m2)/10;
m4=temp-1000*m1-100*m2-10*m3;
for(k=0;k<4000;k++);
for(k=0;k<4000;k++);
for(k=0;k<4000;k++);
i=0;
do
{
if(i==m1) aa=tab2[i];
if(i==m2) bb=tab2[i];
if(i==m3) cc=tab2[i];
if(i==m4) dd=tab2[i];
i++;
}while(i<10);
YJ_Init();
for(k=0;k<4000;k++);
for(k=0;k<4000;k++);
for(k=0;k<4000;k++);
Write_CHAR(aa);
Write_CHAR(0x2e);
Write_CHAR(bb);
Write_CHAR(cc);
Write_CHAR(dd);
Write_CHAR(0x56);
for(k=0;k<4000;k++);
for(k=0;k<4000;k++);
for(k=0;k<4000;k++);
}
}
//-----------------------------------------------------------------------------
// PORT配置
//-----------------------------------------------------------------------------
void PORTb_Init (void)
{
XBR0 |= 0x01; // 使能 UART P0.4(TX) and P0.5(RX)
XBR1 |= 0x40; // 使能交叉開關和弱上拉
P1MDIN|=0X02; //P1.1配置為模擬輸入
P1SKIP |= 0x02;
P0MDOUT|= 0x10; // enable TX0 as a push-pull output
}
//-----------------------------------------------------------------------------
// UART0配置
//-----------------------------------------------------------------------------
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
void UART0_Init (void)
{
SCON0 = 0x10; // SCON0: mode 0, 8-bit UART, enable RX
TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload
TH1 = 0x96; //-(SYSCLK/BAUDRATE/16);
// set Timer1 reload value for baudrate
TR1 = 1; // start Timer1
// Timer1 uses SYSCLK as time base
PCON |= 0x80; // SMOD00 = 1
TI0 = 1; // Indicate TX0 ready
}
//-----------------------------------------------------------------------------
// ADC0配置,T3定時啟動ADC
//-----------------------------------------------------------------------------
void ADC0_Init (void)
{
ADC0CN = 0xc5; // ADC0 T3定時采樣
REF0CN = 0x0e; // 啟用內部基準源
AMX0P=0X09; // 選擇采樣輸入源P1.1作為正輸入
AMX0N=0X11; //選擇采樣輸入源GND作為負輸入ADC工作在單端方式
ADC0CF = 0x38;
EIE1 |= 0x08; // 啟用 ADC 中斷
}
//-----------------------------------------------------------------------------
// Timer3配置,T3定時啟動ADC
//-----------------------------------------------------------------------------
void Timer3_Init (int counts)
{
CKCON=0X80;
TMR3RL = -counts;
TMR3 = 0xffff;
EIE1 &= ~0x80;//禁止定時器3中斷
TMR3CN |= 0x04;//定時器3允許
}
//-----------------------------------------------------------------------------
// ADC0采樣中斷
//-----------------------------------------------------------------------------
void ADC0_ISR (void) interrupt 10
{
static unsigned int_dec=INT_DEC;
static unsigned long accumulator=0L;
ADC0CN &= ~0x20; // 清 ADC 中斷標志位
accumulator=accumulator +ADC0; // 累加ADC采樣數據
int_dec--; // 指針減1
if (int_dec == 0)
{ // 累加完了嗎?
int_dec = INT_DEC; // 指針復位
result = accumulator>>8;
accumulator = 0L; // 累加和變量清0
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -