微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > mini电子时钟程序

mini电子时钟程序

时间:10-02 整理:3721RD 点击:
/*********************************************************************************************/
#include <STC11Fxx.H> //STC头文件
/**********************************************************************************************/
//“程序开发调试设置项”
#define DY_LI   9  //设置LED显示的亮度(值域:1~9)
#define DY_DELAY  10  //设置每一个点显示的时间长度(1~20)
#define DY_LONG   30 //闹铃鸣响的时间长度(秒)(值域:1~59)
/**********************************************************************************************/
sbit DY_LED1_H1 =P2 ^ 7; //设置LED点阵屏连接的I/O口
sbit DY_LED1_H2 =P4 ^ 6; //设置LED点阵屏连接的I/O口
sbit DY_LED1_H3 =P0 ^ 7; //设置LED点阵屏连接的I/O口
sbit DY_LED1_H4 =P1 ^ 7; //设置LED点阵屏连接的I/O口
sbit DY_LED1_L1 =P4 ^ 4; //设置LED点阵屏连接的I/O口
sbit DY_LED1_L2 =P0 ^ 6; //设置LED点阵屏连接的I/O口
sbit DY_LED1_L3 =P3 ^ 0; //设置LED点阵屏连接的I/O口
sbit DY_LED1_L4 =P3 ^ 2; //设置LED点阵屏连接的I/O口
sbit DY_LED1_L5 =P3 ^ 3; //设置LED点阵屏连接的I/O口
sbit DY_LED1_L6 =P4 ^ 5; //设置LED点阵屏连接的I/O口
sbit DY_LED1_L7 =P4 ^ 7; //设置LED点阵屏连接的I/O口
sbit DY_LED1_L8 =P3 ^ 1; //设置LED点阵屏连接的I/O口
sbit DY_BEEP  =P1 ^ 0; //扬声器
sbit DY_KEY1  =P2 ^ 2; //按键1
sbit DY_KEY2  =P2 ^ 6; //按键2
sbit DY_KEY3  =P0 ^ 5; //按键3
sbit DY_KEY4  =P0 ^ 1; //按键4
#define DY_P0M1SET  0x22 //设置I/O口工作方式//00100010
#define DY_P0M0SET  0x80 //设置I/O口工作方式//10000000(PxM0为1时设置为强推)
#define DY_P1M1SET  0x00 //设置I/O口工作方式//00000000(左到右,高到低位)
#define DY_P1M0SET  0x80 //设置I/O口工作方式//10000000
#define DY_P2M1SET  0x44 //设置I/O口工作方式//01000100
#define DY_P2M0SET  0x80 //设置I/O口工作方式//10000000
#define DY_P3M1SET  0x00 //设置I/O口工作方式//00000000
#define DY_P3M0SET  0x00 //设置I/O口工作方式//00000000
#define DY_P4M1SET  0x00 //设置I/O口工作方式//00000000
#define DY_P4M0SET  0x40 //设置I/O口工作方式//01000000
data unsigned char TIME_HH,TIME_MM,TIME_SS;//设置时、分、秒
data unsigned char cou  = 0;     // 软计数器,对10ms时基信号累加到1s
data unsigned char bn;//扫描映射全局变量
data unsigned char DY_PWM;//显示亮度
data unsigned char MENU;//菜单切换标志位
unsigned char code disdata[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //无小数点数码管段码表(0~9)
};
/*********************************************************************************************/
void delay (unsigned int a){ // 用于点扫描的延时
unsigned int i;
while( --a != 0){
  for(i = 0; i < DY_DELAY; i++);
}         
}
/*********************************************************************************************/
void delay1ms (unsigned int a){ // 1ms延时程序(12MHz 10倍于51单片机速度时)
unsigned int i;
while( --a != 0){
  for(i = 0; i < 600; i++);
}         
}
/*********************************************************************************************/
void dis_off (void){
P0 = ~DY_P0M0SET; //关所有显示
DY_LED1_H4 = 0; //使用单独IO控制是为了防止干扰BEEP的工作
P2 = ~DY_P2M0SET;
P3 = ~DY_P3M0SET;
P4 = ~DY_P4M0SET;
delay(10-DY_PWM);
}
/*********************************************************************************************/
void displayHH1 (unsigned char d){ //第1列横向显示程序
unsigned char i;
i = d & 0x01;
if(i == 0x01){
  DY_LED1_H1 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();
i = d & 0x02;
if(i == 0x02){
  DY_LED1_H1 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();
i = d & 0x04;
if(i == 0x04){
  DY_LED1_H1 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();
i = d & 0x08;
if(i == 0x08){
  DY_LED1_H1 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();
i = d & 0x10;
if(i == 0x10){
  DY_LED1_H1 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();
i = d & 0x20;
if(i == 0x20){
  DY_LED1_H1 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();
i = d & 0x40;
if(i == 0x40){
  DY_LED1_H1 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();
i = d & 0x80;
if(i == 0x80){
  DY_LED1_H1 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();
}
/*********************************************************************************************/
void displayHH2 (unsigned char d){ //第2列横向显示程序
unsigned char i;
i = d & 0x01;
if(i == 0x01){
  DY_LED1_H2 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();
i = d & 0x02;
if(i == 0x02){
  DY_LED1_H2 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();
i = d & 0x04;
if(i == 0x04){
  DY_LED1_H2 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();
i = d & 0x08;
if(i == 0x08){
  DY_LED1_H2 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();
i = d & 0x10;
if(i == 0x10){
  DY_LED1_H2 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();
i = d & 0x20;
if(i == 0x20){
  DY_LED1_H2 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();
i = d & 0x40;
if(i == 0x40){
  DY_LED1_H2 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();
i = d & 0x80;
if(i == 0x80){
  DY_LED1_H2 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();
}
/*********************************************************************************************/
void displayHH3 (unsigned char d){ //第3列横向显示程序
unsigned char i;
i = d & 0x01;
if(i == 0x01){
  DY_LED1_H3 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();
i = d & 0x02;
if(i == 0x02){
  DY_LED1_H3 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();
i = d & 0x04;
if(i == 0x04){
  DY_LED1_H3 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();
i = d & 0x08;
if(i == 0x08){
  DY_LED1_H3 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();
i = d & 0x10;
if(i == 0x10){
  DY_LED1_H3 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();
i = d & 0x20;
if(i == 0x20){
  DY_LED1_H3 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();
i = d & 0x40;
if(i == 0x40){
  DY_LED1_H3 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();
i = d & 0x80;
if(i == 0x80){
  DY_LED1_H3 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();
}
/*********************************************************************************************/
void displayHH4 (unsigned char d){ //第4列横向显示程序
unsigned char i;
i = d & 0x01;
if(i == 0x01){
  DY_LED1_H4 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();
i = d & 0x02;
if(i == 0x02){
  DY_LED1_H4 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();
i = d & 0x04;
if(i == 0x04){
  DY_LED1_H4 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();
i = d & 0x08;
if(i == 0x08){
  DY_LED1_H4 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();
i = d & 0x10;
if(i == 0x10){
  DY_LED1_H4 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();
i = d & 0x20;
if(i == 0x20){
  DY_LED1_H4 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();
i = d & 0x40;
if(i == 0x40){
  DY_LED1_H4 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();
i = d & 0x80;
if(i == 0x80){
  DY_LED1_H4 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();
}
/*********************************************************************************************/
void diplay_data (unsigned char l,unsigned char d){
  switch (l){//显示的列位置  
    case 1://   
     displayHH1(d); //将显示数据送入  
     break;//  
    case 2://   
     displayHH2(d); //将显示数据送入  
     break;//  
    case 3://   
     displayHH3(d); //将显示数据送入  
     break;//  
    case 4://   
     displayHH4(d); //将显示数据送入  
     break;//  
  }
}
/**********************************************************************************************/
void beep0(){//BELL 闹钟声音开(蜂鸣器驱动)
WAKE_CLKO = 0x00;
DY_BEEP = 1;
}
/**********************************************************************************************/
void beep1(){//BELL 闹钟声音开(蜂鸣器驱动)
if(cou > 10){
  WAKE_CLKO = (WAKE_CLKO | 0x04);
}else{
  beep0();
}
}
/**********************************************************************************************/
void beep2(){//BELL 闹钟声音开(蜂鸣器驱动)  
WAKE_CLKO = (WAKE_CLKO | 0x04);
delay1ms(40);
beep0();
}
/*********************************************************************************************/
void init (void){ //上电初始化
P0M0 = DY_P0M0SET; //设置I/O口工作方式(行为推挽,列为普通输入/输出)
P0M1 = DY_P0M1SET;
P1M0 = DY_P1M0SET;
P1M1 = DY_P1M1SET;
P2M0 = DY_P2M0SET;
P2M1 = DY_P2M1SET;
P3M0 = DY_P3M0SET;
P3M1 = DY_P3M1SET;
P4M0 = DY_P4M0SET;
P4M1 = DY_P4M1SET;
P4SW = 0xff; //启动P4接口
P0 = 0xff;
P2 = 0xff;
////
DY_PWM = 9;
dis_off();
////
TMOD = 0x11;         // 定时/计数器0,1工作于方式1   
    TH0 = 0x3c;          // 预置产生50ms时基信号   
    TL0 = 0xb0;   
    EA = 1;              // 开总中断   
    ET0 = 1;             // 定时/计数器0允许中断   
    TR0 = 1;             // 开闭定时/计数器0   
/////
//WAKE_CLKO = (WAKE_CLKO | 0x04);//开机音
BRT = (256 - 240);  //启动独立时钟P1.0接口输出功能
AUXR = (AUXR | 0x10);
////
TIME_HH = 0;
TIME_MM = 3;
TIME_SS = 5;
MENU = 0;
}
/*********************************************************************************************/
void main (void){ //主程序
init();
beep2(); //
delay1ms(100);
while (1){
  if(MENU == 0){ //显示倒计时主界面
   diplay_data (1,disdata[TIME_HH/10]);
   diplay_data (2,disdata[TIME_HH%10]);
   diplay_data (3,disdata[TIME_MM/10]+(TIME_SS%2)*0x80);
   diplay_data (4,disdata[TIME_MM%10]+(TIME_SS%2)*0x80);
    while(DY_KEY1 == 1 || DY_KEY2 == 1 || DY_KEY3 == 1 || DY_KEY4 == 1){
     unsigned char i;
     for(i = 0; i < 30; i++){//循环显示,等于键盘去抖的功能
      diplay_data (1,disdata[TIME_HH/10]);
      diplay_data (2,disdata[TIME_HH%10]);
      diplay_data (3,disdata[TIME_MM/10]+(TIME_SS%2)*0x80);
      diplay_data (4,disdata[TIME_MM%10]+(TIME_SS%2)*0x80);
     }
     if(DY_KEY1 == 1){
      delay1ms(50);
      if(DY_KEY1 == 1){
       TIME_HH = TIME_HH+10;
       beep2(); //
       if(TIME_HH > 23){
        TIME_HH = 0;
        if(TIME_MM == 0){
         TIME_MM = 1;
        }
       }
      //while(DY_KEY1 == 1);
      }
     }
     if(DY_KEY2 == 1){
      delay1ms(50);
      if(DY_KEY2 == 1){
       TIME_HH++;
       beep2(); //
       if(TIME_HH > 23){
        TIME_HH = 0;
        if(TIME_MM == 0){
         TIME_MM = 1;
        }
       }
      //while(DY_KEY2 == 1);
      }
     }
     if(DY_KEY3 == 1){
      delay1ms(50);
      if(DY_KEY3 == 1){
       TIME_MM = TIME_MM+10;
       beep2(); //
       if(TIME_MM > 59){
        TIME_MM = 0;
        if(TIME_HH == 0){
         TIME_MM = 1;
        }else{
         TIME_MM = 0;
        }
       }
      //while(DY_KEY3 == 1);
      }
     }
     if(DY_KEY4 == 1){
      delay1ms(50);
      if(DY_KEY4 == 1){
       TIME_MM++;
       beep2(); //
       if(TIME_MM > 59){
        if(TIME_HH == 0){
         TIME_MM = 1;
        }else{
         TIME_MM = 0;
        }
       }
      //while(DY_KEY4 == 1);
      }
     }
     TIME_SS = 5; //初始化秒
    }
   if(TIME_HH == 0 && TIME_MM == 0){ //如果小时和分钟都为0则开始秒倒数
    MENU++;
   }
  }
/*********************************************************************************************/
  if(MENU == 1){ //显示最后一分钟的秒倒数  
   diplay_data (3,disdata[TIME_SS/10]+0x80);
   diplay_data (4,disdata[TIME_SS%10]+0x80);
   if(TIME_SS==0){
    MENU++;
   }
   if(DY_KEY1==1||DY_KEY2==1||DY_KEY3==1||DY_KEY4==1){
    MENU--;
    TIME_MM = 0;
    TIME_SS = 5;
   }
  }
/*********************************************************************************************/
  if(MENU == 2){ //门铃鸣响表示时间到
   TIME_SS = DY_LONG;
   while(TIME_SS > 0){
    beep1(); //
    diplay_data (1,disdata[0]);
    diplay_data (2,disdata[0]);
    diplay_data (3,disdata[0]+0x80);
    diplay_data (4,disdata[0]+0x80);
   }
   MENU++;
  }
/*********************************************************************************************/
  if(MENU == 3){ //进入掉电状态(只能重启复位)
   beep0(); //
   PCON = 0x02; //进入掉电模式
  }
}
}
/**********************************************************************************************/
void tiem0(void) interrupt 1{   // T/C0中断服务程序(产生50ms时基信号)   
    if(cou < 1){                 // 计数值到100(1s) (****时间为倒计时****)  
        cou = 20;               // 软计数器清零   
        if(TIME_SS < 1){          // 秒计数值到60   
            TIME_SS = 60;           // 秒计数器清零   
            if(TIME_MM < 1){      // 分计数到60   
                TIME_MM = 60;       // 分计数器清零   
                if(TIME_HH < 1){  // 时计数到23   
                    TIME_HH = 24;   // 时计数器清零
    }  
                TIME_HH--;         // 时计数器加1(进位60m=1h)   
            }   
            TIME_MM--;             // 分计数器加1(进位60s=1m)  
        }   
        TIME_SS--;                 // 秒计数器加1(进位10ms*100=1s)   
    }   
    cou--;                      // 软计数器加1   
    TH0 = 0x3c;                // 重置定时常数   
    TL0 = 0xb0;   
}
/**********************************************************************************************/

虽然看不明白,还是支持一下, 我也要努力学好单片机

好东西!

不错不错

学习中,现阶段没有原理图看不懂啊

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

网站地图

Top