⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 很实用的单片机例程
💻 C
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
             //段码: 0     1    2    3    4    5    6    7    8    9 
uchar n,aa,shi,fen,miao,miaoge,miaoshi,fenge,fenshi,shige,shishi;
sbit S2=P3^4;    //秒表功能
sbit S3=P3^5;    //调分
sbit S4=P3^6;    //调时
sbit S5=P3^7;    //时,分,秒清零
sbit wela=P2^7;	  //位选控制
sbit dula=P2^6;	  //段选控制

void delayms(uint z);//延时函数声明
void keyscan();    //键盘扫描函数声明
void display();    //显示函数声明
void init();       //初始化函数声明
/***************主函数**************/
void main()
{
  init();		  //初始化
  while(1)
  {
    display();
    keyscan();
  }
}
/*************初始化函数************/
void init()
{ 
  miao=0;			   //秒分时的初始化
  fen=0;
  shi=0;
  aa=0;
  n=0;
  TMOD=0x11;			 	//设置定时器0和1为工作方式1
  TH0=(65536-50000)/256;	//装设初值
  TL0=(65536-50000)%256;    
  EA=1;						//开启总中断
  ET0=1;					//开启定时器0中断
  TR0=1;					//启动定时器0
  TH1=(65536-5000)/256;		//装设初值
  TL1=(65536-5000)%256;
  ET1=1;					//开启定时器0中断
  TR1=1;					//启动定时器0
}
/********定时器T0中断函数**********/
void t0(void) interrupt 1 
{
 TH0=(65536-50000)/256;		//装设初值
 TL0=(65536-50000)%256;
 aa++;
 if(aa==18)					//到达1秒重新计数并将1秒累加
  {
    aa=0;					 //归零
    miao++;
    if(miao==60)
    {
      miao=0;			    //如果秒累加为60则清零同时分钟累加计数
      fen++;
       if(fen==60)		   //如果分钟累加到60清零时进位
        {
           fen=0;
           shi++;
          if(shi==24)	   //如果时累加到60清零时进位
             shi=0;
        }
    }
  }
  miaoge=miao%10;		   	  //将累加的秒de个ge位分离出来    
  miaoshi=miao/10;			 //将累加的秒de个十位分离出来
  fenge=fen%10;				//将累加的分de个ge位分离出来
  fenshi=fen/10;		   	//将累加的分钟de个十位分离出来
  shige=shi%10;			   //将累加的时de个ge位分离出来
  shishi=shi/10;		   //将累加的时de个十位分离出来
}
/********定时器T1中断函数**********/
void t1(void) interrupt 3		//按键处理
{
   TH1=(65536-5000)/256;
   TL1=(65536-5000)%256;
   n++;
   if(n==20) //每秒检测一次key1按键
    {
      n=0;
     if(S2==0)
      {
        delayms(10);
          if(S2==0) //key1按键确实被按下
            { 
               miao++;			  //秒加1
                 if(miao==60)	  //秒到60时分进位
                   {
                      miao=0;
                        fen++;
                      if(fen==60)  //分到60时时进位
                       {
                           fen=0;
                           shi++;
                           if(shi==24)	 //时到24时归零
                                 shi=0;
                                
                       }
                   }
            }                           
       }
      
    }
    
}
/*************延时函数*************/
void delayms(uint z)
{
  uint x,y;
  for(x=z;z>0;z--)
    for(y=110;y>0;y--);
}
/*************显示函数*************/
void display()
{
	dula=1;				 //hour的十位显示
	P0=table[shishi];		 
	dula=0;
    P0=0xff;
	wela=1;
	P0=0xfe;
 	wela=0;
	delayms(10);

	dula=1;				 //hour的个位显示
	P0=table[shige];		 
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xfd;
	wela=0;
	delayms(1);
	 
	dula=1;				 //min的十位显示
	P0=table[fenshi];		 
	dula=0;
    P0=0xff;
	wela=1;
	P0=0xfb;
	wela=0;
	delayms(1);

	dula=1;				 //min的个位显示
	P0=table[fenge];		 
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xf7;
	wela=0;
	delayms(1);

	dula=1;				 //sec的十位显示
	P0=table[miaoshi];		 
	dula=0;
    P0=0xff;
	wela=1;
	P0=0xef;
	wela=0;
	delayms(1);

	dula=1;				 //sec的个位显示
	P0=table[miaoge];		  
	dula=0;
	P0=0xff;
	wela=1;
	P0=0xdf;
	wela=0;
	delayms(1);
   
}
/***********键盘扫描函数*************/
void keyscan()
{
  if(S3==0)
   {
    delayms(10);
     if(S3==0)		 //key2按键确实被按下
       {
          fen++;		  //分进位到60时并清零
            if(fen==60)
             {
               fen=0;
             }
            while(!S3);
            fenge=fen%10;	 //将累加的分钟de个十位和个位分离出来
            fenshi=fen/10;	 
       }
    }
   if(S4==0)
    {
     delayms(10);
        if(S4==0)		//key3按键确实被按下
         {
            shi++;		//时进位到24时并清零
              if(shi==24)
                {
                  shi=0;
                }
              while(!S4)
              shige=shi%10;	  //将累加的时de个十位和个位分离出来
              shishi=shi/10;
                       
         }
     }
   if(S5==0)
    {
     delayms(10);
       if(S5==0)		 //key4按键确实被按下
         { 
           while(!S5);	
           miao=0;		   //将秒分时归零
           fen=0;
           shi=0;
         }
    }
}  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -