C51学习笔记(一)---数码管显示

来源:互联网 发布:淘宝仓库中的宝贝不见 编辑:程序博客网 时间:2024/05/17 23:28

      最近开始研读郭天祥的《新概念51单片机C语言教程》,感觉良好,边学习边通过TX的51开发板实验,长了不少见识,对硬件也有了新的体验,为了巩固学习成果, 特写一下笔记,以供以后查阅。

      这篇笔记针对第三章节的“数码管的显示原理及应用实现”,理解数码管的原理,静态显示和动态显示的实现过程。

      基本概念

      

      数码管就是通过几个发光二极管组成,可以实现数字显示的电子器件。按照引脚的连接方式可以为共阴和共阳,原理图如下所示:

           由上图中的电路可知,针对共阴极的,所有阴极(称为公共端)共同接地,为引脚加高电平,即可点亮。针对共阳极的情况,阳极(公共端)共同接一个高电平,只需要给引脚低电平,即可点亮。这两种数码管显示同一个数字的编码会有所不同。拿到数码管后,可通过万用表来测试出是共阴还是共阳。

           一般情况下,一位数码管有10个引脚,两位数码管也是10个引脚,四位数码管是12个引脚。

           对于多位一体的数码管有必要知道它内部的引脚连接方式:公共端是独立的引脚(称做位选线),而负责显示成什么数字的段引脚(称作段选线)是共用的,即每个位的a、b...g是分别连接在一块的。这样在使用中需要分两步,先通过位选线确定要操作哪个位置上的数码管,再通过段选线来输送相应的信号以显示指定的数字内容。

           明白数码管内部结构后,使用起来就容易了,段选和位选都可通过锁存器来将某I/O口的信号输送给数码管了,具体就根据实际情况来连接电路了。

           关于数码管的动态显示和静态显示,我的理解就是静态显示是让段引脚一直保持某状态,达到显示的效果,动态扫描显示是针对多位数码的情况,快速依次让每一位显示相应的内容,快到以至于肉眼看到的效果是多位同时显示内容,而看不到多位切换的效果。

          TX开发板上具体电路可参考该书第三章,这里直奔代码

/**************************************************************************************Module Name:用数码管动态显示数字Module Date:Module Auth: magcDescription:Others:  Revision History:  Date Rel Ver Notes  **************************************************************************/#include <reg52.h>#define uint unsigned int#define uchar unsigned charvoid delay(uint);void output_num(uint duan,uint wei,uint deplay_s);sbit duan_ea = P2^6; //段选位,U1锁存器端sbit wei_ea = P2^7;//位选位,U2锁存器端// 数码管显示数字的编码表uchar code table[] = {    0x3f,0x06,0x5b,0x4f,    0x66,0x6d,0x7d,0x07,    0x7f,0x6f,0x77,0x7c,    0x39,0x5e,0x79,0x71};// 位选编码表,定位第1~6个位uchar code wei_table[] = {    0xfe,0xfd,0xfb,0xf7,0xef,0xdf};/**************************************************************************Function Name:主函数Function Description:Inputs:Outputs:Notes:**************************************************************************/void main(){    //第一步:先选择要显示的数码管       //第二步:再输送内容的信息    uint i;        //主循环过程    while(1){                for (i = 0; i < 6; i++) {            //依次在1~6位上分别显示0~5数字            output_num(table[i],wei_table[i],500);                    }    }}/**************************************************************************Function Name: 指定一个数码管来显示指定的数字内容Function Description:Inputs: duan:段选信号,wei:位选信号,deplay_s:延时时长Outputs:Notes:**************************************************************************/void output_num(uint duan,uint wei,uint deplay_s){    //输送位选数据    wei_ea = 1;  //打开位选锁存器    P0 = wei;//通过P0输送信号    wei_ea = 0;//关闭位选的锁存器    P0 = 0xFF; //避免影响下一次输送数据,有必要“消影”    //输送段选数据    duan_ea = 1; //打开段选的锁存器    P0 = duan;//通过P0输送信号    duan_ea = 0;//关闭段选的锁存器    P0 = 0xFF;//清影    delay(deplay_s);//延时一下}/**************************************************************************Function Name:延时指定时间Function Description:Inputs:Outputs:Notes:**************************************************************************/void delay(uint t){    uint i,j;    for(i = t;i>0;i--){        for (j = 0; j < 110; j++);    }}


 

 

经过Keil的编码生成Hex文件,再通过ISP软件传至开发板芯片中,运行的效果就是六个数码管,依次显示0~5数字,当每次显示的延时越短时,数字移动显示越快,快到一定程序,就可看到六个同时显示0~5数字了。          

 

小结:

           51单片机给我了们与硬件亲密接触的机会,使用单片机也就是通过它的硬件资源实现控制或简单计算的目的,电路连接要尊重各器件的“品性”,给予合理的电信号,必要时添加其它器件辅助实现连接。

           通过C语言,可以简单快捷地操作单片机上的资源,注意体会这种近距离操作硬件的过程,了解了,才会发现硬件并不难。