📄 adc.c
字号:
//-----------------------------------------------------------------------------
// Firmware.c
//-----------------------------------------------------------------------------
// Copyright (C) 2005 Shenyang Institute of Aeronautical Engineering.
//
// AUTH: PAN
// DATE: 24 Apr 06
//
// This program is used to .
// Target: C8051F314
// Tool chain: KEIL C51 6.23 / KEIL EVAL C51
//
#include <c8051f410.h> // SFR declarations
#include <intrins.h> // SFR declarations
#include <stdio.h> // SFR declarations
#include <string.h> // SFR declarations
#include <math.h> //Keil library
#include <firmware.h> // SFR declarations
float AC_Voltage;
void Timer2_Init (int counts)
{
TMR2CN = 0x00; // STOP Timer2; Clear TF2H and TF2L;
// disable low-byte interrupt; disable
// split mode; select internal timebase
CKCON |= 0x10; // Timer2 uses SYSCLK as its timebase
// CKCON |= 0x00; // Timer2 uses SYSCLK/12 as its timebase
TMR2RL = -counts; // Init reload values
TMR2 = TMR2RL; // Init Timer2 with reload value
ET2 = 0; // disable Timer2 interrupts
// TR2 = 1; // start Timer2
}
void Timer0_Init ()
{
CKCON &= ~0x0B; // init Timer0
// T0M = 0; SCA1:0 = 00
TMOD &= ~0x0f; // TMOD: timer 0 in 16-bit reload
TMOD |= 0x01;
CKCON &= ~0x07;
TH0 = (-SYSCLK/TIMER2_RATE/12*30)>>8;
TL0 = (-SYSCLK/TIMER2_RATE/12*30)&0xff;
//TO = -(SYSCLK/TIMER2_RATE/12*50);
ET0 = 1;
}
void SYSCLK_Init (void)
{
// OSCICN |= 0x03; // Configure internal oscillator for
// its maximum frequency 24.5
OSCICN &= 0xF8;
OSCICN |= 0x06; // Configure internal oscillator for
// frequency 24.5/2
RSTSRC = 0x04; // Enable missing clock detector
}
void PORT_Init (void)
{
XBR0 = 0x01; // Enable UART on P0.4(RX) and P0.5(TX)
P1MDIN = 0x00;
P1SKIP = 0xff;
// P2MDIN |= 0xf0;
// P2SKIP |= 0x07;
P0MDIN |= 0xfe; // configure P0 as digital input
// P0SKIP |= 0x01;
P0MDOUT |= 0x10; // enable TXD(4) as push-pull output
XBR1 = 0x40; // Enable crossbar and enable pull-up
}
void UART0_Init (void)
{
SCON0 = 0xf0; // SCON0: 9-bit variable bit rate
// level of STOP bit is ignored
// RX enabled
// ninth bits are zeros
// clear RI0 and TI0 bits
// if (SYSCLK/BAUDRATE/2/256 < 1) {
// TH1 = -(SYSCLK/BAUDRATE/2);
// CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx
// CKCON |= 0x08;
// } else if (SYSCLK/BAUDRATE/2/256 < 4) {
// TH1 = -(SYSCLK/BAUDRATE/2/4);
// CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
// CKCON |= 0x09;
// } else if (SYSCLK/BAUDRATE/2/256 < 12) {
// TH1 = -(SYSCLK/BAUDRATE/2/12);
// CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
// } else {
// TH1 = -(SYSCLK/BAUDRATE/2/48);
// CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
// CKCON |= 0x02;
// }
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
TL1 = TH1; // init Timer1
TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x20;
TI0 = 0;
RI0 = 0;
ES0 = 1;
PS0 = 1;
TR1 = 1; // START Timer1
}
void ADC0_Init (void)
{
ADC0CN = 0x00; // ADC0 disabled; LP tracking
// mode; ADC0 conversions are initiated
// on a write to ADBusy
ADC0MX = 0x0c; // Single-ended mode
ADC0CF = (SYSCLK/5000000) << 3; // ADC conversion clock <= 3MHz
ADC0CF &= ~0x07; // Make ADC0 right-justified
// enable temp sensor, VREF = VREF, bias
REF0CN = 0x13; // generator is on.
// ADC0CN |= 0x80;
EIE1 &= ~0x08; // Disable ADC0 EOC interrupt
}
void Dog_Init(void)
{
PCA0MD = 0x00;
PCA0CPL5 = 0x00;
PCA0CPH5 = 0xff;
PCA0MD |= 0x40;
}
void Dog_Feed(void)
{
PCA0MD &= ~0x40;
PCA0H = 0x00;
PCA0CPH5 = 0xff;
PCA0MD |= 0x40;
}
float measure (void)
{
unsigned int ADC0_Result[32];
unsigned int temp;
unsigned int currval=0;
unsigned char i,j;
float voltage;
// AMX0P = channel;
AD0INT = 0;
// for(j=0;j<100;j++);
for(i=0;i<32;i++)
{
AD0INT = 0;
AD0BUSY = 1; // read the ADC value and add to running total
while (!AD0INT); // Wait for conversion to complete
AD0INT = 0;
ADC0_Result[i]= ADC0;
// Store latest ADC conversion
}
for(i=0; i<32; i++)
{
for(j=i+1; j<32; j++)
{
if(ADC0_Result[j]<ADC0_Result[i])
{
temp = ADC0_Result[i];
ADC0_Result[i] = ADC0_Result[j];
ADC0_Result[j] = temp;
}
}
}
for(i=8; i<24;i++)
{
currval +=ADC0_Result[i];
}
currval = currval>>4;
Dog_Feed();
voltage =(float)currval/4096.0*2.22*24.5;
return voltage;
}
void send_string( unsigned char *my_string)
{
unsigned char *string;
// ch1=ch&0xff00;
string = my_string;
// DE = 1;
// DE = 1;
TI0 =0;
TI0 =0;
while(*string != 0x00)
{
SBUF0 = *string;
string++;
while(!TI0);
TI0 =0;
}
// DE = 0;
// DE = 0;
}
//-----------------------------------------------------------------------------
// Support Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Wait200ms
//-----------------------------------------------------------------------------
//
// This routine uses timer 2 to insert a delay of approximately one second.
// Timer 2 overflows <TIMER2_RATE> times per second
//
/*
void Wait200ms(void)
{
unsigned int count;
TF2H = 0; // Clear Timer2 overflow flag
TR2 = 1; // Start Timer2
for (count = 200; count != 0; count--) {
while (!TF2H); // wait for overflow
TF2H = 0; // clear overflow indicator
}
TR2 = 0; // Stop Timer2
}
void Wait1ms(void)
{
TF2H = 0; // Clear Timer2 overflow flag
TR2 = 1;
while (!TF2H); // wait for overflow
TF2H = 0;
TR2 = 0;
}
*/
void UART0_ISR (void) interrupt 4
{
unsigned char xdata my_string[10];
unsigned char address ;
EA =0 ;
RI0 = 0; // clear UART0 interrupt flag
address = SBUF0;
if(address==0x02)
{
sprintf(my_string, "%06.1f",AC_Voltage);
send_string(my_string);
}
EA=1;
}
void Timer0_ISR (void) interrupt 1
{
static unsigned char T0_Counts = 0;
float Voltage;
Dog_Feed();
TF0 = 0;
TR0 = 0;
TH0 = (-SYSCLK/TIMER2_RATE/12*30)>>8;
TL0 = (-SYSCLK/TIMER2_RATE/12*30)&0xff;
T0_Counts = T0_Counts+1 ;
if(T0_Counts==20)
{
Voltage = measure();
T0_Counts = 0 ;
EA = 0;
AC_Voltage =Voltage;
EA = 1;
}
TR0 = 1;
}
void main (void)
{
// unsigned char xdata my_string[20];
// float AC_Voltage;
// unsigned char ch;
// unsigned char channel=0x06;
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
EA = 0;
PORT_Init(); // Initialize Port I/O
SYSCLK_Init(); // Initialize Oscillator
UART0_Init();
Timer2_Init(SYSCLK/TIMER2_RATE); // Init Timer 2
Timer0_Init();
ADC0_Init (); // init ADC0
AD0EN = 1; // enable ADC0
Dog_Init();
EA = 1;
TR0 = 1;
while (1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -