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

2020-02-04 09:09发布

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


(原文件名:未命名.jpg)


(原文件名:QQ截图20110514115500.jpg)


(原文件名:QQ截图20110514115539.jpg)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
yt1986yt
1楼-- · 2020-02-05 08:07
 精彩回答 2  元偷偷看……
diudiujiang
2楼-- · 2020-02-05 08:25

$A}75~EYH~T)BBYRQJ`M_TK.jpg (516.44 KB, 下载次数: 0)

下载附件

2012-4-20 11:06 上传

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

#define uchar unsigned char
#define uint  unsigned 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[10],disp_buf[4],disp_cnt;
unsigned int  fre_khz,fre_hz;
unsigned int  fre_cnt1,fre_cnt2;

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

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

//*****************************
//****                显示程序                ****
//*****************************
void display(void)
{
        P2=P2|0xF0;                                                //关闭输出,防止余辉
    LED_PORT=disp_buf[disp_cnt];        //送显示码
        P2=P2&DISP_CS[disp_cnt];                        //确定显示第几位
        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[6]=fre_khz/1000;                  //频率百万位
        frq_buf[5]=fre_khz%1000/100;          //频率十万位
        frq_buf[4]=fre_khz%1000%100/10; //频率万位
        frq_buf[3]=fre_khz%1000%100%10; //频率千位

        frq_buf[2]=fre_hz/100;                 //频率百位
        frq_buf[1]=fre_hz%100/10;                 //频率十位
        frq_buf[0]=fre_hz%100%10;                 //频率个位

        LED_MHZ=1;
        LED_KHZ=1;
        LED_HZ=1;
        if(fre_khz>9999)                         //>9.999MHZ显示"----"
                {
                disp_buf[0]=DISP_CODE[10];
                disp_buf[1]=DISP_CODE[10];
                disp_buf[2]=DISP_CODE[10];
                disp_buf[3]=DISP_CODE[10];
                }
     else
         if(fre_khz>999)                         //1.000M--9.999M
                 {
                disp_buf[3]=DISP_CODE[frq_buf[6]]&DOT;
                disp_buf[2]=DISP_CODE[frq_buf[5]];
                disp_buf[1]=DISP_CODE[frq_buf[4]];
                disp_buf[0]=DISP_CODE[frq_buf[3]];
                LED_MHZ=0;
                }
         else
         if(fre_khz>99)                                 //100.0K-999.0K
                 {
                disp_buf[3]=DISP_CODE[frq_buf[5]];
                disp_buf[2]=DISP_CODE[frq_buf[4]];
                disp_buf[1]=DISP_CODE[frq_buf[3]]&DOT;
                disp_buf[0]=DISP_CODE[frq_buf[2]];
                LED_KHZ=0;
                }
         else
         if(fre_khz>9)                                 //10.00K-99.00K
                 {
                disp_buf[3]=DISP_CODE[frq_buf[4]];
                disp_buf[2]=DISP_CODE[frq_buf[3]]&DOT;
                disp_buf[1]=DISP_CODE[frq_buf[2]];
                disp_buf[0]=DISP_CODE[frq_buf[1]];
                LED_KHZ=0;
                }
          else
          {
                disp_buf[0]=DISP_CODE[frq_buf[0]];
                disp_buf[1]=DISP_CODE[frq_buf[1]];
                disp_buf[2]=DISP_CODE[frq_buf[2]];
                disp_buf[3]=DISP_CODE[frq_buf[3]];
                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;
                }
        }



一周热门 更多>