📄 552_adc_int.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 + -