求助,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) 在数码管驱动上,库里面的三极管是无法仿真的,因为此时三极管基本就是开关作用,仿真不了,不过我这里有别人做的模型可以仿真。
http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_639733CXA6GA.jpg
(原文件名:ff.jpg) 回复【楼主位】cheng307
-----------------------------------------------------------------------
PNP有问题呀,你看仿真的时候不论B级是高还是低,C级都出高呀。 回复【1楼】Hamyou
-----------------------------------------------------------------------
我改成npn就可以正常显示了。。这什么情况?。。我是用的共阳数码管呀? 回复【2楼】perron
-----------------------------------------------------------------------
换npn了。。就正常了。。
http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_639741PSXJR9.jpg
显示正常了,但是为什么秒比原来那个慢了1秒呢? (原文件名:QQ截图20110514130124.jpg) 贴下程序:
#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();
}
} 换成PNP的三极管,不管怎么改都不能正常工作
我不用库里面的三极管,对于数码管来说不好使 henhao很好谢谢 用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]