打印

请教单片机数字时钟c程序问题。

[复制链接]
2846|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jomskung|  楼主 | 2010-4-11 19:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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判断那个键按下,用protues仿真,能计时显示,调时功能不能实现,请高手指教!!!!

相关帖子

沙发
jomskung|  楼主 | 2010-4-11 19:32 | 只看该作者
补充:p1接138,P2接373 四个数码管,显示mm。ss。

使用特权

评论回复
板凳
zc3909| | 2010-4-12 10:16 | 只看该作者
debug 跟踪一下吧

使用特权

评论回复
地板
scan| | 2010-4-12 11:23 | 只看该作者
把调试的时候出现的现象描述一下。要是没有debug调试功能,可以控制个LED指示一下该进的函数是否进了,该进的中断是否进了。

使用特权

评论回复
5
jomskung|  楼主 | 2010-4-13 14:23 | 只看该作者
我用的是protues 的互交式仿真,烧入hex 点击运行时,可以记时显示,但是一按键就进入中断,不能识别时那个键,是不是 用中断查询方式,不能用if语句啊,望指教

使用特权

评论回复
6
jomskung|  楼主 | 2010-4-13 14:24 | 只看该作者
其他都好,就中断有问题,

使用特权

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

本版积分规则

0

主题

5

帖子

1

粉丝