PRO 发表于 2012-10-17 15:22:04

2051时针程序练手,全是自己写的,有仿真文件

本帖最后由 PRO 于 2012-10-17 15:48 编辑

之所以贴出来,一个也是因为这个电路并不像实验板那么整洁,大家看附件的仿真文件就清楚,另一方面也是之前学习的笔记吧

程序
/*        本程序仅应用于‘4位单片机电子钟电路’
        2051
        晶振 3.579MHz
                main.c
*/
#include <STC11.H>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0xfd,0x25,0xbb,0xaf,0x67,0xcf,0xdf,0xa5,0xff,0xef};       //0~9仅限本电路,正常显示
uchar code table2[]={0xfc,0x24,0xba,0xae,0x66,0xce,0xde,0xa4,0xfe,0xee};
uchar x,h,m,s,flag,ID,flag_set;                        //ID=1调整分钟 ID=2调整时钟
void delay(uint a)                  //延时函数0~65535
{                                          
        while(a--);
}

void display()                                  //显示函数
{       
        uchar x=1000;                          //x延时时间
       
        if(flag_set!=1)
        {
                P37=0;                                          //显示分个位
                P1=table;
                delay(x);
                P37=1;
               
                P32=0;                                          //显示分十位
                P1=table;                                         
                delay(x);
                P32=1;
}
        else
        {
                if (flag)
                {
                        P37=0;                                          //显示分个位
                        P1=0x01;
                        delay(x);
                        P37=1;
       
                        P32=0;                                          //显示分十位
                        P1=0x01;                                         
                        delay(x);
                        P32=1;
                }
                else
                {
                        P37=0;                                          //显示分个位
                        P1=table;
                        delay(x);
                        P37=1;
                       
                        P32=0;                                          //显示分十位
                        P1=table;                                         
                        delay(x);
                        P32=1;
                }
        }
       
        if(flag_set!=2)
        {
                P31=0;                                          //显示时个位
                P1=table;
                delay(x);
                P31=1;
       
                if (flag)                               //闪烁秒和显示时十位
                {
                        P30=0;                                          
                  P1=table;
                  delay(x);
                  P30=1;
                }
                else
                {
                  P30=0;                                          
                  P1=table2;
                  delay(x);
                  P30=1;
                }
        }
        else
        {
                if(flag)
                {
                        P31=0;                                          //显示时个位
                        P1=0x01;
                        delay(x);
                        P31=1;
               
                        P30=0;                                          
                  P1=0x01;
                  delay(x);
                  P30=1;
                }
                else
                {
                        P31=0;                                          //显示时个位
                        P1=table;
                        delay(x);
                        P31=1;

                        P30=0;                                          //显示时十位
                  P1=table;
                  delay(x);
                  P30=1;
                }                
        }                                          
}

void keyscan()                        
{ uchar x=1000;                                          //x消抖延时系数
        delay(x);
if(P34==0)
        { while(P34==0)
                                        display();
                ID++;
          switch(ID)
          {
                   case 1:                                                                               //set m        flag_set=1
                                flag_set=1;                                                       
                                while(P34)
                                {if(P35==0)
                                  {        while(P35==0)
                                                                        display();
                                                m++;
                                                if(m==60)
                                                        m=0;       
                                  }
                                  else
                                  {       
                                                display();
                                        }
                                }       
                                break;

                case 2:                                                                                               //set h    flag_set=2
                        flag_set=2;                                                                       
                  while(P34)
                                {if(P35==0)
                                  {        while(P35==0)
                                                                        display();
                                                h++;
                                                if(h==24)
                                                        h=0;       
                                  }
                                  else
                                  {       
                                                display();
                                        }
                                }       
                                break;

                case 3:
                ID=0;
                flag_set=0;
                break;
          }
               
        }
       
}

void main(void)
{
        TH0=(65536-29825)/256;          //中断初始化,100ms
        TL0=(65536-29825)%256;       
        TMOD=0x01;                                //定时器0方式1
        ET0=1;                                          //中断T0允许
        TR0=1;                                          //开T0
        //EX0=1;                                        //开外部中断0
        //IT0=1;                                        //下降沿触发
        EA=1;                                                  //开总中断       

        while(1)
        {       
          display();
                if (P34==0)
                        keyscan();       
        }
}

void t0() interrupt 1
{        x++;
        if(x%5==0)                                  //闪烁标志
               flag=~flag;
        if(x==10)                                          //定时1s
        { x=0;
          s++;
          if(s==60)
          {        s=0;
                        m++;
                        if(m==60)
                        {        m=0;
                                h++;
                                if(h==24)
                                {        h=0;        }
                  }
                }       
}
        TH0=(65536-29825)/256;                  //晶振3.579MHz,定时4ms减1193;定时100ms减29825;定时200ms减59650
        TL0=(65536-29825)%256;       
}


   仿真文件

lee345 发表于 2012-10-17 17:36:34

帮忙顶下,对初学者有好处的
页: [1]
查看完整版本: 2051时针程序练手,全是自己写的,有仿真文件