}
}
unsigned char pro_data(unsigned char mda) //数据处理函数,将高位和低位互换 { }
(e)main.c程序清单: #include
sbit vo = P3^2; sbit tr = P3^7;
unsigned char enddat; unsigned char i; enddat = 0; for(i=0;i<8;i++) { }
return enddat;
enddat = enddat << 1; if(mda & 0x01 == 1) { } else { }
enddat = enddat | 0x00;
enddat = enddat | 0x01;
mda = mda >> 1;
// 用于检测P3.2口的值,计算时间。 计时器0的开与断
- 25 -
// 产生一个低电平脉冲 // 超量程提示灯
sbit ledclc = P2^7;
sbit con1 = P0^0; // 用于控制继电器,实现档位选择 sbit con2 = P0^1; sbit con3 = P0^2;
sbit key1 = P0^3;
sbit key2 = P0^4; sbit key3 = P0^5; sbit key4 = P0^6;
sbit led1 = P2^3;
sbit led2 = P2^4; sbit led3 = P2^5; sbit led4 = P2^6;
unsigned int tw;
float ftemp;
unsigned long int c;
unsigned char need;
unsigned char R; unsigned char flag; unsigned char temp[8]; unsigned char zimu1[] = \ unsigned char zimu2[] = %unsigned char zimu3[] = \
- 26 -
// 独立按键部分,用于用户选择量程 // 量程提示灯
// 用于获取定时器的数值 // 用于计算电容值的中间变量
// 存放电容值
// 需要测量时置1,一次测量结束置0
// 表示不同的档位 // 数据处理结束置1 // 存放电容值的各个位 //量程太高
unsigned char zimu4[] = \ to measure %unsigned char zimu5[] = \
void process(unsigned long int c); // 数据处理函数 void keyscan();
// 键盘扫描函数 // 量程指示灯函数
void ledlight(unsigned char R);
void init_timer0() // 定时器0 初始化 { TMOD = 0x09;
TH0 = 0x00; TL0 = 0x00; EA = 1;
ET0 = 1; TR0 = 1;
}
void init_INT1 ()
{ EA = 1;
IT1 = 1; EX1 = 1; }
void main() { ledclc = 1;
need = 0;
con1 = con2 = con3 = 0;
flag = 0;
init_timer0();
init_INT1(); LCD_init();
dispchar1(zimu3);
// gate置1,方式1,16位计时,定时器由P3.2控制开断
// 定时器0 初始化
// 下降沿触发
// 超量程提示灯熄灭
// 一开始无需测量
// 初始化
- 27 -
dispchar2(zimu4); while(1) {
if(need == 1)
{
// 当需要测量时
if(vo == 0 ) //vo == 0时检测计数器的值可能还没开始计数,可能计数结束 {
if(TH0 != 0x00 || TL0 != 0x00) // 是计数结束 若有读数,用tw 存下 {
tw = TH0 << 8; tw = tw | TL0; TH0 = 0x00; TL0 = 0x00;
need = 0; // 需要再次测量时,need置1.避免tw的值被更
//改 即不需要测量时,一直保持
// 一次结束,计时器清零
}
}
EX1 = 1; // 开外部中断1
else { }
// 反之,证明没有计数,无电容,默认值tw置0
tw = 0;
ftemp = tw / 1.1 ; // 计算电容值 根据公式 tw = 1.1 * R * C
c = (unsigned long int)(ftemp )*100; //扩大了一百倍 便于后续程序
//取两位小数点
}
process(c);
// 调用数据处理函数,根据不同的R值进行处理
- 28 -