📄 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 + -