打印

单片机菜鸟的疑惑

[复制链接]
1522|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
第一个图是将NPN型三极管的b接单片机,e接地,c接共阴极数码管的公共端,给单片机送高或低电平,数码管显示不正常,求解?
第二个图是将NPN型三极管的b接单片机,c接地,e接共阳极数码管的公共端,给单片机送高低电平,数码管显示正常!
请问第一种方法硬件这样的设计是否合理,如果是第一种方法的话,无论给高低电平,本人愚见觉得三极管都是导通的,求正解,希望给位大虾多给意见~

2、
沙发
yimankehao| | 2012-9-7 13:25 | 只看该作者
第一种共阴的硬件设计没有问题,很多电路都是这么做的。问题是这两种电路数码管显示程序不同。

使用特权

评论回复
板凳
yewuyi| | 2012-9-7 15:29 | 只看该作者
第一个图始终打不开。

你接到共阴极上的话,主要阳极单独加电即可

使用特权

评论回复
地板
NE5532| | 2012-9-9 08:48 | 只看该作者
第一个图是端口送高电平,三极管导通的。图没有问题,检查软件和仿真设置。

使用特权

评论回复
5
xppx1987|  楼主 | 2012-9-9 20:23 | 只看该作者
4# NE5532 第一个图 为什么只有在三极管的C级加上拉电阻的情况下才能正常显示

使用特权

评论回复
6
xppx1987|  楼主 | 2012-9-9 20:24 | 只看该作者
4# NE5532 无论送高低电平,显示都是如图不能正常显示,程序肯定是没有问题的,但是后来发现第一个图只有在三极管的C级加上拉电阻的情况下才能正常显示

使用特权

评论回复
7
xppx1987|  楼主 | 2012-9-9 20:25 | 只看该作者
2# yimankehao 无论送高低电平,显示都是如图不能正常显示,程序肯定是没有问题的,但是后来发现第一个图只有在三极管的C级加上拉电阻的情况下才能正常显示

使用特权

评论回复
8
xppx1987|  楼主 | 2012-9-9 20:26 | 只看该作者
3# yewuyi 阳极单独加电什么意思,不解?无论送高低电平,显示都是如图不能正常显示,程序肯定是没有问题的,但是后来发现第一个图只有在三极管的C级加上拉电阻的情况下才能正常显示

使用特权

评论回复
9
NE5532| | 2012-9-9 22:10 | 只看该作者
图里没看到你的上拉电阻呢?

使用特权

评论回复
10
XIEYUANBIN| | 2012-9-10 08:31 | 只看该作者
第一种图是对的,是你程序的确有问题,三极管负责位显示,而你用串转并芯片负责段显示,看样子是段显示有问题。要不就是你的数码管是共阳的才会出现这种情况

使用特权

评论回复
11
xppx1987|  楼主 | 2012-9-10 08:39 | 只看该作者
9# NE5532 这个图是三极管C级没有加上拉电阻的情况,后来加了就能正常显示了,不解?

使用特权

评论回复
12
xppx1987|  楼主 | 2012-9-10 09:01 | 只看该作者
本帖最后由 xppx1987 于 2012-9-10 09:06 编辑

10# XIEYUANBIN 数码管确信是共阴极的没错,确实不知道程序哪里出错了,下面附上简单程序,望大侠纠正指出。还有就是第一个图在三极管C级加了上拉电阻可以正常显示了,不解?还望指点一二!
#include<pic.h>  
#include<math.h>
#include<stdio.h>      
  
__CONFIG(0x3B31); //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

#define data164 RA3
#define clk164 RA5

#define uchar unsigned char
#define uint unsigned int

#define  _nop_()  asm("nop")

uint temp=12;
uchar count_10ms=0;
uchar const bit_tab[]={0x80,0x40,0x20,0x01,0x08,0x04,0x02,0x01,0};//位选表,用来选择哪一只数码管进行显示
uchar const seg_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段选表,共阴数码显示码值  
uchar disbuf[2];                //定义显示缓冲单元


