#include "reg51.h"
//--------------------主程序--------------------------------
void main()
{
//单片机定时器及外部端口技术设置
TMOD=0x51; //设置定时器0,方式1:16位定时器
TH1=0;
TL1=0;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
TR0=1;
TR1=1;
ET1=1;
ET0=1;
EA=1;
//----电阻档-------
A0=1;
LCD_initial();//液晶屏初始化
RX=0;
LCD_cursor(0x00);
LCD_prints(" MEASURE Rx-1 ");
Value_to_ASCII(RX,0x46);//显示阻值
Up=0;
while(1)
{ Key_SM();
if(flag==1){//查到标志
flag=0;//归零
x=Pulsenum*65536+TH1*256+TL1;//读取1s内的频率
if(K2==1)
{
if(Up==0){
RZ=(Z1/x);//测量1K到1000K
RX=RZ-1000;
RX=RX>>1;
RX=RX*10;
if(RX>=10107){
RX=RX-10107;
}else{RX=0;}
if(x==0){RX=0;RX2=0;RX3=0;RX4=0;RX5=0;RX6=0;RX7=0;RX8=0;RX9=0;}//无脉冲后所有的数字归零
if(RX>9999999)
{
RX=9999999;
B0=0;
delay_1ms(25);
B0=1;
}//RX大于9999999,则RX=999999
RX2=(RX+RX3+RX4+RX5+RX6+RX7+RX8+RX9)>>3;//求平均提高精度
RX9=RX8;RX8=RX7;RX7=RX6;RX6=RX5;RX5=RX4;RX4=RX3;RX3=RX;
//保存上一次的阻值
//单位换算及显示刷新
if(RX2<=999)Value_to_ASCII(RX2,0x46);
if(RX2>999&&RX2<=9999)Value_to_ASCII1(RX2,0x46);
if(RX2>9999&&RX2<=99999)Value_to_ASCII2(RX2,0x46);
if(RX2>99999&&RX2<=999999)Value_to_ASCII3(RX2,0x46);
if(RX2>999999&&RX2<=9999999)Value_to_ASCII4(RX2,0x46);
}
if(Up==1){
RZ=(Z2/x);//测量1M到10M
RX=RZ-1000;//测量值减1K
RX=RX>>1;//RX除以2
RX=RX-1008;
if(RX<0)RX=0;//限制数字小于0
if(x==0)RX=0; //归零
if(RX>9999999)RX=x; //显示电阻M
Value_to_ASCII5(RX,0x46);//显示器更新显示
}
}
if(K2==0)
{
LCD_cursor(0x00);
LCD_prints(" DIANRONG ");
RZ=(Z3/x);
if(x>0){RX=RZ+1;} else{RX=0;}
if(RX>9999){RX=999999; }
Value_to_ASCII6(RX,0x46);
}
cnt2ms=0;//归0
Pulsenum=0;//归零
TH1=0;//脉冲技术归零
TL1=0;
TR1=1;//开启中断
}
}
}
/*******函 数 名: Exti0_interrupt函数功能: /T0引脚下降沿进入中断*********/
void T1_interrupt(void) interrupt 3 using 0
{
Pulsenum++; //脉冲大于65536个,溢出标志置1
}
/*******函数功能:定时器/计数器1中断处理************/
void Timer0IntProc() interrupt 1 using 0 //2ms
{
TH0=(65536-1000)/256; //中断定时器重置
TL0=(65536-1000)%256;
cnt2ms++;//计数器加1
if(cnt2ms==999) //1s计时到
{
TR1=0;//关闭定时器功能
cnt2ms = 0;//计时数置0
flag=1;//打1S定时标志
}
}