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

📄 clock.c

📁 一个数字时钟的单片机程序
💻 C
字号:
#include <AT892051.h>
#define uchar unsigned char
#define uint unsigned int
/********全局变量定义*******/
uchar hour=0,min=0,sec=0,ms=0;
uchar flag=0;
int time_i;       //
/*********************引脚定义**************************/
sbit com1 = 0xB0;
sbit com2 = 0xB1;
sbit com3 = 0xB4;
sbit com4 = 0xB5;
sbit dot  = 0x97;   //dot=P1.7
sbit plus = 0xB7;
sbit minus = 0xB3;
sbit int0 = 0xB2;
/***************七段数码管,共阳极代码***********************/
const char code seg[]=
{
        0xc0,    //0
        0xf9,    //1
        0xa4,    //2
        0xb0,    //3
        0x99,
        0x92,
        0x82,
        0xf8,
        0x80,
        0x90,    //9
};
/**************函数声明********************/
      void inti(void);//程序初始化
      void display(void);//显示子程序
      void display_hour(uchar);//小时显示
      void display_min(uchar);//分钟显示
      void delay10ms(void);//延时10ms
      void key();//键盘扫描
      void manage_plus(void);//加程序
      void manage_minus(void);//减程序
      void time_set(void);//时钟设置子程序
      void time1(void);  //定时器中断
      void ex0_isr(void);//中断0程序
      
void main()
{
      inti();   //程序初始化
      //time_set();
      //while(1);
      while(1)display();//时钟显示

}


/***************小时显示程序******************/
void display_hour(uchar a)
{
    uchar sw,gw;
    if(a<10)
    {
        com2=0;
        P1=seg[a];
        delay10ms();
        com2=1;
        delay10ms();
        delay10ms();
        delay10ms();
     }
    else
      {
       sw=a/10;
       gw=a%10;
       com1=0;
       P1=seg[sw];
       delay10ms();
       com1=1;
       delay10ms();
       com2=0;
       P1=seg[gw];
       delay10ms();
       com2=1;
       delay10ms();
      }
}
/***************分钟显示程序******************/
void display_min(uchar b)
{
     uchar gw,sw;
     gw=b%10;
     sw=b/10;
     com3=0;
     P1=seg[sw];
     delay10ms();
     com3=1;
     delay10ms();
     com4=0;
     P1=seg[gw];
     delay10ms();
     com4=1;
     delay10ms();
}
/*****************显示子程序*************************/
void display()
{
   display_hour(hour);
   display_min(min);
   if (ms>125)
     {
       com2=0;
       P1=0xff;
       dot=0;       //秒针闪动一次
       delay10ms();
       com2=1;
       delay10ms();
     }
   else
     {
       delay10ms();
       delay10ms();
     }
}
/**********************初始化程序**********************/
void inti(void)
{
    EA=1;
    //初始化定时计数器控制寄存器
    TMOD=0X10;
    ET1=1;//打开定时计数器1溢出中断
    TH1=-4242/256;
    TL1=-4242%256;
    TR1=1;
    EX0=1;//打开中断0
    IT0=1;//后跳沿有效

}
/*********************键盘扫描程序*********************/
void key()
{
        plus=1;
        //delay10ms();
        if(plus==0)
          {
            while(plus==0);//等待键盘释放
            delay10ms();//  键盘消抖动
            manage_plus();
          }
        minus=1;
        //delay10ms();
        if(minus==0)
          {
            while(minus==0);//等待键盘释放
            delay10ms();//  键盘消抖动
            manage_minus();
          }
        int0=1;
        //delay10ms();
        if(int0==0)
          {
            while(int0==0);//等待键盘释放
            delay10ms();//  键盘消抖动
            flag++;
          }

}
/*********************加程序******************************/
void manage_plus()
{
     if(flag==1)
      {
         min++;
         if(min==60)min=0;
      }
     if(flag==2)
       {
          hour++;
          if(hour==24)hour=0;
       }
}
/*********************减程序******************************/
void manage_minus()
{
     if(flag==1)
       {
          if(min==0)min=60;
          min--;
       }
      if(flag==2)
        {
          if(hour==0)hour=24;
          hour--;
        }
}
/**********************中断0**************************/
void ex0_isr() interrupt 0
{
    EA=0;
    delay10ms();     //键盘消抖动
    if(int0==0)      //判断是否干扰
      {               //的确有键按下
         while(int0==0); //等待键盘释放
         delay10ms();//  键盘消抖动
         flag=1;
         time_set();
      }
     EA=1;
}
/***********************延时子程序*********************/
//延时时间为10ms
void delay10ms()
{
    uint i;
    for(i=150;i>0;i--);
}
/*********************定时子程序*************************/
//定时器1中断服务子程序
//定时工作方式1
void time1(void)interrupt 3
{

     ms++;
    if(ms==250)
        {
           ms=0;
           sec++;
           if(sec==60)
             {
                sec=0;
                ms+=12;
                min++;
                if(min==60)
                   {
                     min=0;
                     ms+=27;
                     hour++;
                     if(hour==24)
                        {
                          hour=0;
                        }
                    }
             }

        }
    TH1=-4242/256;
    TL1=-4242%256;   //重新初始化值
    ET1=1;//打开定时计数器1溢出中断
}
/*******************时钟设置子程序**********************/
void time_set()
{
    while(1)
       {
         if(flag==3)break;
         key();
         if(flag==1)
           {
             time_i++;
             if(time_i>100)
             {
                display_min(min);
                if(time_i>150)time_i=0;
              }
             display_hour(hour);
           }
         if(flag==2)
           {
             time_i++;
             if(time_i>100)
                {
                   display_hour(hour);
                   if(time_i>150)time_i=0;
                 }
             display_min(min);
           }
        }
}






⌨️ 快捷键说明

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