[原创] STC单片机电子时钟

xguzi   2012-6-28 13:39 楼主
我最近写了一个有关电子时钟的C程序(本人是个初学者),调式的过程中发现,当调节时钟参数时,数码管显示有些不稳定,所以请大家看看,是哪个地方出了问题,该怎样改进!还请大家多多参与咯!呵呵……
  程序内容如下:
/*--------------------------------------------------------------
*题目:               时钟-数码管显示

*   定时器T0中断服务中产生时钟数据
*   用动态扫描显示8个数码管。
*   P0口接七段数码管的段码,P2.2、P2.3、P2.4口接数码管的位控制码。
*   按键接在P1口,按下按键,对应的端口位就是0.
*   采用多功能按键设计,A、B个按键调节功能代码,选择要调节的参数;C、D按键循环调节选中的参数的值。
*   闹铃声音信号从P1.5口输出;时间控制接口从P1.6输出,控制指示灯接P3.7口。
---------------------------------------------------------------*/

#include
#define uint unsigned int
#define uchar unsigned char

uchar hour,min,sec,flag,num0;
uchar c1_hour,c1_min;
uchar cont1_sh,cont1_sm;
uchar cont1_eh,cont1_em;

sbit sound=P1^5;
sbit cont_led=P3^7;
sbit control=P1^6;

sbit key_a=P1^0;
sbit key_b=P1^1;
sbit key_c=P1^2;
sbit key_d=P1^3;

uchar code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8c,0xbf};

void delayms(uint xms) //延时xms
{
  uint i,j;
   for(i=xms;i>0;i--)
   for(j=120;j>0;j--);
}


void init()
{
  hour=13;
  min=31;
  sec=30;

  c1_hour=12;
  c1_min=33;

  cont1_sh=12;
  cont1_sm=32;
  cont1_eh=12;
  cont1_em=33;


  TMOD=0x01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
// TH1=(65536-4000)/256;
// TL1=(65536-4000)%256;
  EA=1;
  ET0=1;
// ET1=1;
  TR0=1;
// TR1=1;
}

void display(uchar num,uchar dat)
{
  P0=table[dat];//P0口为段码接口
  P2=0xe3+4*num;//74ls138输出端作为位码接口
  delayms(1);
}


void dis_time()
{
  uchar i;
  i=hour/10;
  display(0,i);
  i=hour%10;
  display(1,i);

  display(2,27);

  i=min/10;
  display(3,i);
  i=min%10;
  display(4,i);

  display(5,27);

  i=sec/10;
  display(6,i);
  i=sec%10;
  display(7,i);
}


void dis_adj(uchar sj1,uchar sj2,uchar sj3 )
{
  uchar t;
  display(0,26);
  t=sj1/10;
  display(1,t);
  t=sj1%10;
  display(2,t);

  display(3,27);

  t=sj2/10;
  display(4,t);
  t=sj2%10;
  display(5,t+10);


  t=sj3/10;
  display(6,t);
  t=sj3%10;
  display(7,t);
}

void dis_all()
{
  switch(flag)
   {
        case 0: dis_time();
        break;
        case 1:
        case 2: dis_adj(flag,hour,min);
        break;
        case 3:        
    case 4: dis_adj(flag,c1_hour,c1_min);
        break;
        case 5:
        case 6: dis_adj(flag,cont1_sh,cont1_sm);
        break;
        case 7:        
    case 8: dis_adj(flag,cont1_eh,cont1_em);
        break;                       
   }

}


void t_control()
{
  if(!flag)
   {
    if((c1_hour==hour)&&(c1_min==min))         
        sound=0;      
    if(min==c1_min+1)
      sound=1;


        if((cont1_sh==hour)&&(cont1_sm==min))
          {
            cont_led=0;
                control=0;          
          }

    if((cont1_eh==hour)&&(cont1_em==min))
          {
            cont_led=1;
                control=1;          
          }
      
   }


}


/*------------------------------------------
A键处理:调节功能标志flag循环增加
-------------------------------------------*/

