通信與信息工程學院
/ 學年第 學期
軟件設計 實驗報告
模 塊 名 稱 AVR單片機軟件設計(proteus)
專 業
學 生 班 級
學 生 學 號
學 生 姓 名
指 導 教 師
設計題目
基于LED數碼管顯示的交通燈控制
任務要求
基本要求:
1.用2個7段數碼管或2片LCD液晶顯示屏分別倒計時東西及南北方向的通行及等待時間。
2.用兩組各3個發光二極管模擬兩個方向的紅、黃、綠交通燈的顯示。
3.可任意調節通行時長。
4.要求對東西、南北直行方向的交通燈進行控制,南北方向互相配合,在通行方向的最后5秒這樣處理:綠燈閃爍3秒后滅,最后2秒黃燈亮。禁行方向則直接由紅燈變為綠燈。
發揮部分:
1.設計三車道十字路口信號燈(左轉、直行、右轉),右轉燈常亮,直行和左轉分時通行。
2.用定時器而不是普通的延時程序控制顯示時間
實驗設備及軟件
CVAVR編程軟件、PROTUES 仿真軟件
同組人員學號及姓名
一人一組,無同組成員
參考文獻
[1]劉文濤.單片機應用開發實例.北京:清華大學出版社,2005年9月:19~113
[2]周寶善.經典電子設計與實踐DIY.北京:人民郵電出版社,2008年8月:7~8,61~92
[3] 寧武,唐曉宇,閆曉金.電子設計競賽技能指導.北京:電子工業出版社,2006年:128~156
[4] 胡偉,季曉衡.單片機c程序設計及應用.北京:人民郵電出版社,2003年7月:67~135
[5] 童詩白,華成英.模擬電子技術基礎.北京:高等教育出版社,2001年1月:501~550
[6] 張靖武, 周靈彬.單片機原理應用與PROTEUS仿真.北京:電子工業出版社,2008年:28~60
[7] 張超琦,鐘明哲.單片機原理及實例.實踐篇.上海:上海交通大學出版社,2007年:110~158
[8]潘超群.單片機控制技術在通信中的應用:MCS-51.北京:電子工業出版社,2008年:200~228
[9]陳濤.單片機原理及C51程序設計.北京:機械工業出版社,2008年:20~66
AVR單片機軟件設計(proteus)報告
摘 要
本文介紹了交通燈系統的設計。軟件部分是基于ATMEGA128單片機的CVAVR軟件系統。本系統利用單片機的定時器產生秒信號,控制十字路口的紅綠黃燈交替點亮和熄滅,并且用2位共陽數碼管顯示十字路口兩個方向的剩余時間。本系統可以按照設定程序在PROTUES仿真軟件中自行運行。可實現基本交通燈功能,系統實用性強、操作簡單。
關鍵詞:單片機最小系統 ATMEGA128 紅綠燈控制 仿真
一、總體設計原理及思路
(一)整體思路
本系統的整體框圖由ATMEGA128構成主控芯片,主要是實現各個功能模塊之間功能交互。
本系統包括紅黃綠LED燈顯示模塊,LED數碼管顯示模塊。
LED數碼管顯示模塊用來顯示被點亮的指示燈還將點亮多久;LED發光二極管模塊用于指示該方向的3種狀態:通行(綠燈亮)、暫緩通行(黃燈亮)和禁止通行(紅燈亮)。
系統結構框圖如圖所示:
(圖) 系統結構框圖
紅綠燈控制器的總體的設計如下圖所示:
(圖) 紅綠燈控制器總體設計圖
從上圖中可以看出整個設計圖。由CVAVR單片機最小系統模塊來控制紅綠黃發光二極管組合模塊與LED數碼管動態顯示模塊的聯合動態顯示,可通過代碼的編寫任意改變通行時間的長短和紅綠黃三種燈的交替。
(二)整體設計流程圖
二、各模塊設計思路及原理圖
n 單片機最小系統
ATMEGA128是ATMEL公司的8位系列單片機的最高配置的一款單片機,穩定性極高,應用極其廣泛。它是高性能、低功耗的 AVR 8 位微處理器,具有先進的 RISC 結構 。它工作于16 MHz 時性能高達16 MIPS,具有只需兩個時鐘周期的硬件乘法器。它有128K 字節的系統內可編程Flash,4K字節的EEPROM,4K 字節的內部SRAM,多達64K 字節的優化的外部存儲器空間。
它有兩個具有獨立的預分頻器和比較器功能的8 位定時器/ 計數器,兩個具有預分頻器、比較功能和捕捉功能的16 位定時器/ 計數器,具有獨立預分頻器的實時時鐘計數器,兩路8 位PWM,6路分辨率可編程(1 到16 位)的PWM,輸出比較調制器,8路10 位ADC,2 個具有可編程增益(1x,10x, 或200x)的差分通道。它還具有6種睡眠模式: 空閑模式、ADC 噪聲抑制模式、省電模式、掉電模式、Standby 模式以及擴展的Standby 模式。
單片機最小系統如下圖所示:
(圖) 單片機最小系統圖
n LED數碼管顯示電路模塊
按發光二極管單元連接方式可分為共陽極數碼管和共陰極數碼管。共陽數碼管是指將所有發光二極管的陽極接到一起形成公共陽極(COM)的數碼管,共陽數碼管在應用時應將公共極COM接到+5V,當某一字段發光二極管的陰極為低電平時,相應字段就點亮,當某一字段的陰極為高電平時,相應字段就不亮。
本系統的數碼管采用的是兩位共陽數碼管。
數碼管如下圖所示:
(圖) LED數碼管顯示模塊圖
n LED燈顯示模塊
LED燈采用的是共陽接法,即所有的LED管陽級通過一個限流電阻上拉到5V電源,所有的陰級接到單片機的相應引腳。只要該I/O口置低,該燈就能點亮。 本系統出于節省資源,左轉燈只用了紅、綠兩色,直行燈用了紅、綠、黃三色,而右轉燈由于要常綠,因此只用了一個綠燈。下圖只給出了東西南北方向重其中任意的一個。
LED燈顯示模塊如下圖所示:
(圖) LED燈顯示模塊圖
三、軟件設計
(一)各模塊設計思路及流程圖
n 主程序模塊
主要完成定時器T0的設置,綠、黃燈的初值設定以及各子程序的調用。
主程序的流程圖如下圖所示:
(圖)主程序的流程圖
n LED數碼管顯示模塊
LED數碼管顯示模塊包括南北方向LED顯示、東西方向LED顯示。
LED數碼管顯示模塊的程序流程圖如下圖所示:
(圖) LED顯示模塊程序流程圖
n LED燈顯示模塊
LED 燈的顯示及執行流程主要是對I/O的高低電平的控制。
LED顯示模塊的程序流程圖如下圖所示:
(圖) LED顯示模塊程序流程圖
n 定時器0中斷模塊
定時器0主要通過計數產生1秒的定時時間,使LED數碼管按照每秒減1進行倒計時。
定時器0中斷模塊的程序流程圖如下圖所示:
(圖) 定時器0中斷模塊程序流程圖
(二)關鍵代碼說明
Step1.以下是將計數數值轉換成LED 能顯示的兩個數字的程序代碼。將一個兩位十進制數通過number0 = a/10;number1 = a%10; 轉換成兩個數字并顯示
void led_play(unsigned char a)
{
number0 = a/10;
number1 = a%10;
PORTD = 0x00;
PORTD = wei[0];
PORTC = table[number0];
delay_ms(5);
PORTD = 0x00;
PORTD = wei[1];
PORTC = table[number1];
delay_ms(5);
}
Step2.以下是計數器0的中斷服務程序。由于初始化的參數設置,使程序1ms進入一次中斷函數,等到進入第1000次時代表1s 計時時間到。1s到了就講time_counter清零,并將time_1s_os置1,便于主函數每1s 執行一次顯示函數。
interrupt [TIM0_COMP] voidtimer0_comp_isr(void)
{
if(++time_counter==1000)
{
time_counter = 0;
time_1s_ok = 1;
}
}
Step3.以下是主函數里的while(1)函數。首先判斷是否到達了1s(即檢驗time_1s_ok是否為1,若為1,則到達了1s)。然后將time_1s_ok 清零,將計數值num 自減1,并將num 的值送給LED 數碼管顯示。接著判斷mode 為1 還是0。如果為0,則是南北方向通行,否則則是東西方向通行。我在函數中初始化計數初值num為30。假設mode 為0,那么如果num<=30&&num>21,那么使南北方向的左轉方向通行,即使南北方向的左轉燈為綠燈;同時南北方向的直行方向為紅燈;而右轉燈無論南北還是東西方向一直都是通行的,即為綠燈。如果num<=21&&num>6,那么南北方向的直行方向為綠燈,左轉禁止通行了。如果num<=6&num>3,南北方向的綠燈閃爍三秒。如果num<=3&&num>1,則南北方向的直行方向為黃燈。在mode = 0的這30s 內,東西方向的左轉和直行方向都是禁止的。mode=1時,則南北和東西方向的情況完全相反,這里就不贅述了。
while (1)
{
led_play(num);
if(time_1s_ok)
{
time_1s_ok = 0;
if(!mode)
{
PORTA=0x2d; //使東西方向的左轉和直行燈都是紅燈
if(num<=30&&num>21)
PORTB=0x1d;
if(num<=21&&num>6)
PORTB=0x2b;
if(num<=6&num>3) //南北方向綠燈閃爍
{
PORTB=0x2f;
for(i=0;i<20;i++)
{
led_play(num);
}
PORTB=0x2b;
}
if(num<=3&&num>1)
PORTB=0x2e;
if(num<=1)
{
mode=~mode;
num=31;
}
}
if(mode)
{
PORTB=0x2d;
if(num<=30&&num>21)
PORTA=0x1d;
if(num<=21&&num>6)
PORTA=0x2b;
if(num<=6&num>3)
{
PORTA=0x2f;
for(i=0;i<20;i++)
{
led_play(num);
}
PORTA=0x2b;
}
if(num<=3&&num>1)
PORTA=0x2e;
if(num<=1)
{
mode=~mode;
num=31;
}
}
num--;
}
}
四、系統測試
在PROTUES軟件中畫好了仿真圖后,將CVAVR中寫好的代碼放入ATMEGA16芯片中,然后啟動。情況如下:
mode=0的30秒內:
21<num<=30時,南北方向的左轉、直行、右轉分別為綠燈、紅燈、綠燈;東西方向的左轉、直行、右轉分別為紅燈、紅燈、綠燈。
6<num<=21時,南北方向的左轉、直行、右轉分別為紅燈、綠燈、綠燈;東西方向的左轉、直行、右轉分別為紅燈、紅燈、綠燈。
3<num<=6時,南北方向的直行方向綠燈有閃爍。
1<num<=3時,南北方向的直行方向黃燈亮。
mode=1的30秒內:
東西方向與南北方向與上述現象正好相反。
系統仿真出來的結果和實驗的基礎要求及提高要求大致上符合,較好的完成了預期期望。
PS:仿真一開始led燈的顏色較淡,之后將串接的限流電阻阻值改小后就解決了這個問題。
五、實驗心得
首先,從此次實驗的完成成果——基于LED數碼管顯示的交通燈控制的角度來總結,本次單片機課程設計的紅綠燈控制器結構簡單,操作方便,對優化城市交通具有一定的意義。本設計將各任務進行細分包裝,使各任務保持相對獨立;能有效改善程序結構,便于模塊化處理,使程序的可讀性、可維護性和可移植性都得到進一步的提高。同時由于使用的是單片機作為核心的控制元件,使得電路的可靠性比較高,功能也比較強大而且可以隨時的更新系統,進行不同狀態的組合。總而言之,本次實驗我努力完成了課程要求的基本部分和發揮部分,探索的內容豐富、學習內容非常充實。
其次,從我個人的收獲角度來說,在我學習AVR單片機之前我學過51單片機,51單片機用起來簡單,價錢也便宜,用于一些比較簡單的控制還算可以,開發平臺相對單一,但是單片機應用系統開發時,首先遇到的問題就是存儲器的擴展。因為51單片機內部的存儲器容量一般都比較小,因此,從單片機外部配置外部存儲器,包括程序存儲器和數據存儲器,就成了應用系統的重要工作之一。同時擴展的同時又占用了I/O口,當外部設備較多時,原有的幾個內部I/O接口就明顯不夠使用。所以,通過此次對AVR的學習,讓我掌握了一種新的、功能更強大的單片機,對我以后的實際應用很有幫助。不僅如此,在這幾個禮拜的學習中,不斷的摸索激發了我對AVR的興趣,同時也鍛煉我的耐心和分析能力,解決一個個困難的過程我認為是非常寶貴的,相信有了這次實驗的經歷,會對我今后各門學科的學習深有幫助,我覺得受益匪淺、收獲良多。
|