微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 怎么在里面添加一个闹钟啊?在调闹钟的时候要关闭定时器的吗?

怎么在里面添加一个闹钟啊?在调闹钟的时候要关闭定时器的吗?

时间:10-02 整理:3721RD 点击:
#include <reg51.h>      //添加头文件
#define uint unsigned int   
#define uchar unsigned char
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
uint num;
uchar H,M,S,count=0;     //时分秒
uchar DAT[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};    //共阴数码管编码0~9
void key();
void delay(unsigned int i)
{
    char j;
    for(i; i > 0; i--)
    {
                for(j = 200; j > 0; j--);
        }
}
void judge()   //改变时分秒的值,使分秒都为60进制,时为24进制
{
        if(S==60)
        {
                S=0;
                M++;
        }
        if(M==60)
        {
                M=0;
                H++;
        }
        if(H==24)
        {
                H=0;
        }
}
void show()   //显示函数,P2为位选,P0为段选
{
                P2=0X7F;
                P0=DAT[H/10];
                delay(150);    //第一位选中时,显示时的高位,延时下   
                P2=0XBF;
                P0=DAT[H%10];
                delay(150);    //第二位选中时,显示时的低位,延时下
                P2=0XDF;
                P0=0X40;
                delay(150);         //第三位选中时,显示“-”,延时下
                P2=0XEF;
                P0=DAT[M/10];
                delay(150);    //第四位选中时,显示分的高位,延时下
                P2=0XF7;
                P0=DAT[M%10];
                delay(150);    //第五位选中时,显示分的低位,延时下
                P2=0XFB;
                P0=0X40;
                delay(150);         //第六位选中时,显示“-”,延时下
                P2=0XFD;
                P0=DAT[S/10];
                delay(150);    //第七位选中时,显示秒的高位,延时下
                P2=0XFE;
                P0=DAT[S%10];
                delay(150);    //第八位选中时,显示秒的低位,延时?
}
void main()    //主函数
{
        TMOD=0X01;    //定时器0工作在方式1
        TH0=(65536-50000)/256;     
        TL0=(65536-50000)%256;    //设置定时器的初值,使得定时时间为50ms(晶振为12MHZ时)
        EA=1;        //开启总中断
        ET0=1;       //允许定时器0中断
        TR0=1;       //开启定时器0
        while(1){
        show();      //一直执行显示函
        key();
}
}
void timer0()interrupt 1  //定时器0中断服务程序
{
        TH0=(65536-50000)/256;     
        TL0=(65536-50000)%256;           //重新设置初值
        count++;          //每中断一次,计数寄存器加1
        if(count>=20)     //当定时20次时,即50MS*20=1000ms=1s
        {
                count=0;         //将计数值重新归零
                S++;
                judge();          //修改时分秒的值
        }
}
void key()      //按键函数,功能为对时间进行调整
{
        if(K1==0)     //key1键按下进入选择并停止定时器
        {
                delay(10);
                while(!K1);    //松手检测
                TR0=0;
                num++;      //每按一次key1  num自加1
        }
        if(num==1)      //key1按一次进行“小时”调整
        {
           if(K2==0)     //key2按下时间增加
           {
                   delay(10);
                   while(!K2);
                    H++;
                   if(H==24)
                   H=0;
           }
          if(K3==0)      //key3按下时间减少
          {
                  delay(10);
                  while(!K3);
                  H--;
                  if(H<0)
                  H=23;
          }
        }
        if(num==2)       //按下key1两次进行“分钟调整”
        {
           if(K2==0)
           {
                   delay(10);
                   while(!K2);
                    M++;
                   if(M==60)
                   M=0;
           }
          if(K3==0)
          {
                  delay(10);
                  while(!K3);
                  M--;
                  if(M<0)
                  M=59;
          }
        }
        if(num==3)       //key1按下三次对“秒”进行调节
        {
            if(K2==0)
           {
                   delay(10);
                   while(!K2);
                    S++;
                   if(S==60)
                   S=0;
           }
          if(K3==0)
          {
                  delay(10);
                  while(!K3);
                  S--;
                  if(S<0)
                  S=59;
          }
        }
        if(num==4)     //key1按下四次认为调节完毕开启定时器并将num清0
        {                                  
                num=0;
                TR0=1;
        }
}

有按键按下进入闹钟设置,不管定时器,打开显示然后调整,完了之后跳回到时间显示就好了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top