cheng307 发表于 2011-5-14 11:56:06

求助,PNP三极管驱动共阳数码管的问题,帮忙看下Protues仿真图哪里有问题?

RT,用protues仿真,51单片机连接数码管显示时间,数码管驱动怎么显示不正确呢?不用三极管驱动的话是正确显示的。

http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_639726UTQ27D.jpg
(原文件名:未命名.jpg)

http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_639727SJF051.jpg
(原文件名:QQ截图20110514115500.jpg)

http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_639728OCCVB5.jpg
(原文件名:QQ截图20110514115539.jpg)

Hamyou 发表于 2011-5-14 12:48:01

在数码管驱动上,库里面的三极管是无法仿真的,因为此时三极管基本就是开关作用,仿真不了,不过我这里有别人做的模型可以仿真。

http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_639733CXA6GA.jpg
(原文件名:ff.jpg)

perron 发表于 2011-5-14 12:51:46

回复【楼主位】cheng307
-----------------------------------------------------------------------

PNP有问题呀,你看仿真的时候不论B级是高还是低,C级都出高呀。

cheng307 发表于 2011-5-14 12:59:44

回复【1楼】Hamyou
-----------------------------------------------------------------------

我改成npn就可以正常显示了。。这什么情况?。。我是用的共阳数码管呀?

cheng307 发表于 2011-5-14 13:01:50

回复【2楼】perron
-----------------------------------------------------------------------

换npn了。。就正常了。。
http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_639741PSXJR9.jpg
显示正常了,但是为什么秒比原来那个慢了1秒呢? (原文件名:QQ截图20110514130124.jpg)

cheng307 发表于 2011-5-14 13:05:01

贴下程序:
#include<reg52.h>   
sbit ksec=P3^0;
sbit kmin=P3^1;
sbit khour=P3^2;
sbit P33=P3^3;
unsigned char

secshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0;
unsigned int num=0,sec=0,min=0,hour=0,x,n;
unsigned char code table={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void delay(unsigned int);
void keyscan();
void display();

main()
        {        TMOD=0x11;
                TH0=(65536-50000)/256;
                TL0=(65536-50000)%256;
                TH1=(65536-50000)/256;
                TL1=(65536-50000)%256;
                EA=1;ET0=1;TR0=1; TR1=0; ET1=1;
        while(1)
        {
                display();
                keyscan();
       }
        }

void delay(unsigned int z)
{unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);}
void time0() interrupt 1
{num++;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
}

void time1() interrupt 3

{
n++;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;

}

void display()
{
if(min==0)
{
TR1=1;
}
else
{TR1=0;}
if(n>10)
{
n=0;
P33=~P33;
}
if(num==20)
{num=0;
   sec++;
   if(sec==60)
   {sec=0;
   min++;
   if(min==60)
    {min=0;
      hour++;
      if(hour==24)
       {hour=0;
      min=0;
      sec=0;
      }
      }
   }
}
secge=sec%10;
secshi=sec/10;
minge=min%10;
minshi=min/10;
hourge=hour%10;
hourshi=hour/10;
P2=1;
P0=table;
delay(5);
P2=2;
P0=table;
delay(5);
P2=4;
P0=191;
delay(5);
P2=8;
P0=table;
delay(5);
P2=16;
P0=table;
delay(5);
P2=32;
P0=191;
delay(5);
P2=64;
P0=table;
delay(5);
P2=128;
P0=table;
delay(5);
}
void keyscan()
{
if(ksec==0)
{delay(10);
   if(ksec==0)
   {sec++;
    if(sec>=60)
    sec=0;
    }
while(ksec==0)
display();}
if(kmin==0)
   {delay(10);
   if(kmin==0)
    {min++;
   if(min>=60)
   min=0;
   }
while(kmin==0)
display();
   }
if(khour==0)
   {delay(10);
   if(khour==0)
    {hour++;
   if(hour>=24)
   hour=0;
   }
while(khour==0)
display();
}
}

Hamyou 发表于 2011-5-14 13:18:22

换成PNP的三极管,不管怎么改都不能正常工作

我不用库里面的三极管,对于数码管来说不好使

yt1986yt 发表于 2011-5-15 19:13:17

henhao很好谢谢

diudiujiang 发表于 2012-4-20 11:09:13

用PROTUES仿真数字频率计,数码管能亮,但值出不来,还有自动转换量程的二极管灯不亮,请大侠指导
//数码管显示频率计
#include <REG52.h>                              //标准定义头文件
#include <intrins.h>                                                        // 使用_nop_()

#define uchar unsigned char
#define uintunsigned int
#define RELOADH 0xD8                        //
#define RELOADL 0xFC                        //1T=0.5uS,周期5MS

#define        LED_PORT        P0
sbit   LED_HZ        =P3^2;
sbit   LED_KHZ        =P3^3;
sbit   LED_MHZ        =P3^4;

//**********************常量定义***************************
unsigned char code DISP_CODE[]=          //*************定义各数字的显示码*********** 0-9,-,
                      { 0xa0, 0xbb, 0x62, 0x2a, 0x39, 0x2c, 0x24, 0xba, 0x20, 0x28,0x7f};
