找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5109|回复: 2
打印 上一主题 下一主题
收起左侧

[原创]请教数字时钟程序问题

[复制链接]
跳转到指定楼层
楼主
ID:23017 发表于 2010-4-11 19:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include <at89x51.h>

unsigned char flag,min,sec,led0,led1,led2,led3;
unsigned int times; 
bit key1;
unsigned char dispcode[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};   //0~9 字位码,0xFF为"灭".
unsigned char act[4]={0x01,0x02,0x03,0x04};  //数码管位选。
void display();  
void flashdisp(int n);

void delay(unsigned int count);
// ***主程序***//
void main(void)
{
  TMOD=0x01;  //定时方式1
  IT0=0;     //电平触发方式,低电平有效。
  min=0;    //初始化min,sec ,和标志位。
  sec=0;
  times=0;
  key1=0;
  flag=0;
  ET0=1;    
  EX0=1;

    
  EA=1;   
  TH0=0xFF;  
  TL0=0xB0;
  TR0=1;
    while(1)
 {
  
    display();
    while(flag==1)
    {
   P1=act[0];
      display();
   delay(100); 
      P2=0xFF;
      delay(100);
    }
    while(flag==2)
    {
   P1=act[1];
      display();
   delay(100); 
      P2=0xFF;
      delay(100);
    }
    while(flag==3)
    {
   P1=act[2];
      display();
   delay(100); 
      P2=0xFF;
      delay(100);
    }
    while(flag==4)
    {
   P1=act[3];
      display();
   delay(100); 
      P2=0xFF;
      delay(100);
    }


 }

}
// ***定时中断服务子程序***//
void timer0(void) interrupt 1   
  {
      TH0=0xFF;
    TL0=0xB0;
 times++;
 
  if(times>=10000)
    {
    times=0;
    sec++;

    if(sec>=60) {sec=0;min++;}
    if(min>=60) {min=0;}
    }
  }

   // ***外部中断0处理子程序***//
  void extern_int1(void) interrupt 0
  {
   EA=0;

   delay(5);
   if(P3^7==0)
    {
      key1=!key1;    //停止计时;
   if(key1==0){TR0=1;}
   if(key1==1){TR0=0;}

  }
 if((P3^6==0)&&key1==1)
 {
 
    flag++;
 if(flag>4){flag=0;}
  }
 if(P3^5==0&&key1)
 {

     switch(flag)
     {
    case 1:min=sec+1;break;
    case 2:min=sec+10;break;
    case 3:min=min+1;break;
    case 4:min=min+10;break;
    default:break;
   }
 }

 EA=1;
 }


//显示//
 void display()
  {
  led0=min/10;
  led1=min%10;
  led2=sec/10;
  led3=sec%10;
  P1=act[0];
  P2=dispcode[led3];
  delay(10);     //延迟10ms。
  P1=act[1];
  P2=dispcode[led2];
  delay(10);     //延迟10ms。
  P1=act[2];
  P2=dispcode[led1];
  delay(10);     //延迟10ms。
  P1=act[3];
  P2=dispcode[led0];
  delay(10);     //延迟10ms。
  }
 

  // ***延时子程序***//
  void delay( unsigned int count)
  {
  int j;
  while(count--!=0)
   {
  for(j=0;j<121;j++)
  {;}
   }
  }

这是本人的程序,三个按键实现调时开关,选位,加一,分别接p3.7,3.6,3.5.同时三个键通过两个与门接到外部中断p3.2上,由外部中断判断按键是否按下,再读p3.73.63.5判断那个键按下,用Proteus仿真,能计时显示,调时功能不能实现,请高手指教!!!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:21975 发表于 2010-4-11 21:54 | 只看该作者

额,貌似你的有点复杂!我有个简单点的给你吧!用的是595控制的

void out595();
void xieru(uchar num);
void timer_init();
void data_change(uchar num);
void time_change();
void display();
void key_scan();

sbit K1=P1^4;
sbit K2=P1^5;
sbit K3=P1^6;
sbit K4=P1^7;

uchar code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar code table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar temp,temp2,hour,minute,second,gew,shiw;
//uchar code table2[3];

sbit SDA=P2^0;
sbit SCLK=P2^1;
sbit SLCK=P2^2;

void out595();
void xieru(uchar num);

void xieru(uchar num)
{
 uchar i;
 for(i=0;i<=7;i++)
 {
  if((num&0x80)==0x80)
   SDA=1;
  else
   SDA=0;
  num<<=1;
  SCLK=0;
  SCLK=1;  
 }
}
void out595()
{
 SLCK=0;
 SLCK=1;
}

void delay(uint z)        //延时子程序
{
 uint i,j;
 for(i=z;i>0;i--)
  for(j=110;j>0;j--);
}

void timer_init()
{
 TMOD=0X11;
 TH1=0X4C;
 TL1=0X00;
 EA=1;
 ET1=1;
 TR1=1;
 temp=0;temp2=0;
 hour=0;minute=0;second=0;
 gew=0;shiw=0;
}
void data_change(uchar num)
{
 shiw=num/10;
 gew=num%10;  
}

void time_change()
{
 if(temp==20)
 {
  temp=0;
  second++;
  if(second==60)
  {
   second=0;
   minute++;
   if(minute==60)
   {
    minute=0;
    hour++;
    if(hour==24)
    {
     hour=0;
    }
   }
  }
 }
}

void display()
{
 data_change(second);
 xieru(TAB[gew]);
 xieru(table[7]);
 out595();
 xieru(TAB[shiw]);
 xieru(table[6]);
 out595();
 data_change(minute);
 xieru(TAB[gew]);
 xieru(table[4]);
 out595();
 xieru(TAB[shiw]);
 xieru(table[3]);
 out595();
 data_change(hour);
 xieru(TAB[gew]);
 xieru(table[1]);
 out595();
 xieru(TAB[shiw]);
 xieru(table[0]);
 out595();
}

void key_scan()
{
 if(K1==0)
 {
  delay(5);
  {
   if(K1==0)
   {
    while(!K1);
    second++;
    if(second==60)
    {
     second=0;
    }
   }
  } 
 }
 if(K2==0)
 {
  delay(5);
  {
   while(!K2);
   minute++;
   if(minute==60)
   {
    minute=0;
   }  
  }
 }
 if(K3==0)
 {
  delay(5);
  if(K3==0)
  {
   while(!K3);
   hour++;
   if(hour==24)
   {
    hour=0;
   }
  }
 }
}

void t1() interrupt 3
{
 TH1=0X4C;
 TL1=0X00;
 temp++;
 time_change();
}

main()函数没写,你就自己把它加上吧,应该没问题吧?

回复

使用道具 举报

板凳
ID:23017 发表于 2010-4-15 17:16 | 只看该作者

先谢了,回去研究研究

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表