基于51单片机的数字电容测量仪设计 下载本文

}

}

unsigned char pro_data(unsigned char mda) //数据处理函数,将高位和低位互换 { }

(e)main.c程序清单: #include #include \#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 -