#include<STC15.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit R=P1^0;
sbit C=P1^1;
sbit A1=P1^3;
sbit A0=P1^4;
sbit RW=P2^5; //读写选择位,P2.5引脚
sbit RS=P2^6; //寄存器选择位,P2.6引脚
sbit E=P2^7; //使能信号位,P2.7引脚
#define FR P3^5
//sbit 位变量名=SFR名称^变量位地址值
#define LCD_data P0 //定义P0.0至p0.7接口
//uchar code table1[16]={0x52,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x52};
//uchar code table2[16]={0x43,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x46};
uchar code table1[16]={"R= R"};
uchar code table2[16]={"C= pF"};
uchar code f_table[88]={13,14,15,16,17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100};
uchar code f_correct[88]={9,10, 11, 12, 12, 12, 13, 14, 15, 16, 17, 18, 18, 18, 19, 20, 21, 21, 22, 23, 24, 25, 25, 26, 26, 27, 28, 29, 29, 30, 30, 31, 32, 33, 33, 34, 35, 35, 36, 37, 38, 38, 39, 40, 41, 41, 42, 42, 43, 44, 45, 45, 46, 47, 48, 49, 49, 50, 51, 51, 52, 53, 54, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 62, 62, 63, 64, 64, 65, 66, 66, 67, 67, 68, 69, 70, 71, 71,};
uchar a8,a7,a6,a5,a4,a3,a2,a1,a0;
uchar flag;
unsigned long cnt,cnt1,cnt2;
unsigned m1, m2, m3, m4;
uchar f_cnt;
// char:8位字符型数据类型
/********************************/
void delay_us(); //18us
void delay_ms(uint);
void lcd_init();
void lcd_write_com(uchar com);
void lcd_write_dat(uchar dat);
void lcd_init();
void lcd_display(uchar add,uchar dat);
/***********************************/
void delay_us() //延时18us?
{
uchar x;
for(x=5;x>0;x--); //5个时钟周期
}
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=2460;y>0;y--); //延迟时间为123*z
}
void lcd_write_com(uchar com) //LCD写指令
{
E=0;
RS=0;
RW=0;
delay_us();
LCD_data=com;
E=1; //高脉冲写入数据
delay_us();
E=0;
}
void lcd_write_dat(uchar dat) //LCD写数据
{
E=0;
RS=1;
RW=0;
delay_us();
LCD_data=dat;
E=1; //高脉冲写入数据
delay_us();
E=0;
}
void lcd_init() //lcd初始化
{
delay_ms(15);
lcd_write_com(0x38); //十六进制数,设置16x2显示,5x7点阵,8位数据接口
delay_ms(10);
lcd_write_com(0x0c); //设置开始显示不显示光标
delay_ms(10);
lcd_write_com(0x06); //写一个字符后地址指针加1
delay_ms(10);
lcd_write_com(0x01); //显示清零数据指针清零(清屏)
delay_ms(2);
}
void timer_init(void) //定时器初始化
{
TMOD=0X51;
PT0=1; /*中断优先*/
TH0=0x4c;
TL0=0x00;
TH1=0;
TL1=0;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EA=1;
}
void lcd_display(uchar add,uchar dat) //lcd显示(地址,数据)
{
lcd_write_com(add); //地址
lcd_write_dat(dat); //数据
delay_us();
}
void real_display(void)
{
if(!R) //写“R=……R”
{
A1=A0=0;
lcd_display(0x80,table1[0]); //R,0x80表示第一位地址
lcd_display(0x80+1,table1[1]); //=
lcd_display(0x80+14,table1[14]); //R,正常
lcd_display(0x80+15,table1[15]);
}
else if(!C) //写“C=……pF”
{
A0=0;A1=1;
lcd_display(0x80,table2[0]); //C
lcd_display(0x80+1,table2[1]); //=
lcd_display(0x80+14,table2[14]); //P
lcd_display(0x80+15,table2[15]); //F
}
//由高位往低位写入数据
if(a8)
lcd_display(0x80+2,0x30+a8); //0x30表示0
else
lcd_display(0x80+2,' ');
if(a8||a7)
lcd_display(0x80+3,0x30+a7);
else
lcd_display(0x80+3,' ');
if(a8||a7||a6)
lcd_display(0x80+4,0x30+a6);
else
lcd_display(0x80+4,' ');
if(a8||a7||a6||a5)
lcd_display(0x80+5,0x30+a5);
else
lcd_display(0x80+5,' ');
if(a8||a7||a6||a5||a4)
lcd_display(0x80+6,0x30+a4);
else
lcd_display(0x80+6,' ');
if(a8||a7||a6||a5||a4||a3)
lcd_display(0x80+7,0x30+a3);
else
lcd_display(0x80+7,' ');
if(a8||a7||a6||a5||a4||a3||a2)
lcd_display(0x80+8,0x30+a2);
else
lcd_display(0x80+8,' ');
lcd_display(0x80+9,0x30+a1);
lcd_display(0x80+10,0x2e); //0x2e表示小数点
lcd_display(0x80+11,0x30+a0);
}
void correct(void) //误差修正函数
{
uchar i,k;
unsigned long wucha;
if(cnt<1000000) //100KHz以内的修正
{
if(cnt>9800&&cnt<21000) cnt-=1;
if(cnt>=21000&&cnt<39000) cnt-=2;
if(cnt>=39000&&cnt<48000) cnt-=3;
if(cnt>=48000&&cnt<57000) cnt-=4;
if(cnt>=57000&&cnt<80000) cnt-=5;
if(cnt>=80000&&cnt<91000) cnt-=6;
if(cnt>=91000&&cnt<109000) cnt-=7;
if(cnt>=109000&&cnt<119000) cnt-=8;
if(cnt>=119000&&cnt<130000) cnt-=9;
if(cnt>=130000&&cnt<=1000000)
{
k=cnt/1000;
for(i=0;i<88;i++)
{
if(k==f_table[i])
{
cnt-=f_correct[i];
}
}
}
}
if(cnt>10000000)
{
wucha=(cnt/1000)*73065/100000;
cnt-=wucha;
}
}
void main()
{
P1M1 = 0x00;
P1M0 = 0x00;
P0M1 = 0x00;
P0M0 = 0x00;
P2M1 = 0x00;
P2M0 = 0x00;
P3M1 = 0x00;
P3M0 = 0x00;
timer_init(); //定时器初始化
lcd_init(); //lcd初始化
while(1)
{
if(flag==1)
{
real_display();
flag=0;
}
}
}
void timer0() interrupt 1 //定时器0的中断函数,interrupt中断关键字,1定时器0的中断号
{
uchar timer0;
//定时时间50ms,主振频率11.0592MHz
//机器周期=12/主振频率
//计数次数=定时时间/机器周期=46080
//65536-46080=19456
//4c00
TH0=0x4c; //高位
TL0=0x00; //低位
timer0++;
if(timer0==20) //60-32+1=19
{
TR1=0; //关闭的计数器
EA=0;
cnt=TL1+TH1*256+f_cnt*65536;
correct();
if(!R)
{ //cnt1为待测值
cnt1=10000000/(2*0.693*cnt)-165; //1/cnt为NE555脉冲周期,1/cnt1=0.693*(R+2RX)*10^(-7)
// cnt1=1/(1/(10000000/(2*0.693*cnt)-(1000+2*560)/2)-1/(47*1000000))/11.0592*12;
}
else if(!C)
{
cnt1=1000000000/(0.693*3*510*cnt); //1/cnt=0.644*(3*510*10^3)*CX
}
timer0=0;
a8=cnt1%100000000/10000000;
a7=cnt1%10000000/1000000;
a6=cnt1%1000000/100000;
a5=cnt1%100000/10000;
a4=cnt1%10000/1000;
a3=cnt1%1000/100;
a2=cnt1%100/10;
a1=cnt1%10;
if(!R)
{
cnt2=10000000*10/(2*0.693*cnt)-165;
a0=cnt2%10;
}
else if(!C)
{
cnt2=1000000000*10/(0.693*3*510*cnt);
a0=cnt2%10;
}
flag=1;
TH1=0;
TL1=0;
TH0=0x4c;
TL0=0x00;
cnt=0;
f_cnt=0;
EA=1;
TR1=1; //打开计数器
}
}
void int1() interrupt 3
{
f_cnt++;
} |