|
这是已经打好的,但是有很多错误完全运行不了,求改正。
#include <reg52.h>
#include <intrins.h>
#define DATA P0
#define uchar unsigned char
#define uint unsigned int
sbit adcs=P2^3;//可以硬件直接接地
sbit adrd=P2^5;
sbit adwr=P2^4;
sbit RW=P2^1;//1602写数据
sbit RS=P2^0;//1602写地址
sbit EN=P2^2;//1602工作使能
sbit b_test=P3^7;//开始测试电容的按键输入
sbit c_test=P3^6;
sbit _reset=P3^5; //555时基芯片工作控制信
uint T_flag,N,D,C,i,Dis1,Dis0;
uchar get_ad();
uint A,F,H,A1,A2;
uint r[]={'R','=','0','0','.','0','K',0Xf4};
uint b[9]={'C','=','0','0','.','0','0','u','F'};//显示C=00.00UF
uint Data1;
/***********延时
1MS*************************/
void Delay1ms(uint mm)
{uint i;
for(;mm>0;mm--)
for(i=0;i<100;i++);
}
void delay(uint z)//延时程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******************检查忙否**********************/
void Checkstates()
{
uchar dat;
RS=0;
RW=1;
do{EN=1;//下降沿
_nop_();//保持一定间隔
_nop_();
dat=DATA;
_nop_();
_nop_();
EN=0;
}while((dat&0x80)==1);
}
/************LCD写命令函数**********/
void wcomd(uchar cmd)
{
Checkstates();
RS=0;
RW=0;
DATA=cmd;
EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
EN=0;
}
/***********LCD写数据函数**********/
void wdata(uchar dat)
{
Checkstates();
RS=1;
RW=0;
DATA=dat;
EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
EN=0;
}
/************初始化**************/
void LCDINIT()
{
Delay1ms(15);
wcomd(0x38);//功能设置
Delay1ms(5);
wcomd(0x38);//功能设置
Delay1ms(5);
wcomd(0x01);//清屏
Delay1ms(5);
wcomd(0x08);//关显示
Delay1ms(5);
wcomd(0x0c);//开显示;不开光标
}
/********显示函数**********/
void Display(void)//显示函数
{
uchar i,j;
uchar
a[12]={0X4D,0X45,0X41,0X53,0X55,0X52,0X45,0X4D,0X45,0X4E,0X54,0X53};//显示measurements
for(i=0;i<12;i++)//写显示第一行
{ wcomd(0x80+i);
Delay1ms(1);
wdata(a[i]);
Delay1ms(1);
}
for(j=0;j<9;j++)//写显示第二行
{
wcomd(0xc0+j);
Delay1ms(1);
wdata(b[j]);
Delay1ms(1);
}
Delay1ms(150);
}
void Display1()//显示函数 显示电阻
{
uchar i,j;
uchar
a[12]={0X4D,0X45,0X41,0X53,0X55,0X52,0X45,0X4D,0X45,0X4E,0X54,0X53};//显示measurements
for(i=0;i<12;i++)//写显示第一行
{ wcomd(0x80+i);
Delay1ms(1);
wdata(a[i]);
Delay1ms(1);
}
for(j=0;j<9;j++)//写显示第二行
{
wcomd(0xc0+j);
Delay1ms(1);
wdata(r[j]);
Delay1ms(1);
}
Delay1ms(1000);
}
uchar get_ad()//adc0804操作
{
uchar temp;
adcs=1;
adwr=1;
_nop_();
delay(1);
adcs=0;
adwr=0;
_nop_();
delay(1);
adwr=1;
adcs=1;
delay(1);
P1=0xff;
adcs=1;
adrd=1;
delay(1);
_nop_();
_nop_();
_nop_();
delay(20);
adcs=0;
adrd=0;
_nop_();
temp=P1;
delay(1);
adrd=1;
adcs=1;
return temp;
}
void main()
{
IE=0x81;//打开全外部中断允许
TMOD=0x09;//T0为161
IT0=1;//设置外部中断的触发的方式为脉冲触发
TH0=0x00;
TL0=0x00;
T_flag=0;
_reset=0;
LCDINIT();
while(1)
{
if(!b_test==1)//如果有测量按键输入就往下执行
{
i=0;
_reset=1;//启动555时基芯片
EX0=1;//开启中断0
while(_reset)//超出等待时间;中断还没有过来;就退出
{
i++;
if(i>5000)//设置最长等待时间
{
_reset=0;//最长等待时间到还没有中断;停止5000
}
}
if(N<100)
{
b[6]=0x1c;
b[5]=0x1c;
b[4]=0x11;
b[3]=0X1D;
b[2]=0X23;
}
if(N>5000)//如果计数值大于5000;显示LARGER;表示应换用大一点的量程
{b[6]=0x15;
b[5]=0x17;
b[4]=0x22;
b[3]=0x11;
b[2]=0x1C;
}
if(N>=100&&N<=5000)
{
C=N/100;D=N%100;//计算电容的大小
b[2]=C/10;//计算电容值得十位
b[3]=C-b[2]*10;//计算电容值的各位
b[5]=D/10;
b[6]=D-b[5]*10;
}
Display();//显示电容的大小
wcomd(0x80+0x42);
Delay1ms(5);
wdata(0x30+b[2]);
Delay1ms(5);
wcomd(0x80+0x43);
Delay1ms(5);
wdata(0x30+b[3]);
Delay1ms(5);
wcomd(0x80+0x45);
Delay1ms(5);
wdata(0x30+b[5]);
Delay1ms(5);
wcomd(0x80+0x46);
Delay1ms(5);
wdata(0x30+b[6]);
Delay1ms(1000);
}
if(!c_test==1)
{
Display1();
Data1=get_ad();
A=100*Data1;
H=A/(256-Data1);
A1=H/10;
A2=H%10;
wcomd(0x80+0x43);
Delay1ms(5);
wdata(0x30+A1);
Delay1ms(5);
wcomd(0x80+0x45);
Delay1ms(5);
wdata(0x30+A2);
Delay1ms(1000);
}
}
}
void int0(void) interrupt0 //第一次中断开始计数;第二个中断停止计数
{
T_flag=!T_flag;
if(T_flag==1)
{
TR0=1;//开始计时
}
if(T_flag==0)
{
TR0=0;//停止计时
EX0=0;//关闭中断
_reset=0;//停止发出方波
N=TH0*256+TL0;//计算计数器的值
N=N*5/3;
TH0=0x00;//恢复初值
TL0=0x00;
}
}
|
|