424

主题

3

好友

1万

积分
     

超级版主 当前离线

Rank: 8Rank: 8

UID
13663
帖子
13726
精华
6
经验
10608 点
金钱
8449 ¥
注册时间
2006-10-21

论坛版主 优秀版主 乐于助人 DIY大赛获奖

发表于 2011-8-16 09:41 | 显示全部楼层
本帖最后由 ahao 于 2012-1-28 15:09 编辑

测试编辑中还需要好几天。。。。。
声明:本贴将编写一些个人学习单片机的经验和实例,欢迎单片机方面的老师多多指点和分享你们的经验。 为了增加本贴的可读性请老师们积极添砖盖瓦,还有前几页不希望出现一些如“学习了”“记号”“收藏”。。。等等与本贴宗旨无关的回帖,所以我会根据实际情况对回帖进行整理,敬请谅解。同时建议如果对本贴内容不感冒或者持反对态度的朋友,如果您误入本贴请您轻轻的来悄悄的走不要留下只言片语,否则彪哥可能会发飙影响到彼此的感情就不好了!谢谢合作。

第一回:制作一个电压表,使用STC12C5A08S2单片机、12M晶振、4位LED数码管。 (具体请看2楼、3楼,另外录了一段视频仅供比我还新的新手参考。)
目的:说一下写C程序的基本步骤,了解动态扫描、数模转换、定时器的应用等等,为下一个电路做铺垫。本来打算先说带峰值保持的LED指示电路的后来考虑还是先用电压表来讲一下几个知识点比较合适。

第二回:制作一个带有峰值保持的20段LED音频电平指示电路,使用STC12C5A08S2单片机、12M晶振、10位LED光柱(也可以用普通LED代替)、358普通运放。。。等元件。(见4楼、5楼,程序、视频暂未完成)

第三回:
第四回:

上传几个小工具,在7楼

评分

参与人数 1经验 +30 收起 理由
mxwmke1 + 30 很给力!

查看全部评分

424

主题

3

好友

1万

积分
     

超级版主 当前离线

Rank: 8Rank: 8

UID
13663
帖子
13726
精华
6
经验
10608 点
金钱
8449 ¥
注册时间
2006-10-21

论坛版主 优秀版主 乐于助人 DIY大赛获奖

 楼主| 发表于 2011-8-16 10:58 | 显示全部楼层

先做一个电压表,方便下一个电路的讲解。

本帖最后由 ahao 于 2011-8-23 17:02 编辑

电路图如下
电压表.gif

上图中的J2是下载程序用的,下载线如下图。
下图中的ic可以用MAX232 MAX3232(建议用MAX3232,因为将来刷卫星接收机也可以用)
下载线.gif


实物图如下
实物图01.jpg
实物图02.jpg

424

主题

3

好友

1万

积分
     

超级版主 当前离线

Rank: 8Rank: 8

UID
13663
帖子
13726
精华
6
经验
10608 点
金钱
8449 ¥
注册时间
2006-10-21

论坛版主 优秀版主 乐于助人 DIY大赛获奖

 楼主| 发表于 2011-8-16 10:58 | 显示全部楼层
本帖最后由 ahao 于 2011-10-22 22:10 编辑

C程序如下红字部分。

#include <intrins.H>                  //头文件
#include "STC_NEW_8051.H"     //STC自己的头文件
#define uint unsigned int           //宏定义
#define uchar unsigned char
uint abc,tongd0,tongd7;           //定义uint型变量
uchar tt0;                                  //定义uchar型变量
sbit gewei=P2^0;                     //个十百千位的位声明
sbit shiwei=P2^1;
sbit baiwei=P2^2;
sbit qianwei=P2^3;
sbit dian=P0^7;                      //小数点点声明

