子函数涉及到的就这些,我把wendu()放到主函数就不行了。没放按键还是可以实现的
unsigned char ADC0832()//ad转换,返回结果,运用了I2c总线
{
unsigned char i,data_c;
data_c=0;
ADC_CLK=0;
ADC_DI=1;
ADC_CS=0;//拉低cs端
ADC_CLK=1;
ADC_CLK=0;//拉低LCK端,形成下降沿1
ADC_DI=1;//指定转换通道是CH1还是CH2。H
ADC_CLK=1;
ADC_CLK=0;//拉低CLK端,形成下降沿2
ADC_DI=0;//指定值右移一位,再取最后一位的值。L
ADC_CLK=1;
ADC_CLK=0;//拉低CLK,形成下降沿3
ADC_DI=1;
for(i=0;i<8;i++)//采集一次
{
ADC_CLK=1;
ADC_CLK=0;
if(ADC_DI)
data_c|=0x80>>i;
//data_c=(data_c<<1)|ADC_DO;//在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数
}
/*for(i=0;i<8;i++)//采集第二次
{
if(ADC_DI)
data_c|=0x01<<i;
ADC_CLK=1;
ADC_CLK=0;
}*/
ADC_CS=1;//取消片选 一个转换周期结束
ADC_CLK=1;//拉高数据端,回到初始状态
ADC_DI=1;
return(data_c);
}
void disp_TP(float f_data)
{
uint tp;
if(f_data<0)
{
Disp1Char(9,0,('-'));
tp=f_data;
tp=tp-1;
f_data=~tp;
}
f_data=f_data*100;
DispStr(7,0,"T=");
Disp1Char(10,0,((int)f_data/1000+0x30));
Disp1Char(11,0,((int)f_data%1000/100+0x30));
Disp1Char(12,0,('.'));
Disp1Char(13,0,((int)f_data%1000%100/10+0x30));
Disp1Char(14,0,(0xdf));
Disp1Char(15,0,('C'));
}
void wendu()
{
v=ADC0832();
temp=v;
RV=BaseVol/256*temp;
RT=RV*10/(BaseVol-RV);
tmpp=1/(1/TN+(log(RT/RN)/B))-273.15;
disp_TP(tmpp);
if(tmpp>h)//当温度大于h时,蜂鸣器响
{
beep();
DispStr(3,1,"Th");
delaynms(20);
}
if(tmpp<g)//当温度小于g时,蜂鸣器响
{
beep();
DispStr(3,1,"Tl");
delaynms(20);
}
} |