uint idata time0_tmp; // 临时变量,用于计算定时
uint data datatab[5];
uint data receave,count0=0,scan=0,dig=0;
/* 显示函数 */
void display(uint result)
{
uchar x;
unsigned int d;
P1|=0xff; //关显示
if(result> =2047) //12位AD转换大于2047为正数
{
d=(result-2047); //200℃对应+5V
switch (scan)
{
case 0: x=d/1000; break; //千位
case 1: x=(d/100)%10; break; //百位
case 2: x=(d/10)%10; break; //十位
case 3: x=d%10; break; //个位
default: break;
}
P0|=0xff;P1|=0xff; //关显示
if((scan==0)&&(x==0)){P0=0xff; P1=0xff;} //有效位前的零不显示
else {P0= DispTab[x]; // 送字型码
P1=BitTab[scan]; // 送字位码
}
scan++;
if(scan> 3){scan=0;}
}
else
{
d=(2047-result); //小于2047为负
switch (scan)
{
case 0: x=d/1000; break; //千位
case 1: x=(d/100)%10; break; //百位
case 2: x=(d/10)%10; break; //十位
case 3: x=d%10; break; //个位
default: break;
}
P0|=0xff;P1|=0xff;
if((scan==0)&&(x==0)){P0=0xbf;} //有效位前的零不显示,0xbf是负号
else if ((scan==0)&&(x==1)){P0=0xb9; } // 否则-1
else P0= DispTab[x]; // 送字型码
P1=BitTab[scan];
scan++;
if(scan> 3){scan=0;}
}
}
/*ad1674采样函数*/
uint ad1674(void)
{
r=0;
w=0; //CE=0
ADCOM=0; //启动转换
while(adbusy==1);
return ((uint)(ADHI < <4)+(ADLO> > 4));
}
/* 定时器0中断服务子程序,定时动态扫描显示 */
void time0_int(void) interrupt 1
{
TH0 = (time0_tmp/256);
TL0 = (time0_tmp%256);
count0++;
if(count0==50) //200ms转换一次
{
datatab[dig]=ad1674();//启动转换
count0=0;
dig++;
if(dig> 4)
{
receave=(datatab[0]+datatab[1]+datatab[2]+datatab[3]+datatab[4])/5;
dig=0;
}
}
display(receave);
}
/*主函数*/
void main()
{ P0|=0XFF,
P1|=0xff; // 关闭显示
TMOD = 0x01; // T0工作方式1
time0_tmp = 65536-time0*fosc/12; /* 2ms 定时设置 */
TH0 = (time0_tmp/256);
TL0 = (time0_tmp%256);
TR0 = 1;
ET0 = 1;
EA = 1;
while(1);
}