找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么我的单片机数码管常显8 不倒计时啊?

[复制链接]
跳转到指定楼层
楼主

单片机源程序如下:

  1. #include<reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define DIG0 0x01                 // 定义数码管1
  6. #define DIG1 0x02                 // 定义数码管2
  7. #define DIG2 0x03                 // 定义数码管3
  8. #define DIG3 0x04                 // 定义数码管4
  9. void delay(uint i);
  10. void T0_init();
  11. void MAX7219(uchar addr,uchar num);
  12. void MAX7219_init();                        //MAX7219初始化
  13. void display();
  14. sbit DIN=P3^0;                                         //连接MAX7219 DIN引脚
  15. sbit LOAD=P3^1;                                        //连接MAX7219 LOAD 引脚
  16. sbit CLK=P3^2;                                         //连接MAX7219 CLK 引脚
  17. sbit G1=P0^0;                                        //南北红绿灯
  18. sbit Y1=P0^1;
  19. sbit R1=P0^2;
  20.                                                                  
  21. sbit G2=P1^0;                                        //东西红绿灯
  22. sbit Y2=P1^1;
  23. sbit R2=P1^2;
  24. uchar NS_S,NS_G,EW_S,EW_G;
  25. uchar NS,EW;
  26. uchar temp=0,i;
  27. uchar code table[10]= {0x7e,0x30,0x6d,0x79,0x33,
  28.                                           0x5b,0x5f,0x70,0x7f,0x7b};                //共阴级数码管数组
  29.                                                          
  30. void delay(uint i)
  31. {
  32.         uint j;
  33.         for(j=0;j<i;j++);
  34. }
  35. void T0_init()
  36. {                                                                 //装初值10MS
  37.         TMOD=0X01;
  38.         TH0=0XD8;
  39.         TL0=0XF0;
  40.         ET0=1;
  41.         TR0=1;
  42. }
  43. void MAX_write(uchar ch)                 //以8位一个字节进行写值
  44. {
  45.         uchar j,ads;
  46.     for(j=0;j<8;j++)                            //8位
  47.         {
  48.       ads=ch&0x80;                        //取最高位
  49.       CLK = 0;                        //时钟线置低
  50.       if(ads)  DIN = 1;
  51.       else      DIN = 0;
  52.       ch=ch<<1;                         //左移一位
  53.       CLK=1;                                     //上升沿,DIN的数据写入到7219
  54.     }
  55. }
  56. void MAX7219(uchar addr, uchar num)                //写地址,写数据
  57. {
  58.     LOAD = 0;         
  59.         _nop_();
  60.     MAX_write(addr);
  61.          _nop_();
  62.     MAX_write(num);  
  63.          _nop_();
  64.     LOAD = 1;                                  //锁存
  65. }                                                                          
  66. void MAX7219_init()
  67. {
  68.     MAX7219(0x0c,0x01);                                        //正常状态
  69.     MAX7219(0x0b,0x03);                                        //设置扫描范围DIG0-3
  70.     MAX7219(0x0a,0x05);                                        //设置亮度11/32
  71.     MAX7219(0x09,0x00);                                        //采用译码方式 ,不译码
  72. }
  73. void display()
  74. {
  75.         NS_S=NS/10;                                                         //南北十位,个位
  76.         NS_G=NS%10;
  77.         EW_S=EW/10;                                                         //东西十位,个位
  78.         EW_G=EW%10;
  79.         MAX7219(DIG0,table[NS_S]);                                //南北十位,个位      
  80.     MAX7219(DIG1,table[NS_G]);                                       
  81.     MAX7219(DIG2,table[EW_S]);                                //东西十位,个位
  82.     MAX7219(DIG3,table[EW_G]);
  83. }
  84. void T0_(void)interrupt 1
  85. {
  86.   temp++;
  87.   TH0=0XD8;
  88.   TL0=0XF0;
  89.   if(temp==100)
  90.     {
  91.       temp=0;
  92.       NS--;
  93.       EW--;
  94.           if((NS==0)&&(EW==3))
  95.          {
  96.           NS=3;
  97.           EW=3;
  98.           i=1;
  99.          }
  100.       if((NS==0)&&(EW==0)&&(i==1))
  101.          {
  102.           NS=83;
  103.           EW=80;
  104.           i=2;
  105.          }
  106.      if((NS==3)&&(EW==0))
  107.          {
  108.           NS=3;
  109.           EW=3;
  110.           i=3;
  111.          }
  112.      if((NS==0)&&(EW==0)&&(i==3))
  113.          {
  114.           NS=60;
  115.           EW=63;
  116.           i=4;
  117.          }
  118.         }
  119.         display();
  120. }
  121. void main()
  122. {
  123.         T0_init();
  124.         MAX7219_init();
  125.         EA=1;
  126.         NS=60;                                                                   //初始南北通行60秒
  127.         EW=63;                                                                  
  128.    R2=0,G1=0;                                                             //南北绿灯亮,东西红灯亮
  129. while (1)
  130.         {
  131.                 uint k;
  132.                 display();        
  133.       switch(i)
  134.                {
  135.               case 1:         R2=1,G1=1;                        //关闭南北绿灯,东西红灯
  136.                                                   Y1=0,Y2=0;                        //黄灯闪烁
  137.                       for(k=0;k<3;k++)
  138.                         {
  139.                               Y1=~Y1;
  140.                                                           Y2=~Y2;
  141.                               delay(10000);
  142.                            }        
  143.                                   break;
  144.               case 2: G2=0,R1=0;                         //东西绿灯亮,南北红灯亮
  145.                       break;
  146.               case 3: G2=1,R1=1;
  147.                                             Y1=0,Y2=0;                        //黄灯闪烁
  148.                       for(k=0;k<3;k++)                //循环三次进行延时闪烁
  149.                         {
  150.                               Y1=~Y1;
  151.                                                           Y2=~Y2;
  152.                               delay(10000);
  153.                             }
  154.                                   break;
  155.               case 4: R2=0,G1=0;                         //东西红灯亮,南北绿灯亮
  156.                           break;
  157.              }                        
  158.          }
  159. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2023-12-15 20:34 | 只看该作者
因为你用的共阳数码管,而MAX7219的A-P各段输出为低电平,就造成数码管各段全亮
回复

使用道具 举报

板凳
ID:883242 发表于 2023-12-17 15:32 | 只看该作者
方向也不对,NS共用一套N,EW共用一套E,分不清楚东南西北。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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