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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4947|回復: 0
打印 上一主題 下一主題
收起左側

單片機正逆向秒表流水燈Proteus仿真+代碼

[復制鏈接]
跳轉到指定樓層
樓主
    這是樓主學習單片機時做的,很適合新手學習定時器和外部中斷時做參考。    左側為單片機最小系統,左上按鍵為復位鍵,右側P3口為兩個外部中斷,INT0為開始/暫停按鍵(用定時器控制),INT1為模式切換按鍵。
    流水燈沒有用循環函數寫,其與定時器結合,可以用外部中斷INT0實時控制。
    keil所有文件和proteus仿真都已上傳,程序注釋標的很清楚,適合新手學習。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機正逆向秒表流水燈源程序如下:
  1. #include<reg51.h>
  2. #include"main.h"
  3. #include"delay.h"
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. unsigned long int g_unDisNum;                                                                   //用于計數,從00000到99999
  7. unsigned long int g_unDisNum1;                                                                   //用于計數,從99999到00000
  8. uchar i,K,m,g_ucNum;
  9. uint c=0;
  10. uchar code table[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};  //流水燈顯示模式一
  11. uchar code table1[]={0x55,0xAA};                                                            //流水燈顯示模式二
  12. uchar code table2[]={0x00,0xFF};                                                            //流水燈顯示模式三
  13. uchar code DIS_CODE[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共陰極數碼管顯示代碼
  14. void disp_numu(unsigned long int num1)                                       //數碼管顯示函數,顯示5位數字
  15. {        
  16.         uchar sep_num1=0;
  17.         uchar ten_num1=0;
  18.         uchar hund_num1=0;  
  19.         uchar thou_num1=0;
  20.         uchar tent_num1=0;
  21.         
  22.         sep_num1=num1%10;                                                                          //數碼管的個十百千萬位
  23.         ten_num1=(num1%100)/10;
  24.         hund_num1=(num1%1000)/100;
  25.         thou_num1=(num1%10000)/1000;
  26.         tent_num1=(num1%100000)/10000;
  27.         
  28.         P2=0xFE;                                                                                          //通過掃描的方式顯示
  29.         P0=DIS_CODE[tent_num1];
  30.         delay_ms(1);

  31.         P2=0xFD;
  32.         P0=DIS_CODE[thou_num1];
  33.         delay_ms(1);

  34.         P2=0xFB;
  35.         P0=DIS_CODE[hund_num1];
  36.         delay_ms(1);

  37.         P2=0xF7;
  38.         P0=DIS_CODE[ten_num1];
  39.         delay_ms(1);

  40.         P2=0xEF;
  41.         P0=DIS_CODE[sep_num1];

  42. }
  43. void modea()                                                          //正序按秒從00000遞增至99999
  44. {
  45.         if(g_ucNum>=200)                                          //g_ucNum增至200正好1秒,將g_ucNum清零,g_unDisNum增1
  46.         {
  47.         g_ucNum=0;                                                         
  48.         g_unDisNum++;        
  49.         }
  50.         disp_numu(g_unDisNum);
  51.         P1=0x00;
  52. }
  53. void modeb()                                                          //倒序按秒從99999遞減至00000
  54. {
  55.         if(g_ucNum>=200)                                          //g_ucNum增至200正好1秒,將g_ucNum清零,g_unDisNum1減1
  56.         {
  57.         g_ucNum=0;
  58.         g_unDisNum1--;        
  59.         }
  60.         disp_numu(g_unDisNum1);
  61.         P1=0x00;

  62. }
  63. void mode1()                                                           //正序流水燈,為了實時暫停、開始流水燈,mode1mode2mode3mode4均采用定時器中斷的方式控制
  64. {
  65.         P1=table[i%8];
  66.         if(g_ucNum>=20)
  67.         {
  68.         g_ucNum=0;
  69.         i++;        
  70.         }
  71.         P2=0xFF;                                                          //清除右側數碼管余輝
  72.         
  73. }
  74. void mode2()                                                              //倒序流水燈
  75. {
  76.         P1=table[i%8];
  77.         if(g_ucNum>=20)
  78.         {
  79.         g_ucNum=0;
  80.         i--;        
  81.         }
  82. }
  83. void mode3()                                                          //混合亮滅流水燈
  84. {
  85.         P1=table1[i%2];
  86.         if(g_ucNum>=20)
  87.         {
  88.         g_ucNum=0;
  89.         i++;        
  90.         }
  91. }
  92. void mode4()                                                           //全亮全滅流水燈
  93. {
  94.         P1=table2[i%2];
  95.         if(g_ucNum>=20)
  96.         {
  97.         g_ucNum=0;
  98.         i++;        
  99.         }
  100. }                                                                                 
  101. void mode5()                                                          //初始狀態 數碼管88888二極管1111 1111
  102. {        uchar m;
  103.         for(m=0;m<10;m++)
  104.         {
  105.         P2=0xFE;
  106.         P0=0x7F;
  107.         delay_ms(2);
  108.         P2=0xFD;
  109.         P0=0x7F;
  110.         delay_ms(2);
  111.         P2=0xFB;
  112.         P0=0x7F;
  113.         delay_ms(2);
  114.         P2=0xF7;
  115.         P0=0x7F;
  116.         delay_ms(2);
  117.         P2=0xEF;
  118.         P0=0x7F;
  119.         delay_ms(2);
  120.         P1=0x00;
  121.         delay_ms(2);
  122.         }        
  123. }
  124. void int0_inter()interrupt 0                          //INT0外部中斷,可暫停、開始所有的單片機狀態
  125. {        if(c%2==0)
  126.         {
  127.         g_ucNum=0;                                                         
  128.         TL0=0x18;                                                          //定時器賦初值TL0=(8192-5000)%32
  129.         TH0=0x63;                                                          //THO=(8192-5000)/32
  130.         TR0=1;                                                                  //T0定時器計數
  131.         c++;                                                                  //通過參數c,用一個外部中斷按鍵開關定時器控制單片機的開始與暫停
  132.         }
  133.         else
  134.         {
  135.         TR0=0;                                                                  //T0定時器計數停止計數
  136.         c++;                                                                  //通過參數c,用一個外部中斷按鍵開關定時器控制單片機的開始與暫停
  137.         }
  138. }
  139. void timer0_inter()interrupt 1                          //定時器中斷
  140. {
  141.         g_ucNum++;
  142.         TL0=0x18;
  143.         TH0=0x63;
  144. }
  145. void int1_inter()interrupt 2                          //INT1外部中斷,切換單片機狀態
  146. {
  147.         if(!INT1)
  148.         {
  149.         delay_ms(2);
  150.         if(!INT1)
  151.         {
  152.         K++;
  153.         if(K==7)
  154.         K=1;
  155.         }
  156.         while(!INT1);
  157.         }
  158. }
  159. void main(void)
  160. {
  161.         g_unDisNum=0;                                                  //正序秒表初值
  162.         g_unDisNum1=99999;                                          //逆序秒表初值
  163.         g_ucNum=0;                                                          //定時計數初值
  164.         P0=0xFF;
  165.         P2=0xFF;
  166.         P3=0xFF;
  167.         
  168.         IT0=1;                                                                  //外部中斷0下降沿觸發
  169.         IT1=1;                                                                  //外部中斷1下降沿觸發
  170.         EX0=1;                                                                  //外部中斷0打開
  171.         EX1=1;                                                                  //外部中斷1打開
  172.         TMOD=0;                                                                  //定時器工作模式,工作方式0
  173.         TL0=0x18;                                                          //定時器賦初值TL0=(8192-5000)%32
  174.         TH0=0x63;                                                          //THO=(8192-5000)/32
  175.         ET0=1;                                                                  //打開T/C0溢出中斷
  176.         EA=1;                                                                  //打開全局中斷
  177.         while(1)
  178.         {
  179.         switch(K)
  180.         {
  181.         case 1:modea();break;
  182.         case 2:modeb();break;
  183.         case 3:mode1();break;
  184.         case 4:mode2();break;
  185.         case 5:mode3();break;
  186.         case 6:mode4();break;
  187.         default:mode5();break;
  188.         }
  189.         }
  190. }
復制代碼


所有資料51hei提供下載:
正逆向秒表流水燈.rar (63.98 KB, 下載次數: 27)


評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产在线一区观看 | 日韩中文字幕一区 | 国产ts人妖系列高潮 | 日韩一区二区在线看 | www久久国产 | 成人在线免费观看视频 | 日韩不卡一区二区 | 色综合一区 | 亚洲欧美另类在线观看 | 中文字幕av色 | 懂色中文一区二区三区在线视频 | 99精品视频一区二区三区 | 天堂网中文字幕在线观看 | 91亚洲精品在线 | 亚洲精品在线视频 | 久久久一区二区 | 国产精品99久久久久久宅男 | 欧美中文字幕一区二区三区亚洲 | 99久久精品一区二区成人 | 国产精品久久久久久久午夜 | 午夜在线视频 | 91热在线| 国产精品久久在线观看 | 久久艹免费视频 | 欧美精品综合在线 | 国产精品毛片一区二区三区 | 中文字幕国产在线 | 亚洲午夜精品一区二区三区他趣 | 91在线资源| yeyeav| 99资源| 久久在线视频 | 久久伊人精品一区二区三区 | 国产亚洲一区二区三区 | 天天拍天天操 | 99精品国自产在线 | 亚洲欧美在线视频 | 欧美日韩最新 | 国产亚洲一区二区三区在线观看 | 国产精品日韩在线 | 亚洲高清在线 |