- // ADC配置修正
- void ConfigAdc() {
- ADCON1 = 0x0004; // 12-bit整数格式,禁止自动转换
- ADCON2 = 0x0418; // 扫描模式,3次转换后中断(SMPI=3)
- ADCON3 = 0x1FBF; // 31TAD采样时间,RC时钟
- ADCHS = 0x0000; // CH0作为主通道
- ADPCFG = 0xFFF8; // AN0-2模拟输入
- ADCSSL = 0x0007; // 扫描AN0-AN2
- // 中断配置
- IFS0bits.ADIF = 0;
- IEC0bits.ADIE = 1;
- IPC2bits.ADIP = 7;
- }
- volatile unsigned int adc_results;
- volatile uint8_t conv_complete = 0;
- // 中断服务程序优化
- void __attribute__((__interrupt__)) _AdcInterrupt(void) {
- if(ADCON1bits.DONE) {
- adc_results = ADCBUF0; // 读取AN0结果
- adc_results = ADCBUF1; // 读取AN1结果
- adc_results = ADCBUF2; // 读取AN2结果
- conv_complete = 1; // 置位完成标志
- ADCON1bits.DONE = 0; // 清除完成标志
- }
- IFS0bits.ADIF = 0; // 清除中断标志
- }
- // 主程序逻辑优化
- int main(void) {
- ConfigAdc();
- ADCON1bits.ADON = 1; // 开启ADC
- TRISB = 0x0007; // RB0-2为输入
-
- while(1) {
- ADCON1bits.SAMP = 1; // 启动自动采样
- while(!conv_complete); // 等待转换完成
- conv_complete = 0; // 清除标志
-
- // 使用adc_results数组中的数据
- unsigned int T = adc_results;
- unsigned int I = adc_results;
- unsigned int U = adc_results;
-
- // 数据处理代码...
- }
- }
|