EDN首页   博客首页 用户登陆  |  注册

日志档案

发表于 2009/2/26 10:02:11

6

标签: 手把手教你学单片机  入门  51开发板  学习板  

手把手教你学习单片机(2.3)——数码管电路及实验

数码管电路及实验

 

    今天讲数码管电路,数码管分为共阴极和共阳极,顾名思义大家应该能理解其意思。

对于数码管的驱动,常用的有IO口直接驱动,三极管驱动,芯片驱动,大功率的还要增加驱动能力。

开发板中选择的是常用的2位数码管,这样的可以采取IO口直接驱动,电路如下:

上面的段码SEG[A..H]连到开发板的P1口,位码Dig0Dig1分别连接到IO口的P04P05,由于采用的IO直接驱动,选择了共阴极数码管,并且在P1口上拉1K电阻, 增强P1口驱动能力。在1-2位数码管的时候,完全可以采用IO直接驱动,而没有必要增加三极管驱动电路,这个电路已经经过实践验证的,没有问题的。

再看一下三极管驱动电路,

点击看大图

 

这个电路采用的数码管驱动电路是三极管驱动,共阳极数码管,另外在SEG[A..H]中,要串联个270欧姆左右的限流电阻,具体值可根据实际亮度调整。

再举一种常用的键盘数码芯片ZLG7289,如下图,64个按键,8位数码管,直接和单片机进行SPI通信就可以了。

点击看大图

 象数码管的电路还有很多,比如使用74595芯片,74164芯片,还有好几种其它的键盘显示芯片,价格上都相差不是太大,三极管驱动的最为便宜,但程序要动态扫描占用CPU资源多。使用专用键盘显示芯片的要贵一点,但单片机处理起来很简单。

对与第一种图,本博客以前发过其静态,动态的C和汇编语言程序,大家可以在本博客08年的文章中找找,现在只把动态C语言的贴出来:

#include <reg52.h>   //调用头文件(单片机内部的寄存器定义)

/******本段为硬件I/O口定义********/
sbit  LED0   = P0 ^ 0;
sbit  LED1   = P0 ^ 1;
sbit  LED2   = P0 ^ 2;
sbit  LED3   = P0 ^ 3;
sbit  DIG0   = P0 ^ 4;  //数码管位0
sbit  DIG1   = P0 ^ 5;  //数码管位1

sbit  BUZZ   = P3 ^ 4;  //蜂鸣器


//数码管显示0~9,定义到代码段,和程序数据烧在FLASH中
code unsigned  char DispBuf[10]= {0x3f,0x06,0x5b,0x4f,0x66,
          0x6d,0x7d,0x07,0x7f,0x6f};

void  disp_selec(unsigned  char bit_selec,unsigned  char  seg);

/**************************************************
** 函数名称: dellay
** 入口参数:h(双字节型)
** 出口参数:无
** 功能描述: 短暂延时,使用11.0592晶体,约0.01MS
****************************************************/

void dellay(unsigned int  h)
{
  while(h--);    //0.01MS
}

 

/************主程序**************/
main()
{
 unsigned  char  i="0";      //要显示的数
 unsigned  char  temp_a,temp_b; //个位、十位数
    
 while(1)     
  {unsigned  int temp;

    temp_b=i/10;
 temp_a=i%10;
    for(temp=0;temp<100;temp++)
    {
    disp_selec(0,temp_a);   //显示个位数
     dellay(100);
    disp_selec(1,temp_b);    //显示十位数
    dellay(100);
     }        //显示数加1
      i++;
   if(i>99)
      i="0";  
  }  
}
/**************************************************
** 函数名称: disp_selec
** 入口参数:bit_selec,seg
** 出口参数:无
** 功能描述: 选择相应数码管,进行显示
****************************************************/

void  disp_selec(unsigned  char bit_selec,unsigned  char  seg)
{
   if(bit_selec==0)   //数码管位选0
 {
   DIG0=0;
   DIG1=1;
  }
 if(bit_selec==1)   //数码管位选1
  {
    DIG0=1;
    DIG1=0;
  }
   P1=DispBuf[seg];

}

大家参考参考吧,学习靠实践,看别人的永远学不到真东西,但学习别人的经验可以加快自己的学习速度。

 

以前写的,请在这里打开链接:

 

手把手教你学习单片机(2.2)——缝鸣器电路及实验

手把手教你学习单片机(2.1——单片机控制发光二极管实验

手把手教你学习单片机(第一章)——认识单片机及其如何工作

 

我的新QQ464976346

开发板详细介绍!

http://blog.ednchina.com/ahai0306/(我的博客首页)

拍拍网店铺: http://shop.paipai.com/464976346

淘宝网店: http://shop35284066.taobao.com/

百度网店:http://youa.baidu.com/shop/83eabd89bd63f95984248678

AD电子论坛的本51开发板的版块:

http://dianzi.5d6d.com/forum-39-1.html

手机:13626455309  (白天请短信联系)

邮箱: ahai0306@sina.com联系人:张工

系统分类: 单片机   |   用户分类: 单片机入门   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

该用户于2009/2/26 10:02:39编辑过该文章

阅读(2683)  |  评论(0)  |  收藏(0)  |  举报  

投一票您将和博主都有获奖机会!