void key_scan()
{
  if(key_a==0)                     
   {
     delayms(10);
         if(key_a==0)
          {        
            flag++;
        if(flag==1||flag==2)
         TR0=0;
        else TR0=1;
           
                if(flag==9)      
             flag=0;
     

                while(!key_a);
        dis_all();          
          }
   
   }

/*------------------------------------------
B键处理:调节功能标志flag循环减少
-------------------------------------------*/

  if(key_b==0)                  
   {
     delayms(10);
         if(key_b==0)
          {            
        flag--;
        if(flag==1||flag==2)
         TR0=0;
        else TR0=1;
                if(flag==-1)      
                flag=8;
        dis_all();       
                while(!key_b);
        dis_all();          
          }
   
   }

/*------------------------------------------
C键处理:根据功能标志flag的值进行判断
调节时钟-小时、分钟,闹钟1-小时、分钟,时段控制-小时、分钟的增加
-------------------------------------------*/

  if(key_c==0)                    
   {                          
     delayms(10);
         if(key_c==0)
          {
            if(flag==1)
                 {
                   hour++;
                   if(hour==24)
                   hour=0;                 
                 }

         if(flag==2)
                 {
                   min++;
                   if(min==60)
                   min=0;                 
                 }

         if(flag==3)
                 {
                   c1_hour++;
                   if(c1_hour==24)
                   c1_hour=0;                 
                 }

     if(flag==4)
                 {
                   c1_min++;
                   if(c1_min==60)
                   c1_min=0;                 
                 }

      if(flag==5)
                 {
                   cont1_sh++;
                   if(cont1_sh==24)
                   cont1_sh=0;                 
                 }

     if(flag==6)
                 {
                   cont1_sm++;
                   if(cont1_sm==60)
                   cont1_sm=0;                 
                 }

          if(flag==7)
                 {
                   cont1_eh++;
                   if(cont1_eh==24)
                   cont1_eh=0;                 
                 }

     if(flag==8)
                 {
                   cont1_em++;
                   if(cont1_em==60)
                   cont1_em=0;                 
                 }
   
     while(!key_c);

          }
   
   }

/*------------------------------------------
D键处理:根据功能标志flag的值进行判断
调节时钟-小时、分钟,闹钟1-小时、分钟,时段控制-小时、分钟的减少
-------------------------------------------*/
  
   if(key_d==0)                                                                                                      
    {                                 
      delayms(10);                             
         if(key_d==0)
          {
            if(flag==1)
                 {
                   if(hour==0) hour=23;
                   else hour--;                       
                 }

         if(flag==2)
                 {
                   if(min==0) min=59;         
                   else min--;
                 }

         if(flag==3)
                 {
                   if(c1_hour==0) c1_hour=23;                       
                   else c1_hour--;                          
                 }

         if(flag==4)
                 {
                   if(c1_min==0) c1_min=59;
                    else  c1_min--;                                           
                 }

      if(flag==5)
                 {
                   if(cont1_sh==0) cont1_sh=23;
                    else  cont1_sh--;
                 }

         if(flag==6)
                 {
                   if(cont1_sm==0) cont1_sm=59;
                    else cont1_sm--;
                 }          
                       
         if(flag==7)
                 {
                   if(cont1_eh==0)  cont1_eh=23;
                    else  cont1_eh--;
                 }         
               
         if(flag==8)
                 {
                   if(cont1_em==0) cont1_em=59;
                   else        cont1_em--;
                  }  
         while(!key_d);       
  
          }
   
   }

}

void timer0() interrupt 1
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  num0++;
  if(num0==20)
   {
     num0=0;
     sec++;
     if(sec==60)
      {
       sec=0;
       min++;
       if(min==60)
        {
         min=0;
         hour++;
         if(hour==24)
          {
           hour=0;
          }      
        }  
      }   
   }
}

//void timer1() interrupt 3
// {
//  TH1=(65536-4000)/256;
//  TL1=(65536-4000)%256;
//  dis_all();

// }

void main()
{
  init();
  while(1)
   {
    key_scan();
    dis_all();
          t_control();

   }

}

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复