51单片机——时钟显示

一、硬件电路:AT89C51,上拉电阻,共阳数码管

1.整体电路图

238b6d92da7b4fc6b01e5199e4c1b470.png(在这里我没有给单片机接晶振部分的时钟电路以及其他一些基本电路,因为在proteus里面不需要接也能正常工作,仿真就是仿真,但在实际电路中还是有些本质区别的,所以实际电路中一定要接,实际中显示与仿真还是有区别的。同时在实际中不会出现这种不亮的情况,只会亮度更低,如果亮度低了就加延时,如果肉眼分辨的出每位亮起的时间差就减少延时。)

2.八段式数码管e3a83fd79c064200a535ccf71d033492.png

从数码管电极性质可分为共阳数码管(CA)和共阴数码管(CC),共阴接法(左)的com端接低电平,共阳接法(右)的com端接电高电平,a,b,c,d,e,f,g,dp分别对应数码管上的一段。

字形码代码表
显示字符段符号十六进制
dpgfedcba共阴极共阳极
0001111113FC0
10000011006F9
2010110115BA4
3010011114FB0
4011001106699
5011011016D92
6011111017D82
70000011107F8
8011111117F80
9011011116F

     90

 

二、工程源码:

#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int

uchar data table_w[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//共阳数码管位码组
uchar data table_d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管段码组
uchar count,shi=23,fen=59,miao=50;//定义时分秒
void delayms(uchar x)//延时函数
{ uchar i,j;
	for(i=0;i<x;i++)
	for(j=0;j<120;j++);}  

void t0_init()
{
	TMOD=0x01;//设置T0为方式1定时
	TH0=15536/256;//装初值的高8位
	TL0=15536%256;//装初值的低8位
	ET0=1;//开启定时器中断允许
	EA=1;//开启总中断
    TR0=1;//T0运行控制位1,启动定时器0
}
void t0_break()interrupt 1//中断服务程序,1代表0003B入口
{   TH0=15536/256;
	TL0=15536%256;	
	count++;//计数20次
	if(count==20)//20*50=1000ms=1s,即每隔1s加1
	{
		miao++;
		count=0;
	}	
	if(miao==60)//miao=60时清零,分加1
	{
		fen=fen+1;
		miao=0;	
	}
	if(fen==60)
	{
		shi=shi+1;
	    fen=0;
    }
	    if(shi==24)
	    {shi=0;}
	}


void display(uchar wei,uchar duan)//定义P0,P2端口
{
  P2=table_w[wei];
  P0=table_d[duan];
	delayms(5);
}
void main()
{
	t0_init();
	while(1)
	{
		display(0,shi/10);//shi/10高八位取整(十位)
		delayms(10);		
		display(1,shi%10);//shi%10低八位取余(个位)
		delayms(10);		
		display(3,fen/10);
		delayms(10);
		display(4,fen%10);
		delayms(10);
		display(6,miao/10);
		delayms(10);
  	    display(7,miao%10);
		delayms(10);
	}
}