
c展开代码#include "reg52.h"
#include <intrins.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
/*
 * 大概就是,做一个电子时钟,然后加四个独立按键,
 * K1按一次设置闹钟的秒,两次设置闹钟的分,三次设置闹钟的时,
 * 然后四次修改时间的秒,五次修改时间的分,六次改时间的时这样
 *
 * K2是加一,K3是减一
 *
 * K4是关闹钟
定时器实现时钟送PC机显示独立键盘设置时间
要求;
筒易时钟。并送PC机上湿示,当前时间可以通过独立键盘来没置;整点提醒、定时闹钟
需要keil c语言程序(注释),proteus仿真图
 *
 */
#define uchar unsigned char
#define uint unsigned int
#define u8 unsigned char
#define u16 unsigned int
char rtc_hour = 23;
char rtc_min  = 59;
char rtc_sec  = 55;
char rtc_hour_al = 1;            /* 闹钟 */
char rtc_min_al = 0;
char rtc_sec_al = 1;
unsigned char num2 = 0;                 /* 计数 */
u8 ItemsNum = 0;                        /*按键改变项目 */
char *ALLtime[] = { &rtc_hour, &rtc_min, &rtc_sec, &rtc_hour_al, &rtc_min_al,
      &rtc_sec_al };      /* 指针便于调用 */
u8 openAlarm = 1;                       /* 打开或者关闭闹钟 */
u8 alarmifg = 0;
u8 alarm_shijian = 0;
sbit key_01 = P2 ^ 1;
sbit key_02 = P2 ^ 2;
sbit key_03 = P2 ^ 3;
sbit key_04 = P2 ^ 4;
sbit key_05 = P2 ^ 5;
sbit BEEP = P3 ^ 6;
/*********************************************************************************
 * 【函 数 名】: void send_cmd(unsigned char dat)
 * 【功    能】: 串口发送数据命令
 **********************************************************************************/
void send( unsigned char dat )
{
 SBUF = dat;     /* 发送指令到SBUF */
 while ( !TI )
  ;       /* 等待发送结束 */
 TI = 0;         /* 清除结束标志,以便再发送数据 */
}
/*********************************************************************************
 * 【函 数 名】: Print_Str(unsigned char *s)
 * 【功    能】: 串口发送 一个字符串
 **********************************************************************************/
void Print_Str( unsigned char *s )
{
 while ( *s != '\0' )
 {
  send( *s++ );
 }
}
#define FSOC 11059200L    //晶振
#define BAUD  9600        //波特率
/*********************************************************************************
 * 【函 数 名】: void SerInit(void)
 * 【功    能】: 串口初始化程序 设置波特率为9600
 **********************************************************************************/
void SerInit( void )
{
 SCON = 0x50; /* 010 1 0000B,工作方式1, 8位UART,波特率可变,允许接收 */
 TMOD = 0x20; /* T1工作于方式2 */
 TCON = 0x40; /* 定时器1开始计数 */
 TH1 = -(FSOC/BAUD/12/16);  /* T1计数初值 */
 TL1 = -(FSOC/BAUD/12/16);
 PCON = 0x80; /* SMOD置1,双倍速率 */
 RI = 0;
 TI = 0;
 ES = 0;    /* 关闭串口中断 */
}
/* 闹钟函数 */
void BeepAlarm()
{
 unsigned char beeptime = 0;
 int  cycl  = 1000;
 while ( cycl-- )
 {
  BEEP = !BEEP;
  for ( beeptime = 0; beeptime < 5; beeptime++ )
   ;
 }
 BEEP = 1;
}
/* 延时函数 */
void delay_ms_key( unsigned char t ) /* 延时xms */
{
 unsigned char ttt;
 while ( t-- )
 {
  for ( ttt = 0; ttt < 125; ttt++ )
   ;
 }
}
/*
 * 四个按键的检测函数
 * 按键则返回1 2 3 4
 * 无按键则返回0xff
 */
