找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13605|回复: 5
打印 上一主题 下一主题
收起左侧

【详解】51hei板子单个数码管显示1到9

[复制链接]
跳转到指定楼层
楼主
ID:33640 发表于 2012-1-7 01:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

数码管,其实就是8个发光二极管按顺序排列而成的,所以让数码管显示特定的数字,只需要将该亮的二极管点亮,不该亮的灭了就好了。为了达到这个目的,就得参考电路图了,51HEI开发板的电路图在我的相册里有,但是整张贴出来就太大了,所以这里只显示部分。电路图如下:

乍一看这张图比较明显的就是最左边的单片机和两个锁存器U1和U2的引脚信息了,从D00到D07,两个锁存器是共用的,D00对应输出Y1和X1,D07对应输出Y8和X8。锁存器,从它的名字大概就可以知道它的用途了!其作用就是有的引脚输入改变的时候输出保持之前的状态,达到锁和存的效果(我目前的理解是这样的,不理解的可以上网搜官方解释)。查查74HC573是怎么用的,表格如下:

图中引脚1代表输出使能,11引脚代表锁存使能。锁存器嘛,打开锁存,让输出使能引脚处于低电平,锁存使能引脚输入高电平,传入对应的D,然后再使锁存使能引脚处于低电平,这样就能让输出保持不变。使用的过程就是打开锁,传数据,关锁保持。

说完了锁存器,回到第一张电路图,途中的锁存器1号引脚都接地,自然是低电平,11号引脚分别对应单片机的D26和D27,所以控制U1和U2就靠这2个引脚啦!

按道理说,8个数码管,应该有8*8=64根线才对啊,而第一张图中只有24个引脚,里面肯定有复用的引脚,所以不知道内部电路是没办法写滴,还好51HEI给的资料比较全。

2个LED管的内部电路如下:         ABCDEFG  DP总共8个二极管,分别由11、7、4、2、1、10、5、3引脚控制,而1这8个引脚对应第一个图中的Y1到Y8,12、9、8、6呢则有两组,一组是共阴极的数码管,一组是共阳极的数码管。12、9、8、6呢则对应X1到X8,有2个,一组是X1到X4,一组是X4到X8,X1到X4是共阴极的,X5到X8是共阳极的。本实验只让共阴极的DIG1那个数码管显示数据,把别的都关掉。那只要12(X1)引脚输入低电平,986输入高电平,其他的都不会亮了,让DIG1显示什么数字,就由Y1到Y7来决定了。

经计算,让DIG1显示0到9还有小数点的表格如下:

 

 uint8  table[11]={ 0x3f, 0x30, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x80  };
        那么有了这个表格,只要一秒钟让P0换一个表格中的数值,就可以动态更新数码管的数值啦!那怎样才能1秒换一次呢,有两种方法,一种是些代码,让单片机执行一些操作,直到一秒钟过去,就更新P0,这种方法呢缺点是需要计算,要计算每个操作的指令周期和操作的执行总次数,假设有i种操作(i=1,2…n),对应的指令周期Ti,这个操作执行的总次数Si,那么总的时间间隔的计算公式是:单位是秒。各种操作的指令周期在数据手册上都可以查的到。不过一般的也没上面的公式那么复杂,一般都是一个循环,里面进行自增或者自减 操作。
        第二种方法呢就是用单片机内部的定时器,STC89C52内部有3个定时器,这里只用到一个,先看看定时器SFR的结构。图片如下:
      要用到4个寄存器,TCON,和TMOD,TH0,TL0。TCON的各个位包含了计时器T0和T1的开关和计时,尾数带1的表示和T1相关,尾数带0的表示和T0相关,TF位表示溢出位,就是计时器达到最大值,TF位就为1,TF位为1之后要么软件手动清零,或者时间中断自动硬件清零;TR呢表示计时器的运行控制,TR位置1则计时器运行,置0则停止运行。       第二个寄存器TMOD,这个寄存器的值不能单位操作,主要功能是设置计时器的工作模式,
T1和T0分别代表单片机两个计数器
GATE:该位被置位时为门控位。仅当TR1被置位并且INT1脚为高,定时器开始计数。当该位被清零时,只要TR1被置位,定时器1马上开始计数。
C/T:该位为0的时候,用作定时器,该位为1的时候,用做计数器。
00        01       10          11
模式0 模式1 模式2 模式3模式1:16位的计数器。(TH0,TL0)
模式2:自动装载8位计数器。主要应用在串口波特率发生器。
模式0&模式3:几乎不用。
TCON和TMOD复位后都会自动变成0×00.

