数码管99数字计数器设计

基于AT89C51单片机

用单片机上两个数码管显示;用按键实现计数器启动功能、计数满99后嗡鸣器报警,计数器自动清零;

用按键控模拟计数脉冲加、减;

#include <REGX52.H>//头文件
sbit w1 = P1^0;sbit w2 = P1^1;sbit w3 = P1^2;sbit w4 = P1^3;
sbit d1 = P0^0;sbit d2 = P0^1;sbit d3 = P0^2;sbit d4 = P0^3;
sbit d5 = P0^4;sbit d6 = P0^5;sbit d7 = P0^6;sbit d8 = P0^7;
sbit K1 = P3^2;sbit K2 = P3^3;sbit K3 = P3^4;sbit K4 = P3^5;
sbit K5 = P3^6;sbit K6 = P3^7;sbit  S = P1^7;sbit  J = P1^6;
char code led_wei[]={0xfe,0xfd,0xfb,0xf7};
unsigned char led[]={ 
 
                0xC0,  //"0"
                0xF9,  //"1"
                0xA4,  //"2"
                0xB0,  //"3"
                0x99,  //"4"
                0x92,  //"5"
                0x82,  //"6"
                0xF8,  //"7"
                0x80,  //"8"
                0x90,  //"9"
                0x88,  //"A"
                0x83,  //"B"
                0xC6,  //"C"
                0xA1,  //"D"
                0x86,  //"E"
                0x8E,  //"F"
                0x89,  //"H"
                0xC7,  //"L"
                0xC8,  //"n"
                0xC1,  //"u"
                0x8C,  //"P"
                0xA3,  //"o"
                0xBF,  //"-"
                0xFF,  //
 
                         };
void delay(int i)//延时子程序
{int k;//定义字符k
   for(k=0;k<i;k++);//for循环
      } 

void display(int j)//数码管显示子程序
{	int qian, shi,ge,bai;	//定义字符qian,shi,ge,bai
	qian=j/1000;//j值除1000取整赋值给字符qian
	bai=j%1000/100;//j值的百位数字赋值给字符bai
	shi = j%100/10; //j值的十位数字赋值给字符shi
	ge  = j%100%10;//j值的个位数字赋值给字符ge
	P0 = 0xff;//P0←0xff(数码管全灭)
  P1 =led_wei[1] ;//数码管十位显示
	P0 = led[shi];//十位显示数字
	delay(200);//延时
		
	P0 = 0xff;//P0←0xff(数码管全灭)
  P1 =led_wei[0] ;//数码管个位显示
	P0 = led[ge];//十位显示数字
	delay(200);	//延时	
}

void soft_reset(void)//复位子程序
{((void(code*)(void))0)();}

void main()
{ 	int m=0;//定义m=0
	while(1)//循环
	{	if(K6==0)//判断按键是否按下
	   {
	      delay(5);//延时
	      if(K6==0)//判断按键是否按下
		 {
		    m++;//m自增1
		    while(!K6);//判断按键是否抬起
		       }
		       }
		        if(K5==0)//判断按键是否按下
	   {
	      delay(5);//延时
	      if(K5==0)//判断按键是否按下
		 {
		    m--;//m自减1
		    while(!K5);//判断按键是否抬起
		       }
		       }

		       display(m);//
		       if(m==99)//判断数码管显示99时报警并复位
	{
	S=0;//蜂鸣器响起
	   delay(20000);//延时
	   S=1;//蜂鸣器关闭
	   soft_reset();//复位
	}
}}