//==========声明区=============
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define SEG P1//声明数码管接P1口
uchar TAB[]={ 0XC0, 0XF9, 0XA4, 0XB0, 0X99, //共阳数码管
0X92, 0X82, 0XF8, 0X80, 0X90};
uchar disp[4];//显示器数组
uint result;
uint temp;
uint temp1;
uchar time_flag;
uchar time[20];
void display(void);//声明显示函数
void delay1ms(uchar);//声明延时函数
void init(void);//初始化函数
double compare_number();//
void sampling(); //采样并进行数字滤波
sbit CLK=P3^5;//时钟接口
sbit EOC=P3^2;
sbit ST=P3^6;
sbit OE=P3^7;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
//=====主函数=================
main()
{init();
while(1)
{ ST=1;//启动
//delay1ms(1);
ST=0;
while(EOC==0)//查询等待转换结果
{
display();
}
sampling();
}
}
//======显示函数=============
void display(void)
{ uchar i;
for(i=0;i<4;i++)
{
if(i==0)
{
P20=0;
SEG=TAB[disp];
delay1ms(10);
P20=1;
}
else if(i==1)
{
P21=0;
SEG=TAB[disp]&0x7F; //按位点亮
delay1ms(10);
P21=1;
}
else if(i==2)
{
P22=0;
SEG=TAB[disp];
delay1ms(10);
P22=1;
}
else
{
P23=0;
SEG=TAB[disp];
delay1ms(10);
P23=1;
}
//delay1ms(10);
}
//P23=1;
}
//=====延时1MS函数=========
void delay1ms(uchar x)
{ uchar ii,j;
for(ii=0;ii<x;ii++)
for(j=0;j<x;j++);
}
//=====T0初始化函数============
void init(void)
{ EA=1;
ET0=1;
EX1=0;
EX0=0;
ET1=0;
ES=0;
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
temp1=0;
P2=0xff;
}
//=======T0中断服务,提供时钟信号======
void timer0(void) interrupt 1
{ TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
CLK=~CLK;
}
double compare_number()
{
unsigned char i,j,flag;
uint flag_t=0,flag_tt=0;
display();
for(i=0;i<9;i++)
{
for(j=i+1;j<10;j++)
{
if(time>time[j])
{
flag=time;
time=time[j];
time[j]=flag;
}
}
}
for(i=1;i<9;i++)
{
flag_t+=time;
}
flag_tt=flag_t*1.0/8;
return flag_tt;
}
void sampling()
{
time_flag++;
OE=1; //打开输出允许信号
//display();
switch(time_flag)
{
case 1: time[0]=P0;break;
case 2: time[1]=P0;break;
case 3: time[2]=P0;break;
case 4: time[3]=P0;break;
case 5: time[4]=P0;break;
case 6: time[5]=P0;display();break;
case 7: time[6]=P0;break;
case 8: time[7]=P0;break;
case 9: time[8]=P0;break;
case 10: time[9]=P0;time_flag=0;break;
default: break;
}
if(time_flag==0)
{
temp=compare_number(); //读入值
P2=0xff;
if(P2==0xdf) temp1=temp;
temp=temp-temp1;
result=(uint)(temp*1.0/255*500);
if(result>=0)
{
disp[0]=result/1000;
disp[1]=result/100%10;
disp[2]=result/10%10;
disp[3]=result%10;
display();
}
else
{
disp[0]=0;
disp[1]=0;
disp[2]=0;
disp[3]=0;
display();
}
}
}
以上是一个5V电压表的测量程序,现在加了一个清零按钮,仿真可以通过,为什么实际电路程序运行一段时间就会自动清零?不人为清零。十分不解,望达人求解~~十分紧急!!!万分希望。。
PS:电路图详见附件 |