找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3721|回复: 4
收起左侧

新人请教仿真一个数码管电子钟问题 把P0的位置和h=b[g],h=c[g]的位置换一下就不行了

[复制链接]
ID:79034 发表于 2015-5-26 23:59 | 显示全部楼层 |阅读模式
仿真一个数码管电子钟,问题在代码后面。代码和原理图如下:
  1. #include<reg51.h>//头文件
  2. #define uchar unsigned char//宏定义
  3. #define uint unsigned int
  4. sbit s1=P1^0;
  5. sbit s2=P1^1;
  6. sbit s3=P1^2;//按键123
  7. sbit fmq=P3^6;
  8. sbit fmqkg=P3^7;
  9. uint nian=2015,yue=5,ri=26;//初始化定义2015年5月26日
  10. signed char shi=16,fen=5,miao=0,xingqi=2,ns=7,nf=30,nm=0;//时分秒23-59-50,星期2,闹时分秒7:30:00
  11. uchar qiehuan=0,shanshuo=0,tiaojie=0,jishi=0,jishu=0,c[8]; //切换,闪烁,调节,计时,计数。
  12. uchar code a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9“-”“不显示”
  13. uchar code b[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//P2打开次序
  14. void yanshi(uchar d) //延时
  15. {        
  16.         uchar e,f;
  17.         for(e=d;e>0;e--)
  18.         for(f=120;f>0;f--);
  19. }
  20. void shijianxianshi() //时间显示
  21. {
  22.         uchar g,h;
  23.         for(g=0;g<8;g++)
  24.         {
  25.                 P2=0; //关P2,不关也没事。关了放心点。
  26.                 h=c[g];               
  27.                 P0=a[h];
  28.                 h=b[g];
  29.                 if(shanshuo)
  30.                 {
  31.                         if(tiaojie==1&(g==0|g==1))h=0; //若调节等于1,秒闪烁
  32.                         if(tiaojie==2&(g==3|g==4))h=0;//若调节等于2,分闪烁
  33.                         if(tiaojie==3&(g==7|g==6))h=0; //若调节等于3,时闪烁
  34.                 }
  35.                 P2=h;
  36.                 yanshi(5);
  37.                 P2=0; //消影
  38.         }
  39.         c[7]=shi/10; //分离时分秒
  40.         c[6]=shi%10;
  41.         c[5]=10; //“显示-”
  42.         c[4]=fen/10;
  43.         c[3]=fen%10;
  44.         c[2]=10;
  45.         c[1]=miao/10;
  46.         c[0]=miao%10;
  47.         if(shi<10)c[7]=11;//若小时小于10,0不显示。
  48. }
  49. void riqixianshi()         //日期        显示
  50. {
  51.         uchar i,j;
  52.         for(i=0;i<8;i++)
  53.         {
  54.                 P2=0;
  55.                 j=c[ i];
  56.                 P0=a[j];
  57.                 j=b[ i];
  58.                 if(shanshuo)//调节时对应的位置闪烁
  59.                 {
  60.                         if(tiaojie==4&(i==0|i==1))j=0;                //日
  61.                         if(tiaojie==5&(i==2|i==3))j=0;                //月
  62.                         if(tiaojie==6&(i==7|i==6|i==5|i==4))j=0;//年闪烁
  63.                 }
  64.                 P2=j;
  65.                 yanshi(5);
  66.                 P2=0;
  67.         }
  68.         c[7]=nian/1000%10;
  69.         c[6]=nian/100%10;
  70.         c[5]=nian/10%10;
  71.         c[4]=nian%10;
  72.         c[3]=yue/10;
  73.         c[2]=yue%10;
  74.         c[1]=ri/10;
  75.         c[0]=ri%10;
  76. }
  77. void xingqixianshi() //星期显示
  78. {
  79.         P2=0x40;  //01000000
  80.         P0=0X3F;  //00111111 显示“.”“-”
  81.         yanshi(5);
  82.         P2=0;
  83.         P2=0x20;   //00100000
  84.         P0=a[xingqi];  //星期显示位置
  85.         yanshi(5);
  86.         P2=0;
  87.         P2=0x10;         //00010000
  88.         P0=0XbF;        // 显示“-”
  89.         yanshi(5);
  90.         P2=0;
  91.         P2=0x08;         //00001000
  92.         P0=0X7F;         //显示“.”
  93.         yanshi(5);
  94.         P2=0;
  95. }
  96. void fengmingqi() //蜂鸣器
  97. {
  98.         if(fen==0&&miao==0)//整点报时
  99.         fmq=0;                                 //报时1秒
  100.         if(fen!=0||miao!=0)//1秒过后
  101.         fmq=1;                           //关蜂鸣器
  102.         if(shi==ns&&fen==nf) //闹钟1分钟
  103.         fmq=0;
  104.         if(shi!=ns||fen!=nf) //1分钟过后
  105.         fmq=1;                                //关蜂鸣器
  106. }
  107. void naozhongxianshi() //闹钟显示
  108. {
  109.         uchar k,l;
  110.         for(k=0;k<8;k++)
  111.         {
  112.                 P2=0;
  113.                 l=c[k];
  114.                 P0=a[l];
  115.                 l=b[k];
  116.                 if(shanshuo)
  117.                 {                                 
  118.                         if(tiaojie==7&(k==3|k==4))l=0;
  119.                         if(tiaojie==8&(k==7|k==6))l=0;
  120.                 }
  121.                 P2=l;
  122.                 yanshi(5);
  123.                 P2=0;
  124.         }
  125.         c[7]=ns/10;
  126.         c[6]=ns%10;
  127.         c[5]=10;
  128.         c[4]=nf/10;
  129.         c[3]=nf%10;
  130.         c[2]=10;
  131.         c[1]=nm/10;
  132.         c[0]=nm%10;
  133.         if(shi<10)c[7]=11;
  134. }
  135. void anjian()
  136. {         
  137.         if(s1==0)//若S1按下
  138.         {
  139.                 yanshi(10);         //延时
  140.                 if(s1==0)          //确认按下
  141.                 {
  142.                         while(!s1);        //等待放开
  143.                         tiaojie++;
  144.                         TR0=0;           //关定时器0
  145.                         TR1=1;           //开定时器1
  146.                         if(tiaojie==11)        //若调节到了11
  147.                         {
  148.                                 tiaojie=0; //置零
  149.                                 TR1=0;        //关计时器1;
  150.                                 TR0=1;        //开计时器0
  151.                         }
  152.                 }
  153.         }
  154. /*        if(s2==0)
  155.         {
  156.                 while(!s2);
  157.                 switch(tiaojie)
  158.                 {
  159.                         case 1:qiehuan=0;miao++;if(miao==60)miao=0;break;
  160.                         case 2:qiehuan=0;fen++;if(fen==60)fen=0;break;
  161.                         case 3:qiehuan=0;shi++;if(shi==24)shi=0;break;
  162.                         case 4:qiehuan=1;ri++;if(yue==2&&(nian%4==0)&&ri==30)ri=1;  //年能整除4的2月,29天。
  163.                                                                         else if(yue==2&&ri==29)ri=1; //其他的2月28天
  164.                                                                         else if((yue==4||yue==6||yue==9||yue==11)&&ri==31)ri=1;        //小月30天
  165.                                                                         else if(ri==32)ri=1;break;  //其他的31天
  166.                         case 5:qiehuan=1;yue++;if(yue==13)yue=1;break;
  167.                         case 6:qiehuan=1;nian++;if(nian==10000)nian=0;break;
  168.                         case 7:qiehuan=3;nf++;if(nf==60)nf=0;break;
  169.                         case 8:qiehuan=3;ns++;if(ns==24)ns=0;break;
  170.                         case 9:qiehuan=2;xingqi++;if(xingqi==8)xingqi=1;break;
  171.                         case 10:fmqkg=0;break;
  172.                         default:qiehuan=0;                                
  173.                 }
  174.         }
  175.         if(s3==0)
  176.         {
  177.                 while(!s3);
  178.                 switch(tiaojie)
  179.                 {
  180.                         case 1:qiehuan=0;miao--;if(miao==-1)miao=59;break;
  181.                         case 2:qiehuan=0;fen--;if(fen==-1)fen=59;break;
  182.                         case 3:qiehuan=0;shi--;if(shi==-1)shi=23;break;
  183.                         case 4:qiehuan=1;ri--;if(yue==2&&(nian%4==0)&&ri==0)ri=30;  //年能整除4的2月,29天。
  184.                                                                         else if(yue==2&&ri==0)ri=29; //其他的2月28天
  185.                                                                         else if((yue==4||yue==6||yue==9||yue==11)&&ri==0)ri=31;        //小月30天
  186.                                                                         else if(ri==0)ri=31;break;  //其他的31天
  187.                         case 5:qiehuan=1;yue--;if(yue==0)yue=12;break;
  188.                         case 6:qiehuan=1;nian--;if(nian==10000)nian=9999;break;
  189.                         case 7:qiehuan=3;nf--;if(nf==-1)nf=59;break;
  190.                         case 8:qiehuan=3;ns++;if(ns==-1)ns=23;break;
  191.                         case 9:qiehuan=2;xingqi--;if(xingqi==0)xingqi=7;break;
  192.                         case 10:fmqkg=0;break;                        
  193.                 }
  194.         }*/
  195.         if(tiaojie==1)        //调秒
  196.         {
  197.                 qiehuan=0;
  198.                 if(s2==0)
  199.                 {                                
  200.                         while(!s2);
  201.                         miao++;
  202.                         if(miao==60)miao=0;
  203.                 }
  204.                 if(s3==0)
  205.                 {                                 
  206.                         while(!s3);
  207.                         miao--;
  208.                         if(miao==-1)miao=59;
  209.                 }
  210.         }
  211.         if(tiaojie==2) //调分
  212.         {
  213.                 qiehuan=0;
  214.                 if(s2==0)
  215.                 {
  216.                         while(!s2);
  217.                         fen++;
  218.                         if(fen==60)fen=0;
  219.                 }
  220.                 if(s3==0)
  221.                 {
  222.                         while(!s3);
  223.                         fen--;
  224.                         if(fen==-1)fen=59;
  225.                 }
  226.         }
  227.         if(tiaojie==3)        //调时
  228.         {
  229.                 qiehuan=0;
  230.                 if(s2==0)
  231.                 {
  232.                         while(!s2);
  233.                         shi++;
  234.                         if(shi==24)shi=0;
  235.                 }
  236.                 if(s3==0)
  237.                 {
  238.                         while(!s3);
  239.                         shi--;
  240.                         if(shi==-1)shi=23;
  241.                 }
  242.         }
  243.         if(tiaojie==4)//调日
  244.         {
  245.                 qiehuan=1;
  246.                 if(s2==0)
  247.                 {                                
  248.                         while(!s2);
  249.                         ri++;                        
  250.                         if(yue==2&&(nian%4==0)&&ri==30)ri=1;  //年能整除4的2月,29天。
  251.                         else if(yue==2&&ri==29)ri=1; //其他的2月28天
  252.                         else if((yue==4||yue==6||yue==9||yue==11)&&ri==31)ri=1;        //小月30天
  253.                         else if(ri==32)ri=1;  //其他的31天
  254.                 }
  255.                 if(s3==0)
  256.                 {                                 
  257.                         while(!s3);
  258.                         ri--;
  259.                         if(yue==2&&(nian%4==0)&&ri==0)ri=30;
  260.                         else if(yue==2&&ri==0)ri=29;
  261.                         else if((yue==4||yue==6||yue==9||yue==11)&&ri==0)ri=31;
  262.                         else if(ri==0)ri=31;
  263.                 }
  264.         }
  265.         if(tiaojie==5) //调月
  266.         {
  267.                 qiehuan=1;
  268.                 if(s2==0)
  269.                 {
  270.                         while(!s2);
  271.                         yue++;
  272.                         if(yue==13)yue=1;
  273.                 }
  274.                 if(s3==0)
  275.                 {
  276.                         while(!s3);
  277.                         yue--;
  278.                         if(yue==0)yue=12;
  279.                 }
  280.         }
  281.         if(tiaojie==6) //调年
  282.         {
  283.                 qiehuan=1;
  284.                 if(s2==0)
  285.                 {
  286.                         while(!s2);
  287.                         nian++;
  288.                         if(nian==10000)nian=0;
  289.                 }
  290.                 if(s3==0)
  291.                 {
  292.                         while(!s3);
  293.                         nian--;
  294.                         if(nian==10000)shi=9999;
  295.                 }
  296.         }        
  297.         if(tiaojie==7)//调闹钟分
  298.         {
  299.                 qiehuan=3;
  300.                 if(s2==0)
  301.                 {
  302.                         while(!s2);
  303.                         nf++;
  304.                         if(nf==60)nf=0;
  305.                 }
  306.                 if(s3==0)
  307.                 {
  308.                         while(!s3);
  309.                         nf--;
  310.                         if(nf==-1)nf=59;
  311.                 }
  312.         }
  313.         if(tiaojie==8)//调闹钟时
  314.         {
  315.                 qiehuan=3;
  316.                 if(s2==0)
  317.                 {
  318.                         while(!s2);
  319.                         ns++;
  320.                         if(ns==24)ns=0;
  321.                 }
  322.                 if(s3==0)
  323.                 {
  324.                         while(!s3);
  325.                         ns--;
  326.                         if(ns==-1)ns=23;
  327.                 }
  328.         }
  329.         if(tiaojie==9)//调星期
  330.         {
  331.                 qiehuan=2;
  332.                 if(s2==0)
  333.                 {
  334.                         while(!s2);
  335.                         xingqi++;
  336.                         if(xingqi==8)xingqi=1;
  337.                 }
  338.                 if(s3==0)
  339.                 {
  340.                         while(!s3);
  341.                         xingqi--;
  342.                         if(xingqi==0)xingqi=7;
  343.                 }
  344.         }
  345.         if(tiaojie==10)//开关蜂鸣器
  346.         {
  347.                 if(s2==0)
  348.                 {
  349.                         while(!s2);
  350.                         fmqkg=0;                        
  351.                 }
  352.                 if(s3==0)
  353.                 {
  354.                         while(!s3);
  355.                         fmqkg=1;                        
  356.                 }
  357.         }
  358. }
  359. void main()
  360. {
  361.         TMOD=0X01;         //中断器
  362.         TH0=(65535-49990)/256;
  363.         TL0=(65535-49990)%256;
  364.         ET0=1;
  365.         TR0=1;
  366.         EA=1;
  367.         TH1=(65535-49990)/256;
  368.         TL1=(65535-49990)%256;
  369.         ET1=1;
  370.         TR1=0;
  371.         while(1)
  372.         {        
  373.                 anjian();
  374.                 fengmingqi();
  375.                 if(qiehuan==0)
  376.                 shijianxianshi();
  377.                 if(qiehuan==1)
  378.                 riqixianshi();
  379.                 if(qiehuan==2)
  380.                 xingqixianshi();
  381.                 if(qiehuan==3)
  382.                 naozhongxianshi();
  383.         }
  384. }
  385. void dingshiqi1()interrupt 1
  386. {
  387.         TH0=(65535-49990)/256;
  388.         TL0=(65535-49990)%256;
  389.         jishi++;
  390.         if(jishi==20)
  391.         {
  392.                 jishi=0;
  393.                 miao++;
  394.                 if(miao>29&&miao<36)qiehuan=2;        //5秒显示星期
  395.                 if(miao>35&&miao<45)qiehuan=1; //9秒显示日期
  396.                 if(miao>44||miao<30)qiehuan=0; //其他的时间全显示时间
  397.                 if(miao==60)
  398.                 {
  399.                         miao=0;
  400.                         fen++;
  401.                         if(fen==60)
  402.                         {
  403.                                 fen=0;
  404.                                 shi++;
  405.                                 if(shi==24)
  406.                                 {
  407.                                         shi=0;
  408.                                         xingqi++;
  409.                                         if(xingqi==8)xingqi=1;
  410.                                         ri++;
  411.                                         if(yue==2&&(nian%4==0)&&ri==30)ri=1;
  412.                                     else if(yue==2&&ri==29)ri=1;
  413.                                     else if((yue==4||yue==6||yue==9||yue==11)&&ri==31)ri=1;        
  414.                                     else if(ri==32)ri=1;  
  415.                                         if(ri==1)
  416.                                         {
  417.                                                 yue++;
  418.                                                 if(yue==13)
  419.                                                 {
  420.                                                         yue=1;
  421.                                                         nian++;
  422.                                                         if(nian==10000)//没地方显示了,不然长整型非得弄成几亿年。
  423.                                                         nian=0;        //想多了,人生百年虽然短了点,但是也可以了。
  424.                                                 }
  425.                                         }
  426.                                 }
  427.                         }
  428.                 }
  429.         }        
  430. }
  431. void dingshiqi2()interrupt 3
  432. {
  433.         TH1=(65535-49990)/256;
  434.         TL1=(65535-49990)%256;
  435.         jishu++;
  436.         if(jishu==40)
  437.         {
  438.                 jishu=0;
  439.                 shanshuo=shanshuo^0xff;
  440.         }
  441. }
复制代码


为什么我把P0的位置和h=b[g],h=c[g]的位置换一下就不行了呢?
原理图.png
换了P0=a[h]位置.png
换了P0=a[h]位置1.png
换了h=b[g]位置.png
换了h=b[g]位置1.png
换了h=b[g]位置3.png
换了h=b[g]位置3-2.png

数码管.zip

88.88 KB, 下载次数: 9

回复

使用道具 举报

ID:79034 发表于 2015-5-31 01:17 | 显示全部楼层
有人能帮我解释下吗?
回复

使用道具 举报

ID:81118 发表于 2015-6-6 18:20 | 显示全部楼层
仿真的东西,说不清道不明!
回复

使用道具 举报

ID:1 发表于 2015-6-9 01:48 | 显示全部楼层
h=b[g],h=c[g]是两句相邻的语句,他们的顺序不会影响到程序的执行结果,楼主是不是复制的时候输入了一些 全角的空格或者字符?
回复

使用道具 举报

ID:79034 发表于 2015-6-12 20:16 | 显示全部楼层
admin 发表于 2015-6-9 01:48
h=b[g],h=c[g]是两句相邻的语句,他们的顺序不会影响到程序的执行结果,楼主是不是复制的时候输入了一些 全 ...

没有啊,都是自己打的,换位置的时候才是复制的。不过仿真确实可能有问题。
我做个实物实验一下。谢谢。。。。

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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