打印

高手请进来,紧急求助~~~

[复制链接]
2050|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
//==========声明区=============
#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:电路图详见附件

相关帖子

沙发
Karlshen| | 2010-1-21 22:43 | 只看该作者
图片放大了也看不大清

使用特权

评论回复
板凳
冷漠| | 2010-1-22 09:43 | 只看该作者
我这边看贴图很清楚的:清零按钮接在P2.4脚。那么下面语句:

  if(P2==0xdf) temp1=temp;  // P2==0xef ?  
   temp=temp-temp1;
  result=(uint)(temp*1.0/255*500);

使用特权

评论回复
地板
必有我师| | 2010-12-15 15:26 | 只看该作者
程序挺多。留一句。貌似寄存器弄的不对吧。

使用特权

评论回复
5
airwill| | 2010-12-16 09:58 | 只看该作者
程序挺长,看着有点费力。
象这类长时间出来的异常。要检查:
什么处理器,有没有看门狗触发?
输入信号有没有噪声抖动。
算法有没有边界 bug。
楼主在看看

使用特权

评论回复
6
chunyang| | 2010-12-16 10:24 | 只看该作者
楼主电路中P3口有富余那么就不要使用P2口,否则一旦使用寻址操作而程序处理不当的话就会出问题,用P3口富余IO即可,另外须在开关两侧并一个小电容,同时要有消抖程序。

使用特权

评论回复
7
qhcpcb| | 2010-12-16 10:35 | 只看该作者
:)

使用特权

评论回复
8
w522930954| | 2011-3-22 15:45 | 只看该作者
仿真软件玩玩还行,真做起来问题大大的有

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

14

帖子

1

粉丝