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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3842|回復: 0
收起左側

單片機可控跑馬燈Proteus仿真程序

[復制鏈接]
ID:591246 發表于 2020-3-8 00:02 | 顯示全部樓層 |閱讀模式
可控跑馬燈仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png

單片機源程序如下:
  1. #include<regx51.h>                                         //加入頭文件
  2. #define uchar unsigned char                         //宏定義用uchar來代替unsigned char
  3. #define uint  unsigned int                         //宏定義用uint來代替unsined int
  4. uint code unm[]={0,1,3,5,7,9,15,60,100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500};
  5.                                      //用于調速的數組
  6. uchar unm1[]={0xff,0xef,0xc7,0xab,0xef,0xef,0xef,0xff};
  7.                                      //用于顯示箭頭的數組
  8. uchar m,n,j,y;                                             //定義全局變量
  9. uint  l,g;
  10. //==========延時子程序============
  11. void delay(uint i)
  12. {
  13.   uchar j;                                             //定義局部變量
  14.   while(i--)                                         //循環執行空指令用于延時
  15.   for(j=0;j<120;j++);  
  16. }                                                 
  17. //===========定時器初始化子程序===================
  18. void init()
  19. {
  20.   TMOD = 0x11;                                                 //設置定時器0、1都工作在方式1
  21.   TH0 = 0x00;                                                 //設置定時器0初值
  22.   TL0 = 0x00;                                                 
  23.   TH1 = 0xaa;                                                 //設置定時器1初值
  24.   TL1 = 0xbb;                                                 
  25.   EA = 1;                                                         //打開總中斷
  26.   ET0 = 1;                                                         //打開定時器0中斷
  27.   ET1 = 1;                                                         //打開定時器1中斷
  28.   TR0 = 1;                                                         //啟動定時器0
  29.   TR1 = 1;                                                         //啟動定時器1
  30. }
  31. //=================================================
  32. //函數名:ce_anjian ( )
  33. //功能:檢測是否有按鍵按下,并返回是否有按鍵按下
  34. //輸出參數:key
  35. //說明:有按鍵按下,key=1;無鍵按下,key=0;
  36. //=================================================
  37. bit ce_anjian ( )
  38. {
  39.   bit key=0;                                   //定義局部變量
  40.   P1=0xf3;                                           //輸出掃描信號,將行置高電平,將列置低電平
  41.   if(P1!=0xf3)                               //讀入P1口數據,與掃描信號比較判斷是否有鍵按下
  42.       key=1;                                   //如果有鍵按下,key賦值為1
  43.   else
  44.       key=0;                                   //如果沒有鍵按下,key賦值為0
  45.   return(key);                                   //返回key值
  46. }
  47. //=================================================
  48. //函數名:ce_jianzhi ( )
  49. //功能:測按鍵值并去除按鍵按下和按鍵松開時的抖動
  50. //調用函數:doudong_ys();ce_anjian();
  51. //說明:鍵值y=i*2+j+1;
  52. //=================================================
  53. void ce_jianzhi ( )
  54. {
  55.    uchar i,j,p;                                 //定義局部變量
  56.    do                           
  57.    {
  58.       while(ce_anjian()==0);     //是否有按鍵按下?若按鍵沒有按下,原地等待
  59.                                  //若按鍵按下,則返回值為1,則繼續往下執行
  60.       delay(50);                 //調用去抖延時子程序
  61.    }while(ce_anjian()==0);       //再次判斷是否有鍵按下?若沒有按下,返回0
  62.    for(i=0;i<2;i++)                          
  63.    {
  64.       P1=(0xfe<<i)|i;                 //循環掃描輸出行掃描信號
  65.      for(j=0;j<2;j++)
  66.          {
  67.            p=P1&0x0c;                             //讀取并保留鍵盤的列數據,其余清0
  68.            if(p==0x08>>j)                 //是否有1或2列按鍵按下?
  69.            {
  70.               y=i*2+j+1;                     //計算鍵值
  71.                   goto D1;                             //跳出循環,使程序跳轉至D1
  72.             }
  73.          }
  74.    }
  75. D1:  delay(50);                  //調用去抖延時子程序
  76.    do
  77.    {
  78.       while(ce_anjian()==1);     //判斷按鍵是否釋放,若按鍵沒有釋放,繼續判斷
  79.                                  //若按鍵有釋放,返回值為0,則繼續往下執行
  80.       delay(50);                 //調用去抖延時子程序
  81.    }while(ce_anjian()==1);       //再次判斷是否釋放,若按鍵沒有釋放,繼續判斷
  82. }
  83. //=======蜂鳴器鳴叫子程序==========
  84. void mingjiao()
  85. {
  86.   uchar t;                                                 //定義局部變量
  87.   for(t=0;t<50;t++)                                          
  88.   {
  89.     P1_7=0;       
  90.   }
  91.     P1_7=1;                                             //停止鳴叫
  92. }
  93. //============主程序===============
  94. void main()
  95. {       
  96.   init();                                                 //調用定時器初始化子程序
  97.   n=5;                                                         //單片機一上電,速度設置在第5擋
  98.   while(1)                                             //主程序無限循環執行
  99.   {
  100.     l=unm[n];                                     //設置定時器的設定值       
  101.         if(ce_anjian()==1)                     //快速判斷是否有按鍵按下
  102.         {
  103.           ce_jianzhi();                         //若有按鍵按下,則側鍵值
  104.           switch(y)
  105.           {
  106.             case 1: {m=1;j=0x7f;mingjiao();}break;         //鍵值為1,則P2口賦值0xfe,點亮P2.0LED
  107.             case 2:        {m=2;j=0xfe;mingjiao();}break;         //鍵值為2,則P2口賦值0xfd,點亮P2.1LED
  108.             case 3:        {n=n+1;if(n==24)n=23;mingjiao();}break;//鍵值為3,則P2口賦值0xfb,點亮P2.2LED
  109.             case 4:        {n=n-1;if(n==0)n=1;mingjiao();}break;  //鍵值為4,則P2口賦值0xf7,點亮P2.3LED
  110.         default: break;
  111.           }
  112.         }
  113.   }
  114. }
  115. //=========定時器1中斷子程序=======
  116. void t_1()interrupt 3
  117. {
  118.   uchar a,k;                                                 //定義局部變量
  119.   TH1 = 0xaa;                                                 //設置定時器初值
  120.   TL1 = 0xbb;
  121.   switch(m)                                                         //判斷模式
  122.   {
  123.      case 1:                                                 //模式1
  124.         {
  125.           a=0x01;                                                 //顯示左移箭頭
  126.       for(k=0;k<8;k++)
  127.       {
  128.             P2=a;                                                       
  129.             P3=unm1[k];                                       
  130.         delay(2);               
  131.             a=a<<1;                                                       
  132.             if(a==0)a=0x01;       
  133.             P0=j;
  134.       }
  135.         }break;
  136.          case 2:                                                 //模式2
  137.         {
  138.           a=0x80;                                                 //顯示右移箭頭
  139.       for(k=0;k<8;k++)
  140.       {
  141.             P2=a;                                                       
  142.             P3=unm1[k];                                       
  143.         delay(2);               
  144.             a=a>>1;                                                       
  145.             if(a==0)a=0x80;       
  146.             P0=j;                                                         //跑馬燈右移
  147.       }
  148.         }
  149.   }       
  150. }
  151. //=======定時器0中斷子程序=========
  152. void t_0()interrupt 1
  153. {
  154.   uchar b1,b2,b3,b4,b5,b6,b7,b8;         //定義局部變量
  155.   if(++g<l) return;                                         //如果g+1小于設定值l那么跳出中斷
  156.   g=0;                                                                 //如果g+1大于設定值l則g清零
  157.   switch(m)
  158.   {
  159.     case 1:{ j=(j>>1)|0x80;
  160.                  if(j==0xff)j=0x7f;}break;
  161.         case 2:{ j=(j<<1)|0x01;
  162.                  if(j==0xff)j=0xfe;}break;
  163.   }
  164.   b1=unm1[0];                                             //箭頭移動
  165.   b2=unm1[1];
  166.   b3=unm1[2];
  167.   b4=unm1[3];
  168.   b5=unm1[4];
  169.   b6=unm1[5];
  170.   b7=unm1[6];
  171.   b8=unm1[7];
  172.   unm1[0]=b2;
  173.   unm1[1]=b3;
  174.   unm1[2]=b4;
  175.   unm1[3]=b5;
  176.   unm1[4]=b6;
  177.   unm1[5]=b7;
  178.   unm1[6]=b8;
  179.   unm1[7]=b1;
  180. }
