基于51的数码管计数器

 
/***********************************************/
//作者:  元培电信1601旺仔   2018/1/6
/***********************************************/

#include "reg52.h"		 

typedef unsigned int u16;	  
typedef unsigned char u8;
#define N 2500
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f};//显示0~9的值

u16 number[9];	    
u16 minute,sec,mse,i,a;	    //这里的minute是分计时部分,sec是秒部分,mse是毫秒部分

void _time();
void timedeal();
void display();
 
void main()
{	
	minute=0;sec=0;mse=0;
	i=0;a=0;
	_time();
	timedeal();
	while(1)
	{
		timedeal();
		display();
    }
}
void timedeal()
{
 	number[0]=mse%10;  //时,分,秒每个两位
	number[1]=mse/10;

	number[3]=sec%10;
	number[4]=sec/10;

	number[6]=minute%10;
	number[7]=minute/10;
}
void display()
{
	if(a==5)
	{
		mse++;
		a=0;
	}
	if(mse>99)
	{
		mse=0;
		sec++;
	}
	if(sec>60)
	{
		sec=0;
		minute++;
	}
	if(minute>60)
	{
		minute=0;
		sec=0;
		mse=0;
	}
}
void _time()
{
	TMOD=0x01;//定义为定时器0为方式1,16位
	TH0=(65536-N)/256;	 //计时到65536则溢出 ,则N多少为时间,也可以TH0=(-5000)<<8
	TL0=(65536-N)%256;
	EA=1;//总中段
	ET0=1;//开定时器0的中断
	TR0=1;//启动
}
void T0_time() interrupt 1
{
	TH0=(65536-N)/256;	 //计时到65536则溢出 ,则N多少为时间,也可以TH0=(-5000)<<8
	TL0=(65536-N)%256;
	P2=i<<2;            //因为位选定义的是P2^2	,P2^3,  P2^4,所以i要左移两位对P2口进行操作
	if(i==1)
	{
		P0=smgduan[number[i]]|0x80;	
	}  //这个是毫秒部位的的那个小数点
	else if(i==2||i==5)	 // 当扫描到两个单位之间的分隔 “-”时就不是显示时间数了
	{				     //要显示“——“,所以是要数码管的g段亮,因为开发板板数码 
 		P0=0x40;		 //管是共阴的,所以是0x40,就是 0100 0000 
	}         
	else{
		P0=smgduan[number[i]];}								   
	i++;
	if(i==8)
		i=0;
	a++;
}

你可能感兴趣的:(51单片机)