欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7456|回復: 1
收起左側

基于51單片機的心形燈的設計詳細資料 含程序電路解釋

[復制鏈接]
ID:654471 發表于 2020-2-21 16:02 | 顯示全部樓層 |閱讀模式
這是我花了兩個星期的時間完成的心形燈的實驗設計,
相信需要的師兄會滿意的,里面包括了仿真和源碼

此次設計基于單片機技術與單片機芯片AT89C51芯片功能和c語言程序,實現心形流水燈的四種模式切換和四種速度的切換。利用中斷實現開始模塊的功能和暫停鍵的功能,在延時函數中實現了速度切換。了解了單片機的一些技術,單片機芯片AT89C51的一些功能,然后結合c語言編程,最后將它們運用到實際的電路,使心形流水燈LED燈實現多種亮滅方法。

概要設計
2.1設計目標

設計一個心形燈,包含以下功能:

1、由多個LED燈組成心形燈,要求至少在32個燈以上組成心形結構,外接4個按鍵,并要求兩個按鍵(開始和暫停)接在兩個外部中斷引腳上;

2、上電后心形燈先全亮5秒,后亮滅閃爍5秒,以測試燈狀態的好壞;

3、之后處于全滅等待狀態,當按下開始按鍵后心形燈按照一定規律顯示,規律自定義,創意越好分數越高;

4、當在任意狀態下按下暫停鍵后心形燈停留在當前狀態不再改變,再一次按下暫停鍵后則繼續顯示;

5、另外一個鍵為模式切換鍵,要求至少設計4中心形燈顯示模式,每按一次切換鍵則切換一次顯示模式,要求切換鍵在燈運行狀態和暫停狀態均可切換;

6、第四個鍵為速度鍵,要求可以改變心形燈的亮滅切換速度,至少設計4種速度,通過速度鍵可以切換不同的切換速度。

2.2設計框圖

                                 2-1 設計框圖

2.2各功能塊的功能和作用

2.2.1閃爍模塊

讓燈先全亮五秒,再閃爍亮五秒,然后全滅。

2.2.2 中斷初始化模塊

開始按鍵和暫停按鍵用到了中斷,并且設置暫停鍵的優先級要高于開始按鍵的優先級。并且把開始鍵按下之后的自己設計的心形燈閃爍的模式也寫在中斷初始化模塊中。

2.2.3 速度切換模塊

用按鍵控制,如果檢測到按鍵按下就進行速度的切換。

2.2.4 模式切換模塊

用按鍵控制,如果檢測到按鍵按下就進行模式的切換,總共有四種模式。

2.2.5 暫停模塊

在按鍵中斷中,如果檢測到按鍵按下,會對已經定義的標志位進行改變,然后作用在延時函數中,就會產生一個死循環,相當于產生中斷。再次按下時,標志位會再次改變,從而退出死循環,繼續執行。


第三章                 系統硬件設計3.1 C51單片機芯片
  • 置4組8位I/O口,其中P0口為雙向I/O口,P1,P2,P3為準雙向I/O口。
  • 內置2個16位定時器/計數器。
  • 內置外部中斷2 路,下降沿中斷或低電平觸發中斷,Power Down 模式可由外部中斷低電平觸發中斷方式喚醒。
  • 內置通用異步串行口。
  • 工作電壓為5V。
  • 工作溫度為0℃~70℃。
圖3-2  STC89C51RC引腳圖
引腳說明:
I/O口:P0、P1、P2、P3四組I/O口,P0口為三態雙向I/O口,沒有內置的上拉電阻,需要外接上拉電阻;P1、P2、P3為準雙向I/O口;所有I/O口均可獨立編程使用。
VCC、GND:單片機電源引腳,常電壓為+5V;
XTAL1、XTAL2:外接時鐘引腳,XTAL1為輸入端,XTAL2為輸出端。
RST:單片機的復位引腳,連續兩個機器周期以上的高電平為有效。
RXD、TXD:串行輸入輸出口。
INT0、INT1:外部中斷0,外部中斷1。
T0、T1:定時器\計數器0外部輸入端、定時器\計數器0外部輸入端。
PSEN:程序儲存器允許輸出控制端。
ALE/PROG:外部儲存器鎖存端。
EA/VPP:外部儲存器控制端。
3.2.復位設計和時鐘設計部分
圖3-3時鐘和復位

