![]() |
發布時間: 2025-4-21 16:22
正文摘要:#include <reg51.h> #include <intrins.h> // DS18B20???? sbit DS18B20_DQ = P3^7; // ADC0832???? sbit ADC_CLK = P1^0; sbit ADC_DO = P1^1; sbit ADC_CS = P1^2; / ... |
電路圖底部那三只按鍵分別連在 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 級的延時子函數更精準。 |