标签:单片机C51数码管

在之前的文章中我们学习了多位数码管的倒计时,下面我们将对多位数码管对实际生活中的时间来进行显示,该功能的实现也并不复杂,将数码管知识相结合并运用起来,就可以完成一个属于自己的时钟了。

一、功能概述

实现对时间的计数我们需要用到单片机中的定时器模块,定时器的本质上就是每经过一个单片机自己机械周期就会加一的寄存器。定时器也可以是一个中断,当到达了给定时时间后就会执行相对应的程序。

了解了定时器的原理和使用方法,我们就可以选择我们需要的多位数码管来进行电路的设计了。

二、显示原理

既然我们需要现实的是时分秒的时间,那么我们可以选用六位的数码管,每两个数码管分别显示时、分、秒。而控制每一个数码管都需要段码线和选位线来控制,这样也节省了我们所需要使用的单片机IO口。

三、电路连接

使用Proteus进行电路图仿真:

四、程序设计

程序代码:

#includereg51.h

typedefunsignedcharuchar;typedefunsignedintuint;ucharcodenum[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0~9字码ucharmiao=0,fen=0,shi=0;//进位标志位uinti=0;//计时ucharmiao_L,miao_H,fen_L,fen_H,shi_L,shi_H;//时、分、秒的个位(xxx_L)和十位(xxx_H)voiddelay(uintx){//延时函数while(x--);}voidT0_init(){//定时器0初始化TMOD=0x01;//工作方式1TH0=0x3c;//高八位赋初值-==3cb0HTL0=0xb0;//底八位赋初值EA=1;//开总中断ET0=1;//开T0中断TR0=1;//启动T0}voiddisplay(){//显示P2=0x20;//秒与分间隔线P0=0xbf;delay();P2=0x04;//分与时间隔线P0=0xbf;delay();P2=0x80;//数码管位选P0=num[miao_L];//秒个位delay();P2=0x40;//数码管位选P0=num[miao_H];//秒十位delay();P2=0x10;//数码管位选P0=num[fen_L];//分个位delay();P2=0x08;//数码管位选P0=num[fen_H];//分十位delay();P2=0x02;//数码管位选P0=num[shi_L];//分个位delay();P2=0x01;//数码管位选P0=num[shi_H];//分十位delay();}voidmain(){T0_init();//定时器初始化while(1){display();//显示}}voidtimer0_int()interrupt1{//中断服务函数i++;if(i==20){i=0;//满一秒清零miao++;//i=为一,秒标志位加1if(miao==60){miao=0;//满一分清零fen++;if(fen==60){fen=0;//满一时清零shi++;if(shi==24){shi=0;//24小时制fen=0;miao=0;}}}miao_L=miao%10;//秒个位miao_H=miao/10;//秒十位fen_L=fen%10;//分个位fen_H=fen/10;//分十位shi_L=shi%10;//时个位shi_H=shi/10;//时十位}}

五、总结

本章对多位数码管的使用进行了更深一步的研究,更加贴近我们的生活。一个复杂的程序都是由简单的程序慢慢延伸下去的,都不是一蹴而就的,其实在我们一步一步的学习中,我们已经能对生活中的电子产品进行自己的修改了,下一章我们将学习如何更为合理的使用定时器来对数码管的显示进行控制。



转载请注明地址:http://www.abmjc.com/zcmbwh/1580.html