您的位置 首页 电路

C51单片机LED数码管计数器的规划

C51单片机LED数码管计数器的设计-该部分的硬件电路如图所示,U1的P0口和P2口的部份引脚构成了6位LED数码管驱动电路,数码管采用共阳型,使用PNP型三极管作为片选端的驱动,所 有三极管的发射极连在一起,接到正电源端,它们的基极则分别连到P2.0…P2.5,当P2.0…P2.5中某引脚输是低电平时,三极管导通,给相应的数 码管供电,该位数码管点亮哪些笔段,则取决于笔段引脚是高或低电平。

该部分的硬件电路如图所示,U1的P0口和P2口的部份引脚构成了6位LED数码管驱动电路,数码管选用共阳型,运用PNP型三极管作为片选端的驱动,所 有三极管的发射极连在一起,接到正电源端,它们的基极则别离连到P2.0…P2.5,当P2.0…P2.5中某引脚输是低电平时,三极管导通,给相应的数 码管供电,该位数码管点亮哪些笔段,则取决于笔段引脚是高或低电平。图中看出,一切6位数码管的笔段连在一起,经过限流电阻后接到P0口,因而,哪些笔段 亮就取决于P0口的8根线的状况。

C51单片机LED数码管计数器的规划

编写程序时,首要依据硬件连线写出LED数码管的字形码、位驱动码,然后编写程序如下:

#include “reg51.h”

#define uchar unsigned char

#define uint unsigned int

uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB}; //位驱动码

uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; //字形码

uchar DispBuf[6]; //显现缓冲区

void TImer1() interrupt 3

{ uchar tmp;

uchar Count; //计数器,显现程序经过它得知现正显现哪个数码管

TH1=(65536-3000)/256;

TL1=(65536-3000)%256; //重置初值

tmp=BitTab[Count]; //取位值

P2=P2|0xfc; //P2与11111100B相或

P2=P2&tmp; //P2与取出的位值相与

tmp=DispBuf[Count];//取出待显现的数

tmp=DispTab[tmp]; //取字形码

P0=tmp;

Count++;

if(Count==6)

Count=0;

}

void main()

{ uint tmp;

P1=0xff;

P0=0xff;

TMOD=0x15; //守时器0作业于计数办法1,守时器1作业于守时办法1

TH1=(65536-3000)/256;

TL1=(65536-3000)%256; //守时时刻为3000个周期

TR0=1; //计数器0开端运转

TR1=1;

EA=1;

ET1=1;

for(;;)

{ tmp=TL0|(TH0《《8); //取T0中的数值

DispBuf[5]=tmp%10;

tmp/=10;

DispBuf[4]=tmp%10;

tmp/=10;

DispBuf[3]=tmp%10;

tmp/=10;

DispBuf[2]=tmp%10;

DispBuf[1]=tmp/10;

DispBuf[0]=0;

}}

这个程序顶用到了一个新的知识点,即数组,首要作一个介绍。

数组是C51的一种结构数据类型,数组必须由具有相同数据类型的元素构成,这些数据的类型便是数组的根本类型,如:数组中的一切元素都是整型,则该数组称为整型数组,如一切元素都是字符型,则该数组称为字符型数组。

数组必需求先界说,后运用,这儿仅介绍一维数组的界说,其办法为:

类型说明符 数组名[整型表达式]

界说好数组后,能够经过:数组名[整型表达式]来运用数组元素。

在界说数组时,能够对数组进行初始化,即给其赋予初值,这可用以下的一些办法完结:

1.在界说数组时对数组的悉数元素赋予初值:

例:int a[5]={1,2,3,4,5};

2.只对数组的部分元素初始化;

例:int a[5]={1,2};

上面界说的a数组共有5个元素,但只对前两个赋初值,因而a[0]和a[1]的值是1、2,而后边3个元素的值满是0。

3.在界说数组时对数组元素的悉数元素不赋初值,则数组元素值均被初始化为0

4.能够在界说时不指明数组元素的个数,而依据赋值部分由编译器主动承认

例:uchar BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};则相当于界说了一个BitTab[6]这样一个数组。

5.能够为数组指定存储空间,这个比如中,未指定空间时,将数组界说在内部RAM中,能够用code要害字将数组元素界说在ROM空间中。

uchar code BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};

用这两种界说别离编译,能够看出运用了code要害字后体系占用的RAM数减少了,这种办法用于编程中不需求改动内容的场合,如显现数码管的字形码等是很适宜的。

6.C言语并不对越界运用数组进行检测,例如上例中数组的长度是6,其元素应该是从BitTab[0]~BitTab[5],可是假如你在程序中写上 BitTab[6],编译器并不会以为这有语法错误,也不会给出正告(其他言语如BASCI等则有严厉的规则,这种状况将视为语法错误),因而,编程者必 须自己当心承认这是否是你需求的成果。

程序剖析:程序中将守时器T1用作数码管显现,经过interrupt 3要害字界说函数TImer1()为守时器1中止服务程序,在这个中止服务程序中,运用TH1=(65536-3000)/256;

TL1=(65536-3000)%256;

来重置守时器初值,这其间3000即为守时周期,这样的写法能够直观地看到守时周期数,是常用的一种写法。其他程序段别离完结取位码以挑选数码管、从 显现缓冲区取得待显现数值、依据该数值取段码以点亮相应笔段等使命。其间运用了一个计数器,该计数器的值从0~5对应第1到第6位的数码管。

主程序的榜首部分是做一些初始化的操作,设置守时器作业方法、敞开守时器T1、敞开计数器T0、敞开T1中止及总中止,随后进入主循环,主循环首要用 unsigned int型变量tmp取出T0中的数值,这儿运用了“tmp=TL0|(TH0《《8);”这样的方法,这相当于 tmp=TH0*256+TL0,但比之于后一种方法,该办法能够得到更高的效,这以后便是将tmp值不断地除10取整,这样将int型数据的各位别离并送 入相应的显现 .

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/345947.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部