我正在使用PIC18F26K83,并且试图通过使用NTCALUG02A103F来测量温度。我已经计算了ADC输出和它们等于的温度。我创建了2个数组:1个用于ADC值,1个用于该ADC值的温度。在for循环中,我将ADC的值与数组的值进行比较,如果我的ADC值小于数组的值,它将继续递减数组元素,最终它将以258 ADC值结束,这是我数组的最后一个元素。但是,在for循环中,它永远不会减少。即使我的ADC值为2000,它也不会继续。它卡在i = 32。这是代码:
int i;
int temperature;
int temp_data;
int temp_ADC_array[34] = {259, 293, 332, 377, 428, 487, 555, 632, 720,
821, 934, 1062, 1203, 1360, 1531, 1715, 1910, 2113,
2320, 2528, 2731, 2926, 3108, 3274, 3422, 3552, 3663,
3756, 3833, 3895, 3945, 3983, 4013, 4036};
int temp_array[34] = {125, 120, 115, 110, 105, 100, 95, 90, 85, 80, 75, 70,
65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10,
5, 0, -5, -10, -15, -20, -25, -30, -35, -40};
void main() {
while (1) {
temp_data = ADC_READ(3);
for (i = 33; temp_data < temp_ADC_array[i]; i--) {
temperature = temp_array[i];
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:此for循环也不起作用:
for (i = 0; i < 34; i++) {
if (temp_data > temp_ADC_array[33 - i]) {
temperature = temp_array[33 - i];
break;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2:我使用led进行测试,电路上没有USB,因此无法使用调试器。这是我测试温度的方法:(我检查LED的闪烁)
for(i; temperature>=0; temperature=temperature-10){
led=1;
delay_ms(1000);
led=0;
delay_ms(1000);
}
delay_ms(5000);
Run Code Online (Sandbox Code Playgroud)
这个答案只是我的评论的重复。它的目的是使它有可能被接受为答案,以便人们立即看到该问题已解决。
我认为当条件不再成立时,在分配温度之前,您的第一个循环可能会停止。这意味着温度值过早为一。虽然第二个循环对我来说很好
第一个循环是
void main() {
while (1) {
temp_data = ADC_READ(3);
for (i = 33; temp_data < temp_ADC_array[i]; i--) {
temperature = temp_array[i];
}
}
Run Code Online (Sandbox Code Playgroud)
而且问题在于一旦条件temp_data < temp_ADC_array[i]不再满足,它就会停止循环。因此,如果发生这种情况i==0,温度仍将保持在temp_array[1]。
第二个循环是
for (i = 0; i < 34; i++) {
if (temp_data > temp_ADC_array[33 - i]) {
temperature = temp_array[33 - i];
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这应该起作用,因为只有在分配正确的温度后它才会破裂。