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

📄 adc.c

📁 这是8051F020的一些基本实验程序
💻 C
字号:
#include "c8051F020.h"
#include <intrins.h>

/*
	压力应变片ADC试验

	运行此程序,压力值将在数码管上显示.用手触摸应变片
	观察压力变化.

*/

#define MUX_TEMP			0x08
#define MUX_VOLT			0x01
#define MUX_PRESS			0x02

unsigned int idata  Temp, Press, Volt;
unsigned char  idata mux_select;

sfr16 ADC0     = 0xbe;                 // ADC0 data

void init_adc(void)
{
	ADC0CN = 0x81;                      // ADC0 enabled; normal tracking
     	                                // mode; ADC0 conversions are initiated 
                                       	// on write to AD0BUSY; ADC0 data is
                                       	// left-justified
	REF0CN = 0x07;                      // enable temp sensor, on-chip VREF,
                                       	// and VREF output buffer
	mux_select = MUX_TEMP;	  			// CPU on-chip temp sensor
	AMX0SL = MUX_TEMP; 	

	ADC0CF = (SYSCLK/2500000) << 3;     // ADC conversion clock = 2.5MHz
	//ADC0CF |= 0x01;                     // PGA gain = 2
	EIE2 &= ~0x02;                      // disable ADC0 EOC interrupt
	EIE1 &= ~0x04;                      // disable ADC0 window compare interrupt
}

//  On-chip temperature
//  AN1. 电位器
//  AN2. 应变片

void read_analog_inputs(void)
{
	long temp_long;
    AD0INT = 0;                      // clear conversion complete indicator
    AD0BUSY = 1;                     // initiate conversion
    while (AD0INT == 0);             // wait for conversion complete

	switch (mux_select)
	{
		case MUX_TEMP:
	      	temp_long = ADC0 - 42380/2;
		    temp_long = (temp_long * 200L) / 156;
			Temp=temp_long;
			AMX0SL = MUX_VOLT;		// Select AIN1 for next read
			mux_select = MUX_VOLT;
		break;

	   	case MUX_VOLT:
			temp_long = ADC0;
			Volt = 24*temp_long/655;
			AMX0SL = MUX_PRESS;		// Select on-chip temp sensor
			mux_select = MUX_PRESS;
		break;
    	
		case MUX_PRESS:
			temp_long = ADC0;
			temp_long = 24*temp_long/655;
			Press = temp_long;
      		AMX0SL = MUX_TEMP;	 
      		mux_select = MUX_TEMP;
		break;
		default:
		AMX0SL = MUX_TEMP;
		mux_select = MUX_TEMP;
		break;
  	}
}
 
unsigned int GetADCValue(char No)
{
	read_analog_inputs();
	read_analog_inputs();
	read_analog_inputs();
	switch (No)
	{
		case 1:
			return Temp;
		case 2:
			return Volt;
		case 3:
			if (Press<10) Press=0;
			return Press;
	}
}


⌨️ 快捷键说明

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