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

📄 552_adc_int.c

📁 这是《Keil Cx51 V7.0单片机高级语言编程与uVision2应用实践》教材各章中列出的全部程序例子。
💻 C
字号:
/******************************************************************************
*  功能描述: 在STADC引脚的上升沿之后扫描所有ADC通道。由定时器T2
*            控制在P4.7引脚上产生重复周期为1.14ms的上升沿信号。
*            A/D转换结果被送往UART。 
******************************************************************************/
#include <reg552.h>
#define ADEX  0x20
#define ADCI  0x10
#define ADCS  0x08
#define ADCIn 0x0ef
#define FALSE 0
#define TRUE  1

void write_UART(unsigned int *, unsigned int);
bit conversion_finished;

void main(void) {
  unsigned int conversion, result_ADC[8];
  unsigned char ADC_Channel;
  S0CON=0x40;			/* 串行口初始化 */
  TH1=TL1=0xfd; 		/* 19200 Baud @11.0592MHz */
  TMOD=0x20;
  TR1=1;
  TM2CON=0xfd;			/* 定时器T2初始化: osc/96 */
  RTE=0x80;			/* 溢出率= 0.569ms, 在STADC的上升沿开始
				   A/D转换, 转换速率=1.14ms */
  EAD=1;			/* ADC 开中断 */
  EA=1;
  conversion_finished=FALSE;
  ADC_Channel=conversion=0;
  ADCON=0;			/* 第一次转换由外部启动 */
  ADCON=ADEX;
  while(1) {
    if (conversion_finished==FALSE) {
	/* 在A/D转换期间可执行用户的其他程序代码 */
    }
    else {
	  result_ADC[ADC_Channel]=5*((256*ADCH+(ADCON&0xc0))>>6);
				/* 存储A/D转换结果 */
	  if (ADC_Channel!=7) {
	      /* 准备对下一个通道进行转换 */
	      ADCON=++ADC_Channel;
	      ADCON=ADCON|ADCS;
	  }
	  else {
		/* ADC0...ADC7 全部转换完毕, 结果送往 UART */
		write_UART(&result_ADC, conversion++);
		if (conversion==10000) conversion=0;
		ADC_Channel=0;
		ADCON=0;	/* 准备下一次扫描 */
		ADCON=ADEX;
	  }
	  conversion_finished=FALSE;
    }
  }
 }

void ADC(void) interrupt 10 using 1 {
  ADCON=ADCON&ADCIn;		/* 清除ADCI标志 */
  conversion_finished=TRUE;
 }

⌨️ 快捷键说明

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