网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 杭州晶控电子有限公司 >> 文章中心 >> 手把手学PIC单片机 >> 文章正文
  [组图]手把手教你使用PIC单片机点亮7段数码管           ★★★ 【字体:
手把手教你使用PIC单片机点亮7段数码管
作者:admin    文章来源:本站原创    点击数:    更新时间:2008-01-04    

手把手教你使用PIC单片机点亮7段数码管(C语言版)——站长原创,如需引用请注明出处

    七段数码管在家电及工业控制中有着很广泛的应用,例如用来显示温度、数量、重量、日期、时间等等,具有显示醒目、直观的优点,它作为一种应用十分普遍的显示器件,可以在各种各样的设备上见到,例如图1就是某数字表头显示时候的效果图。它很适合用在对价格、亮度等条件比较敏感,同时基本上只要求显示数字量的时候,所以在数据显示,定时控制等场合用得很多。数码管也叫LED数码显示器,其实是由多个LED排列封装而成,图2给出了一些常见的数码管的实物图,其中以上看到的数码管都是由8个LED组合而成的,当然也有其它类型的。


图1、某数字表头显示效果

图2、常见的数码管实物图

    首先,让我们先来对相关理论知识进行一番了解。如图片左上角,是我们51试验板的4位数码管;那这些数码管是怎样来显示1,2,3,4……数字呢?别着急,我们一起慢慢来学。
    数码管实际上是由7个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。如:显示一个“2”字,那么应当是a亮b亮g亮e亮d亮f不亮c不亮dp不亮。

7段数码管的段排列和内结构见下图:

    我们的增强型PIC实验板用的都是共阳极扫描型数码管。那什么是共阳极呢;就是他们的公共端接正极;还有一种是共阴极的数码管,那么他们的公共端是接负极的。扫描型的意思是,几位的数码管的段选都是并联着的。
    现在我们可以看到试验板上有六个数码管,那我们应该如何来控制哪一只数码管显示呢?再看看试验板上的图片,数码码下边有6个黑糊糊的三极管,对,就是用它们来控制左边的那些数码管哪个边亮。

现在来看看增强型PIC实验板数码管部分的硬件原理图。



    图中的A,B,C,D,E,F,G,DP分别与单片机的RC口相连,用来控制显示数字的形状。Q3、Q4、Q5、Q6、Q7、Q8即为上文所讲到的6个控制数码管的三极管,RA1、RA0、RA3、RA2、RA5、RA4分别接在单片机的RA口上。通过控制这些三极管的基极电平来打开或关闭数码管的显示,即起到“使能”作用。如S1端为低电平,则允许相应的数码管显示,显示的字形则由RC口所决定。

    上面理论说了一大堆,我们从这里开始动手喽:)我们的任务是要让六个数码管显示数字“0”——“9”字样,时间间隔为1秒。

#include<pic.h>

const unsigned char display_numb[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};

void delay_1ms(void)
{
unsigned int n;
for(n=0;n<50;n++)
{
NOP();
}
}
void delay_ms(unsigned int time)
{
for(;time>0;time--)
{
delay_1ms();
}
}

void main(void)
{
TRISC=0X00;
TRISA=0X00;
while(1)
{
PORTC=display_numb[0];
PORTA=0X00;

delay_ms(1000);
PORTC=display_numb[1];

delay_ms(1000);
PORTC=display_numb[2];

delay_ms(1000);
PORTC=display_numb[3];

delay_ms(1000);
PORTC=display_numb[4];

delay_ms(1000);
PORTC=display_numb[5];

delay_ms(1000);
PORTC=display_numb[6];

delay_ms(1000);
PORTC=display_numb[7];

delay_ms(1000);
PORTC=display_numb[8];

delay_ms(1000);
PORTC=display_numb[9];

delay_ms(1000);
PORTC=display_numb[10];
}
}

    #include<pic.h> 语句用来加载PIC库文件, 数组display_numb用来定义数字“0”--“9”的字形码,如下表所示:

    我们把它转换为16进制,得出下表,直接送到RC口就行啦。

显示数字

RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0

16进制代码

0

1

1

0

0

0

0

0

0

C0H

1

1

1

1

1

1

0

0

1

F9H

2

1

0

1

0

0

1

0

0

A4H

3

1

0

1

1

0

0

0

0

B0H

4

1

0

0

1

1

0

0

1

99H

5

1

0

0

1

0

0

1

0

92H

6

1

0

0

0

0

0

1

0

82H

7

1

1

1

1

1

0

0

0

F8H

8

1

0

0

0

0

0

0

0

80H

9

1

0

0

1

0

0

0

0

90H


注意: 0为点亮 1 为灭

    我们把他从高往低排列为二进制,例如2,就是10100100, 用计算器转换为16进制就是A4.我们在单片机里为了把16进制和10进制有所区别,就把16进制后面跟一个H。 void delay_1ms(void) 是延时1ms的函数,void delay_ms(unsigned int time) 是延时X毫秒的函数,具体为多少毫秒由形参time变量决定,如我们执行函数 delay_ms(1000); 即表示为延时1000毫秒=延时1秒的时间。语句“TRISC=0X00;”用来设置RC口的输入、输出状态,在此我们设置为输出;语句“TRISA=0X00;”用来设置RA口的输入、输出状态,在此我们设置为输出。while(1) 是死循环语句,即周而复始地执行{ }内的语句体,如我们现在的程序中的作用即是不停地执行 delay_ms(x); PORTC=display_numb[x]; 这两类语句,即给RC口送一个字形码,延时1秒钟后,又给RC口赋予一个新的字形码,在我们从实验结果上看来就是数码管在不停地显示“0”——“9”这些数字。

下面是以上程序在执行过程中,数码管显示的部分瞬间效果图:



当数码管显示“0”时的瞬间截图。



当数码管显示“1”时的瞬间截图。



当数码管显示“2”时的瞬间截图。



当数码管显示到“9”时的瞬间截图。

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    杭州晶控电子有限公司 版权所有 站长:hificat