搜索
bottom↓
回复: 1

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

[复制链接]

出50入0汤圆

发表于 2012-10-17 15:22:04 | 显示全部楼层 |阅读模式
本帖最后由 PRO 于 2012-10-17 15:48 编辑

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

程序

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

  16. void display()                                  //显示函数
  17. {       
  18.         uchar x=1000;                          //x延时时间
  19.        
  20.         if(flag_set!=1)
  21.         {
  22.                 P37=0;                                          //显示分个位
  23.                 P1=table[m%10];
  24.                 delay(x);
  25.                 P37=1;
  26.                
  27.                 P32=0;                                          //显示分十位
  28.                 P1=table[m/10];                                         
  29.                 delay(x);
  30.                 P32=1;
  31.   }
  32.         else
  33.         {
  34.                 if (flag)
  35.                 {
  36.                         P37=0;                                          //显示分个位
  37.                         P1=0x01;
  38.                         delay(x);
  39.                         P37=1;
  40.        
  41.                         P32=0;                                          //显示分十位
  42.                         P1=0x01;                                         
  43.                         delay(x);
  44.                         P32=1;
  45.                 }
  46.                 else
  47.                 {
  48.                         P37=0;                                          //显示分个位
  49.                         P1=table[m%10];
  50.                         delay(x);
  51.                         P37=1;
  52.                        
  53.                         P32=0;                                          //显示分十位
  54.                         P1=table[m/10];                                         
  55.                         delay(x);
  56.                         P32=1;
  57.                 }
  58.         }
  59.        
  60.         if(flag_set!=2)
  61.         {
  62.                 P31=0;                                          //显示时个位
  63.                 P1=table[h%10];
  64.                 delay(x);
  65.                 P31=1;
  66.        
  67.                 if (flag)                                 //闪烁秒和显示时十位
  68.                 {
  69.                         P30=0;                                          
  70.                   P1=table[h/10];
  71.                   delay(x);
  72.                   P30=1;
  73.                 }
  74.                 else
  75.                 {
  76.                   P30=0;                                          
  77.                   P1=table2[h/10];
  78.                   delay(x);
  79.                   P30=1;
  80.                 }
  81.         }
  82.         else
  83.         {
  84.                 if(flag)
  85.                 {
  86.                         P31=0;                                          //显示时个位
  87.                         P1=0x01;
  88.                         delay(x);
  89.                         P31=1;
  90.                
  91.                         P30=0;                                          
  92.                   P1=0x01;
  93.                   delay(x);
  94.                   P30=1;
  95.                 }
  96.                 else
  97.                 {
  98.                         P31=0;                                          //显示时个位
  99.                         P1=table[h%10];
  100.                         delay(x);
  101.                         P31=1;

  102.                         P30=0;                                          //显示时十位
  103.                   P1=table[h/10];
  104.                   delay(x);
  105.                   P30=1;
  106.                 }                
  107.         }                                          
  108. }

  109. void keyscan()                          
  110. { uchar x=1000;                                          //x消抖延时系数
  111.         delay(x);
  112.   if(P34==0)
  113.         { while(P34==0)
  114.                                         display();
  115.                 ID++;
  116.           switch(ID)
  117.           {
  118.                    case 1:                                                                                 //set m        flag_set=1
  119.                                 flag_set=1;                                                         
  120.                                 while(P34)
  121.                                 {if(P35==0)
  122.                                   {        while(P35==0)
  123.                                                                         display();
  124.                                                 m++;
  125.                                                 if(m==60)
  126.                                                         m=0;         
  127.                                   }
  128.                                   else
  129.                                   {       
  130.                                                 display();
  131.                                         }
  132.                                 }       
  133.                                 break;

  134.                 case 2:                                                                                                 //set h    flag_set=2
  135.                         flag_set=2;                                                                         
  136.                   while(P34)
  137.                                 {if(P35==0)
  138.                                   {        while(P35==0)
  139.                                                                         display();
  140.                                                 h++;
  141.                                                 if(h==24)
  142.                                                         h=0;         
  143.                                   }
  144.                                   else
  145.                                   {       
  146.                                                 display();
  147.                                         }
  148.                                 }       
  149.                                 break;

  150.                 case 3:
  151.                 ID=0;
  152.                 flag_set=0;
  153.                 break;
  154.           }
  155.                
  156.         }
  157.        
  158. }

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

  169.         while(1)
  170.         {       
  171.           display();
  172.                 if (P34==0)
  173.                         keyscan();       
  174.         }
  175. }

  176. void t0() interrupt 1
  177. {        x++;
  178.         if(x%5==0)                                  //闪烁标志
  179.                  flag=~flag;
  180.         if(x==10)                                          //定时1s
  181.         { x=0;
  182.           s++;
  183.           if(s==60)
  184.           {        s=0;
  185.                         m++;
  186.                         if(m==60)
  187.                         {        m=0;
  188.                                 h++;
  189.                                 if(h==24)
  190.                                 {        h=0;        }
  191.                   }
  192.                 }       
  193.   }
  194.         TH0=(65536-29825)/256;                  //晶振3.579MHz,定时4ms减1193;定时100ms减29825;定时200ms减59650
  195.         TL0=(65536-29825)%256;       
  196. }


复制代码
    仿真文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-10-17 17:36:34 | 显示全部楼层
帮忙顶下,对初学者有好处的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 20:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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