此中控電路叫做C51單片機的最小系統,作用是為單片機提供適合的外部工作條件。U1為STM89C51RC,即為電子表的主控芯片。左上角接在RST引腳的電路為復位按鍵電路,由一個按鍵、一個0.1μF電容和一個10Ω電阻組成。電容作用是消除按鍵抖動。按下按鍵即可為單片機提供連續兩個機器周期的高電平,以供單片機復位。左下角接在XTAL兩個引腳的是晶振電路,由一個晶振、兩個起振電容構成。以晶振的固定頻率震蕩以輸出固定頻率的脈沖信號,為單片機提供機器周期,同時提供時間基準。左上角為P0 I/O口的上拉電阻。使其能穩定輸出高低電平。

3.3按鍵交互

按鍵交互部分由四個獨立按鍵構成,四個獨立按鍵一端接地,另一端口鏈接單片機上的四個I/O口,當單片機檢測到其中的I/O口為低電平時,將會觸發按鍵功能。
按鍵功能簡述:
R36連接按鍵:模式切換

R37連接按鍵:速度切換

R34連接按鍵:開始鍵
R35連接按鍵:暫停鍵

3.4心形燈的設計

圖3-2心形燈

采用的是共陽極,每個燈的引腳送低電平時,燈亮;送高電平時,燈滅。



第四章                 系統軟件設計
4.1軟件設計流程圖



4-1主程序流程圖



4.2關鍵代碼
延時函數
(速度切換和模式切換都在延時函數中進行切換)
void delay(uint n)              //延時
{
              uint i,j;
              if(P35==0)//速度切換
              {
                            time2++;
                            if(time2%4==0)
                            s1=200;
                            if(time2%4==1)
                            s1=500;
                            if(time2%4==2)
                            s1=700;
                            if(time2%4==3)
                            s1=1000;
              }
              for(i=0;i<n;i++)
              for(j=0;j<121;j++);
              if(P34==0)//模式切換
              {                                                                                   
                                          while(1)
                                          {
                                                        time1++;
                                                        moshiqiehuan();
                                          }                           
              }
              while(flag==1);            
}
因為燈每亮或者滅一次,都要調用延時函數,所以我們進行模式切換和速度切換都可以在延時函數中實現。

開始模塊:
void D_INT0(void) interrupt 0 using 0  //開始鍵,設置一種波形,先亮左半邊,再亮右半邊
{
              uint i;
            
            
              while(1)
              {
                            P2=0x7f;
                            for(i=0;i<8;i++)
                            {
                                          P2=P2>>1;
                                          delay(500);            
                            }
                            P0=0xfe;
                            for(i=0;i<8;i++)
                            {
                                          P0=P0<<1;
                                          delay(500);            
                            }
                            P1=0xfe;
                            for(i=0;i<8;i++)
                            {
                                          P1=P1<<1;
                                          delay(500);            
                            }
                            P0=P1=P2=0XFF;//全部亮一遍之后再循環點亮            
              }
}
利用外部中斷0實現了開始模塊的功能。

暫停功能:
void D_INT1() interrupt 2 using 2  //控制暫停
{
                time++;
                if(time%2==1)  //time如果是奇數,說明暫停;偶數的話,則是再開始。
                {
                                            flag=1;

                }
                else
                flag=0;
}
產生一個標志位,讓這個標志位作用在延時函數中,產生中斷。


第五章                 系統仿真設計
                         圖5-1 心形燈
p3口沒有接燈,燈的一端接電源,另一端接芯片的接口。

                        5-2 引腳及開關
時鐘復位電路,以及四個開關,分別控制著開始、暫停、速度切換和模式切換。


第六章                 總結

