這是我花了兩個星期的時間完成的心形燈的實驗設計,
相信需要的師兄會滿意的,里面包括了仿真和源碼
此次設計基于單片機技術與單片機芯片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 引腳及開關 時鐘復位電路,以及四個開關,分別控制著開始、暫停、速度切換和模式切換。
第六章 總結當時看到這個的時候,感覺無從下手,當我靜下心來,思考如何一步步實現這個功能,首先應該把電路圖畫出來,以及元器件的連接。那天晚上,我先把電路圖畫出來,然后編寫代碼實現了開始亮五秒,亮滅閃爍五秒這個功能,縱觀整個的設計過程,經常出現這樣那樣的困難,比如電路圖畫錯、編程出現錯誤、軟件不會使用,在這期間著實費了我不少時間,但是我還是努力認真的去學習檢查和修改。雖然這個過程非常艱難,但還是值得我回味的。在整個設計過程,我查閱了大量地相關書籍和文獻資料,從中學習了一些單片機的工作原理以及怎樣去設計一個電子電路。通過這次設計,我不僅加深了對以前學過課本知識得以理解和應用,并且對于其在電路中的使用有了更多的認識。通過這次自主學習,我學會了很多的道理,當我們遇見一個很棘手的問題時,先不要慌,要靜下心來,思考應該如何一步步實現,膽怯和畏懼時解決不了問題的。這次的功能的實現,給了我很大的信心,只要努力去做,沒有完不成的事情。
全部資料51hei下載地址:
單片機自主學習-心形燈的設計.7z
(435.47 KB, 下載次數: 28)
2020-2-23 00:21 上傳
點擊文件名下載附件
|