proteus仿真51单片机存在的若干问题

     proteus能够很好的仿真51单片机,对于学习和开发非常的方便,但也存在一些和硬件实物不一致的问题,下面根据本人经验,将发现的仿真中存在的问题总结如下。测试采用的软件平台:proteus7.5、7.7、 7.9,硬件平台STC89C52RC


1 数码管动态扫描问题

    当编写数码管动态扫描问题时,如用proteus仿真,编写程序时,必须先输入片选信号,在输入段选信号,反过来则会出现乱码,而实物不会出现这个问题

  如图所示数码管,数码管扫描程序(先为选再段选)如下:

void display(uchar aa,uchar bb,uchar cc,uchar ba,uchar sh,uchar g)
  //用6个数码管显示
{

      // dula=1;P0=0;dula=0;//段初始化
      wela=1;P0=0xc0;wela=0;//位初始化

        wela=1;P0=0xfe;wela=0;           
        dula=1;P0=table[aa];dula=0;    // 第一位
        P0=0xff;
        delay(5);

        wela=1;P0=0xfd;    wela=0;
           dula=1;P0=table[bb];dula=0;//  第二位 ,小数点亮
        P0=0xff;
        delay(5);


       wela=1;    P0=0xfb;wela=0;
        dula=1;P0=table[cc];dula=0;//
        P0=0xff;
        delay(5);
        
        wela=1;    P0=0xf7;wela=0;
        dula=1;P0=table[ba];dula=0;    //
        P0=0xff;
           delay(5);

        wela=1;P0=0xef;wela=0;
        dula=1;P0=table[sh];dula=0;    //
        P0=0xff;
        delay(5);

        wela=1;P0=0xdf;wela=0;
        dula=1;P0=table[g];dula=0;//
        P0=0xff;
        delay(5);    
}

若改为先段选后为选如下:

void display(uchar aa,uchar bb,uchar cc,uchar ba,uchar sh,uchar g)
  //用6个数码管显示
{

      // dula=1;P0=0;dula=0;//段初始化
      wela=1;P0=0xc0;wela=0;//位初始化

              
        dula=1;P0=table[aa];dula=0;    // 第一位
        P0=0xff;

     wela=1;P0=0xfe;wela=0; 
        delay(5);

       
           dula=1;P0=table[bb];dula=0;//  第二位 ,小数点亮
        P0=0xff;

wela=1;P0=0xfd;    wela=0;
        delay(5);


      
        dula=1;P0=table[cc];dula=0;//
        P0=0xff;

       wela=1;    P0=0xfb;wela=0;
        delay(5);
        
       
        dula=1;P0=table[ba];dula=0;    //
        P0=0xff;

        wela=1;    P0=0xf7;wela=0;
           delay(5);

      
        dula=1;P0=table[sh];dula=0;    //
        P0=0xff;

      wela=1;P0=0xef;wela=0;
        delay(5);

       
        dula=1;P0=table[g];dula=0;//
        P0=0xff;

       wela=1;P0=0xdf;wela=0;
        delay(5);    
}

   此时硬件实物显示结果不变,而proteus仿真则显示乱码

2  示波器问题

   依然如上图所示,用51单片机做频率计,示波器输出波形。发现示波器输出波形频率越高,单片机反应越慢,以至于数码管无法正常显示,而硬件实物没有此问题。

3  51单片机深度掉电后不能唤醒问题

    51单片机执行PCON |=0x02进入深度掉电模式后,可通过外部中断唤醒

  实例程序如下(不完整):

   #define IdleMode()  PCON    |=0x01 //01为空闲模式。
   #define PowerOFF()  PCON |=0x02 //02掉电模式
   //进入掉电模式,外部晶振停振、CPU、定时器、串行口全部停止工作,只有外部中断继续工作
   //使单片机进入休眠模式的指令将成为休眠前单片机执行的最后一条指令
   //进入休眠模式后,芯片中程序未涉及到的数据存储器和特殊功能寄存器中的数据都将保持原值。
   //可通过外部中断唤醒,proteus仿真时无法唤醒
   #define EXT0_Init() EX0=1;EA=1   //打开外部中断,以方便唤醒。唤醒后程序从原来停止处继续运行
  //电源管理模板程序   
  main()
{
   EXT0_Init();
   while(1)     //
    {
       if(time.sec==0){time.sec++;PowerOFF();}
       //
    }   
}
 void EX0ISR(void) interrupt 0
{
  //PCON&=0xfc;    //清除之前的掉电(空闲)模式
}

 实验中发现proteus仿真时无法通过外部中断唤醒,而实物能够正常唤醒

 

4  定时器T2不能输出方波问题

     51单片机的定时器T2有个法波输出功能,程序如下:

   /*定时器T2输出时钟,从P1.0输出方波
本程序proteus仿真无法通过,但实物通过  */
#include
#ifndef ulong
#define ulong unsigned long
#endif
#ifndef uint
#define uint unsigned int
#endif
#ifndef __AT89X52_H__
sfr T2MOD = 0xC9; //AT89X52.h中有该寄存器定义
#endif
//功能:定时器T2初始化,时钟输出方式
void Timer2_out_Init(void)
{
  ET2=0;
  T2MOD=0x02;//T2OE=1,定时器2允许输出
  T2CON=0x00;
  RCAP2H=0xf4;
  RCAP2L=0x48;
  TR2=1;
}
//设置输出频率
void SetFreq(ulong freq)
{
#ifndef fosc
#define fosc 11059200
#endif
 uint TimerValue;
 TimerValue=65536-fosc/4/freq;
  RCAP2H=TimerValue/256;
  RCAP2L=TimerValue%256;

}
 void main()
 {
 
 Timer2_out_Init();
 SetFreq(1000);
 while(1);
 }

电路图如上图所示,preteus仿真时发现P1.0无波形输出,而实物有波形输出。


你可能感兴趣的:(学习心得)