原创 LED电子钟

2008-10-28 16:38 5614 7 8 分类: MCU/ 嵌入式

https://static.assets-stash.eet-china.com/album/old-resources/2008/10/28/56e84065-f6a5-49d2-8f24-3032c3b05b6a.rarLED电子钟


 


/*--------------------------------------------------------------*/
//包含头文件
#include <AT89X52.H>
#include "74HC595.H"



/*--------------------------------------------------------------*/
//键盘接口定义
sbit k1 = P1^0;
sbit k2 = P1^1;
sbit k3 = P1^2;
sbit k4 = P1^3;
sbit BP = P1^4;


/*--------------------------------------------------------------*/
//定义相关变量
unsigned char count;  //50ms计数
unsigned char second;  //1s计数
unsigned char minute;  //1m计数
unsigned char hour;   //1h计数
unsigned char time[8];  //时分秒拆位
unsigned char alarm_minute; //闹铃分钟
unsigned char alarm_hour; //闹铃小时
bit  flag;     //切换闹铃时间(1)和正常走时时间(0)


 


/*--------------------------------------------------------------*/
//函数定义
void delay(unsigned char x, unsigned char y, unsigned char z)
{
    unsigned char tempx,tempy,tempz=z;
    do{tempy=y;do{tempx=x;while(--tempx);}while(--tempy);}while(--tempz);
}


 



/*--------------------------------------------------------------*/
//定时器初始化
void Timer_init(void)                    
{
    TMOD = 0x11;
    TH0  = 0x3c;           //50ms
    TL0  = 0xb7;


    TH1  = 0xec;           //5ms
    TL1  = 0x7e;


    IE   = 0x8a;     //EA = 1; ET0 = 1; ET1 = 1;
 IP   = 0x02;     //PT0 = 1; 
    TCON = 0x50;        //TR0 = 1; TR1 = 1;
}



/*--------------------------------------------------------------*/
//按键处理程序
void Key_pro(void)
{
 if(k1 == 0)
 { 
  delay(1, 3, 227);    //5ms 
  if(k1 == 0)  second = 0;  while(k1 == 0);
 }


 if(k2 == 0)
 { 
  delay(1, 3, 227);    //5ms 
  if(k2 == 0)  
  {
   if(flag) {alarm_minute++; if(alarm_minute == 60) alarm_minute = 0;  while(k2 == 0);}
   else  {minute++;   if(minute == 60) minute = 0;  while(k2 == 0);}
  }
 }


 if(k3 == 0)
 { 
  delay(1, 3, 227);  //5000+1 us 
  if(k3 == 0)  
  {
   if(flag) {alarm_hour++;  if(alarm_hour == 24) alarm_hour = 0;  while(k3 == 0);}
   else  {hour++; if(hour == 24)  hour = 0;  while(k3 == 0);}
  }
 }
}



/*--------------------------------------------------------------*/
//闹铃检测以及设置
void Alarm_detect(void)
{
 unsigned char i;
 if(k4 == 0)  {delay(1, 3, 227);    if(k4 == 0) flag = ~flag; while(k4 == 0);}
 while(alarm_hour == hour && alarm_minute == minute)
 {
  for(i = 4; i != 0; i--)
  {
   BP = ~BP;
   P0 = ~P0;
   delay(7, 225, 74);  //300ms
  }
  if(k4 == 0)  break ;
  delay(14, 187, 167); //1000ms
 }
}
  



/*--------------------------------------------------------------*/
//T0定时器中断服务
void T0_intservice(void) interrupt 1  
{
    TH0  = 0x3c; //50ms
    TL0  = 0xb7;
 count++;
 if(count == 20)
 {
  count = 0;
  second++;
  if(second == 60)
  {
   second = 0;
   minute++;
   if(minute == 60)
   {
    minute = 0;
    hour++;
    if(hour == 24) hour = 0;
   }
  }


  if(flag)
  {
   time[0] = 10;
   time[1] = 10;
   time[3] = alarm_minute%10;
   time[4] = alarm_minute/10;
   time[6] =   alarm_hour%10;
   time[7] =   alarm_hour/10;
  }
  else
  {
   time[0] = second%10;
   time[1] = second/10;
   time[3] = minute%10;
   time[4] = minute/10;
   time[6] =   hour%10;
   time[7] =   hour/10;
  }
 }
}