unsigned char KeySscan( void )
{
 unsigned char keyvaluee = 0xff;
 if ( key_01 == 0 )
 {
  delay_ms_key( 10 );
  if ( key_01 == 0 )
  {
   while ( key_01 == 0 )
    ;
   return(1);
  }
 }
 if ( key_02 == 0 )
 {
  delay_ms_key( 10 );
  if ( key_02 == 0 )
  {
   while ( key_02 == 0 )
    ;
   return(2);
  }
 }
 if ( key_03 == 0 )
 {
  delay_ms_key( 10 );
  if ( key_03 == 0 )
  {
   while ( key_03 == 0 )
    ;
   return(3);
  }
 }
 if ( key_04 == 0 )
 {
  delay_ms_key( 10 );
  if ( key_04 == 0 )
  {
   while ( key_04 == 0 )
    ;
   return(4);
  }
 }
 if ( key_05 == 0 )
 {
  delay_ms_key( 10 );
  if ( key_05 == 0 )
  {
   while ( key_05 == 0 )
    ;
   return(5);
  }
 }
 return(0xff);
}
/* 显示时间 */
void displaytime()
{
 u8 disp[15];
 u8 count = 0;
 disp[count++] = rtc_hour / 10 + '0';
 disp[count++] = rtc_hour % 10 + '0';
 disp[count++] = ':';
 disp[count++] = rtc_min / 10 + '0';
 disp[count++] = rtc_min % 10 + '0';
 disp[count++] = ':';
 disp[count++] = rtc_sec / 10 + '0';
 disp[count++] = rtc_sec % 10 + '0';
 disp[count++] = 0;
 Print_Str( disp );
 Print_Str("\r\n");//发送换行符号 便于看
}
/* 显示闹钟 */
void displayAlarm()
{
 u8 disp[15];
 u8 count = 0;
 disp[count++] = rtc_hour_al / 10 + '0';
 disp[count++] = rtc_hour_al % 10 + '0';
 disp[count++] = ':';
 disp[count++] = rtc_min_al / 10 + '0';
 disp[count++] = rtc_min_al % 10 + '0';
 disp[count++] = ':';
 disp[count++] = rtc_sec_al / 10 + '0';
 disp[count++] = rtc_sec_al % 10 + '0';
 disp[count++] = 0;
 Print_Str( disp );
 Print_Str("\r\n");//发送换行符号 便于看
}
/*********************************************************************************
 *
 *        定时器中断
 **********************************************************************************/
void T1_time()
interrupt 1
{
 TH0 = (65536 - 50000) / 256;
 TL0 = (65536 - 50000) % 256;
 num2++;
 if ( num2 == 20 )
 {
  displaytime(); /* 发送时间显示 */
  num2 = 0;
  rtc_sec++;
  /* 闹钟响声判定 */
  if ( openAlarm == 1 )                           /* 打开了闹钟 */
  {
   if ( *ALLtime[0] == *ALLtime[3] )       /* 判定时间一样不一样 */
   {
    if ( *ALLtime[1] == *ALLtime[4] )
    {
     if ( *ALLtime[2] == *ALLtime[5] )
     {
      alarmifg = 1;
     }
    }
   }
  }
  if ( alarmifg == 1 ) /* 闹钟开始响了 */
  {
   alarm_shijian++;
  }
  if ( rtc_sec == 60 )
  {
   rtc_sec = 0;
   rtc_min++;
   if ( rtc_min == 60 )
   {
    rtc_min = 0;
    //整点报时
    //alarmifg = 1;//打开蜂鸣器
    Print_Str("zheng dian bao shi ");
    Print_Str("\r\n");//发送换行符号 便于看
    rtc_hour++;
    if ( rtc_hour == 24 )
    {
     rtc_hour = 0;
    }
   }
  }
 }
}
void delay_ms( unsigned int t ) /* 延时xms */
{
 unsigned char ttt;
 while ( t-- )
 {
  for ( ttt = 0; ttt < 125; ttt++ )
   ;
 }
}
/*********************************************************************************
 *
 *       主函数
 **********************************************************************************/