當時看到這個的時候,感覺無從下手,當我靜下心來,思考如何一步步實現這個功能,首先應該把電路圖畫出來,以及元器件的連接。那天晚上,我先把電路圖畫出來,然后編寫代碼實現了開始亮五秒,亮滅閃爍五秒這個功能,縱觀整個的設計過程,經常出現這樣那樣的困難,比如電路圖畫錯、編程出現錯誤、軟件不會使用,在這期間著實費了我不少時間,但是我還是努力認真的去學習檢查和修改。雖然這個過程非常艱難,但還是值得我回味的。在整個設計過程,我查閱了大量地相關書籍和文獻資料,從中學習了一些單片機的工作原理以及怎樣去設計一個電子電路。通過這次設計,我不僅加深了對以前學過課本知識得以理解和應用,并且對于其在電路中的使用有了更多的認識。通過這次自主學習,我學會了很多的道理,當我們遇見一個很棘手的問題時,先不要慌,要靜下心來,思考應該如何一步步實現,膽怯和畏懼時解決不了問題的。這次的功能的實現,給了我很大的信心,只要努力去做,沒有完不成的事情。


  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<absacc.h>
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. void quanliang(); //全亮
  7. void quanmie();              //全滅
  8. void delay(uint); //延時
  9. void chushiliang(); //實現初始時亮五秒,閃爍五秒的功能
  10. void init();//初始化中斷
  11. void moshi1(); //四種模式
  12. void moshi2();
  13. void moshi3();
  14. void moshi4();
  15. void moshiqiehuan();//模式切換
  16. void suduqiehuan() ;
  17. uint time=0;//定義暫停按鍵按下的次數
  18. uint time1=-1;//定義模式切換按鍵按下的次數
  19. uint time2=-1;//定義速度切換按鍵按下的次數
  20. uint s1;
  21. uint flag;
  22. sbit P34=P3^4;
  23. sbit P35=P3^5;
  24. sbit P33=P3^3;
  25. void main()
  26. {
  27.               chushiliang();//初始時亮五秒,閃爍五秒
  28.               init();//中斷初始化
  29.               while(1); //等待中斷

  30. }

  31. void chushiliang()  //初始時亮五秒,閃爍五秒
  32. {
  33.               quanliang();
  34.               delay(5000);
  35. //下面是閃爍5秒                           
  36.               quanmie();            
  37.               delay(500);
  38.               quanliang();
  39.               delay(500);
  40.               quanmie();
  41.               delay(500);
  42.               quanliang();
  43.               delay(500);
  44.               quanmie();
  45. }
  46. void delay(uint n)              //延時
  47. {
  48.               uint i,j;
  49.               if(P35==0)
  50.               {
  51.                             time2++;
  52.                             if(time2%4==0)
  53.                             s1=200;
  54.                             if(time2%4==1)
  55.                             s1=500;
  56.                             if(time2%4==2)
  57.                             s1=700;
  58.                             if(time2%4==3)
  59.                             s1=1000;
  60.               }
  61.               for(i=0;i<n;i++)
  62.               for(j=0;j<121;j++);
  63.               if(P34==0)
  64.               {                                                                                   
  65.                                           while(1)
  66.                                           {
  67.                                                         time1++;
  68.                                                         moshiqiehuan();
  69.                                           }                           
  70.               }
  71.               while(flag==1);            
  72. }
  73. void quanliang() //全亮
  74. {
  75.               P0=P1=P2=0x00;
  76. }
  77. void quanmie() //全滅
  78. {
  79.               P0=P1=P2=0xFF;            
  80. }
  81. void init()
  82. {
  83.               IT0=1;
  84.               EA=1;
  85.               EX0=1;
  86.               EX1=1;
  87.               IT1=1;
  88.               IP=0x04;//外部中斷1的優先級高與外部中斷零
  89. }
  90. void D_INT0(void) interrupt 0 using 0  //開始鍵,設置一種波形,先亮左半邊,再亮右半邊
  91. {
  92.               uint i;
  93.             
  94.             
  95.               while(1)
  96.               {
  97.                             P2=0x7f;
  98.                             for(i=0;i<8;i++)
  99.                             {
  100.                                           P2=P2>>1;
  101.                                           delay(500);            
  102.                             }
  103.                             P0=0xfe;
  104.                             for(i=0;i<8;i++)
  105.                             {
  106.                                           P0=P0<<1;
  107.                                           delay(500);            
  108.                             }
  109.                             P1=0xfe;
  110.                             for(i=0;i<8;i++)
  111.                             {
  112.                                           P1=P1<<1;
  113.                                           delay(500);            
  114.                             }
  115.                             P0=P1=P2=0XFF;//全部亮一遍之后再循環點亮            
  116.               }
  117. }
  118. void D_INT1() interrupt 2 using 2  //控制暫停
  119. {
  120.                 time++;
  121.                 if(time%2==1)  //time如果是奇數,說明暫停;偶數的話,則是再開始。
  122.                 {
  123.                                             flag=1;

  124.                 }
  125.                 else
  126.                 flag=0;
  127. }
  128. void moshiqiehuan()                 //模式切換
  129. {
  130.               uint i;
  131.               i=time1%4;//四種模式切換
  132.               if(i==0)
  133.               moshi1();
  134.               if(i==1)
  135.               moshi2();
  136.               if(i==2)
  137.               moshi3();
  138.               if(i==3)
  139.               moshi4();
  140.             
  141. }

  142. void moshi1()              //心形的右半邊中間開始向兩邊亮
  143. {
  144.               uint i;
  145.               do
  146.               {
  147.               P0=P1=P2=0XFF;//全部亮一遍之后滅
  148.               P0=0x7f;
  149.               P1=0xfe;
  150.               for(i=0;i<8;i++)
  151.               {
  152.                             P0=P0>>1;
  153.                             P1=P1<<1;
  154.                             delay(s1);            
  155.               }            
  156.               P1=0xfe;
  157.               }while(1);            
  158. }

  159. void moshi2()              //順時針循環亮
  160. {
  161.               uint i;
  162.               do
  163.               {
  164.               P0=P1=P2=0XFF;//全部亮一遍之后滅
  165.               P0=0xfe;
  166.               for(i=0;i<8;i++)
  167.               {
  168.                             P0=_crol_(P0,1);
  169.                             delay(s1);            
  170.               }
  171.               P1=0xfe;
  172.               for(i=0;i<8;i++)
  173.               {
  174.                             P1=_crol_(P1,1);
  175.                             delay(s1);            
  176.               }
  177.               P2=0xfe;
  178.               for(i=0;i<8;i++)
  179.               {
  180.                             P2=_crol_(P2,1);
  181.                             delay(s1);            
  182.               }
  183.               }while(1);            
  184. }

  185. void moshi3()              //順時針一個一個亮,使所有的燈都亮
  186. {
  187.               uint i;
  188.               do
  189.               {
  190.               P0=P1=P2=0XFF;//全部亮一遍之后再循環點亮
  191.               P0=0xfe;
  192.               for(i=0;i<8;i++)
  193.               {
  194.                             P0=P0<<1;
  195.                             delay(s1);            
  196.               }
  197.               P1=0xfe;
  198.               for(i=0;i<8;i++)
  199.               {
  200.                             P1=P1<<1;
  201.                             delay(s1);            
  202.               }
  203.               P2=0xfe;
  204.               for(i=0;i<8;i++)
  205.               {
  206.                             P2=P2<<1;
  207.                             delay(s1);            
  208.               }
  209.               }while(1);            
  210. }
  211. void moshi4()              //從心形的最底部,兩邊同時開始向上亮
  212. {
  213.               uint i;
  214.               do
  215.               {
  216.               P0=P1=P2=0XFF;//全部亮一遍之后再循環點亮
  217.               P1=0x7f;
  218.               P2=0xfe;
  219.               for(i=0;i<8;i++)
  220.               {
  221.                             P1=P1>>1;
  222.                             P2=P2<<1;
  223.                             delay(s1);            
  224.               }
  225.               P0=0x7f;
  226.               for(i=0;i<8;i++)
  227.               {
  228.                             P0=0x7f;
  229.                             delay(s1);            
  230.               }
  231.               }while(1);            
  232. }
復制代碼

全部資料51hei下載地址:
單片機自主學習-心形燈的設計.7z (435.47 KB, 下載次數: 28)



回復

使用道具 舉報

ID:760854 發表于 2020-5-27 15:03 | 顯示全部樓層
我想問一下最后的時鐘模塊是不需要了嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表