unsigned char code        DISP_CS[]={0x7F,0xBF,0xEF,0xDF,0xFF};
#define        DOT                0xDF                //点

//**********************变量定义***************************
unsigned char tick_count,tick_5ms,tick_1s,tick_1min;        //时钟节拍
unsigned char frq_buf,disp_buf,disp_cnt;
unsigned intfre_khz,fre_hz;
unsigned intfre_cnt1,fre_cnt2;

//**********************定义***************************

//*************************************************

//*****************************
//****                显示程序                ****
//*****************************
void display(void)
{
        P2=P2|0xF0;                                                //关闭输出,防止余辉
    LED_PORT=disp_buf;        //送显示码
        P2=P2&DISP_CS;                        //确定显示第几位
        if(disp_cnt<3)        disp_cnt++;                        //判断是否全部显示完
                else   
                {disp_cnt=0;                                //显示完则从头开始
                }
}
//*********************显示内容计算******************
void disp_data(void)
{       
        fre_hz=fre_cnt1%1000;                   //计算频率HZ数
        fre_khz=fre_cnt1/1000;                   //计算频率KHZ数
        fre_cnt1=0;
        while(1)                                           //频率计算器高位是否有数?就是计数值超过65535
                {
                if(fre_cnt2==0)break;
                fre_khz=fre_khz+65;
                fre_cnt1=fre_cnt1+536;
                fre_cnt2--;
                }
        fre_cnt1=fre_cnt1+fre_hz;                //重新计算频率HZ数
        fre_hz=fre_cnt1%1000;
        fre_khz=fre_khz+(fre_cnt1/1000);//重新计算频率KHZ数

        frq_buf=fre_khz/1000;                  //频率百万位
        frq_buf=fre_khz%1000/100;          //频率十万位
        frq_buf=fre_khz%1000%100/10; //频率万位
        frq_buf=fre_khz%1000%100%10; //频率千位

        frq_buf=fre_hz/100;               //频率百位
        frq_buf=fre_hz%100/10;               //频率十位
        frq_buf=fre_hz%100%10;               //频率个位

        LED_MHZ=1;
        LED_KHZ=1;
        LED_HZ=1;
        if(fre_khz>9999)                       //>9.999MHZ显示"----"
                {
                disp_buf=DISP_CODE;
                disp_buf=DISP_CODE;
                disp_buf=DISP_CODE;
                disp_buf=DISP_CODE;
                }
   else
       if(fre_khz>999)                       //1.000M--9.999M
               {
                disp_buf=DISP_CODE]&DOT;
                disp_buf=DISP_CODE];
                disp_buf=DISP_CODE];
                disp_buf=DISP_CODE];
                LED_MHZ=0;
                }
       else
       if(fre_khz>99)                               //100.0K-999.0K
               {
                disp_buf=DISP_CODE];
                disp_buf=DISP_CODE];
                disp_buf=DISP_CODE]&DOT;
                disp_buf=DISP_CODE];
                LED_KHZ=0;
                }
       else
       if(fre_khz>9)                               //10.00K-99.00K
               {
                disp_buf=DISP_CODE];
                disp_buf=DISP_CODE]&DOT;
                disp_buf=DISP_CODE];
                disp_buf=DISP_CODE];
                LED_KHZ=0;
                }
          else
          {
                disp_buf=DISP_CODE];
                disp_buf=DISP_CODE];
                disp_buf=DISP_CODE];
                disp_buf=DISP_CODE];
                LED_HZ=0;
                }







}

//*****************************
//****                主程序                   ****
//*****************************
void main(void)
{
        TMOD=0x51;                                         //设置定时器模式,T1外部输入计数
        TCON=0x00;
//        IE=0x82;                   //开中断
        TH0=RELOADH;
        TL0=RELOADL;                        //装入初值
        ET1=1;
        ET0=1;
        EA=1;
        TR0=1;                                         // 启动T0
        TR1=1;                                         // 启动T1

while(1)
    {
        if(tick_count>0)                                           //有时钟节拍
                {
                tick_count--;                                           //节拍数清零
//                disp_data();
                display();
                if(tick_1s==0) disp_data();

                }
    }
}
//*****************************
//****                定时器0中断                ****
//*****************************
void timer1(void) interrupt 3 using 0
        {
        fre_cnt2++;                                //计数器溢出了,高位加1

        }
//*****************************
//****                定时器1中断                ****
//*****************************
void timer0(void) interrupt 1 using 1
        {
        TR0=0;                                         // 停止定时器0
        TH0=RELOADH;                 // 设定溢出时间
        TL0=RELOADL;
        TR0=1;                                         // 启动T0

       tick_count++;                         // 时间计数器加1
        tick_1s++;
        if(tick_1s==200)                                       //时间到了1秒,保存频率值
                {
               TR1=0;
               fre_cnt1=(TH1<<8)+TL1;
               TH1=0;
               TL1=0;
               TR1=1;
               tick_1s=0;
                }
        }



页: [1]
查看完整版本: 求助,PNP三极管驱动共阳数码管的问题,帮忙看下Protues仿真图哪里有问题?