MPLAB X IDE编译PIC18F4620单片机代码报错求排查
问题代码错误点说明
- 错误1:函数声明与实际定义类型不匹配
代码开头的函数原型声明为unsigned char Get_Full_ADC(void);、void Flash_LED(unsigned char);,但实际定义的两个函数返回值/参数类型分别是unsigned int、unsigned int,类型不一致会直接触发编译报错。 - 错误2:
Flash_LED函数内语法缺失
行LATB = 0x05末尾缺失必要的分号,属于C语言基础语法错误。 - 可选逻辑修正(避免运行隐患):
Get_Full_ADC函数内的result变量定义为带符号int,但实际存储的是无符号ADC采样值,建议改为unsigned int类型避免溢出风险。
修正后完整代码
#include <stdio.h> #include <stdlib.h> #include <xc.h> #include <math.h> #include <p18f4620.h> #pragma config OSC = INTIO67 #pragma config WDT = OFF #pragma config LVP = OFF #pragma config BOREN = OFF #define delay 5 // 修正函数原型,和实际定义的参数、返回值类型保持一致 void Init_ADC(void); unsigned int Get_Full_ADC(void); void Flash_LED(unsigned int); void main(void) { unsigned int ADC_Result; // 存储ADC采样结果 Init_ADC(); // 初始化ADC模块 TRISB =0x00; // 设置PORTB为全输出端口 while(1) { ADC_Result = Get_Full_ADC(); // 读取ADC通道采样值 Flash_LED(ADC_Result); // 根据采样值调整LED闪烁间隔 } } void Init_ADC(void) { ADCON0=0x01; // 选择AN0通道,开启ADC模块 ADCON1=0x0E; // 仅AN0设为模拟引脚,参考电压为VDD/VSS ADCON2=0xA9; // 配置ADC转换、采样时间,结果右对齐 } unsigned int Get_Full_ADC(void) { // 修正变量类型为无符号,匹配ADC采样值属性 unsigned int result; ADCON0bits.GO=1; // 启动AD转换 while(ADCON0bits.DONE==1); // 等待转换完成(转换结束后DONE位由硬件自动清0) result = (ADRESH * 0x100) + ADRESL; // 拼接高低字节的10位采样结果 return result; // 返回完整采样结果 } void Flash_LED(unsigned int ADC_result) { unsigned int counter1, counter2; LATB = 0x0A; // PORTB输出电平00001010 // 延时循环 for (counter2=delay; counter2>0; --counter2) { for (counter1=ADC_result ; counter1>0; -- counter1); } LATB = 0x05; // 补充分号,PORTB输出电平00000101 // 延时循环 for (counter2=delay; counter2>0; --counter2) { for (counter1=ADC_result ; counter1>0; -- counter1); } }
内容的提问来源于stack exchange,提问作者user16739861
相关产品推荐
相关产品推荐