uchar code led[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //定义0-9数字的编码

void delay(uint z)                    //延时函数
{
     uint x,y;
     for(x=z;x>0;x--)
     for(y=100;y>0;y--);
}

void display()                         //显示函数
{
     qianwei=0;                           //显示千位
     P0=led[abc/1000];
     dian=0;
     delay(50);
     qianwei=1;


     baiwei=0;                             //显示百位
     P0=led[abc%1000/100];
     delay(50);
     baiwei=1;


     shiwei=0;                            //显示十位
     P0=led[abc%100/10];
     delay(50);
     shiwei=1;


     gewei=0;                            //显示个位
     P0=led[abc%10];
     delay(50);
     gewei=1;
}


//以下直接引用自STC的网站数模转换的例子-------------------------------------
//以下选择 ADC 转换速率,只能选择其中一种
//SPEED1 SPEED0  A/D转换所需时间
#define AD_SPEED   0x60 //  0110,0000   1      1   70 个时钟周期转换一次,
//CPU工作频率21MHz时 A/D转换速度约 300KHz
//#define AD_SPEED   0x40 //0100,0000   1      0     140 个时钟周期转换一次
//#define AD_SPEED   0x20 //0010,0000   0      1     280 个时钟周期转换一次
//#define AD_SPEED   0x00 //0000,0000   0      0     420 个时钟周期转换一次

uint get_AD_result(uchar channel)                //模数转换程序
{
     uchar AD_finished=0;                              //存储 A/D 转换标志

     ADC_RES = 0;
     ADC_RESL = 0;

     channel &= 0x07;                                    //0000,0111 清0高5位
     ADC_CONTR = AD_SPEED;
     _nop_();
     ADC_CONTR |= channel;                          //选择 A/D 当前通道
     _nop_();
     ADC_CONTR |= 0x80;                             //启动 A/D 电源
     delay(1);                                                //使输入电压达到稳定
     ADC_CONTR |= 0x08;                             //0000,1000 令 ADCS = 1, 启动A/D转换,
     AD_finished = 0;
     while (AD_finished ==0 )                          //等待A/D转换结束
     {
           AD_finished = (ADC_CONTR & 0x10);    //0001,0000 测试A/D转换结束否
     }
     ADC_CONTR &= 0xE7;                             //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,

     return (ADC_RES*4+ADC_RESL);             //返回 A/D 高8位+低2位转换结果
}


//------下面是主函数--------
void main()                                //主程序
{                                              //进入主程序后先对定时器初始化


      TMOD=0x01;                       //设定定时器0工作方式  
      TH0=(65536-10000)/256;    //定时器0高8位装初值  12M晶振定时10毫秒
      TL0=(65536-10000)%256;   //定时器0低8位装初值  
      ET0=1;                               //开定时器0中断
      TR0=1;                               //启动定时器0
      EA=1;                                 //开总中断


      P1ASF = 0x81;                    //1000,0001, 将 P1.0 P1.7 置成模拟口
//    ADRJ = AUXR1^2:
//    0: 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
//    1: 10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器
      AUXR1 &= ~0x04;               //0000,0100, 令 ADRJ=0
//    AUXR1 |= 0x04;                  //0000,0100, 令 ADRJ=1

      ADC_CONTR |= 0x80;          //1000,0000 打开 A/D 转换电源

      while(1)
     {
           abc=(tongd0*1.0/tongd7)*2500;    //让abc等于通道0和通道7转换后的运算结果
           display();                                       //显示具体数字
     }

}

void timer0() interrupt 1                        //定时器0服务程序
{
      TH0=(65536-10000)/256;               //再装一次初值
      TL0=(65536-10000)%256;
      tt0++;
      if(tt0==20)                                    //200ms转换一次
     {
           tt0=0;
           tongd0=get_AD_result(0);         //转换P0.0通道
           tongd7=get_AD_result(7);         //转换P0.7通道
     }
}


424

主题

3

好友

1万

积分
     

超级版主 当前离线

Rank: 8Rank: 8

UID
13663
帖子
13726
精华
6
经验
10608 点
金钱
8449 ¥
注册时间
2006-10-21

论坛版主 优秀版主 乐于助人 DIY大赛获奖

 楼主| 发表于 2011-8-16 10:58 | 显示全部楼层

再来一个带有峰值保持的音频电平LED显示电路

本帖最后由 ahao 于 2011-9-28 11:27 编辑

电路图如下
带峰值保持LED音频电平显示.gif
C程序只弄了一边,目前显示还不稳定。先发上来,等有时间了再优化。
如下(仅供参考,还不能用于实际电路)
#include <intrins.h>
#include "STC12C5A60S2.H"

typedef unsigned char uchar;
typedef unsigned int uint;

uchar count;                                   //中断次数计数
uint ADC_result0,ADC_result1,ADC_result7,VOL_resultA,VOL_resultB;

uchar abc,pp,tt,tt0,tt1,tt2;
sbit A0=P2^2;
sbit A1=P2^1;
sbit A2=P2^0;
                 
uchar code led[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};  //定义led显示的编码
uchar code pf[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};      //定义漂浮物的编码
void delay(uint z)                                                                    //延时程序
{
        uint x,y;
        for(x=z;x>0;x--)  
                for(y=100;y>0;y--);
}

void piaofu()                                                                          //漂浮物显示程序
{
        switch(pp)
        {
                case 20:
                A0=1;A1=1;A2=0; P0=pf[3];
                break;

                case 19:
                A0=1;A1=1;A2=0; P0=pf[2];
                break;

                case 18:
                A0=1;A1=1;A2=0; P0=pf[1];
                break;

                case 17:
                A0=1;A1=1;A2=0; P0=pf[0];
                break;

                case 16:
                A0=1;A1=0;A2=1; P0=pf[7];
                break;

                case 15:
                A0=1;A1=0;A2=1; P0=pf[6];
                break;

                case 14:
                A0=1;A1=0;A2=1; P0=pf[5];
                break;

                case 13:
                A0=1;A1=0;A2=1; P0=pf[4];
                break;

                case 12:
                A0=1;A1=0;A2=1; P0=pf[3];
                break;

                case 11:
                A0=1;A1=0;A2=1; P0=pf[2];
                break;

                case 10:
                A0=1;A1=0;A2=1; P0=pf[1];
                break;

                case 9:
                A0=1;A1=0;A2=1; P0=pf[0];
                break;
               
                case 8:
                A0=0;A1=1;A2=1; P0=pf[7];
                break;               
               
                case 7:
                A0=0;A1=1;A2=1; P0=pf[6];
                break;               

                case 6:
                A0=0;A1=1;A2=1; P0=pf[5];
                break;

                case 5:
                A0=0;A1=1;A2=1; P0=pf[4];
                break;

                case 4:
                A0=0;A1=1;A2=1; P0=pf[3];
                break;

                case 3:
                A0=0;A1=1;A2=1; P0=pf[2];
                break;                        

                case 2:
                A0=0;A1=1;A2=1; P0=pf[1];
                break;

                case 1:
                A0=0;A1=1;A2=1; P0=pf[0];
                break;
        }
        delay(1);
}

void displayA(uchar dd)                                              //led显示程序
{
        if(dd>0)
        {        
                A0=0; A1=1; A2=1;
                if(dd>=8) P0=led[7];
                else P0=led[dd];
        }        
        delay(2);
        P0=0xff;
        
        if(dd>=8)
        {        
                A0=1; A1=0; A2=1;
                if(dd>=16) P0=led[7];
                else P0=led[dd%8];
        }        
        delay(2);
        P0=0xff;

        if(dd>=16)
        {        
                A0=1; A1=1; A2=0;
                P0=led[dd%16];
        }        
        delay(2);
        P0=0xff;
                        
}


void init()                                         //初始化程序
{        
        TMOD=0x11;
        TH0=(65536-100)/256;
        TL0=(65536-100)%256;
        EA=1; //开总中断
        ET0=1;//开定时器0中断
        TR0=1;//启动定时器0        
   
        TH1=(65536-10000)/256;
        TL1=(65536-10000)%256;        
        ET1=1;//开定时器1中断
        TR1=0;//启动定时器1

        P1ASF = 0x83;                         //1000,0011, 将 P1.0 P1.1 P1.7置成模拟口

}

//以下选择 ADC 转换速率,只能选择其中一种
//SPEED1 SPEED0  A/D转换所需时间
#define AD_SPEED   0x60 //  0110,0000   1      1   70 个时钟周期转换一次,
//CPU工作频率21MHz时 A/D转换速度约 300KHz
//#define AD_SPEED   0x40 //0100,0000   1      0     140 个时钟周期转换一次
//#define AD_SPEED   0x20 //0010,0000   0      1     280 个时钟周期转换一次
//#define AD_SPEED   0x00 //0000,0000   0      0     420 个时钟周期转换一次
//---------------------------------------------------------------------
/*---------------------------------------------------------------------
         STC12C5A60S2单片机AD转换函数,直接引用于宏晶科技网站
----------------------------------------------------------------------*/
uint get_AD_result(uchar channel)
{
    uchar AD_finished=0;            //存储 A/D 转换标志

    ADC_RES = 0;
    ADC_RESL = 0;

    channel &= 0x07;                //0000,0111 清0高5位
    ADC_CONTR = AD_SPEED;
    _nop_();
    ADC_CONTR |= channel;           //选择 A/D 当前通道
    _nop_();
    ADC_CONTR |= 0x80;              //启动 A/D 电源
    delay(1);                       //使输入电压达到稳定
    ADC_CONTR |= 0x08;              //0000,1000 令 ADCS = 1, 启动A/D转换,
    AD_finished = 0;
    while (AD_finished ==0 )        //等待A/D转换结束
    {
        AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
    }
    ADC_CONTR &= 0xE7;              //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,

    return (ADC_RES*256+ADC_RESL);               //返回 A/D 高2位 + 低8位转换结果
}


void main()
{
        //ADRJ = AUXR1^2:
        //    0: 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
        //    1: 10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器
        //    AUXR1 &= ~0x04;               //0000,0100, 令 ADRJ=0
        AUXR1 |= 0x04;                        //0000,0100, 令 ADRJ=1

        ADC_CONTR |= 0x80;                //1000,0000 打开 A/D 转换电源        
        pp=20;                                     //上电后让漂浮物置顶,然后从顶部落下
        init();
        while(1)
        {
               
                VOL_resultA= ADC_result0*1.0/ADC_result7*2500;        //语句中"*1.0"是必不可少的,不然C语言作整数处理,没有想要的结果产生.
                if(VOL_resultA>2200) tt1=19;               
                else if(VOL_resultA>1800) tt1=18;
                else if(VOL_resultA>1400) tt1=17;               
                else if(VOL_resultA>1200) tt1=16;
                else if(VOL_resultA>1000) tt1=15;               
                else if(VOL_resultA>850) tt1=14;
                else if(VOL_resultA>700) tt1=13;               
                else if(VOL_resultA>600) tt1=12;        
                else if(VOL_resultA>500) tt1=11;               
                else if(VOL_resultA>420) tt1=10;        
                else if(VOL_resultA>350) tt1=9;               
                else if(VOL_resultA>300) tt1=8;        
                else if(VOL_resultA>250) tt1=7;                                
                else if(VOL_resultA>200) tt1=6;        
                else if(VOL_resultA>177) tt1=5;               
                else if(VOL_resultA>150) tt1=4;               
                else if(VOL_resultA>125) tt1=3;               
                else if(VOL_resultA>100) tt1=2;
                else if(VOL_resultA>88) tt1=1;                                                                                       
                else if(VOL_resultA>60) tt1=0;
               
                displayA(tt1);                        //显示具体电压值
                if(pp<=tt1)
                {
                        pp=tt1+1;                   //令pp始终大于tt1一格
                        TR1=0;                       //关闭定时器1
                        abc=7;                        //这里可以设定悬停时间
                }
                else if(pp>tt1)               
                {
                        TR1=1;                       //打开定时器1
                }

                piaofu();                             //运行漂浮程序

        }                                         

}


void timer0() interrupt 1                       //定时器0中断程序
{
                                                         //再装一次初值
    TH0=(65536-100)/256;
    TL0=(65536-100)%256;
    count++;

    if (count==100)                              //10ms转换一次.
   {
           count=0;
           ADC_result7 = get_AD_result(7); //P1.1 为 A/D 当前通道, 测量结果存ADC_result7                          
           ADC_result0 = get_AD_result(0); //P1.0 为 A/D 当前通道, 测量结果存ADC_result0
           ADC_result1 = get_AD_result(1); //P1.0 为 A/D 当前通道, 测量结果存ADC_result0
        }
}        

void timer1() interrupt 3                     //定时器1中断程序
{
                                                       //再装一次初值
    TH1=(65536-10000)/256;
        TL1=(65536-10000)%256;
        
        tt0++;
        if(tt0>=7)                                 //设定下降速度
        {
               
               
                if(abc==0)                        //检测是否悬停时间到了,是的话pp自减下降
                        pp--;
                else if(abc>0)
                        abc--;

                tt0=0;
        }

}


先看看显示效果,目前基本完成一个声道,还有一些小问题正在调试中。
http://player.youku.com/player.php/sid/XMjk1MTQ3MzMy/v.swf

424

主题

3

好友

1万

积分
     

超级版主 当前离线

Rank: 8Rank: 8

UID
13663
帖子
13726
精华
6
经验
10608 点
金钱
8449 ¥
注册时间
2006-10-21

论坛版主 优秀版主 乐于助人 DIY大赛获奖

 楼主| 发表于 2011-8-16 10:58 | 显示全部楼层
本帖最后由 ahao 于 2011-9-16 17:49 编辑

数显温度的焊台,程序还没写好先放张电路图look、look。

电路图.gif

实物图
未命名.jpg


焊台手柄常识
焊台手柄01.jpg

焊台手柄02-1.jpg

焊台手柄内部03.jpg

焊台手柄内部04.jpg

焊台手柄内部05.jpg

67

主题

0

好友

2170

积分
     

罗宾汉 当前离线

Rank: 7Rank: 7Rank: 7

UID
44250
帖子
4958
精华
0
经验
2170 点
金钱
2152 ¥
注册时间
2008-5-28
发表于 2011-8-16 11:53 | 显示全部楼层
顶,刚刚去看了另一坛友在教单片机。版主能不能从零开始教起啊,毕竟受之于渔比受之于鱼要好得多吧,要是懂了自然慢慢的就可以往这方面拓展的。密切关注中。

424

主题

3

好友

1万

积分
     

超级版主 当前离线

Rank: 8Rank: 8

UID
13663
帖子
13726
精华
6
经验
10608 点
金钱
8449 ¥
注册时间
2006-10-21

论坛版主 优秀版主 乐于助人 DIY大赛获奖

 楼主| 发表于 2011-8-16 12:05 | 显示全部楼层
本帖最后由 ahao 于 2011-8-25 10:18 编辑

我打算录一个这个C程序具体怎么写成和调试的视频,因为我也是初哥所以不会出现什么高级语句,基本上了解一点C语言的都能看懂


小工具:
LED段码数据生成器.rar   这个小软件很好使,一看就会用
LED段码数据生成器.rar (815.67 KB, 下载次数: 785)

9

主题

0

好友

691

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
62624
帖子
1529
精华
0
经验
691 点
金钱
673 ¥
注册时间
2008-11-10
发表于 2011-8-16 12:22 | 显示全部楼层
顶楼主,我之前也写过一篇文章,种种原因暂时搁置了;

关注楼主!

13

主题

0

好友

207

积分

业余侠客 当前离线

Rank: 4

UID
327390
帖子
142
精华
0
经验
207 点
金钱
152 ¥
注册时间
2011-5-1
发表于 2011-8-16 12:28 | 显示全部楼层
回复 1# ahao


    ahao大叔,把单片机工作方式改成推挽输出不久好了?用单片机直接推LED,三极管电阻全88~

424

主题

3

好友

1万

积分
     

超级版主 当前离线

Rank: 8Rank: 8

UID
13663
帖子
13726
精华
6
经验
10608 点
金钱
8449 ¥
注册时间
2006-10-21

论坛版主 优秀版主 乐于助人 DIY大赛获奖

 楼主| 发表于 2011-8-16 12:53 | 显示全部楼层
回复 10# 591534671

嘿嘿,推挽的方式还没学会怎么弄,先弄一个常规的慢慢改进 另外我这个扫描方式不是一个个扫的而是8个一组方式扫的,如果用一个口推挽同时驱动8个LED可能有点不行。等学会推挽方式再试试

13

主题

0

好友

84

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
269674
帖子
129
精华
0
经验
84 点
金钱
83 ¥
注册时间
2010-12-7
发表于 2011-8-26 22:50 | 显示全部楼层
回复 4# ahao


    这个频谱好久了程序还没有出来,这个频谱分析在刚刚过去不久的大学电子大赛初赛我做的题目里有需要频谱却一直没有做好,能不能先给一个大致的流程图出来供参考啊

67

主题

0

好友

2170

积分
     

罗宾汉 当前离线

Rank: 7Rank: 7Rank: 7

UID
44250
帖子
4958
精华
0
经验
2170 点
金钱
2152 ¥
注册时间
2008-5-28
发表于 2011-8-27 10:41 | 显示全部楼层
为什么360提示LED段码数据生成器有病毒啊,先收藏下,还没学到这里来。刚看完子程序的调用。

67

主题

0

好友

2170

积分
     

罗宾汉 当前离线

Rank: 7Rank: 7Rank: 7

UID
44250
帖子
4958
精华
0
经验
2170 点
金钱
2152 ¥
注册时间
2008-5-28
发表于 2011-8-27 10:43 | 显示全部楼层
每看完一节,我都会用用当前学过的例子做个延伸的学习,不然依葫芦画瓢永远也只能照着别人的做,永远也坐不出来新的东西。

38

主题

4

好友

648

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
165937
帖子
956
精华
0
经验
648 点
金钱
633 ¥
注册时间
2010-1-18
发表于 2011-8-29 16:59 | 显示全部楼层
学习中,多谢啦

7

主题

0

好友

87

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
274856
帖子
91
精华
0
经验
87 点
金钱
87 ¥
注册时间
2010-12-23
发表于 2011-8-29 17:13 | 显示全部楼层
想做数码管显示的白光`````不知道楼住没有这样的资料`````谢谢

424

主题

3

好友

1万

积分
     

超级版主 当前离线

Rank: 8Rank: 8

UID
13663
帖子
13726
精华
6
经验
10608 点
金钱
8449 ¥
注册时间
2006-10-21

论坛版主 优秀版主 乐于助人 DIY大赛获奖

 楼主| 发表于 2011-8-29 17:29 | 显示全部楼层
回复  ahao


    这个频谱好久了程序还没有出来,这个频谱分析在刚刚过去不久的大学电子大赛初 ...
nccz 发表于 2011-8-26 22:50


这段时间有点忙,抽空我就上传。目前这个功能的程序显示部分还有点问题,我先发上来等以后慢慢优化

为什么360提示LED段码数据生成器有病毒啊,先收藏下,还没学到这里来。刚看完子程序的调用。
languifan 发表于 2011-8-27 10:41


360冤枉人的事时常发生

想做数码管显示的白光`````不知道楼住没有这样的资料`````谢谢
loneabcd 发表于 2011-8-29 17:13


没有这方面的资料,不过我过段时间可能会做一个单片机控制焊台手柄的东西。

22

主题

0

好友

801

积分

职业侠客 当前离线

Rank: 5Rank: 5

UID
5751
帖子
994
精华
0
经验
801 点
金钱
606 ¥
注册时间
2005-9-29
发表于 2011-8-29 19:18 | 显示全部楼层
喜啊 怎么会不喜

2

主题

0

好友

72

积分

论坛游民 当前离线

Rank: 3Rank: 3

UID
56436
帖子
216
精华
0
经验
72 点
金钱
70 ¥
注册时间
2008-9-30
发表于 2011-9-4 13:50 | 显示全部楼层
原来版主是河南郑州的,顶老乡啊

3

主题

0

好友

1180

积分

侠之大者 当前离线

论坛总版主

Rank: 6Rank: 6

UID
25005
帖子
1738
精华
0
经验
1180 点
金钱
1143 ¥
注册时间
2007-7-23
发表于 2011-9-4 23:04 | 显示全部楼层
老大帮我讲讲数码管的位选端为什么要接8550?不能直接接单片机的脚上嘛?

424

主题

3

好友

1万

积分
     

超级版主 当前离线

Rank: 8Rank: 8

UID
13663
帖子
13726
精华
6
经验
10608 点
金钱
8449 ¥
注册时间
2006-10-21

论坛版主 优秀版主 乐于助人 DIY大赛获奖

 楼主| 发表于 2011-9-5 13:33 | 显示全部楼层
老大帮我讲讲数码管的位选端为什么要接8550?不能直接接单片机的脚上嘛?
不敢太帅 发表于 2011-9-4 23:04


因为我用的是共阳极数码管,所以要想点亮必须位选端为高电平,而单片机输出高电平能力太弱(哪怕是STC的能强制推挽输出高电平也不行),只能加三极管来驱动,用NPN的管子要接成射极跟随器形式,所以我用PNP管子来驱动更合适一些。比如要点亮其中一位显示“8.”就是8个LED同时点亮,需要至少几十mA的电流,用三极管扩流后就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc.

返回顶部