/*--------------------------------------------------------------*/
//T1定时器中断服务
void T1_intservice(void) interrupt 3  
{
 unsigned char i;
    TH1 = 0xec;   //5ms
    TL1 = 0x7e;
 for(i = 0; i <8 ; i++)
 {
  Ser_IN( pos );   //片选
  Ser_IN( seg[ time ] ); //段码    
  Par_OUT();
  if(i == 2 || i == 5) time = 10; //显示"-"
  Ser_IN(0x00);   //片选
  Ser_IN(0xff);   //段码    
  Par_OUT();
 }
 if(k4 == 0)  {BP = 1; P0 = 0xff;}  
}



/*--------------------------------------------------------------*/
//主函数
void main(void)
{
 Timer_init();
 alarm_minute = 2;
 while(1)
 {
  Alarm_detect();
  Key_pro();  
 }
}


 


/*--------------------------------------------------------------*/


//74HC595驱动头文件


//Note: 74HC595驱动
//File: 74HC595.H
//Date: 08-7-16
//Time: 8:50
//      __                   __
//Note: MR 主复位接电源正极, OE 使能端,输出有效接电源负极



/*--------------------------------------------*/
#ifndef __74HC595_H__
#define __74HC595_H__


 


/*--------------------------------------------*/
sbit SD = P2^0;  //串行数据输入
sbit SH_CK = P2^1; //移位寄存器时钟输入
sbit ST_CK = P2^2; //存储寄存器时钟输入


 


/*--------------------------------------------*/
//数码管断码和位码的定义
unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
                          //0   1    2    3    4    5    6    7    8    9    -
unsigned char code pos[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
                          //1    2    3   4    5    6     7   8



/*--------------------------------------------*/
//函数声明
void Ser_IN(unsigned char Data); //串行数据输入
void Par_OUT(void);     //串行数据输出
//void Ser_Par(unsigned char Data); //串行输入,并行输出


 


/*--------------------------------------------*/
//串行数据输入
void Ser_IN(unsigned char Data)
{
 unsigned char i;
 for(i = 0; i < 8; i++)
 {
  SH_CK = 0;   //CK=100MHz
  SD = Data & 0x80;
  Data <<= 1;
  SH_CK = 1;
 }
}


 


/*--------------------------------------------*/
//并行数据输出
void Par_OUT(void)
{
 ST_CK = 0;
 ST_CK = 1;
}


 


/*--------------------------------------------*/
/*
//串行输入,并行输出
void Ser_Par(unsigned char Data)
{
 Ser_IN(Data);
 Par_OUT();
}
*/



/*--------------------------------------------*/
#endif

文章评论1条评论)

登录后参与讨论

用户257913 2010-4-1 10:44

这个不错,可以学习一下
相关推荐阅读
用户149863 2010-05-22 22:40
LCD简单菜单显示
LCD简单菜单显示显示器件为图形型LCD12864(主控芯片KS0108)什么都不带!包含以下文件:LCD菜单(测试)LCD菜单(简单)LCD菜单(界面)LCD菜单(遥控器)希望对大家有用^_^感兴趣...
用户149863 2010-05-22 14:33
LCD12864(KS0108)液晶演示程序
LCD12864(KS0108)液晶演示程序LCD12864(KS0108)液晶演示程序视频: LCD12864演示程序(什么都不带的液晶) 视频演示网址:http://v.youku.com/v_s...
用户149863 2009-10-22 18:27
AVR代码
AVR单片机程序代码集,给需要的朋友们参考呵呵,都是自己一边学一边写的,一个一个字符从键盘敲出来的^_^希望对大家有用:-)呵呵,编译软件为:  ICCAVR V6.31A版本一共七个压缩包,呵呵,分...
用户149863 2009-10-22 15:18
VGA相关资料
VGA相关资料呵呵^_^如果你想玩的就请下载,有很多东西,都是花了我好几个夜晚才搜到的都是网上的资料:-)有兴趣的可以做做哦 包含以下文件夹:├─VGA+2051│  │  共享-----国外优秀电子...
用户149863 2009-10-10 14:46
PS/2 键盘与单片机
程序打包PS/2 键盘与单片机接口用LCD1602显示调试成功所以拿出来给大家分享,希望对大家有用,呵呵^_^用PS/2键盘做系统输入部分蛮方便的哦!可以使用Backspace/Esc/Tab/Cap...
用户149863 2009-08-17 19:54
AVR端口操作宏定义,便于移植
AVR端口操作宏定义头文件(ICCAVRIO.H),便于移植(ICCAVR编译环境) 压缩包里面有网上的相关资料,把它看完,相信你会更加了解红宏定义的^_^还有头文件在ICCAVRIO.H在Inclu...
我要评论
1
7
关闭 站长推荐上一条 /2 下一条