用stc15写一段含有ADC中断的程序
时间: 2023-09-12 19:07:49 浏览: 143
好的,下面是一段基于STC15单片机的ADC中断程序示例:
```c
#include <STC15F2K60S2.h>
#define FOSC 24000000L
#define BAUD 115200L
#define ADC_CHANNEL 0 // ADC采集通道
unsigned int adc_value = 0; // 存储ADC采集值
void init_uart() {
PCON &= 0x7F; // 设置SMOD0=0
SCON = 0x50; // 设置UART为模式1
TMOD &= 0x0F; // 清除定时器1模式位
TMOD |= 0x20; // 设置定时器1为模式2
TH1 = TL1 = -(FOSC/12/32/BAUD); // 设置波特率
ET1 = 0; // 关闭定时器1中断
TR1 = 1; // 启动定时器1
}
void init_adc() {
ADC_RES = 0; // 清除ADC结果寄存器
ADC_CONTR = 0xE0 | ADC_CHANNEL; // 设置ADC控制寄存器
ADC_CONTR |= 0x08; // 启动ADC转换
}
void adc_isr() interrupt 5 {
adc_value = ADC_RES << 2; // 读取ADC结果
ADC_CONTR &= ~0x10; // 清除ADC中断标志位
}
void main() {
init_uart();
init_adc();
EA = 1; // 开启总中断
while(1) {
// 输出ADC采集值
printf("ADC Value: %d\r\n", adc_value);
// 延时
for(int i = 0; i < 10000; i++);
}
}
```
上面的代码中,我们首先定义了一些常量和变量。然后在`init_uart()`函数中初始化了串口,`init_adc()`函数中初始化了ADC。最后在`adc_isr()`函数中实现了ADC中断服务程序,当ADC转换完成时,将结果保存在`adc_value`变量中。
在`main()`函数中,我们开启了总中断,并在一个无限循环中输出了`adc_value`的值。
注意:上面的代码仅供参考,实际应用中需要根据自己的需求进行修改和完善。