TH0和TL0呢分别代表计数器的高8位和低8位,加起来刚好16位,可以最大值是0~65535,总共65536个数,当TH0和TL0组成16位数等于65535时TF0就会被置1,也就是溢出,这种方法的计时公式是:12*X/晶振频率=y;    X=65536- z;    y代表计时器溢出一次的时间,z表示设置TH0和TL0组成的16位数的值,而X则代表从z到65536总共有多少个数,一般的晶振频率有:6MHz,11.059MHz,12MHz,20MHz,        令X取极值,将上述晶振频率代入式中,得出从计时开始到溢出最多能记录的时间分别为130ms,71.1ms,65.5ms,39.3ms,明显这些时间都比较短(相对1s),而且不规则,1s=1000ms=20*50ms=1000*1ms=40*25ms这种整数我们比较容易接受,也更容易计算,所以应该令y为50等整数,然后再去计算出z的值,让TH0为z的高八位,TL0为z的第八位。假设晶振频率是12MHz,让y=50ms,计算得出z=15536=0x3CB0,则将TH0设为0x3C,TL0设为0xB0,TR0设为1,TMOD设为0×01,则到了50ms之后TF0就会变为1,通过判断TF0溢出知道过了50ms,判断完了之后要软件(也就是代码)对TF0清零,溢出之后TH0和TL0都会被清零,所以再将TH0和TL0设成0x3C和0xB0,每次溢出都记录一次,记录二十次之后就是过了1秒啦!1秒的定时就是这么来!额,估计被我绕晕了吧·····这个表达可能是有点问题,想看原版的,去看金沙滩工作室的视频吧,我也是从那学的。

计时器的使用步骤总结如下:

一、设置TMOD

二、     设置TH0和TL1(事先计算好值。)

三、设置TR0

最终代码如下:
#include <reg52.h>
typedef unsigned char uint8;
typedef unsigned int  uint16;

 sbit   D24 = P2^4;
 sbit   D25 = P2^5;
 sbit   U1 = P2^6;              //U1锁存器的开关
 sbit   U2 = P2^7; 		//U2锁存器的开关
 sbit 	LINX1  = P0^0;
 sbit   LINY5  = P0^4;
 sbit   LINY6  = P0^5;

 uint8  table[11]={ 0x3f, 0x30, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x80  };

 void main(void)
 {	

   uint8 counter = 0;
   uint8 offset = 0;
   TH0 = 0x3C;
   TL0 = 0xB0;
   TR0 = 1;

   TMOD = 0x01;	  //计时模式选01模式
    U2 = 1;
	P0 = 0xfe;
	U2 = 0;
    P0 = 0xff;

   D24 = 0;                //关闭8X8点阵LED
   D25 = 0;

    while(1)
	{
	 if(TF0==1)	//每次计时是50ms,达到50ms后计时器0的溢出位位1,进行软件清零和计时器初始化.
	  {
	     counter++;
		 TF0=0;
		 TH0 = 0x3C;    //12MHZ的晶振算出来是从15536开始计时,十六进制就是 0x3CB0
		 TL0 = 0xB0;    //高位取0x3C,低位取0xB0
	  }
	  if(counter==20)		 //20*50ms=1000ms=1s
	  {
	    counter=0;
		U1 = 1;
		P0 = table[offset++];
		U1 = 0;
		if(offset==11)
		{
		  offset = 0;
		}

	  }

	}

 }
[此贴子已经被作者于2012-1-7 1:07:46编辑过]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:50654 发表于 2013-6-30 20:50 | 只看该作者
这程序用汇编怎么写?尤其是//U1锁存器的开关
                                       //U2锁存器的开关
再回便利如何开关,51板子的功能选择不太会,不知道怎么选区相应部件
回复

使用道具 举报

板凳
ID:56623 发表于 2013-11-4 18:34 | 只看该作者
赞,,,,,,,,,,,,,,,,,,,,,
回复

使用道具 举报

地板
ID:56623 发表于 2013-11-4 18:35 | 只看该作者
楼主不错,,期待更多的作品,,
回复

使用道具 举报

5#
ID:66061 发表于 2014-10-12 22:11 | 只看该作者
楼主厉害!终于把数码管搞明白了,就是不太懂这几条语句有什么作用?是否多余?
typedef unsigned int  uint16;??????

sbit         LINX1  = P0^0;?????
sbit   LINY5  = P0^4;????
sbit   LINY6  = P0^5;??????
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表