找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1826|回复: 0
打印 上一主题 下一主题
收起左侧

单片机数字钟仿真

[复制链接]
跳转到指定楼层
楼主
数字钟仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h> //包含51单片机的头文件
  2. unsigned char code teble[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//包含数码位码
  3. unsigned char code table[10]={0Xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0Xf8,0X80,0X90};//数码管断码
  4. unsigned char shijian[6]={0,0,0,0,0,0};//时间显示
  5. unsigned char shijian2[6]={0,0,0,0,0,0};//星期显示
  6. unsigned char nyr[6]={0,0,0,0,0,0};        //年月日显示
  7. unsigned char nyr1[6]={0,0,0,0,0,0};
  8. void zh();        //状态函数
  9. void display();        //显示函数
  10. void week();//星期显示
  11. void miaobiao();//秒表显示
  12. unsigned char keysc();//按键模块
  13. void mDelay(unsigned int Delay); //延迟函数
  14. unsigned char  hour,sec,minute;//定义小时,分钟,秒
  15. unsigned char  day=22,month=05,year=18;        //定义day month ,year
  16. unsigned char  i,w,year1,j,se,fe,mi;        //定义i,w,year1,j,se,fe,mi.
  17. sbit k1=P1^4;//按键k1=P1.0;
  18. sbit k2=P1^1;//按键k1=P1.1;
  19. sbit k3=P1^2; //按键k1=P1.21;
  20. sbit k4=P1^3;//按键k1=P1.3;

  21. unsigned char  display_state=0;

  22.                                                
  23. unsigned char keysc()  //按键模块
  24. {if(!k1)                  //判断按键按下
  25.   {mDelay(5);          //延时消抖
  26.    if(!k1)              
  27.    while(!k1) display(); //判断按键是否按下返回,因为按下时k1=0即!k1=1,display是消闪烁,一起来控制按下按键为一次的变量
  28.    return 1;        
  29.    }
  30. if(!k2)                 //判断按键按下
  31.   {mDelay(5);                  //延时消抖
  32.    if(!k2)
  33.    while(!k2) display();   //判断按键是否按下返回,因为按下时k1=0即!k1=1,display是消闪烁,一起来控制按下按键为一次的变量
  34.    return 2;         
  35.    }
  36. if(!k3)
  37.   {mDelay(5);
  38.    if(!k3)
  39.    while(!k3) display();  //同上所示
  40.    return 3;          
  41.    }
  42. if(!k4)
  43.   {mDelay(5);
  44.   if(!k4)
  45.    while(!k4) display();  //如上所示
  46.   return 4;          
  47.   }
  48. return 0;
  49. }

  50. void display()        //显示模块
  51. {unsigned char k; //定义k
  52. unsigned char y; //定义y
  53.   unsigned char data1; //定义data1
  54.    if(display_state==0)
  55.    {
  56. for(k=0;k<6;k++)          //使得k等于0到6
  57.     {y=0x00;
  58.          if(k==2||k==4) y=0x80;
  59.          P2=0X00;
  60.          data1=shijian[k];
  61.      P0=table[data1]-y;     
  62.          P2=teble[k];
  63.      mDelay(2);
  64.          }
  65.          }
  66.    if(display_state==1)
  67.    {
  68. for(k=0;k<6;k++)
  69.     {y=0x00;
  70.          if(k==2||k==4) y=0x80;
  71.          P2=0X00;
  72.          data1=nyr[k];
  73.      P0=table[data1]-y;     
  74.          P2=teble[k];
  75.      mDelay(2);
  76.          }
  77.           }
  78.         if(display_state==2)
  79.          {for(k=0;k<6;k++)
  80.     {y=0x00;
  81.          if(k==2||k==4) y=0x80;
  82.          P2=0X00;
  83.          data1=nyr1[k];
  84.      P0=table[data1]-y;     
  85.          P2=teble[k];
  86.      mDelay(2);
  87.          }
  88.          }
  89.                  if(display_state==3)
  90.          {for(k=0;k<6;k++)
  91.     {y=0x00;
  92.          if(k==2||k==4) y=0x80;
  93.          P2=0X00;
  94.          data1=shijian2[k];
  95.      P0=table[data1]-y;     
  96.          P2=teble[k];
  97.      mDelay(2);
  98.          }
  99.          }
  100.          }

  101. void mDelay(unsigned int Delay)
  102. {unsigned int k;
  103.   for(;Delay>0;Delay--)
  104.    {for(k=0;k<54;k++);
  105.    }
  106. }

  107. void t0() interrupt 1  //外部中断0
  108. {
  109. TH0=55536/256;
  110. TL0=55536%256;
  111. i++;
  112. }

  113. void t1()   interrupt 3        //定时器中断1
  114. {TH0=55536/256;
  115. TL0=55536%256;
  116. j++;

  117. }

  118. void zh()        //转换模块
  119. {
  120. if(i==100)
  121. { i=0;sec++;
  122.    if(sec==60)      {sec=0;minute++;}
  123.    if(minute==60)   {minute=0;hour++;}
  124.    if(hour==24)     {hour=0;day++;}

  125.    if(day==31)      {day=0;month++;}
  126.    if(month==12)   {month=0;year++;}
  127.    if(year==99)     {year=0;}

  128.    
  129.   

  130.   if(month==1||month==5||month==7||month==8||month==10||month==12)
  131.     if(day==31){day=0;month++;}
  132.   if(month==3||month==4||month==6||month==9||month==11)
  133.     if(day==30){day=0;month++;}
  134.   if(month==12){month=0;year++;}
  135.   if(year/4==0)if(month==2)if(day==29)
  136.   {day=0;month++;}
  137.   else if(month==2)if(day==28)
  138.   {day=0;month++;}
  139.   

  140.        
  141. }
  142. if(display_state==0)

  143. shijian[0]=sec%10;
  144. shijian[1]=sec/10;
  145. shijian[2]=minute%10;
  146. shijian[3]=minute/10;
  147. shijian[4]=hour%10;
  148. shijian[5]=hour/10;

  149. if(display_state==1)
  150. nyr[0]=day%10;
  151. nyr[1]=day/10;
  152. nyr[2]=month%10;
  153. nyr[3]=month/10;
  154. nyr[4]=year%10;
  155. nyr[5]=year/10;
  156. if(display_state==3)
  157. shijian2[0]=j%10;
  158. shijian2[1]=j/10;
  159. shijian2[2]=se%10;
  160. shijian2[3]=se/10;
  161. shijian2[4]=fe%10;
  162. shijian2[5]=fe/10;

  163. }
  164. void week()          //星期显示模块
  165. {if(month==1||month==2)
  166.    {month+=12;
  167.    year--;
  168.    }
  169.    year1=year+2000;
  170.     if(month==1||month==2)  {month+=12; year1--;}
  171.    w=(day+2*month+3*(month+1)/5+year1+year1/4-year1/100+year1/400)%7;
  172.   nyr1[0]=w+2;
  173. }       
  174. void miaobiao()
  175. { if(j==100)
  176.     {se++;j=0;         j=0; }
  177.    if(se==60){ fe++;se=0;

  178. }
  179. shijian2[0]=j%10;
  180. shijian2[1]=j/10;
  181. shijian2[2]=se%10;
  182. shijian2[3]=se/10;
  183. shijian2[4]=fe%10;
  184. shijian2[5]=fe/10;
  185. }


  186. void main()
  187. {
  188.   unsigned char key; //定义key
  189.   unsigned char mun=0;//定义mun
  190.   TMOD=0X01;                 
  191.   TH0=55536/256;
  192.   TL0=55536%256;
  193.   TR0=1;
  194.   EA=1;
  195.   ET0=1;        //采用定时器0的方式0;


  196.   TMOD=0X11;
  197.   TH0=55536/256;
  198.   TL0=55536%256;
  199.   TR1=0;
  200.   EA=1;
  201.   ET1=1;                                      //采用定时器1的方式工作方式1

  202.   while(1)                         //循环
  203.   {       
  204.     week();                        //星期显示
  205.           zh();                        //状态库
  206.     display();           //显示模块
  207.         miaobiao();           //秒表显示
  208.     key=keysc();           //使得key等于按键的值
  209.            zh();  //状态显示
  210.     display(); //显示
  211.   switch(key)
  212.   {
  213.   case 1:if(display_state==0)//如果display_state==0等于0
  214.   {TR0=0;mun++;if(mun>3) {mun=0;TR0=1;}}//让定时器0停止工作如果mun大于3那么定时器从新开始;
  215.    if(display_state==1)               //如果display_state==0等于1那么执行以下代码
  216.   {TR0=0;mun++;if(mun>3) {mun=0;TR0=1;}} break;       
  217.   case 2:if(display_state==0)          //如果display_state==0等于0
  218.   {
  219.   if(mun==1) {sec++;    if(sec==60)           sec=00;}        //如果mun等于1,秒加加,当秒加到60的时候秒等于0
  220.   if(mun==2) {minute++; if(minute==60) minute=00;}         //如果mun等于1,。分加加,当分加到60的时候分等于0
  221.   if(mun==3) {hour++;   if(hour==24)   hour=00;}         //如果hour等于1,shi加加,当shi加到60的时候秒等于0
  222.   }
  223.   if(display_state==1)
  224.   {
  225.   if(mun==1) {day++; if(day==32)day=00;}
  226.   if(mun==2) {month++; if(month==12) month=00;}
  227.   if(mun==3) {year++;   if(year==99)   year=00;}
  228.   }
  229.   if(display_state==2)        //display_state等于2的时候
  230.   {
  231.   if(mun==1) {w++; if(w==7)day=01;}        //并且mun等于1的时候w++,当w等于
  232.   }
  233.     if(display_state==3)
  234. ……………………

  235. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
新建文件夹 (2).rar (57.66 KB, 下载次数: 29)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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