/******函数定义**************/
void sendbyte1(char byte);
void sendbyte2(char byte);
void conv(uint tmp_s);
void display();

/********端口设置函数********/
void port_init( )
{
TRISA=0x07;
TRISB=0x06;
TRISC=0x00;                //端口C输出,位选
ADCON1=0x06;                //定义RA为IO端口
//ANSEL=0x00;
//ANSELH=0x00;
}

/*****************显示函数***********************/
void sendbyte1(char byte)
{
        unsigned char  c;  
        for(c=0;c<8;c++)
        {
                if(byte&0x80)
                data164=1;
                else data164=0;   
                clk164=0;
                _nop_();
                clk164=1;
                byte<<=1;
        }
}

void sendbyte2(char byte)
{
        unsigned char  c;
        for(c=0;c<16;c++)
        {
                if(byte&0x80)
                data164=1;
                else data164=0;   
                clk164=0;
                _nop_();
                clk164=1;
                byte<<=1;
        }
}

void conv(uint tmp_s)
{
        disbuf[0]=tmp_s/10;
                disbuf[1]=tmp_s%10;        
}

void display()
{
        static uchar count=0;
        PORTC=bit_tab[8];
        switch(count)
        {
                        case 0:sendbyte1(seg_data[disbuf[0]]);PORTC=bit_tab[6];break;
                        case 1:sendbyte2(seg_data[disbuf[1]]);PORTC=bit_tab[7];break;
        }
        count++;
        if(count==2) count=0;
}

/*********定时器0/定时器1初始化函数********/
void  timer_init()
{
        GIE=1;                                        //开总中断
        PEIE=1;                                //开外围功能模块中断
        T0CS=0;                                //定时器0对内部时钟计数
        PSA=0;                                //分频器分配给TRM0
        PS0=1;
        PS1=1;
        PS2=1;                                        //定时器0分频比为1:256
        T0IE=1;                                //允许TMR0溢出中断
        TMR0=248;                                //TMR0赋初值,定时2ms
        T1CKPS0=1;T1CKPS1=1;                //定时器1分频比为1:8
        TMR1CS=0;                                //定时器1设置为定时功能
        TMR1IE=1;                                //使能定时器1中断
        TMR1ON=1;                                //启动定时器1
        TMR1H=0xfb;                                //置计数值高位,定时时间为10ms
        TMR1L=0x1e;                                //置计数值低位
}

/********中断服务程序********/
void interrupt ISR(void)
{   
        if(TMR0IF==1)
        {        
                TMR0IF=0;                        //清TMR1溢出中断标志位
                TMR0=248;                       //TMR0赋初值,定时2ms
                display();                        //调显示函数
        }
        if(TMR1IF==1)
        {        
                TMR1IF=0;                        //清TMR1溢出中断标志位
                TMR1H=0xfb;                        //重置计数值,定时时间为10ms
                TMR1L=0x1e;                        //重置计数值
                count_10ms++;                //10ms计数器加1
                if(count_10ms>=100)               
                {
                        count_10ms=0;//计数100次后恰好为1s,此时10ms计数器清零
                }
        }
}


/*************************主函数****************************/
void main( )
{
        port_init();
        timer_init();                        //调定时器T0、T1初始化函数
        while(1)
        {
                 conv(temp);        //调走时转换函数        
        }
}

使用特权

评论回复
13
yewuyi| | 2012-9-10 11:32 | 只看该作者
1、你是否接了真实的硬件实验?还是只在类似PROTUES这样的软件中模拟仿真的?如果只是仿真结果,请用实际硬件动手实验。
2、在PIC的IO口往往复用了一些模块,请检查各个模块是否配置正确,例如A口默认往往是模拟口,你要仔细检查寄存器配置。
3、检查你的晶体振荡源的配置,检查晶体是否真实起振了。
4、检查你的段和位送出的电平到底是什么?

使用特权

评论回复
14
qjh7758| | 2012-9-11 16:17 | 只看该作者
因该是共阴共阳出了问题

使用特权

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

本版积分规则

5

主题

153

帖子

2

粉丝