使用单片机编写四位数码管显示计时分钟和秒的代码

8051系列单片机有两个定时器:T0和T1,分别称为定时器和定时器T1,这两个定时器都是16位的定时器/计数器;8052系列单片机增加了第三个定时器/计数器T2;它们都有定时或事件计数功能,常用于时间控制、延时、对外部时间计数和检测等场合。

8051单片机的两个定时器T0和T1分别都由两个特殊功能寄存器组成;T0由特殊功能寄存器TH0和TL0构成,而T1则是由TH1和TL1构成。

TF0是定时/计数器0的溢出指示,平时为0,溢出时为1.

TR0是定时/计数器0的运行控制位,只有当TR0置1时,定时/计数器0才会工作。TF0响应中断程序后,该标志位自动清零,如果不用中断则需要手动清零。

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^7;
sbit du = P2^6;
uchar counter,time_counter,gg;
uchar code leddata[] = {	   //数码管显示数字数组			(这是共阴极的数码管表达方式)
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x76,0x38,0x37,0x3E,0x73,0x5C,0x40,0x00
};

void delay(int z) {			 //设置延时函数
	int x ,y;
	for(x=z;x>0;x--)
	for(y=114;y>0;y--) ;
}
void display(uchar i,uchar gg) {		 //用i来代替   time_counter
    uchar shi,ge;			//定义个位和十位   (其实用uchar和char都可以,这是我认为的)
	shi = i/10; //求模	 十位
	ge = i%10; //求余	 个位
	
	P0 = 0xff;		 //1111 1111   
	we = 1;			  //设置位选
	P0=0xbf;//1011 1111点亮第七位数码管
	we = 0;

	du = 1;				  //设置段选
	P0=leddata[shi];   //设置第七位数码管作为十位数的摆放位置
	du=0;
	delay(1);      //肉眼分辨不出来(因为速度太快)  所以会同时数码管会同时显示)

	P0 = 0xff;
	we = 1;
	P0 = 0x7f; //0111  1111   点亮第八位数码管
	we = 0;

	du = 1;
	P0 = leddata[ge];
	du = 0;
	delay(1);

	P0 = 0xff;
	we = 1;
	P0 = 0xdf; 	   //1101 1111  点亮第六位数码管 作为分钟的摆放位置
	we = 0;
  


	du = 1;
	P0 = leddata[gg]|0X80;		//点亮第六位的小数点位置!!!
	du = 0;
	delay(1);
		
}

void main(){


	TMOD = 0x01;
	TR0  = 1;
	TH0 = (65536-46080)/256;	    //50ms
	TL0 = (65536-46080)%256;

	while(1) {
	

		if(TF0 == 1){
			TF0 = 0;
			TH0 = (65536-46080)/256;	    //50ms
	TL0 = (65536-46080)%256;
			counter++;
		}
		if(counter == 20){	     //如果时间达到50ms*20=1000ms=1s的时候则计数清零
			counter = 0;
			time_counter++;
		}
		if(time_counter == 60)	{
		time_counter = 0;
		gg++;			     //若达到了一分钟 则gg++   (依次循环下去)
	
		}
		
		display(time_counter,gg);   //在调用display这个函数
	}

	
}

 

ps:如果不清楚46080怎么来 可以参考:http://t.csdn.cn/kAgd8

物联沃分享整理
物联沃-IOTWORD物联网 » 使用单片机编写四位数码管显示计时分钟和秒的代码

发表评论