void main( void )
{
 u8 key = 0xff;
 SerInit();
 TMOD |= 0x01;
 TH0 = (65536 - 50000) / 256;
 TL0 = (65536 - 50000) % 256;
 EA = 1;
 ET0 = 1;
 TR0 = 1;
 /* LCD_write_com(0x0c); //关光标,闪烁 */
 while ( 1 )
 {
  key = KeySscan();
  if ( key != 0xff )
  {
   if ( key == 1 )
   {
    ItemsNum = (ItemsNum + 1) % 7;
    if(ItemsNum==0)
    {
     Print_Str("Settings have been saved and exited\r\n");
    }else if(ItemsNum==1)
    {
     Print_Str("Set Clock hours\r\n");
    }else if(ItemsNum==2)
    {
     Print_Str("Set Clock minutes, \r\n");
    }else if(ItemsNum==3)
    {
     Print_Str("Set Clock seconds\r\n");
    }else if(ItemsNum==4)
    {
     Print_Str("Set Alarm clock hours \r\n");
    }else if(ItemsNum==5)
    {
     Print_Str("Set Alarm clock minutes, \r\n");
    }else if(ItemsNum==6)
    {
     Print_Str("Set Alarm clock seconds\r\n");
    }
   } else if ( key == 2 )          /* 加法 */
   {
    *ALLtime[ItemsNum - 1] = *ALLtime[ItemsNum - 1] + 1;
   } else if ( key == 3 )          /* 减法 */
   {
    *ALLtime[ItemsNum - 1] = *ALLtime[ItemsNum - 1] - 1;
   } else if ( key == 4 )          /* 关闭或者打开闹钟 */
   {
    openAlarm = !openAlarm;
    if ( openAlarm == 0 )   /* 恢复闹钟功能 */
    {
     alarmifg = 0;
     alarm_shijian = 0;
    }
   } else if ( key == 5 )          /* 保存并退出设置 */
   {
    ItemsNum=0;
    Print_Str("Settings have been saved and exited\r\n");
   }
   /* 增加时间界限 */
   if ( *ALLtime[0] == 24 )
   {
    *ALLtime[0] = 0;
   } else if ( *ALLtime[1] == 60 )
   {
    *ALLtime[1] = 0;
   } else if ( *ALLtime[2] == 60 )
   {
    *ALLtime[2] = 0;
   }
   if ( *ALLtime[0] == -1 )
   {
    *ALLtime[0] = 23;
   } else if ( *ALLtime[1] == -1 )
   {
    *ALLtime[1] = 59;
   } else if ( *ALLtime[2] == -1 )
   {
    *ALLtime[2] = 59;
   }
   /* 增加闹钟界限 */
   if ( *ALLtime[3] == 24 )
   {
    *ALLtime[3] = 0;
   } else if ( *ALLtime[4] == 60 )
   {
    *ALLtime[4] = 0;
   } else if ( *ALLtime[5] == 60 )
   {
    *ALLtime[5] = 0;
   }
   if ( *ALLtime[3] == -1 )
   {
    *ALLtime[3] = 23;
   } else if ( *ALLtime[4] == -1 )
   {
    *ALLtime[4] = 59;
   } else if ( *ALLtime[5] == -1 )
   {
    *ALLtime[5] = 59;
   }
   /* 无论按哪一个按键 我们都要刷新显示 */
   if ( ItemsNum <= 3 )
   {
    displaytime();
   } else {
    displayAlarm();
   }
   /* 控制游标 */
   if ( ItemsNum == 0 )
   {
    TR0 = 1;        /* 开启时钟 */
   } else {
    TR0 = 0;        /* 关闭时钟 */
   }
   key = 0xff;
  }
  /* 闹钟 */
  if ( alarmifg == 1 )
  {
   BeepAlarm();                    /* 闹钟想 */
   if ( alarm_shijian > 5 )        /* 响一会后关闭闹钟 alarm_shijian在定时器中自加 */
   {
    alarmifg = 0;
    alarm_shijian = 0;
   }
  }
 }
}


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!