找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 5055|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:412951 發(fā)表于 2018-11-30 18:36 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
    這是樓主學(xué)習(xí)單片機(jī)時(shí)做的,很適合新手學(xué)習(xí)定時(shí)器和外部中斷時(shí)做參考。    左側(cè)為單片機(jī)最小系統(tǒng),左上按鍵為復(fù)位鍵,右側(cè)P3口為兩個(gè)外部中斷,INT0為開始/暫停按鍵(用定時(shí)器控制),INT1為模式切換按鍵。
    流水燈沒有用循環(huán)函數(shù)寫,其與定時(shí)器結(jié)合,可以用外部中斷INT0實(shí)時(shí)控制。
    keil所有文件和proteus仿真都已上傳,程序注釋標(biāo)的很清楚,適合新手學(xué)習(xí)。

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


單片機(jī)正逆向秒表流水燈源程序如下:
  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;                                                                   //用于計(jì)數(shù),從00000到99999
  7. unsigned long int g_unDisNum1;                                                                   //用于計(jì)數(shù),從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}; //共陰極數(shù)碼管顯示代碼
  14. void disp_numu(unsigned long int num1)                                       //數(shù)碼管顯示函數(shù),顯示5位數(shù)字
  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;                                                                          //數(shù)碼管的個(gè)十百千萬(wàn)位
  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()                                                           //正序流水燈,為了實(shí)時(shí)暫停、開始流水燈,mode1mode2mode3mode4均采用定時(shí)器中斷的方式控制
  64. {
  65.         P1=table[i%8];
  66.         if(g_ucNum>=20)
  67.         {
  68.         g_ucNum=0;
  69.         i++;        
  70.         }
  71.         P2=0xFF;                                                          //清除右側(cè)數(shù)碼管余輝
  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()                                                          //初始狀態(tài) 數(shù)碼管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外部中斷,可暫停、開始所有的單片機(jī)狀態(tài)
  125. {        if(c%2==0)
  126.         {
  127.         g_ucNum=0;                                                         
  128.         TL0=0x18;                                                          //定時(shí)器賦初值TL0=(8192-5000)%32
  129.         TH0=0x63;                                                          //THO=(8192-5000)/32
  130.         TR0=1;                                                                  //T0定時(shí)器計(jì)數(shù)
  131.         c++;                                                                  //通過參數(shù)c,用一個(gè)外部中斷按鍵開關(guān)定時(shí)器控制單片機(jī)的開始與暫停
  132.         }
  133.         else
  134.         {
  135.         TR0=0;                                                                  //T0定時(shí)器計(jì)數(shù)停止計(jì)數(shù)
  136.         c++;                                                                  //通過參數(shù)c,用一個(gè)外部中斷按鍵開關(guān)定時(shí)器控制單片機(jī)的開始與暫停
  137.         }
  138. }
  139. void timer0_inter()interrupt 1                          //定時(shí)器中斷
  140. {
  141.         g_ucNum++;
  142.         TL0=0x18;
  143.         TH0=0x63;
  144. }
  145. void int1_inter()interrupt 2                          //INT1外部中斷,切換單片機(jī)狀態(tài)
  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;                                                          //定時(shí)計(jì)數(shù)初值
  164.         P0=0xFF;
  165.         P2=0xFF;
  166.         P3=0xFF;
  167.         
  168.         IT0=1;                                                                  //外部中斷0下降沿觸發(fā)
  169.         IT1=1;                                                                  //外部中斷1下降沿觸發(fā)
  170.         EX0=1;                                                                  //外部中斷0打開
  171.         EX1=1;                                                                  //外部中斷1打開
  172.         TMOD=0;                                                                  //定時(shí)器工作模式,工作方式0
  173.         TL0=0x18;                                                          //定時(shí)器賦初值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. }
復(fù)制代碼


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


評(píng)分

參與人數(shù) 1黑幣 +90 收起 理由
admin + 90 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表