![]() |
电路图底部那三只按键分别连在 P3.2、P3.3、P3.4 上(INT0、INT1、T0) 代码中却写成: sbit KEY_SET = P3^1; sbit KEY_ADD = P3^2; sbit KEY_SUB = P3^3; 应该改为: sbit KEY_SET = P3^2; sbit KEY_ADD = P3^3; sbit KEY_SUB = P3^4; 电路图上 ADC0832 的 DI、DO 是分开的两根线: DI(写入控制位) 接在 P1.1 DO(读出 A/D 数据) 接在 P1.3 代码中却只定义了一个 ADC_DO = P1^1;,既用来写又用来读: sbit ADC_CLK = P1^0; sbit ADC_DO = P1^1; // 实际应是 ADC_DI sbit ADC_CS = P1^2; // 缺少: sbit ADC_DO = P1^3; 改法: sbit ADC_CLK = P1^0; sbit ADC_DI = P1^1; // 写控制位 sbit ADC_DO = P1^3; // 读数据位 sbit ADC_CS = P1^2; 同时,ADC0832 的数据输出前还有两个“空”位需要丢弃(datasheet 要求在 SGL/ODD 之后再时钟两次),你的 for(i=0;i<8;i++) 开始读时实际上少跑了这两个时钟,把数据错排了。 pH 阈值没有被显示出来 你在 Key_Process() 里调整了 ph_high/ph_low,但主循环里并没有把它们用 LCD_ShowValue() 打出来,用户按键调节时屏幕看不到反馈。 建议在第二行或第三行再加两处 LCD_ShowValue(),把当前的 pH 高低阈值实时显示。 (次要)DS18B20 的时序延时过长 你的 Delayms(1) 是约 1 ms,但 DS18B20 写“1”位用的是低电平保持 1~15 μs(而你保持了 1 ms)、写“0”位要保持 60~120 μs(1 ms 也 OK)。 虽然过长的延时通常设备“能通用”,但如果后面出现不稳定,建议改成用us 级的延时子函数更精准。 |