关于stc15使用ADC中断的相关例程
时间: 2023-07-11 13:12:42 浏览: 417
STC15系列自带10位ADC驱动
以下是STC15使用ADC中断的相关例程代码:
```
#include <reg52.h>
#include <intrins.h>
#define FOSC 11059200L
#define BAUD 9600
unsigned char code table[] = "ADC Value:";
unsigned char adc_val; // 存储ADC转换结果
// 初始化串口
void InitUart() {
TMOD = 0x20; // 设置定时器1为模式2
TH1 = TL1 = -(FOSC/12/32/BAUD); // 设定波特率
TR1 = 1; // 启动定时器1
SM0 = 0; // 设置串口工作模式
SM1 = 1;
EA = 1; // 打开总中断
ES = 1; // 打开串口中断
}
// 初始化ADC
void InitADC() {
P1ASF = 0x01; // 设置P1.0为模拟输入
ADC_RES = 0; // 清零ADC转换结果
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ADC_CH0; // 启动ADC转换
}
// ADC中断服务程序
void ADC_ISR() interrupt 5 using 1 {
ADC_CONTR &= ~ADC_FLAG; // 清除ADC转换标志位
adc_val = ADC_RES; // 获取ADC转换结果
}
// 主函数
void main() {
InitUart(); // 初始化串口
InitADC(); // 初始化ADC
while (1) {
printf("%s%d\n", table, adc_val); // 输出ADC转换结果
DelayMs(1000); // 延时1秒
}
}
```
以上代码中,通过`InitUart()`函数初始化串口,通过`InitADC()`函数初始化ADC。在主程序中,通过`printf()`函数输出ADC转换结果,通过`DelayMs()`函数实现延时操作。中断服务程序`ADC_ISR()`中获取ADC转换结果,并清除转换标志位。需要注意的是,ADC中断的优先级比较高,因此需要使用优先级为1的中断向量。
阅读全文