找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5115|回复: 2
收起左侧

51单片机驱动数码管数字显示混乱是怎么回事?

[复制链接]
ID:245101 发表于 2017-11-2 20:48 来自手机 | 显示全部楼层 |阅读模式
如题,共阳级数码管

Screenshot_2017-11-02-20-45-31.png
     程序无误,管脚接触无误

  1. /**********交通灯元件清单***********/

  2. 1、9*15万用板            一块
  3. 2、单片机            一枚
  4. 3、两位数码管            4个
  5. 4、LED灯            9个
  6. 5、排阻            一个
  7. 6、晶振            1个
  8. 7、三极管8550        4个
  9. 8、电解电容10uf        1个
  10. 9、按键            6个
  11. 10、USB接口            1个
  12. 11、自锁开关            1个
  13. 12、电阻470            9个
  14. 13、电阻.7K            4个
  15. 14、电阻10K            1个

  16. 交通灯的pcb:
  17. 0.png 0.png
  18. 交通灯原理图:
  19. 0.png
  20. 交通灯仿真:
  21. 0.png 0.png

  22. 交通灯的电机源程序:
  23.         
  24. #include<reg51.H>                                         // 对单片机的口进行了定义
  25. #define uint unsigned int
  26. #define uchar unsigned char
  27. uchar code a[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//段码组合,共阳极
  28. uchar code b[4]={0x01,0x02,0x04,0x08}; //位码组合         
  29. uchar code c[4]={0xcc,0xd4,0x78,0xb8};/*P1 绿红、黄红、红绿、红黄*/
  30.                   
  31. //12MHz                          
  32. //*************************************************************************************
  33. uchar NB=25,DX=30,NBG=25,DXG=15,H=5;                         /*数码管显示值设置*/
  34. uchar  i,k=0,cnt=0,j=0;

  35. sbit K0=P3^4;                           /*支干道通行*/
  36. sbit K1=P3^5;                           /*主干道通行*/
  37. sbit K4=P3^6;                           /*返回*/
  38. sbit K3=P3^2;                        /*设置时间*/
  39. sbit K2=P3^3;                        /*紧急刹车*/

  40. void delay(uchar t);                /*定义延时程序*/
  41. void key();                                /*定义键盘程序*/
  42. void display();                        /*定义显示程序*/
  43. void settime();                /*定义时间设置显示程序*/
  44. //*************************程序初始*********************************************
  45. void init(void)
  46. {
  47.         TMOD=0x01;                          /*使用定时器0模式一*/
  48.         TH0=0x3c;                          /*(65536-5000)/256*/
  49.         TL0=0xb0;                          /*(65536-5000)%256*/
  50.         IT0=1;                                  //开中断
  51.         ET0=1;
  52.         TR0=1;
  53.         EA=1;
  54.         EX0=1;
  55.         EX1=1;
  56.         P1=c[k];                                  //开启交通灯
  57. }
  58. //*************************中断0处理程序***************************************
  59. void int0(void) interrupt 0                 //        通行时间设置
  60. {         
  61.   EA=0;
  62.   P1=0xd8;                                /*红灯全亮*/
  63.   
  64. for(;;)
  65.         {
  66.            settime();

  67.                    if(K1==0)                                          /*P3^6=0设置主干道通行时间*/
  68.            {  
  69.           delay(40);
  70.           if(K1==0)
  71.                   {
  72.              while(!K1)
  73.              {settime();}
  74.                                  DXG++;                                /*主干道通行时间加1*/
  75.              if(DXG==100)
  76.              DXG=0;                        
  77.           }
  78.            }
  79.          
  80.                    if(K0==0)                                                         /*P3^5=0设置支干道通行时间*/
  81.            {  
  82.              delay(40);
  83.              if(K0==0)
  84.                      {
  85.                while(!K0)
  86.                {settime();}
  87.                            NBG++;                                                /*支干道通行时间加1*/
  88.                if(NBG==100)
  89.                NBG=0;               
  90.              }
  91.            }
  92.          
  93.            if(K4==0)                                                           /*P3^7=0返回*/
  94.        {  
  95.                 delay(40);        
  96.                     if(K4==0)
  97.                     {
  98.                        while(!K4)
  99.                            {
  100.                            }
  101.                            k=0;P1=c[k];
  102.                            NB=NBG,DX=NBG+H;        
  103.                        display();
  104.                            EA=1;
  105.                         
  106.                    break;
  107.                     }                       
  108.        }
  109.     }
  110. }


  111. //***********************************中断1处理程序********************
  112. void int1(void) interrupt 2                                         //紧急情况
  113. {                                                                                          
  114.                                                          /*东西南北红灯亮*/
  115.         EA=0;                                                                        
  116.         TR0=!TR0;                                                            /*停止计数*/

  117.         for(;;)                                                                   /*主支干道显示全为0*/
  118.         {         
  119.                 P1=0xd8,
  120.                 P0=a[0];
  121.            P2=b[0];
  122.            delay(20);
  123.            
  124.            P2=b[1];
  125.            delay(20);

  126.            P2=b[2];
  127.            delay(20);

  128.            P2=b[3];
  129.            delay(20);
  130.    

  131.            if(K4==0)                                                   /*返回*/
  132.         {
  133.                  delay(20);
  134.                 EA=1;
  135.                   
  136.                 P1=c[k];                                          /*返回紧急前状态开始计数*/
  137.                 TR0=!TR0;                                                /*重启计数*/
  138.                 break;                                                           
  139.                 }
  140.         }
  141. }
  142. void time1(void) interrupt 1                                                /*交通灯控制程序*/
  143. {
  144.         TH0=0x3c;                                                                                /*定时50ms*/
  145.         TL0=0xb0;                                                                                         
  146.         cnt++;
  147.         
  148.         if(cnt>=20)                                                                                  /*每20*50ms=1s自减一*/
  149.         {
  150.                 NB--;
  151.                 DX--;
  152.                 cnt=0;
  153.                 if(NB==0||DX==0)
  154.                 {
  155.                         k++;
  156.                         if(k>3)                                                                        /*k取0,1,2,3*/
  157.                         k=0;
  158.                         switch(k)
  159.                         {        
  160.                                 case 0:NB=NBG,DX=NBG+H;j=0;P1=c[k];break;          /*主干道通行显示绿红*/
  161.                             case 1:NB=H;j=1;P1=c[k];break;                                           /*主干道黄灯闪烁*/
  162.                                 case 2:NB=DXG+H,DX=DXG;j=0;P1=c[k];break;          /*支干道通行显示红绿*/
  163.                                 case 3:DX=H;j=2;P1=c[k];break;                                           /*支干道黄灯闪烁*/
  164.                         }
  165.                 }                 
  166.         }
  167. }
  168. void delay(uchar t)                         //延时程序延时0.1*nms   
  169. {
  170.   uchar i;
  171.   do
  172.    {
  173.      for(i=0;i<20;i++)
  174.      ;;;
  175.    } while(t--);
  176. }
  177. void settime()
  178. {
  179.            P2=b[0],P0=a[(NBG+H)%10];        /*显示主干道通行时间         */
  180.        delay(20);
  181.                   
  182.            P2=b[1],P0=a[(NBG+H)/10];        
  183.            delay(20);
  184.                   
  185.           P2=b[2],P0=a[(DXG+H)%10];                /*显示支干道通行时间*/
  186.            delay(20);
  187.                   
  188.        P2=b[3],P0=a[(DXG+H)/10];        
  189.            delay(20);
  190. }
  191. void  key()                                //键盘程序用KO K1模拟一道有车一道无车
  192. {
  193.             if(K1==0)                                           /*主干道有车支干道无车*/
  194.     {  
  195.        delay(40);
  196.        if(K1==0)                        
  197.        {
  198.           while(!K1)
  199.           {  
  200.                                  display();
  201.           }
  202.              k=0,P1=c[k];cnt=0;
  203.           NB=NBG, DX=NBG+H;
  204.          display();
  205.        }
  206.     }
  207.            if(K0==0)                                            /*支干道有车主干道无车*/
  208.     {  
  209.        delay(40);
  210.        if(K0==0)
  211.        {
  212.           while(!K0)
  213.           {
  214.            display();
  215.           }
  216.                 k=2,P1=c[k];cnt=0;
  217.           NB=DXG+H,DX=DXG;
  218.                    display();
  219.            }
  220.         }
  221. }
  222. void display()                                                        //显示程序
  223.         {
  224.                 P2=b[0],P0=a[NB%10];                           /*由k的不同值进入确定显示数值*/
  225.                 delay(20);
  226.         
  227.                 P2=b[1],P0=a[NB/10];
  228.                 delay(20);
  229.         
  230.                 P2=b[2],P0=a[DX%10];
  231.                 delay(20);
  232.                                                    
  233.                 P2=b[3],P0=a[DX/10];
  234.                 delay(20);
  235.         }
  236. void main(void)
  237. {                //主程序
  238.         init();
  239.         
  240.         for(;;)
  241.         {
  242.           display();
  243.           key();
  244.          
  245.           //黄灯闪烁程序
  246.           while(j==1)                                                                                        /*主干道黄灯闪烁*/
  247.        {                                                                                                               
  248.                      P1=0xdc;                                                                        /*给黄灯一高电平黄灯灭*/                  
  249.                          for(i=83;i>0;i--){display();}                                                /*执行for循环延时*/                        
  250.                          P1=c[k];                                                                        /*再给黄灯一低电平黄灯亮*/
  251.                          for(i=83;i>0;i--){display();}
  252.                 }
  253.         while(j==2)
  254.          {                                                                                    /*支干道黄灯闪烁*/
  255.                     
  256.                          P1=0xf8;
  257.                          for(i=83;i>0;i--){display();}
  258.                          P1=c[k];
  259.                          for(i=83;i>0;i--){display();}
  260.                  }                                                                          
  261.           }
复制代码


回复

使用道具 举报

ID:96682 发表于 2017-11-2 23:24 | 显示全部楼层
显示乱码是因为单片机与数码管的连接有误
回复

使用道具 举报

ID:126608 发表于 2017-11-3 10:11 | 显示全部楼层
你的共阳段码不是标准接线码,你的接线看不见,无法判断正确不正确,要根据接线编辑段码。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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