找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机智能交通灯矩阵按键共阴数码管仿真程序

[复制链接]
跳转到指定楼层
楼主
智能交通灯,显示时间可以通过矩阵开关输入调节
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit dula=P2^5;
  5. sbit w1=P2^0;
  6. sbit w2=P2^1;
  7. sbit k1=P2^2;
  8. sbit k2=P2^3;
  9. sbit k3=P2^4;

  10. sbit red1=P1^0;
  11. sbit yellow1=P1^1;
  12. sbit green1=P1^2;

  13. sbit red2=P1^3;
  14. sbit yellow2=P1^4;
  15. sbit green2=P1^5;

  16. uchar N=23;           //定义时间为20s,可自由更改为0-99;

  17. uchar miao;
  18. bit flag=0;
  19. bit  flag1=0;

  20. unsigned int pp;
  21. uchar j,k;
  22. uchar a=0,b=0;
  23. uchar nn=0;
  24. uchar q=0;
  25. unsigned char keyvalue=0,m=0;
  26. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  27.                         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

  28. void delay(unsigned char i)
  29. {
  30.   for(j=i;j>0;j--)
  31.     for(k=125;k>0;k--);
  32. }
  33. void display(uchar n)
  34. {
  35.    uchar c,d;
  36.    c=n/10;
  37.    d=n%10;
  38.    P0=0x00;
  39.    dula=0;
  40.    P0=table[c];
  41.    dula=1;
  42.    w1=0,w2=1;
  43.    delay(5);

  44.    P0=0x00;
  45.    dula=0;
  46.    P0=table[d];
  47.    dula=1;
  48.    w2=0,w1=1;
  49.    delay(5);
  50. }
  51. void scankeys()
  52. {

  53.         if(k1==0)  //
  54.         {
  55.          delay(5);
  56.          if(k1==0)
  57.          {
  58.          TR0=1;
  59.          pp=0;
  60.           miao=N;
  61.          }
  62.          while(!k1);
  63.         }

  64.         if(k2==0)  //
  65.         {
  66.          delay(5);
  67.          if(k2==0)
  68.          {
  69.          TR0=0;
  70.          pp=0;
  71.           miao=N;
  72.          }
  73.          while(!k2);
  74.         }

  75.         if(k3==0)  //
  76.         {
  77.          delay(5);
  78.          if(k3==0)
  79.          {
  80.          flag1=!flag1;
  81.          }
  82.          while(!k3);
  83.          if(flag1==0)
  84.          {
  85.          TR0=1;
  86.          pp=0;
  87.           miao=N;
  88.          }
  89.           if(flag1==1)
  90.          {       
  91.           a=b=N=0;
  92.          }
  93.         }
  94. }
  95. void KeyScan()        //带返回值的子函数
  96. {
  97.        
  98.         P3 = 0xf0;
  99.         if( P3 != 0xf0)//判断是否有按键按下
  100.         {
  101.                 delay(5);//软件消抖
  102.                 if( P3!= 0xf0)//判断是否有按键按下
  103.                 {   switch(P3)
  104.                         {        case 0xe0:keyvalue=0,flag=1;break;
  105.                                 case 0xd0:keyvalue=1,flag=1;break;
  106.                                 case 0xb0:keyvalue=2,flag=1;break;
  107.                                 case 0x70:keyvalue=3,flag=1;break;
  108.                     }       
  109.                         P3=0x0f;
  110.                         switch(P3)
  111.                         {        case 0x0e:keyvalue=keyvalue+0,flag=1;break;
  112.                                 case 0x0d:keyvalue=keyvalue+4,flag=1;break;
  113.                                 case 0x0b:keyvalue=keyvalue+8,flag=1;break;
  114.                                 case 0x07:keyvalue=keyvalue+12,flag=1;break;
  115.                     }
  116.                
  117.                            while(P3!=0x0f);                                                         
  118.                             q++;                                                            
  119.                 }
  120.         }                       
  121. }
  122. void  change()           //按键解码
  123. {
  124. switch(keyvalue)
  125. {
  126.   case 0:m=1;break;
  127.   case 1:m=2;break;
  128.   case 2:m=3;break;
  129.   
  130.   case 4:m=4;break;
  131.   case 5:m=5;break;
  132.   case 6:m=6;break;

  133.   case 8:m=7;break;
  134.   case 9:m=8;break;
  135.   case 10:m=9;break;

  136.   case 13:m=0;break;

  137. }

  138. }
  139. void main()
  140. {
  141.         TMOD=0x01;
  142.         TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
  143.         TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
  144.         ET0=1;    //        开定时器0中断
  145.         TR0=0;         
  146.         EA=1;
  147.         miao=N;
  148.         while(1)
  149.         {
  150.          if(flag1==0)
  151.          {
  152.                  if(miao>3)
  153.                  {
  154.                           if(flag==0)
  155.                           {
  156.                            red1=1,yellow1=1,green1=0;
  157.                            red2=0,yellow2=1,green2=1;
  158.                          
  159.                            }
  160.                           if(flag==1)
  161.                           {
  162.                            red1=0,yellow1=1,green1=1;
  163.                            red2=1,yellow2=1,green2=0;
  164.                           
  165.                           }
  166.                           
  167.                   }
  168.      else {
  169.                             if(flag==0)
  170.                           {
  171.                            if(pp==10)
  172.                            yellow1=0,green1=1;
  173.                           
  174.                           }
  175.                            if(flag==1)
  176.                           {
  177.                            if(pp==10)
  178.                            yellow2=0,green2=1;
  179.                           
  180.                           }
  181.           
  182.               }


  183.         display(miao);
  184.        
  185.         }
  186.         else
  187.         {
  188.          red1=1,yellow1=1,green1=1;
  189.         red2=1,yellow2=1,green2=1;
  190.         KeyScan();
  191.         change();
  192.         if(q==1)
  193.         a=m;
  194.         if(q==2)
  195.         b=m,q=0;
  196.         N=a*10+b;
  197.         display(N);
  198.         }
  199.         scankeys();
  200.        
  201.     }
  202. }

  203. void time0() interrupt 1
  204. {        TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
  205.         TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
  206.         pp++;
  207.         if(pp==20)
  208.         {
  209.             pp=0;
  210.                 if(miao>0)
  211.                 miao--;       
  212.                 else
  213.                 {
  214.                  miao=N;
  215.                  flag=!flag;
  216.                  
  217.                 }
  218.         }
  219. }
复制代码

Keil代码与Proteus仿真下载:
交通灯矩阵按键共阴数码管.zip (107.86 KB, 下载次数: 19)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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