查看: 1665|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
沙发
发表于 2016-6-4 01:16:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之所以贴出来,一个也是因为这个电路并不像实验板那么整洁,大家看附件的仿真文件就清楚,另一方面也是之前学习的笔记吧

程序
  • /*        本程序仅应用于‘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[m%10];
  •                 delay(x);
  •                 P37=1;
  •                 P32=0;                                          //显示分十位
  •                 P1=table[m/10];
  •                 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[m%10];
  •                         delay(x);
  •                         P37=1;
  •                         P32=0;                                          //显示分十位
  •                         P1=table[m/10];
  •                         delay(x);
  •                         P32=1;
  •                 }
  •         }
  •         if(flag_set!=2)
  •         {
  •                 P31=0;                                          //显示时个位
  •                 P1=table[h%10];
  •                 delay(x);
  •                 P31=1;
  •                 if (flag)                                 //闪烁秒和显示时十位
  •                 {
  •                         P30=0;
  •                   P1=table[h/10];
  •                   delay(x);
  •                   P30=1;
  •                 }
  •                 else
  •                 {
  •                   P30=0;
  •                   P1=table2[h/10];
  •                   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[h%10];
  •                         delay(x);
  •                         P31=1;
  •                         P30=0;                                          //显示时十位
  •                   P1=table[h/10];
  •                   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;
  • }




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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