在线时间34 小时
UID9302
注册时间2007-7-19
NXP金币0
该用户从未签到
中级会员
 
- 积分
- 252
- 最后登录
- 1970-1-1
|

楼主 |
发表于 2015-4-29 10:26:05
|
显示全部楼层
就这么一段代码。见后。
1. 下载N次,表现一样
2. 没有设置断点
3. 整个项目已经成功运行、销售。这次只是想把测温范围从0-150提高到0-220,所以,数组要加长。
4. 调整数组赋值方式后,问题解决,可以说明,程序逻辑、数组的引用都没有越界、错误之类的问题。
#include "includes.h"
unsigned int AD12[8];
unsigned char AD12_count;
unsigned int AD13[8];
unsigned char AD13_count;
/* 对应温度传感器输出15档(150度,140度..0度)电阻时的AD采样值 */
unsigned int Temperature[] ={
33, //150度
42, //140度
53,//130度
68, //120度
87, //110度
114,
148,
194,
254,
328,
417,
517,
625,
729,
821,
889 //0度
};
/* 查表得到温度值 */
/* 输入 : 10位AD采样值 */
/* 结果变量:0--1500(单位:0.1度) */
unsigned int AD2T(unsigned int ADValue)
{
unsigned int tmp1,tmp2;
unsigned char i=0,VH,VL;
tmp1=Temperature;
if (ADValue <= tmp1)
{
return 1500;
}
if (ADValue > Temperature[15])
{
return 0;
}
while (ADValue > tmp1)
{
i++;
tmp1=Temperature;
}
if (ADValue==tmp1)
{
VH=i;
VL=0;
}
else
{
i--;
VH=i;
tmp2=Temperature;
tmp1-=tmp2;
tmp2=ADValue-tmp2;
tmp2*=100; //100等分
VL=0;
while(tmp1<=tmp2)
{
tmp2-=tmp1;
VL++;
}
}
return (150-VH*10)*10-VL;
}
void get_T(void)
{
unsigned int temp;
unsigned char AD_Value_H,AD_Value_L,i;
ADC1SC1 = 12;//获取ADP12通道的AD值------热风口温度
while( ADC1SC1_COCO == 0 )
{
if( ADC1SC2_ADACT == 0 )
return;
}
AD_Value_L = ADC1RL;
AD_Value_H = ADC1RH;
temp = AD_Value_H;
temp = (temp <<8) + AD_Value_L;
AD12[AD12_count]=temp;
AD12_count++;
if(AD12_count==8) //采样8次后取平均值,然后换算成温度
{
temp=0;
for(i=0;i<8;i++) temp+=AD12;
temp=(temp>>3);
temp=AD2T(temp);
T12=(temp/10);
AD12_count=0;
}
ADC1SC1 = 13;//获取ADP13通道的AD值------环境温度
while( ADC1SC1_COCO == 0 )
{
if( ADC1SC2_ADACT == 0 )
return;
}
AD_Value_L = ADC1RL;
AD_Value_H = ADC1RH;
temp = AD_Value_H;
temp = (temp <<8) + AD_Value_L;
AD13[AD13_count]=temp;
AD13_count++;
if(AD13_count==8) //采样8次后取平均值,然后换算成温度
{
temp=0;
for(i=0;i<8;i++) temp+=AD13;
temp=(temp>>3);
temp=AD2T(temp);
T13=(temp/10);
AD13_count=0;
}
}
void ADC_init(void)
{
/* ADC初始化 */
APCTL1 = 0x00; //ADPC7~1=0=允许AD7~0管脚用作I/O
//AD12:热风口温度
//AD13:环境温度
//AD14:预留
//AD15:预留
APCTL2 = 0b00110000; //ADPC12/13用于AD,其他引脚用作I/O
ADC1CFG = 0b00001000;//(高速、不分频、短采样时间) ,10位模式
ADC1SC2 = 0x00; //未启动转换,软件触发转换,禁止比较功能
ADC1CV = 0x00; //比较位清零
ADC1SC1 = 0x1F; //0001 1111,转换完成禁止中断,非连续转换,通道选择VREFH(获取AD值时,在GetAD中切换通道)
AD12_count=0;
AD13_count=0;
} |
|