单片机源程序如下:
#include "reg52.h"
#include "intrins.h"
//-------宏定义---------
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
#define Cref 2200 //基准电容值(单位pF)
#define LCD_DATA P0 //LCD数据口(8位)
//-------I/O定义--------
sbit LCD_BUSY = P0^7; //LCD忙信号
sbit LCD_RS = P1^0; //数据/命令选择(数据=1,命令=0)
sbit LCD_RW = P1^1; //读/写选择(写=0,读=1)
sbit LCD_EN = P1^2; //使能信号
sbit K1_F_LC = P1^3; //F/LC测量选择按钮(自锁),([抬起]=0测LC,[按下]=1测F)
sbit K2_L_C = P1^4; //L/C测量选择按钮(自锁)([抬起]=0测C,[按下]=1测L)
sbit K3_Eb_Es = P1^6; //电解量程选择按钮(自锁),([抬起]=0低量程,[按下]=1高量程)
sbit K4_FLC_EC = P3^6; //FLC或EC(电解电容)测量选择按钮(无锁)(每按一次,翻转一次)
sbit K5_Calib = P3^7; //手工校正(清零)按钮(无锁)(消除寄生电容值)
sbit Dischg = P1^5; //测量电解电容时的充放电控制端口(=0放电,=1充电)
//-------全局变量定义--------
bit FLC_EC_Flag; //测量标志(=0测FLC,=1测电解电容)
u8 Measure_Flag; //测量标志(=1测电容,=2测电感,=3测频率,=4测小电解,=5测大电解)
u8 Lref; //基准电感值(单位uH)(原作没有)
u16 T0_times; //T0中断计数预设值(每50ms一次),测F=20次(1s),测LC=10次(0.5s)
u16 Timer0_Num; //T0计数
u16 Timer1_Num; //T1计数
u32 Frequency0; //频率0(未接被测元件时的频率)
u32 Frequency1; //频率1(接入被测元件时的频率)
u32 Cx; //被测电容
u32 Lx; //被测电感
u32 ECx_H; //被测电解电容(大)
u32 ECx_L; //被测电解电容(小)
//------x的n次方------------
u32 power(u8 x,u8 n)
{
u8 i;
u32 j = 1;
if(n == 0)
{
return 1;
}
else
{
for(i=0; i j *= x; } return j; } } //----延时n毫秒(12M晶振,12T模式,一个指令周期=1us)--- //----1ms=(跳转等3个指令周期+两个空指令)*200---- void Delay_ms(u8 n) { u8 i,j; for(i=0; i for(j=0; j<200; j++) { _nop_(); _nop_(); } } } //------LCD1602读忙标志位------ void Check_busy(void) { do { LCD_EN=0; LCD_RS=0; LCD_RW=1; LCD_DATA=0xFF; LCD_EN=1; } while(LCD_BUSY==1); LCD_EN=0; } //------LCD1602写指令------ void Write_Command(u8 cmd) { Check_busy(); LCD_RS=0; LCD_RW=0; LCD_DATA=cmd; LCD_EN=0; LCD_EN=1; LCD_EN=0; } //------LCD1602写数据------ void Write_Data(u8 dat) { Check_busy(); LCD_RS=1; LCD_RW=0; LCD_DATA=dat; LCD_EN=0; //机器周期小于1us时,须加延时 LCD_EN=1; LCD_EN=0; } //-----LCD1602写字符串------ //---x=列(0~15); y=行(0,1) //---从指定的位置开始写,直到超出屏幕显示 void LCD_Write_String(u8 y,u8 x,u8 *Data) { if(y==0) //第一行 { if(x<16) { Write_Command(0x80+x); //0x80 + 第一行起始地址 for(; x<16&&*Data!='