復制代碼

所有資料51hei提供下載:
項目1.zip (76.45 KB, 下載次數: 25)

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕日韩av | 淫片一级国产 | 久久99久久98精品免观看软件 | 午夜视频一区二区三区 | 亚洲国产精品一区二区三区 | caoporn视频在线 | 久久久精品一区二区三区 | 欧美一区二区免费 | 久久国产精品久久久久久久久久 | 日韩精品一区二区久久 | 国产精品视频久久久久久 | 欧美视频一级 | 狠狠插狠狠操 | 久久久久香蕉视频 | 免费亚洲视频 | 欧美国产视频 | 国产在线精品一区二区三区 | 99精品一区二区 | 一区在线观看 | 久久久一区二区三区 | 深爱激情综合 | 亚洲欧美在线视频 | 91伊人| 伊人网站在线观看 | 中文字幕第一页在线 | 一级毛片在线播放 | 热久久性| 日韩在线中文字幕 | 欧美精品一区二区三区蜜桃视频 | 久久免费观看一级毛片 | 欧美三级网站 | 精品一区二区久久久久久久网站 | 老司机久久 | 国产在线视频三区 | 亚洲欧美日韩中文字幕一区二区三区 | 老熟女毛片 | 视频第一区 | 久久高清| 久久免费高清视频 | 97精品国产97久久久久久免费 | 91香蕉|