久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2090|回復: 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, 下載次數: 24)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕 欧美 日韩 | 久久国产精品免费视频 | 在线免费观看黄视频 | 日韩欧美成人一区二区三区 | 国产精品大全 | 日本一卡精品视频免费 | 国产精品极品美女在线观看免费 | 国产一区二区三区四区三区四 | 久久福利电影 | 国产午夜视频 | 欧美激情精品久久久久久变态 | 国产一区二区三区四区在线观看 | 日本啊v在线 | 精品在线观看一区二区 | 亚洲精品久久久一区二区三区 | 亚洲久在线 | 国产美女在线观看 | 99九九久久 | 91精品国产色综合久久 | 国产91精品网站 | 一区二区在线 | 综合一区二区三区 | 欧美视频福利 | 婷婷在线网站 | 成人精品在线视频 | 久久久久亚洲精品 | 日韩精品免费在线 | 一区二区三区成人 | 婷婷中文字幕 | 午夜影院| 亚洲精品视频免费观看 | 国产精品国产精品 | 国产精品免费在线 | 91一区二区 | 欧美成人一区二区三区 | 国产高清91 | 久久婷婷香蕉热狠狠综合 | 日韩欧美在线一区 | 成人中文字幕在线观看 | 国产成人免费网站 | 小川阿佐美pgd-606在线 |