打印

设计一个可调的电子时钟

[复制链接]
1318|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
蒙meng|  楼主 | 2012-6-14 14:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
需要在增加一个闹钟模块

/************************
       电子时钟
************************/
#include<at89x51.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY_ADD=P3^4;   //对按键1定义在P3^4口 加1
sbit KEY_SUB=P3^5;   //对按键2定义在P3^5口 减1
sbit KEY_MOVE=P3^6;   //对按键3定义在P3^6口 移位
//sbit KEY_READ=P3^7;   //对按键4定义在P3^7口 闹钟
bit flag_s;
bit flag_500ms;
uchar t0IntCnt,change_num;
uchar time_s,time_m,time_h;
uchar code TAB[]={   //数码管显示代码表
  0xC0,/*0*/
        0xF9,/*1*/
        0xA4,/*2*/
        0xB0,/*3*/
        0x99,/*4*/
        0x92,/*5*/
        0x82,/*6*/
        0xF8,/*7*/
        0x80,/*8*/
        0x90,/*9*/
  };
/************************
       毫秒延时程序
************************/
void delays_ms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
  for(j=0;j<121;j++);  
}
}
/************************
       数码管显示程序
************************/
void display()
{
if(!(flag_500ms&&change_num==1))
{
  P0=TAB[time_s%10];   //个位秒
  P2_5=0;
  delays_ms(1);
  P2_5=1;
  
  P0=TAB[time_s/10];  //十位秒
  P2_4=0;
  delays_ms(1);
  P2_4=1;
}
if(!(flag_500ms&&change_num==2))
{
  P0=TAB[time_m%10];   //个位分
  P2_3=0;
  P0_7=0;
  delays_ms(1);
  P2_3=1;
  P0=TAB[time_m/10];  //十位分
  P2_2=0;
  delays_ms(1);
  P2_2=1;
}
if(!(flag_500ms&&change_num==3))
{
  P0=TAB[time_h%10];  //个位时
  P2_1=0;
  P0_7=0;
  delays_ms(1);
  P2_1=1;
   
  P0=TAB[time_h/10];  //十位时
  P2_0=0;
  delays_ms(1);
  P2_0=1;
}
P1=~time_s;
}
/************************
       按键检测程序
************************/
void KEY_test()
{
if(KEY_ADD==0)    //加1按键
{
  delays_ms(10);
  if(KEY_ADD==0)
  {
   switch(change_num)
   {
    case 1:time_s++;
     if(time_s==60)
     {
      time_s=0;
     }   
    break;
    case 2:time_m++;
     if(time_m==60)
     {
      time_m=0;
     }
    break;
    case 3:time_h++;
     if(time_h==24)
     {     
      time_h=0;
     }     
    break;
   default:break;
   }
   while(KEY_ADD==0)
   {
    display();
   }
  }
}
if(KEY_SUB==0)    //减1按键
{
  delays_ms(10);
  if(KEY_SUB==0)
  {
   switch(change_num)
   {
    case 1:
     if(time_s==0)
      time_s=59;
     else
      time_s--;
    break;
    case 2:
     if(time_m==0)
      time_m=59;
     else
      time_m--;
    break;
    case 3:
     if(time_h==0)
      time_h=23;
     else
      time_h--;
    break;
   default:break;
   }  
   while(KEY_SUB==0)
   {
    display();
   }
  }
}
if(KEY_MOVE==0)   //移位按键
{
  delays_ms(10);
  if(KEY_MOVE==0)
  {
   change_num--;
   change_num%=4;
   while(KEY_MOVE==0)
   {
    display();     
   }
  }
}
// if(KEY_READ==0)   //闹钟按键
// {
//  delays_ms(10);
//  if(KEY_READ==0)
//  {
//   
//   while(KEY_READ==0)
//   {
//    display();
//   }
//  }
// }   
}
/************************
       定时程序
************************/
void timer0_ISR() interrupt 1
{
TH0=(65536-50000)/256;  //初值
TL0=(65536-50000)%256; //初值
t0IntCnt++;
if(t0IntCnt==10||t0IntCnt==20)
{
  flag_500ms=!flag_500ms;
}
if(t0IntCnt==20)
{
  t0IntCnt=0x00;
  if(change_num==0)
  time_s++;
  if(time_s==60)
  {
   time_s=0x00;
   time_m++;
   if(time_m==60)
   {
    time_m=0x00;
    time_h++;
    if(time_h==24)
    {
     time_h=0x00;
    }
   }
  }
}  
}
/************************
       初始化程序
************************/
void init()
{
TMOD=0x01;     //设定T0为方式1定时
TR0=1;    //启动T0
TH0=(65536-50000)/256;  //初值
    TL0=(65536-50000)%256; //初值
EA=1;         //开启总中断
    ET0=1;      //开启T0中断  
t0IntCnt=0;
time_s=0;   //秒清0
time_m=0;   //分清0
time_h=0;   //时清0
}
/************************
       主程序
************************/
void main()
{
init();
while(1)
{
  display();
  KEY_test();
}
}

相关帖子

沙发
forgot| | 2012-6-14 16:16 | 只看该作者
想问什么?

使用特权

评论回复
板凳
蒙meng|  楼主 | 2012-6-14 16:49 | 只看该作者
再加一个闹钟模块

使用特权

评论回复
地板
NE5532| | 2012-6-14 19:42 | 只看该作者
这里的工程师做东西一般都需要付款的。

使用特权

评论回复
5
wukunshan| | 2012-6-15 17:32 | 只看该作者
你这个程序玩玩可以,用来做闹钟?如生更半夜没电了,第二天太阳晒屁股了,你的闹钟也还在睡大觉呢。加上时钟芯片和备份电池重新做吧。

使用特权

评论回复
6
NE5532| | 2012-6-15 17:52 | 只看该作者
一看就是课程设计嘛,这么明显滴。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

6

帖子

0

粉丝