找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1575|回复: 6
收起左侧

万能的网友,求助下这个怎么把共阳改成共阴

[复制链接]
ID:1058814 发表于 2022-12-24 13:28 | 显示全部楼层 |阅读模式
  1. #include<reg51.H>                                         // 对单片机的口进行了定义
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar code a[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//段码组合,共阳极
  5. uchar code b[4]={0x01,0x02,0x04,0x08}; //位码组合         
  6. uchar code c[4]={0xcc,0xd4,0x78,0xb8};/*P1 绿红、黄红、红绿、红黄*/
  7.                   
  8. //12MHz                          
  9. //*************************************************************************************
  10. uchar NB=25,DX=30,NBG=25,DXG=15,H=5;                         /*数码管显示值设置*/
  11. uchar  i,k=0,cnt=0,j=0;

  12. sbit K0=P3^4;                           /*支干道通行*/
  13. sbit K1=P3^5;                           /*主干道通行*/
  14. sbit K4=P3^6;                           /*返回*/
  15. sbit K3=P3^2;                        /*设置时间*/
  16. sbit K2=P3^3;                        /*紧急刹车*/

  17. void delay(uchar t);                /*定义延时程序*/
  18. void key();                                /*定义键盘程序*/
  19. void display();                        /*定义显示程序*/
  20. void settime();                /*定义时间设置显示程序*/
  21. //*************************程序初始*********************************************
  22. void init(void)
  23. {
  24.         TMOD=0x01;                          /*使用定时器0模式一*/
  25.         TH0=0x3c;                          /*(65536-5000)/256*/
  26.         TL0=0xb0;                          /*(65536-5000)%256*/
  27.         IT0=1;                                  //开中断
  28.         ET0=1;
  29.         TR0=1;
  30.         EA=1;
  31.         EX0=1;
  32.         EX1=1;
  33.         P1=c[k];                                  //开启交通灯
  34. }
  35. //*************************中断0处理程序***************************************
  36. void int0(void) interrupt 0                 //        通行时间设置
  37. {         
  38.   EA=0;
  39.   P1=0xd8;                                /*红灯全亮*/
  40.   
  41. for(;;)
  42.         {
  43.            settime();

  44.                    if(K1==0)                                          /*P3^6=0设置主干道通行时间*/
  45.            {  
  46.           delay(40);
  47.           if(K1==0)
  48.                   {
  49.              while(!K1)
  50.              {settime();}
  51.                                  DXG++;                                /*主干道通行时间加1*/
  52.              if(DXG==100)
  53.              DXG=0;                        
  54.           }
  55.            }
  56.          
  57.                    if(K0==0)                                                         /*P3^5=0设置支干道通行时间*/
  58.            {  
  59.              delay(40);
  60.              if(K0==0)
  61.                      {
  62.                while(!K0)
  63.                {settime();}
  64.                            NBG++;                                                /*支干道通行时间加1*/
  65.                if(NBG==100)
  66.                NBG=0;               
  67.              }
  68.            }
  69.          
  70.            if(K4==0)                                                           /*P3^7=0返回*/
  71.        {  
  72.                 delay(40);        
  73.                     if(K4==0)
  74.                     {
  75.                        while(!K4)
  76.                            {
  77.                            }
  78.                            k=0;P1=c[k];
  79.                            NB=NBG,DX=NBG+H;        
  80.                        display();
  81.                            EA=1;
  82.                         
  83.                    break;
  84.                     }                       
  85.        }
  86.     }
  87. }


  88. //***********************************中断1处理程序********************
  89. void int1(void) interrupt 2                                         //紧急情况
  90. {                                                                                          
  91.                                                          /*东西南北红灯亮*/
  92.         EA=0;                                                                        
  93.         TR0=!TR0;                                                            /*停止计数*/

  94.         for(;;)                                                                   /*主支干道显示全为0*/
  95.         {         
  96.                 P1=0xd8,
  97.                 P0=a[0];
  98.            P2=b[0];
  99.            delay(20);
  100.            
  101.             P2=b[1];
  102.            delay(20);

  103.            P2=b[2];
  104.            delay(20);

  105.            P2=b[3];
  106.            delay(20);
  107.    

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


回复

使用道具 举报

ID:1034262 发表于 2022-12-24 15:29 | 显示全部楼层
输出到IO时取反即可。
回复

使用道具 举报

ID:213173 发表于 2022-12-24 17:22 | 显示全部楼层
软件都是基于硬件条件编写的,你不上硬件电路图,就你这个极不成熟的代码,根本无法给出合理建议。
回复

使用道具 举报

ID:417460 发表于 2022-12-26 18:25 | 显示全部楼层
段码输出做取反操作
回复

使用道具 举报

ID:879348 发表于 2022-12-27 08:20 | 显示全部楼层
所有数据取反,所有驱动反相,直接改好给你不可能的吧,谁那么有空呢
回复

使用道具 举报

ID:965189 发表于 2022-12-27 09:38 | 显示全部楼层
硬件决定阴阳,如果硬件不变,只改变软件是不行的。
回复

使用道具 举报

ID:77589 发表于 2022-12-27 10:25 | 显示全部楼层
把所有显示相关输出的数据都按位取反
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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