第一篇:?jiǎn)纹瑱C(jī)交通燈綜合實(shí)驗(yàn)報(bào)告
河 北 工 業(yè) 大 學(xué)
實(shí)
驗(yàn)
報(bào)
告
學(xué)
院:
專(zhuān)
業(yè):
班
級(jí):
姓
名:
學(xué)
號(hào):
實(shí)驗(yàn)課程:?jiǎn)纹瑱C(jī)應(yīng)用系統(tǒng)設(shè)計(jì)開(kāi)發(fā)入門(mén) 指導(dǎo)教師:
實(shí)驗(yàn)名稱:
交通信號(hào)燈控制實(shí)驗(yàn)
實(shí)驗(yàn)時(shí)間:
2019 年
月 23 日
2019 年 5 月 23 日
一
實(shí)驗(yàn)要求
實(shí)驗(yàn)?zāi)康募皩?shí)驗(yàn)內(nèi)容要求 實(shí)驗(yàn)?zāi)康模?.熟悉外部中斷源的擴(kuò)展方法。
2.初步掌握單片機(jī)綜合應(yīng)用系統(tǒng)設(shè)計(jì)。
3.掌握用 Proteus 調(diào)試匯編源程序的方法。
實(shí)驗(yàn)內(nèi)容要求:
用發(fā)光二極管模擬交通信號(hào)燈,用邏輯電平開(kāi)關(guān)模擬控制開(kāi)關(guān),設(shè)計(jì)一個(gè)交通信號(hào)燈控制系統(tǒng)。設(shè)計(jì)要求如下:
(1)A 車(chē)道與 B 車(chē)道交叉組成十字路口,A 是主道,B 是支道;正常情況下,A、B 兩車(chē)道輪流放行。具體放行時(shí)間和要求如下:
(2)A 車(chē)道放行 50s,其中綠燈常亮 44s,綠燈閃爍 3s(用于警告),黃燈常亮 3s(用于警告)。
(3)B 車(chē)道放行 30s,其中綠燈常亮 24s,綠燈閃爍 3s(用于警告),黃燈常亮 3s(用于警告)。
在交通繁忙時(shí),交通信號(hào)燈控制系統(tǒng)應(yīng)有手控開(kāi)關(guān),可人為地改變信號(hào)燈的狀態(tài),以緩解交通擁擠狀況??刂埔笕缦拢?/p>
(1)在 B 車(chē)道放行期間,若 A 車(chē)道有車(chē)而 B 車(chē)道無(wú)車(chē),按下開(kāi)關(guān)使 A 車(chē)道放行 15s。
(2)在 A 車(chē)道放行期間,若 B 車(chē)道有車(chē)而 A 車(chē)道無(wú)車(chē),按下開(kāi)關(guān)使 B 車(chē)道放行 15s。
(3)有緊急車(chē)輛通過(guò)時(shí),按下開(kāi)關(guān)使 A、B 車(chē)道均為紅燈,禁行 15s。
實(shí)驗(yàn)設(shè)備或運(yùn)行軟件平臺(tái) 完成本實(shí)驗(yàn)需要使用到單片機(jī)仿真軟件 Proteus8,該軟件是英國(guó) Lab Center Electronics 公司出版的 EDA 工具軟件,是目前比較好的仿真單片機(jī)及外圍器件的工具。從原理圖布圖、代碼調(diào)試到單片機(jī)與外圍電路協(xié)同仿真,一鍵切換到 PCB 設(shè)計(jì),真正實(shí)現(xiàn)了從概念到產(chǎn)品的完整設(shè)計(jì)。是目前世界上唯一將電路仿真軟件、PCB 設(shè)計(jì)軟件和虛擬模型仿真軟件三合一的設(shè)計(jì)平臺(tái)。在編譯方面,它也支持 IAR、Keil、MATLAB 等多種編譯器。其具有的基本功能特點(diǎn)為:1.原理布圖。2.PCB 自動(dòng)或人工布線。3.SPICE 電路仿真。革命性的特點(diǎn)是 1.互動(dòng)的電路仿真。
2.仿真處理器及其外圍電路。
二
實(shí)驗(yàn)內(nèi)容及過(guò)程
實(shí)驗(yàn)設(shè)計(jì)及分析(或者實(shí)驗(yàn)程序)
實(shí)驗(yàn)原理圖如下所示:
交通信號(hào)燈模擬控制系統(tǒng)程序流程圖如下圖所示:
主程序
一道有車(chē)另一道無(wú)車(chē)時(shí)
緊急車(chē)輛通過(guò)時(shí) 的中斷服務(wù)程序的中斷服務(wù)程序
A
綠燈閃、B
紅燈延時(shí)
s
A
紅燈、B
綠燈閃動(dòng)延
s
A
紅燈、B
綠燈延時(shí)
s
A
綠燈、B
紅燈延時(shí)
s
A
紅燈、B
黃燈延時(shí)
s
A
黃燈、B
紅燈延時(shí)
s
初始化
開(kāi)中斷
保護(hù)現(xiàn)場(chǎng)
關(guān)中斷
A
道有車(chē)
B
道有車(chē)
A
紅燈、B
綠燈延時(shí)
s
A
綠燈、B
紅燈延時(shí)
s
關(guān)中斷
恢復(fù)現(xiàn)場(chǎng)
開(kāi)中斷
返回
中斷響應(yīng)
保護(hù)現(xiàn)場(chǎng)
A
紅燈、B
紅燈延時(shí)
s
恢復(fù)現(xiàn)場(chǎng)
返回
N
N
Y
Y
中斷響應(yīng)
開(kāi)始
實(shí)驗(yàn)程序及程序分析如下:
ORG
0000H LJMP
MAIN ;LJMP,轉(zhuǎn)向主程序 ORG
0003H LJMP
INT00 ;轉(zhuǎn)向緊急車(chē)輛中斷服務(wù)程序 ORG
0013H LJMP
INT11 ;轉(zhuǎn)向有車(chē)車(chē)道放行中斷服務(wù) ORG
0030H MAIN : SETB
PX0
;置外部中斷 0 為高優(yōu)先級(jí)中斷 MOV
TCON,#00H ;置外部中斷 0、1 為電平觸發(fā) MOV
IE,#85H ;開(kāi) CPU 中斷、外部中斷 0、1 中斷 LOOP:
;A 道綠燈亮;B 紅燈亮 MOV
P1,#0F3H MOV
R1,#88 ;44s 延時(shí)循環(huán)次數(shù) AP1:
;調(diào)用 0.5s 延時(shí)子程序 DELAY LCALL
DELAY DJNZ
R1,AP1 ;44s 不到,繼續(xù)循環(huán)(DJNZ RN,REL 是一條件轉(zhuǎn)移指令,先將工作寄存器Rn 中的數(shù)減“1”,判斷結(jié)果是否為“0”,不為“0”程序就跳轉(zhuǎn)到行標(biāo)為REL 的地方執(zhí)行,否則,為“0”就不轉(zhuǎn)移,繼續(xù)執(zhí)行下一條指令。)
MOV
R1,#6 ;3s 延時(shí)的循環(huán)次數(shù)(循環(huán)一次延時(shí) 0.5 秒。)
AP2:
;A 道綠燈閃爍 CPL
P1.2 LCALL
DELAY ;參考程序中缺少此句,若缺失會(huì)導(dǎo)致無(wú)法延時(shí)。
DJNZ
R1,AP2 ;3s 未到,繼續(xù)循環(huán) MOV
P1,#0F5H ;A 道黃燈亮,B 道紅燈亮 MOV
R1,#6
AP3: LCALL
DELAY DJNZ
R1,AP3
;3s 未到,繼續(xù)循環(huán) MOV
P1,#0DEH ;A 道紅燈亮,B 道綠燈亮 MOV
R1,#48
;延時(shí)循環(huán) 48 次
BP1: LCALL
DELAY
DJNZ
R1,BP1 ;24s 未到繼續(xù)循環(huán) MOV
R1,#6 BP2: CPL
P1.5 ;B 道綠燈閃爍 LCALL
DELAY DJNZ
R1,BP2 ;3s 未到,繼續(xù)循環(huán) MOV
P1,#0EEH;A 道紅燈亮,B 道黃燈亮 MOV
R1,#6 BP3: LCALL
DELAY DJNZ
R1,BP3 ;3s 未到,繼續(xù)循環(huán) SJMP
LOOP ORG
0200H INT00:
保護(hù) P1 口數(shù)據(jù) PUSH
P1
;PUSH 入棧指令 MOV
P1,#0F6H
;A 道紅燈亮;B 道紅燈亮 MOV
R2,#30
;15 秒延時(shí)的循環(huán)次數(shù) DELAY0: LCALL
DELAY DJNZ
R2,DELAY0
POP
P1
;恢復(fù) P1 口數(shù)據(jù) POP 是出棧指令 RETI
;返回主程序 ORG
0300H INT11: CLR
EA
;關(guān)中斷 EA 為總中斷 PUSH
P1
;保護(hù)現(xiàn)場(chǎng) PUSH
04H PUSH
05H PUSH
06H SETB
EA
;開(kāi)中斷 JNB
P3.0,AP0 ;A 道無(wú)車(chē),轉(zhuǎn)向判斷 B 道(JNB 比較轉(zhuǎn)移指令。當(dāng) P3.0 是 0 時(shí)就轉(zhuǎn)移執(zhí)行 AP0,否則就順序執(zhí)行。)
MOV
P1,#0F3H;A 道綠燈亮,B 道紅燈亮 SJMP
DEL1
;轉(zhuǎn)向 15 秒延時(shí)程序 AP0: JNB
P3.1,EXIT ;B 道無(wú)車(chē),退出中斷
MOV
P1,#0DEH;A 道紅燈亮,B 道綠燈亮 DEL1 : MOV
R3,#30 ;15s 延時(shí)的循環(huán)次數(shù) NEXT : LCALL
DELAY DJNZ
R3,NEXT ;15 秒未到循環(huán)繼續(xù) EXIT : CLR
EA POP
06H
;恢復(fù)現(xiàn)場(chǎng) POP
05H POP
04H POP
P1 SETB
EA RETI
;返回原程序 ORG
0350H DELAY : MOV
R4,#20;0.5 秒延時(shí)子程序參考程序中為#10,經(jīng)實(shí)驗(yàn)發(fā)現(xiàn)只能延時(shí) 0.25s 故改為#20,以達(dá)到實(shí)驗(yàn)?zāi)康摹?/p>
LP1 : MOV
R5,#50 LP2 : MOV
R6,#248 NOP LP3: DJNZ
R6,LP3 DJNZ
R5,LP2 DJNZ
R4,LP1 RET END
交通信號(hào)燈與控制管腳的對(duì)應(yīng)關(guān)系如下:
控制狀態(tài)
P1 口控制碼
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
未用
未用
B 道
綠燈
B 道
黃燈
B 道
紅燈
A 道
綠燈
A 道
黃燈
A 道
紅燈
A 綠燈亮、B 紅燈亮
F3H
0
0
A 黃燈亮、B 紅燈亮
F5H
0
0
A 紅燈亮、B 綠燈亮
DEH
0
0
A 紅燈亮、B 黃燈亮
EEH
0
0
A 紅燈亮、B 紅燈亮
F6H
0
0
實(shí)驗(yàn)步驟及實(shí)驗(yàn)數(shù)據(jù)記 錄 1.先接線按下表所示的管腳與 LED 或邏輯開(kāi)關(guān)的對(duì)應(yīng)關(guān)系接線。在 Proteus8 中原理圖繪制界面中將接線接好。
管腳
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P3.0
P3.1
P3.3
P3.2
LED 或邏輯開(kāi)關(guān)
L3
L1
L2
L7
L5
L6
K1
K2
K3
K8
控制對(duì)象
A 紅燈
A 黃燈
A 綠燈
B 紅燈
B 黃燈
B 綠燈
A 道
B 道
使有車(chē)車(chē)道放行低電平有效
緊急車(chē)輛放行低電平有效
高電平表示有車(chē)低電平表示無(wú)車(chē)
接線完成后如圖所示:
2.輸入程序,在 Proteus8 中 SourceCode 界面將程序輸入完成后試運(yùn)行保證程序正確。
出現(xiàn)編譯成功后進(jìn)行下一步。運(yùn)行程序。
4.觀察六只發(fā)光二極管的亮滅規(guī)律。
實(shí)驗(yàn)中六只發(fā)光二極管亮滅規(guī)律:(0 代表滅,1 代表亮,2 代表閃)
運(yùn)行時(shí)間(s)
A 綠 A 黃 A 紅 B 綠 B 黃 B 紅 0 1 0 0 0 0 1 44 2 0 0 0 0 1 47 0 1 0 0 0 1 50 0 0 1 1 0 0 74 0 0 1 2 0 0 77 0 0 1 0 1 0 80 1 0 0 0 0 1 八十秒后開(kāi)始重復(fù) 0-80 秒內(nèi)的亮滅規(guī)律。
5.
部分連接圖如圖所示。
1)
在 A 紅燈、B 綠燈亮?xí)r,先將 K1 撥至高電平(表示 A 道有車(chē))、K2 撥至低電平(表示 B 道無(wú)車(chē)),再將 K3 撥至低電平使有車(chē)車(chē)道(A 道)放行,A 綠燈、B 紅燈同時(shí)亮 5s 后返回原先狀態(tài)。
對(duì)邏輯開(kāi)關(guān) K1、K2、K3 的操作對(duì)應(yīng)于 SW2 開(kāi)關(guān),閉合 SW2 后,A 紅燈滅,綠燈亮,B 綠燈滅,紅燈亮。15s 后恢復(fù)回閉合開(kāi)關(guān)前的的亮燈狀態(tài)。
2)
在 A 綠燈、B 紅燈亮?xí)r,先將 K1 撥至低電平(表示 A 道無(wú)車(chē))、K2 撥至高電平(表示 B 道有車(chē)),再將 K3 撥至低電平使有車(chē)車(chē)道(B 道)放行,A 紅燈、B 綠燈同時(shí)亮 5s 后返
回原先狀態(tài)。
對(duì)邏輯開(kāi)關(guān) K1、K2、K3 的操作對(duì)應(yīng)于 SW1 開(kāi)關(guān),閉合 SW1 后,A 綠燈滅,紅燈亮,B 紅燈滅,綠燈亮。15s 后恢復(fù)回閉合開(kāi)關(guān)前的的亮燈狀態(tài)。
(提示:K3 撥至低電平后,應(yīng)在 5s 內(nèi)改為高電平,否則,單片機(jī)可能將再一次響應(yīng)中斷。)
6.不論 A 道、B 道的信號(hào)燈處于什么狀態(tài),將 K8 撥至低電平后,A 紅燈、B 紅燈同時(shí)亮 20s后返回原先狀態(tài)。(提示:K8 撥至低電平后,應(yīng)在 20s 內(nèi)改為高電平,否則,單片機(jī)可能將再一次響應(yīng)中斷。)
對(duì)邏輯開(kāi)關(guān) K8 的操作對(duì)應(yīng)于 JINJI 開(kāi)關(guān),閉合 JINJI 后,A 只有紅燈亮,B也只有紅燈亮。20s 后恢復(fù)回閉合開(kāi)關(guān)前的的亮燈狀態(tài)。
實(shí)驗(yàn)數(shù)據(jù)分析 1.一道有車(chē)而另一道無(wú)車(chē)時(shí),K3 撥至低電平即向單片機(jī)發(fā)出中斷請(qǐng)求(低優(yōu)先級(jí)別);若此時(shí)單片機(jī)正在執(zhí)行主程序,會(huì)響應(yīng)中斷轉(zhuǎn)入到相應(yīng)的中斷服務(wù)程序,先依次查詢 A、B 車(chē)道的空閑狀態(tài),再去控制 A、B 車(chē)道的信號(hào)燈;若此時(shí)單片機(jī)正在執(zhí)行緊急車(chē)輛通過(guò)時(shí)中斷服務(wù)程序,單片機(jī)不會(huì)響應(yīng)中斷。
2.緊急車(chē)輛通過(guò)時(shí),K8 撥至低電平即向單片機(jī)發(fā)出中斷請(qǐng)求(高優(yōu)先級(jí)別),不論單片機(jī)正在執(zhí)行主程序還是一道有車(chē)而另一道無(wú)車(chē)時(shí)的中斷服務(wù)程序,會(huì)響應(yīng)中斷轉(zhuǎn)入到相應(yīng)的中斷服務(wù)程序。
3.在進(jìn)行步驟 5 1)或 2)操作時(shí),若在閉合開(kāi)關(guān)后沒(méi)有在 5s 內(nèi)斷開(kāi)開(kāi)關(guān),則在 15 秒時(shí)無(wú)法按時(shí)恢復(fù)回閉合開(kāi)關(guān)時(shí)的亮燈狀態(tài)。
4.操作過(guò)程中發(fā)現(xiàn),若操作 SW1 開(kāi)關(guān)后亮燈狀態(tài)已經(jīng)發(fā)生改變,則在 15 秒內(nèi)再操作 SW2開(kāi)關(guān)則無(wú)法繼續(xù)使亮燈狀態(tài)改變。
三
總結(jié)與體會(huì)
實(shí)驗(yàn)任務(wù)完成情況 本實(shí)驗(yàn)完成情況良好。通過(guò)老師的精心指導(dǎo)、本人的不懈努力和同學(xué)的熱心幫助,能夠基本上完成所有實(shí)驗(yàn)內(nèi)容,且在實(shí)驗(yàn)過(guò)程中對(duì)單片機(jī)的了解更加深入了。但也無(wú)法避免地遇到一些問(wèn)題,比如對(duì)實(shí)驗(yàn)程序代碼的理解不夠深入,只停留在表面,且對(duì) 51 單片機(jī)的 111 條指令仍比較陌生,只能記住一些特別常用的。對(duì)于此我的做法是,在分析實(shí)驗(yàn)程序的過(guò)程中,一遇到不熟悉的指令就百度搜索一下加深印象。在反復(fù)的搜索過(guò)程中我也記住了不少指令。通過(guò)課程的學(xué)習(xí),目前達(dá)到的水平是能夠基本看懂實(shí)驗(yàn)程序,能夠繪制簡(jiǎn)單原理圖,但仍無(wú)法做到獨(dú)立編寫(xiě)實(shí)驗(yàn)程序。
實(shí)驗(yàn)體會(huì)、收獲、建議回答問(wèn)題
通過(guò)對(duì)該實(shí)驗(yàn)的學(xué)習(xí),本人也有了許多不小的收獲。對(duì)于一位非電技專(zhuān)業(yè)的學(xué)生來(lái)說(shuō),我在學(xué)習(xí)單片機(jī)的過(guò)程中確實(shí)存在許多問(wèn)題。老師講的東西很多在課堂上都無(wú)法及時(shí)弄明白,必須要靠課余時(shí)間的學(xué)習(xí)。所以起初在做該實(shí)驗(yàn)的時(shí)候也是感覺(jué)苦難重重,覺(jué)得自己肯定是無(wú)法完成的,但我不想輕易放棄,將老師上用的課件反復(fù)查看,發(fā)現(xiàn)很多上課沒(méi)有注意到的重要知識(shí)點(diǎn),這讓我的實(shí)驗(yàn)變得更加容易完成了許多。我覺(jué)得通過(guò)本次實(shí)驗(yàn)我的最大收獲是學(xué)會(huì)了如何解決難題。首先要做的就是對(duì)自己有信心,相信自己一定能夠完成。其次才是去認(rèn)真解決問(wèn)題。
第二篇:?jiǎn)纹瑱C(jī)綜合實(shí)驗(yàn)報(bào)告格式
(在所做過(guò)的實(shí)驗(yàn)內(nèi)容里挑選一個(gè)自己最有收獲,最有感想的實(shí)驗(yàn)內(nèi)容)
綜合實(shí)驗(yàn)報(bào)告標(biāo)題(可與實(shí)驗(yàn)名稱不同)
一、實(shí)驗(yàn)?zāi)康暮鸵蟆?/p>
二、實(shí)驗(yàn)儀器設(shè)備。
三、實(shí)驗(yàn)設(shè)計(jì)及調(diào)試:
(一)實(shí)驗(yàn)內(nèi)容。
(二)實(shí)驗(yàn)電路:畫(huà)出與實(shí)驗(yàn)內(nèi)容有關(guān)的簡(jiǎn)單實(shí)驗(yàn)電路。
(三)實(shí)驗(yàn)設(shè)計(jì)及調(diào)試步驟:
(1)對(duì)實(shí)驗(yàn)內(nèi)容和實(shí)驗(yàn)電路進(jìn)行分析,理出完成實(shí)驗(yàn)的設(shè)計(jì)思路。(2)列出程序設(shè)計(jì)所需的特殊標(biāo)志位、堆棧sp、內(nèi)部ram、工作寄存器等資源的分配列表,分配列表時(shí)注意考慮資源在程序執(zhí)行過(guò)程可能會(huì)出現(xiàn)沖突的問(wèn)題。
(3)畫(huà)出程序設(shè)計(jì)流程圖,包括主程序和各子程序流程圖。
(4)根據(jù)(2)、(3)的內(nèi)容寫(xiě)出實(shí)驗(yàn)程序。
(5)調(diào)試程序(可以使用模擬仿真器)。
a、根據(jù)程序確定調(diào)試目的,即調(diào)試時(shí)所需觀察的內(nèi)容結(jié)果。
b、根據(jù)各調(diào)試目的分別選擇調(diào)試所需的方法,如單步、斷點(diǎn)等命令,分別列出各調(diào)試方法中所需要關(guān)注記錄的內(nèi)容。
c、調(diào)試程序,按各種調(diào)試方法記錄相應(yīng)的內(nèi)容。
d、分析調(diào)試記錄的內(nèi)容和結(jié)果,找出程序中可能出錯(cuò)的地方,然后修改程序,繼續(xù)調(diào)試、記錄、分析,直到調(diào)試成功。
(四)實(shí)驗(yàn)調(diào)試過(guò)程中所遇到的問(wèn)題、解決問(wèn)題的思路和解決的方法。
四、實(shí)驗(yàn)后的經(jīng)驗(yàn)教訓(xùn)總結(jié)。
第三篇:交通燈單片機(jī)課程設(shè)計(jì)
《單片機(jī)原理與接口技術(shù)課程設(shè)計(jì)報(bào)告》
課題:以交通燈為主的多功能任務(wù)設(shè)計(jì)
班級(jí) 學(xué)號(hào) 學(xué)生姓名
指導(dǎo)教師
淮陰工學(xué)院 電子與電氣工程學(xué)院
2015-6 1
目錄
一、課程設(shè)計(jì)目的......................................................................................................3
二、設(shè)計(jì)要求..............................................................................................................3 1. 總體要求........................................................................................................3 2. 具體要求........................................................................................................3 3. 系統(tǒng)硬件總框圖............................................................................................4 1)AT89C52單片機(jī).......................................................................................5 3)數(shù)碼管顯示電路........................................................................................6 4)LED燈顯示...............................................................................................7 5)鍵盤(pán)掃描模塊............................................................................................7 6)蜂鳴器電路................................................................................................8
三、硬件電路的設(shè)計(jì)及描述......................................................................................8 1. 硬件總框圖及原理圖....................................................................................8 2. 主程序流程圖..............................................................................................10 3. 各模塊流程圖..............................................................................................11 1)時(shí)間顯示程序流程圖..............................................................................12 2)流水燈程序流程圖..................................................................................12 3)利用蜂鳴器的音樂(lè)流程圖......................................................................13 4)交通燈控制..............................................................................................13
四、源程序代碼........................................................................................................14
六、調(diào)試情況
六、設(shè)計(jì)心得............................................................................................................20
七、參考文獻(xiàn)............................................................................................................20
一、設(shè)計(jì)目的
《單片機(jī)原理及應(yīng)用》課程設(shè)計(jì)是一項(xiàng)重要的實(shí)踐性教育環(huán)節(jié),是學(xué)生在校期間必須接受的一項(xiàng)工程訓(xùn)練。在課程設(shè)計(jì)過(guò)程中,在教師指導(dǎo)下,應(yīng)用工程的方法,通過(guò)一個(gè)簡(jiǎn)單課題的設(shè)計(jì)練習(xí),可使學(xué)生初步體驗(yàn)單片機(jī)應(yīng)用系統(tǒng)的設(shè)計(jì)過(guò)程、設(shè)計(jì)要求、完成的工作內(nèi)容和具體的設(shè)計(jì)方法,了解必須提交的各項(xiàng)工程文件,也達(dá)到鞏固、充實(shí)和綜合運(yùn)用所學(xué)知識(shí)解決實(shí)際問(wèn)題的目的。
通過(guò)課程設(shè)計(jì),應(yīng)該能加強(qiáng)學(xué)生如下能力的培養(yǎng):(1)獨(dú)立工作能力和創(chuàng)造力;
(2)綜合運(yùn)用專(zhuān)業(yè)及基礎(chǔ)知識(shí),解決實(shí)際工程技術(shù)問(wèn)題的能力;(3)查閱圖書(shū)資料、產(chǎn)品手冊(cè)和各種工具書(shū)的能力;(4)工程繪圖的能力;
(5)編寫(xiě)技術(shù)報(bào)告和編寫(xiě)技術(shù)資料的能力。
二、設(shè)計(jì)要求
1.總體要求
(1)獨(dú)立完成設(shè)計(jì)任務(wù)(2)繪制系統(tǒng)硬件總框圖(3)繪制系統(tǒng)原理電路圖
(4)制定編寫(xiě)設(shè)計(jì)方案,編制軟件框圖,完成詳細(xì)完整的程序清單和注釋?zhuān)?)制定編寫(xiě)調(diào)試方案,編寫(xiě)用戶操作使用說(shuō)明書(shū)
(6)寫(xiě)出設(shè)計(jì)工作小結(jié)。對(duì)在完成以上文件過(guò)程所進(jìn)行的有關(guān)步驟如設(shè)計(jì)思想、指標(biāo)論證、方案確定、參數(shù)計(jì)算、元器件選擇、原理分析等作出說(shuō)明,并對(duì)所完成的設(shè)計(jì)作出評(píng)價(jià),對(duì)自己整個(gè)設(shè)計(jì)工作中經(jīng)驗(yàn)教訓(xùn),總結(jié)收獲和今后研究方向。
2.具體要求
本次工程實(shí)踐的校內(nèi)部分主要以單片機(jī)為基礎(chǔ),進(jìn)行單片機(jī)軟件編程,目的 3 是為了提高學(xué)生的軟件編程和系統(tǒng)設(shè)計(jì)能力,整個(gè)設(shè)計(jì)系統(tǒng)包括兩個(gè)部分,硬件及軟件部分,硬件部分已經(jīng)制作成功,學(xué)生只需要掌握其原理和焊接相應(yīng)的元器件,掌握元器件的辨別和元器件的作用以及應(yīng)用場(chǎng)所即可,另外對(duì)所焊接的電路還需要進(jìn)行仔細(xì)的檢查,判斷是否有焊接錯(cuò)誤的地方或者短路的地方,對(duì)出現(xiàn)的異常情況要能夠根據(jù)現(xiàn)象判別原因,并具備解決問(wèn)題的能力,從而切實(shí)提高學(xué)生的硬件電子電路的分析、判斷能力。
軟件編程是本次課程設(shè)計(jì)的重要環(huán)節(jié)。在為期兩周的工程實(shí)踐中,將占據(jù)主要時(shí)間,完成的軟件編程任務(wù)主要包括以下幾點(diǎn):
1)、熟悉Keil C51編程平臺(tái)及相關(guān)編程軟件
2)、編寫(xiě)、調(diào)試蜂鳴器、繼電器動(dòng)作、方波程序并進(jìn)行軟硬件聯(lián)調(diào) 3)、編寫(xiě)、調(diào)試LED流水燈(循環(huán)顯示)程序并進(jìn)行軟硬件聯(lián)調(diào) 4)、編寫(xiě)、調(diào)試鍵盤(pán)掃描子程序并進(jìn)行軟硬件聯(lián)調(diào) 5)、編寫(xiě)、調(diào)試數(shù)碼管動(dòng)態(tài)掃描程序并進(jìn)行軟硬件聯(lián)調(diào) 6)、基于交通燈的多功能控制設(shè)計(jì)
其中前五個(gè)內(nèi)容是后兩個(gè)內(nèi)容的基礎(chǔ),主要是編制一些子程序,為后繼的整個(gè)系統(tǒng)設(shè)計(jì)打下基礎(chǔ)。交通燈控制是在五個(gè)課題中選做的一個(gè)設(shè)計(jì),是一個(gè)簡(jiǎn)單的單片機(jī)編程設(shè)計(jì),來(lái)實(shí)現(xiàn)智能交通燈的多功能作用。
3.系統(tǒng)硬件總框圖
圖1 系統(tǒng)設(shè)計(jì)總框圖
此次課程設(shè)計(jì),AT89C52是一種帶2K字節(jié)閃爍可編程可擦除只讀存儲(chǔ)器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS 8位微處理器,俗稱單片機(jī)。1)AT89C52單片機(jī)
設(shè)計(jì)中所用的單片機(jī)型號(hào)為AT89C52,其主要功能為:
AT89C52是低功耗、高性能的CMOS 8位單片機(jī)。片內(nèi)帶有8KB的Flash存儲(chǔ)器,且允許在系統(tǒng)內(nèi)改寫(xiě)或用編程器編程。另外,AT89C52的指令系統(tǒng)和引腳與80C52完全兼容,所以,近幾年AT89C52單片機(jī)應(yīng)用極為廣泛。
AT89C52單片機(jī)除了含有8KB的Flash存儲(chǔ)器外,片內(nèi)還有256 B的RAM,32條I/O口線,3個(gè)16位定時(shí)/計(jì)算器、6個(gè)中斷源、1個(gè)全雙工串行口等。同時(shí),與80C52一樣,有空閑和掉電兩種節(jié)電運(yùn)行方式。
AT89C52引腳如下圖所示:
圖2 AT89C52引腳
AT89C52單片機(jī)為40腳雙列直插封裝的8 位通用微處理器,采用工業(yè)標(biāo)準(zhǔn)的C51內(nèi)核,在內(nèi)部功能及管腳排布上與通用的8xc52 相同,其主要用于會(huì)聚調(diào)整時(shí)的功能控制。功能包括對(duì)會(huì)聚主IC 內(nèi)部寄存器、數(shù)據(jù)RAM及外部接口等功能部件的初始化,會(huì)聚調(diào)整控制,會(huì)聚測(cè)試圖控制,紅外遙控信號(hào)IR的接收解碼及與主板CPU通信等。
2)DS1302模塊
DS1302的RST是復(fù)位/片選線,通過(guò)把RST輸入驅(qū)動(dòng)置高電平來(lái)啟動(dòng)所有的數(shù)據(jù)傳送。當(dāng)RST為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對(duì)DS1302進(jìn)行操作。如果在傳送過(guò)程中RST置為低電平,則會(huì)終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。
其管腳圖如下:
圖3 DS1302管腳圖
各引腳功能:Vcc1為后備電源,VCC2為主電源,X1和X2是振蕩源,SCLK為輸入端
RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。
3)數(shù)碼管顯示電路
圖4 數(shù)碼管顯示電路
設(shè)計(jì)中采用六位共陰極數(shù)碼管,通過(guò)單片機(jī)STC89C52的P0口控制其位選和段選,以達(dá)到動(dòng)態(tài)顯示相應(yīng)數(shù)值的效果。在其位選控制部分,采用了一個(gè)9012型三極管,要求當(dāng)P0口輸出低電平時(shí),位選成功。
所謂動(dòng)態(tài)掃描就是指我們采用分時(shí)的方法,輪流控制各個(gè)顯示器的COM端,6 使各個(gè)顯示器輪流點(diǎn)亮。在輪流點(diǎn)亮掃描過(guò)程中,每位顯示器的點(diǎn)亮?xí)r間是極為短暫的(約1ms),但由于人的視覺(jué)暫留現(xiàn)象及發(fā)光二極管的余輝效應(yīng),盡管實(shí)際上各位顯示器并非同時(shí)點(diǎn)亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù),不會(huì)有閃爍感。
4)LED燈顯示
圖5 LED顯示模塊
本次課程設(shè)計(jì)中,“程序語(yǔ)言”通過(guò)“翻譯”軟件“翻譯”成單片機(jī)所需的二進(jìn)制代碼,單片機(jī)可工作。要用外加電源和分壓電阻來(lái)控制低電平驅(qū)動(dòng)點(diǎn)亮,因?yàn)閱纹瑱C(jī)不能直接高電平驅(qū)動(dòng)LED燈。如圖D1-D8和R1、R2以及R6-R11連接到單片機(jī)IO口,當(dāng)P1口某腳變低時(shí)相應(yīng)LED發(fā)光。實(shí)現(xiàn)LED燈的閃爍,只需利用編程方法依次從低位到高位逐個(gè)變?yōu)榈碗娖?,等待少許時(shí)刻再變高即可。
5)鍵盤(pán)掃描模塊
圖6 按鍵輸入電路
本模塊四個(gè)開(kāi)關(guān)分別用于控制流水燈控制電路,時(shí)間顯示電路,音樂(lè)蜂鳴器電路,交通燈四部分功能。當(dāng)按下其中一個(gè)開(kāi)關(guān)時(shí),該部分電路導(dǎo)通,給單片機(jī) 發(fā)出地址信號(hào),實(shí)現(xiàn)其中一項(xiàng)功能的運(yùn)做,如圖4所示。
KEYA鍵:其功能是當(dāng)該鍵按下時(shí),蜂鳴器程序工作; KEYB鍵:其功能是當(dāng)該鍵按下時(shí),流水燈程序工作;
KEYC鍵:其功能是當(dāng)該鍵按下時(shí),數(shù)碼管動(dòng)態(tài)掃描程序工作; KEYD鍵:其功能是當(dāng)該鍵按下時(shí),交通燈程序工作。
6)蜂鳴器電
圖7 蜂鳴器電路
路
蜂鳴器單元電路是通過(guò)一個(gè)PNP三極管來(lái)放大驅(qū)動(dòng)蜂鳴器,蜂鳴器的正極接到+5V電源上面,蜂鳴器的負(fù)極接到三極管的發(fā)射極,三極管的基極經(jīng)過(guò)限流電阻后由單片機(jī)的P3.4控制。
當(dāng)輸出高電平時(shí),三極管截止,蜂鳴器的兩引腳間的直流電壓接近于0V,沒(méi)有電流流過(guò)線圈,蜂鳴器不發(fā)聲;當(dāng)輸出低電平時(shí),三極管導(dǎo)通,使蜂鳴器的兩個(gè)引腳間獲得將接近+5V的直流電壓,這樣蜂鳴器的電流形成回路,發(fā)出聲音。因此,我們可以通過(guò)程序控制IO口輸出的電平來(lái)控制蜂鳴器是否發(fā)出聲音,實(shí)現(xiàn)各種可能音響的產(chǎn)生。
三、硬件電路的設(shè)計(jì)及描述
1.硬件總框圖及原理圖
圖8 硬件總框圖
圖9 硬件總原理圖
2.主程序流程圖
3.各模塊流程圖 1)時(shí)間顯示程序流程圖
2)流水燈程序流程圖
3)利用蜂鳴器的音樂(lè)流程圖
4)智能交通燈
四、源程序代碼
/******************************************************************** * 文件名
: 4個(gè)功能由按鍵控制.c * 描
述
: 按下A鍵,實(shí)現(xiàn)蜂鳴器動(dòng)作。
按下B鍵,實(shí)現(xiàn)LED流水燈循環(huán)顯示。
按下C鍵,實(shí)現(xiàn)數(shù)碼管動(dòng)態(tài)掃描顯示。
按下D鍵,實(shí)現(xiàn)交通燈功能。* 創(chuàng)建人
:
***********************************************************************/ #include
#define uint unsigned int
// 無(wú)符號(hào)整形習(xí)慣的定義
#define uchar unsigned char
//無(wú)符號(hào)字符型習(xí)慣的定義 void buzz_key(void);
//子函數(shù)聲明 void led_key(void);void tube_key(void);void traffic(void);unsigned char code duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 0 1 2 3 4 5 6 7 8 9
unsigned char code weima[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
// 選擇哪個(gè)數(shù)碼管
unsigned char temp[6];uchar i=35;uchar k=30;uchar l=5;uchar j;uchar b;
//定義變量
sbit duan=P2^6;//定義管腳 sbit wei=P2^7;sbit key_A=P3^4;sbit key_B=P3^5;sbit key_C=P3^6;sbit key_D=P3^7;sbit buzz=P2^3;sbit DIOLA=P2^5;sbit csda=P3^2;sbit red=P1^0;//交通燈管腳定義 sbit green=P1^1;sbit yellow=P1^2;/******************************************************************** * 名稱 : Delay_1ms()* 功能 : 延時(shí)子程序,延時(shí)時(shí)間為 1ms * x * 輸入 : x(延時(shí)一毫秒的個(gè)數(shù))* 輸出 : 無(wú)
***********************************************************************/
void Delay_1ms(unsigned int t){ unsigned char x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);
}
/******************************************************************** * 名稱 : Main()* 功能 : 實(shí)現(xiàn)蜂鳴器,流水燈,數(shù)碼管,交通燈
***********************************************************************/ void main(){
DIOLA=0;//流水燈鎖存器關(guān) 流水燈未選通
wei=0;//位選關(guān)
duan=1;
P0=0;
duan=0;
csda=0;
while(1){
if(key_A==0 || key_B==0 || key_C==0|| key_D==0)
{
if(key_A==0)
//A鍵按下
{
buzz_key();
//調(diào)用蜂鳴器子程序
}
else if(key_B==0)//B鍵按下
{
led_key();
//調(diào)用流水燈子程序
}
else if(key_C==0)//C鍵按下時(shí)
{
tube_key();//調(diào)用數(shù)碼管顯示子程序
}
else
//D鍵按下時(shí)
{
traffic();
//調(diào)用交通燈子程序
i=35;
k=30;
l=5;
return;
}
}
} }
/******************************************************************** * 名稱 : buzz_key(void)* 功能 : 蜂鳴器子程序
***********************************************************************/
void buzz_key(void)
{
DIOLA=0;wei=0;
buzz=0;
//蜂鳴器響
while(key_B&&key_C&&key_D&&!key_A);
buzz=1;
//關(guān)蜂鳴器
}
/********************************************************************* * 名稱 : led_key(void)* 功能 : 流水燈子程序
***********************************************************************/ void led_key(void){
DIOLA=1;b=0xfe;
P1=b;//11111110 while(key_B==0){
b=_crol_(b,1);
//左移11111101
Delay_1ms(500);
P1=b;
//111111011
Delay_1ms(500);
}
while(key_A&&key_B&&key_C&&key_D);
P1=0xff;
}
/******************************************************************** * 名稱 : tube_key(void)* 功能 : 數(shù)碼管子程序
***********************************************************************/
void tube_key(void){
DIOLA=0;
//流水燈使能端置0 while(key_C==0)
{ unsigned int i;
for(i=0;i<6;i++)
{
wei=1;
P0=weima[i];
//位選信號(hào)
wei=0;
duan=1;
P0=duanma[i];//段選信號(hào)
duan=0;
Delay_1ms(500);
}
duan=1;
P0=0;
duan=0;
//清零
}
}
/******************************************************************** * 名稱 : traffic_key(void)* 功能 : 交通燈子程序
***********************************************************************/
void traffic(void)
{
DIOLA=0;
while(key_D==0)
{
if(i>0)
{
DIOLA=1;
b=0xfe;
P1=b;//11111110
for(j=0;j<40;j++)
{
P0 = 0;
wei=1;
//消隱
P0 = weima[0];
wei=0;
duan=1;
//第1位數(shù)碼管顯示
P0 = duanma[(i / 10)%10];//在這里取 i 的個(gè)位數(shù)
Delay_1ms(40);
//延時(shí)40毫秒后顯示下一個(gè)數(shù)
P0 = 0;
wei=1;
//消隱
P0 = weima[1];
wei=0;
duan=1;
//第2位數(shù)碼管顯示
P0 = duanma[i % 10];
//在這里取 i 的個(gè)位數(shù)
Delay_1ms(40);
//延時(shí)40毫秒后顯示下一個(gè)數(shù)
}
i--;
}
else if(k>0)
{
DIOLA=1;
b=0xfd;
P1=b;//11111110
for(j=0;j<40;j++)
{
P0 = 0;
wei=1;
//消隱
P0 = weima[0];
wei=0;
duan=1;
//第1位數(shù)碼管顯示
P0 = duanma[(k / 10)%10];//在這里取 i 的個(gè)位數(shù)
Delay_1ms(40);
//延時(shí)3毫秒后顯示下一個(gè)數(shù)
P0 = 0;
wei=1;
//消隱
P0 = weima[1];
wei=0;
duan=1;
//第2位數(shù)碼管顯示
P0 = duanma[k % 10];
//在這里取 i 的個(gè)位數(shù)
Delay_1ms(40);
//延時(shí)3毫秒后顯示下一個(gè)數(shù)
}
k--;
}
else if(l>0)
{
DIOLA=1;
b=0xfb;
P1=b;//11111110
for(j=0;j<40;j++)
{
P0 = 0;
wei=1;
//消隱
P0 = weima[0];
wei=0;
duan=1;
//第1位數(shù)碼管顯示
P0 = duanma[(l / 10)%10];//在這里取 i 的個(gè)位數(shù)
Delay_1ms(40);
//延時(shí)3毫秒后顯示下一個(gè)數(shù)
P0 = 0;
wei=1;
//消隱
P0 = weima[1];
wei=0;
duan=1;
//第2位數(shù)碼管顯示
P0 = duanma[l % 10];
//在這里取 i 的個(gè)位數(shù)
Delay_1ms(40);
//延時(shí)3毫秒后顯示下一個(gè)數(shù)
}
l--;
}
}
}
五、設(shè)計(jì)心得
通過(guò)兩個(gè)星期的實(shí)驗(yàn),我的設(shè)計(jì)雖然有一些毛病,但總體上還是成功的。兩周的時(shí)間雖然短暫,但我從中受益匪淺,畢竟在課堂學(xué)習(xí)到的東西真真正正的用到實(shí)際中還是有很大困難的,要把理論運(yùn)用于實(shí)踐確實(shí)并非一件易事。我從最初的設(shè)想設(shè)計(jì)一個(gè)什么樣的數(shù)字電路到繪制電路圖,然后打印排版,最后矯正設(shè)計(jì)中的漏洞與不足,整個(gè)過(guò)程我翻閱了大量的資料。
這次交通燈的課程設(shè)計(jì),也使我得到了一次用專(zhuān)業(yè)知識(shí)、專(zhuān)業(yè)技能分析和解決現(xiàn)實(shí)問(wèn)題的能力。使我在單片機(jī)的基本原理、單片機(jī)應(yīng)用學(xué)習(xí)過(guò)程中,以及在常用編程設(shè)計(jì)思路技巧的掌握方面都能向前邁了一大步,為日后成為一名合格的應(yīng)用型人才打下良好的基礎(chǔ)。綜合課程設(shè)計(jì)讓我把以前學(xué)習(xí)到的知識(shí)得到鞏固和進(jìn)一步的提高認(rèn)識(shí),對(duì)已有知識(shí)有了更深層次的理解和認(rèn)識(shí)。在此,由于自身能力有限,在課程設(shè)計(jì)中碰到了很多的問(wèn)題,我通過(guò)查閱相關(guān)書(shū)籍、資料以及和周?chē)瑢W(xué)交流得到解決。
還有交通燈是我們生活中非常常見(jiàn)的一種東西,對(duì)于我們學(xué)以致用的這種能力得到了很好鍛煉,能夠?yàn)槲覀円院蟮墓ぷ饔趯W(xué)習(xí)打下基礎(chǔ)。
六、參考文獻(xiàn)
1.《單片機(jī)原理及接口技術(shù)》 李朝青 北京航空航天大學(xué)出版社,2004 2.《單片機(jī)原理及應(yīng)用》 李全力 高等教育出版社,2001 3.《電子系統(tǒng)設(shè)計(jì)與實(shí)踐》 楊剛,周群 電子工業(yè)出出版社,1997 4.《單片機(jī)微型計(jì)算機(jī)技術(shù)》 劉國(guó)榮 機(jī)械工業(yè)出版社,1997 5.《數(shù)字電子技術(shù)》 楊志忠 高等教育出版社,2003 6.《電子技術(shù)》 胡宴如 高等教育出版社,2001 7.《電子線路CAD》 王延才 機(jī)械工業(yè)出版社,2001 8.《單片機(jī)應(yīng)用技術(shù)選編》 何利民 北京航空航天大學(xué)出版社,1996 9.《單片機(jī)應(yīng)用技術(shù)》 吳國(guó)經(jīng) 中國(guó)電力出版社,2004 10.《單片機(jī)及接口技術(shù)實(shí)踐教程》 胡健 北京機(jī)械工業(yè)出版社,2002 11.《使用接口技術(shù)》 李廣軍 成都電子科技大學(xué)出版社,1998
第四篇:?jiǎn)纹瑱C(jī)交通燈控制程序
#include
//*****define led port ********** sbit R1=P2^4;//east and west red led sbit Y1=P2^3;//east and west yellow led sbit G1=P2^2;//east and west green led sbit R2=P2^5;//south and north red led sbit Y2=P2^6;//south and north yellow led sbit G2=P2^7;//south and north green led
//*********define key************** sbit k0=P3^0;//emergency sbit k1=P3^1;//east and west pass sbit k2=P3^2;//south and north pass sbit k3=P3^3;//start and subtract 1 sbit k4=P3^4;//pause and add 1 sbit k5=P3^5;//set time
//*********define variable********* bit flag,flag_t;uchar dx_time,nb_time;uchar cnt,pass_time,cnt1,y_time;uchar k0num,k1num,k2num,k3num,k4num,k5num;
//*********define key******** void delay(uint i){ uint x,y;for(x=i;x>0;x--)
for(y=110;y>0;y--);} void timer0_init(){ TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;ET1=1;}
void led_display(uchar dx,nb){ uchar dx1,dx2,nb1,nb2;dx2=dx/10;dx1=dx%10;nb2=nb/10;nb1=nb%10;if(dx>99){
led_w1=1;
led_w2=1;} else {
led_w1=0;
P0=table[dx1];
delay(5);
led_w1=1;
if(dx<10&&dx>0)led_w2=1;
else
{
led_w2=0;
P0=table[dx2];
delay(5);
led_w2=1;
} } if(nb>99){
led_w3=1;
led_w4=1;} else {
led_w3=0;
P0=table[nb1];
delay(5);
led_w3=3;
if(nb<10&&nb>0)led_w4=1;
else
{
led_w4=0;
P0=table[nb2];
delay(5);
led_w4=4;
} } } //*************light work********** void circle_led(){ if(!flag){
if(pass_time>5)
{
led_display(pass_time-5,pass_time);
R1=1;Y1=1;G1=0;
//east and west pass
R2=0;Y2=1;G2=1;
//south and north stop
}
if(pass_time<=5&&pass_time>0)
{
if(cnt>=10)led_display(pass_time,pass_time);
else led_display(100,pass_time);
R1=1;G1=1;
//east and west yellow led flash
if(cnt>=10)Y1=0;
else Y1=1;
R2=0;Y2=1;G2=1;
}
if(pass_time==0)
{
pass_time=nb_time;
flag=1;
} } else {
if(pass_time>5)
{
led_display(pass_time,pass_time-5);
R1=0;Y1=1;G1=1;
//east and west stop
R2=1;Y2=1;G2=0;
//south and north pass
}
if(pass_time<=5&&pass_time>0)
{
if(cnt>=10)led_display(pass_time,pass_time);
else led_display(pass_time,100);
R1=0;Y1=1;G1=1;
R2=1;G2=1;
//south and north yellow led flash
if(cnt>=10)Y2=0;
else Y2=1;
}
if(pass_time==0)
{
pass_time=dx_time;
flag=0;
} } }
void emergency()
//east and west,south and north stop { led_display(0,0);R1=0;Y1=1;G1=1;R2=0;Y2=1;G2=1;} void dx_pass()
//east and west pass,south and north stop { led_display(100,100);if(y_time<=5&&y_time>0){
TR1=1;
R1=0;Y1=1;G1=1;
R2=1;G2=1;
//south and north yellow led flash
if(cnt1>=10)Y2=0;
else Y2=1;} if(y_time==0){
TR1=0;
R1=1;Y1=1;G1=0;
R2=0;Y2=1;G2=1;} } void nb_pass()
//south and north pass,east and west stop { led_display(100,100);if(y_time<=5&&y_time>0){
TR1=1;
R1=1;G1=1;
if(cnt1>=10)Y1=0;//east and west yellow led flash
else Y1=1;
R2=0;Y2=1;G2=1;
} if(y_time==0){
TR1=0;
R1=0;Y1=1;G1=1;
R2=1;Y2=1;G2=0;} }
//***********keyboard scan************ void keyscan(){
if(!k5num)
{
if(k0==0)//*******emergency*******
{
delay(10);
if(k0==0)
{
while(!k0);
TR0=0;
k0num=1;
}
}
if(!k1num&&!k0num)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
while(!k1);
k1num=1;
k2num=0;
y_time=5;//單方向通行時(shí),黃燈閃爍時(shí)間
TR0=0;
TR1=1;
}
}
}
if(!k2num&&!k0num)
{
if(k2==0)
{
delay(10);
if(k2==0)
{
while(!k2);
k1num=0;
k2num=1;
y_time=5;//單方向通行時(shí),黃燈閃爍時(shí)間
TR0=0;
TR1=1;
}
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!k3);
if(k1num||k2num)pass_time=dx_time;//由東西或南北通行返回時(shí),重新開(kāi)始執(zhí)行。
k0num=0;
k1num=0;
k2num=0;
k4num=0;
k5num=0;
TR0=1;
TR1=0;
flag_t=0;
}
} {
} if(!k4&&!k0num)
//pause { delay(10);if(k4==0){
while(!k4);
TR0=0;
k4num=1;} }
if(k4num==1)
//暫停鍵按下時(shí),才可以調(diào)整兩個(gè)方向通行時(shí)間 if(k5==0){ delay(10);if(k5==0){
k5num++;
while(!k5);
switch(k5num)
{
case 1:
TR0=1;
flag_t=1;//調(diào)整時(shí)間時(shí),pass_time值不變。
k5num=1;
break;
case 2:
k5num=2;
break;
case 3:
TR0=0;
k5num=0;
pass_time=dx_time;//重新賦值
break;
} } } if(k5num!=0){ if(k3==0){
delay(10);
if(k3==0)
{
while(!k3);
switch(k5num)
{
case 1:
dx_time--;
if(dx_time<10)
break;
case 2:
nb_time--;
if(nb_time<10)
break;
}
}
}
if(k4==0)
{
delay(10);
if(k4==0)
{
while(!k4);
switch(k5num)
{
case 1:
dx_time++;
if(dx_time>=100)
break;
case 2:
nb_time++;
if(nb_time>=100)
break;
}
}
}
} } } void main(){ timer0_init();dx_time=45;nb_time=30;
dx_time=99;nb_time=99;dx_time=10;nb_time=10;
pass_time=dx_time;while(1){ keyscan();if(k0num)emergency();else { switch(k4num){
case 0:
if(!k1num&&!k2num)
circle_led();
else
{
if(k1num)dx_pass();
if(k2num)nb_pass();
}
break;
case 1:
switch(k5num)
{
case 0:
if(!k1num&&!k2num)
circle_led();
else
{
if(k1num)dx_pass();
if(k2num)nb_pass();
}
break;
case 1:
R1=1;Y1=1;G1=1;//調(diào)整時(shí)間時(shí),關(guān)閉所有燈
R2=1;Y2=1;G2=1;
if(cnt<=10)
led_display(100,nb_time);
else
led_display(dx_time,nb_time);
break;
case 2:
R1=1;Y1=1;G1=1;//調(diào)整時(shí)間時(shí),關(guān)閉所有燈
R2=1;Y2=1;G2=1;
if(cnt<=10)
led_display(dx_time,100);
else
led_display(dx_time,nb_time);
break;
}
break;
}
}
} } void timer0()interrupt 1 { TH0=(65536-50000)/256;TL0=(65536-50000)%256;cnt++;if(cnt==20){
cnt=0;
if(flag_t==0)pass_time--;//調(diào)整時(shí)間時(shí),不執(zhí)行此操作
} } void timer1()interrupt 3 { TH1=(65536-50000)/256;TL1=(65536-50000)%256;cnt1++;if(cnt1==20){
cnt1=0;
y_time--;//單方向通行時(shí),黃燈閃爍時(shí)間。
} }
第五篇:FPGA交通燈實(shí)驗(yàn)報(bào)告
交通燈實(shí)驗(yàn)報(bào)告
一,實(shí)驗(yàn)?zāi)康?/p>
實(shí)現(xiàn)兩路信號(hào)燈交替亮起,并利用兩組數(shù)碼管分別對(duì)兩路信號(hào)進(jìn)行倒計(jì)時(shí)。
兩路信號(hào)時(shí)間分別為:
V:綠燈(30S)
H:紅燈(35S)
黃燈(5s)
綠燈(30S)
紅燈(35S)
黃燈(5S)
二,實(shí)驗(yàn)步驟 建立工程
可在歡迎界面點(diǎn)擊“Creat a New Project”進(jìn)入工程建立界面,亦可關(guān)閉歡迎界面,點(diǎn)擊菜單欄的“File”,點(diǎn)擊“New Project Wizard”進(jìn)入建立工程界面。右側(cè)為建立工程界面,點(diǎn)擊next。
在此界面選定工程路徑,取好工程名,點(diǎn)擊“Next”。注意:路徑中不能有中文,工程名也不能有中文。
一直點(diǎn)擊“Next”進(jìn)入器件設(shè)置界面,DE2-70開(kāi)發(fā)工具采用的Cyclone II系列的EP2C70F896C6N。點(diǎn)擊“Finish”,完成工程建立
1、點(diǎn)擊“File”,點(diǎn)擊“New” 選擇“Verilog HDL” 2,點(diǎn)擊主界面工具欄中的 選擇“Verilog HDL”
3、寫(xiě)入verilog代碼。
代碼如下:
module traffic(Clk_50M,Rst,LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V,Seg7_VH,Seg7_VL,Seg7_HH,Seg7_HL,led15);
parameter S1=2'b00;parameter S2=2'b01;parameter S3=2'b10;parameter S4=2'b11;
input Clk_50M,Rst;output LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V;output[6:0] Seg7_VH,Seg7_VL,Seg7_HH,Seg7_HL;output led15;
//-------------div for 1Hz-------start----reg Clk_1Hz;reg [31:0] Cnt_1Hz;always@(posedge Clk_50M or negedge Rst)begin
if(!Rst)
begin
Cnt_1Hz<=1;
Clk_1Hz<=1;
end
else
begin
if(Cnt_1Hz>=25000000)
end
//-----------div for 1Hz------end-----reg[7:0] Cnt30,CntH,CntV,CntHH,CntVV;reg[7:0] CntDis,CntDiss;//-----------30 counter and seg7---start---reg LedR_H,LedG_H,LedY_H,LedR_V,LedG_V,LedY_V;always@(posedge Clk_1Hz)begin
end
begin
Cnt_1Hz<=1;
Clk_1Hz<=~Clk_1Hz;
end
else
Cnt_1Hz<=Cnt_1Hz + 1;
case(state)
S1:
end
always@(posedge Clk_1Hz)begin
case(stateV)
S1:
begin
if(CntV>=30)
CntV<=1;
begin
if(Cnt30>=30)
Cnt30<=1;
else
Cnt30<=Cnt30 + 1;S2:
begin
if(Cnt30>=5)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;S3:
begin
if(Cnt30>=30)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;S4:
begin
if(Cnt30>=5)
Cnt30<=1;end
else
Cnt30<=Cnt30 + 1;end endcase
else
CntV<=CntV + 1;
S2: begin
end
end if(CntV>=5)
CntV<=1;
else
CntV<=CntV + 1;end
S3:
begin
if(CntV>=35)
CntV<=1;
else
CntV<=CntV + 1;end endcase always@(posedge Clk_1Hz)begin
case(stateH)
S1:
end
always@(negedge Clk_50M or negedge Rst)begin
begin
if(CntH>=35)
CntH<=1;
else
CntH<=CntH + 1;
S2:
begin
if(CntH>=30)
CntH<=1;end
else
CntH<=CntH + 1;end
S3:
begin
if(CntH>=5)
CntH<=1;
else
CntH<=CntH + 1;end endcase
case(state)
S1:
end always@(negedge Clk_50M or negedge Rst)begin
case(state)
S1:
end
//16進(jìn)制計(jì)數(shù)器轉(zhuǎn)換為用于顯示的10進(jìn)制計(jì)數(shù)器 always@(posedge Clk_50M)begin
if(CntVV>29)
begin
CntDis[7:4]<=3;
CntDis[3:0]<=CntVV20;end else if(CntVV>9)begin
CntDis[7:4]<=1;
CntDis[3:0]<=CntVV30;end else if(CntHH>19)begin
CntDiss[7:4]<=2;
CntDiss[3:0]<=CntHH10;end else
CntDiss<=CntHH;
end
if(Cnt30>=5)
end
end S3:
begin
state<=S4;
end S4:
begin
state<=S1;
end default:
begin
state<=S1;
end endcase
if(Cnt30>=30)
if(Cnt30>=5)always@(posedge Clk_1Hz)begin
case(state)
S1:
end
always@(posedge Clk_50M or negedge Rst)
begin
stateH<=S1;
stateV<=S1;
end S2:
begin
stateH<=S1;
stateV<=S2;
end S3:
begin
stateH<=S2;
stateV<=S3;
end S4:
begin
stateH<=S3;
stateV<=S3;
end endcase begin
if(!Rst)
begin
LedR_H<=0;
else
LedG_H<=0;LedY_H<=0;
LedR_V<=0;
LedG_V<=0;end LedY_V<=0;
begin
case(state)
S1:
begin
LedR_H<=1;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=1;LedY_V<=0;end
S2:
begin
LedR_H<=1;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=1;end
S3:
begin
LedR_H<=0;LedG_H<=1;LedY_H<=0;LedR_V<=1;LedG_V<=0;LedY_V<=0;end
S4:
begin LedR_H<=0;LedG_H<=0;
end
LedY_H<=1;LedR_V<=1;LedG_V<=0;LedY_V<=0;end
default:
begin
end LedR_H<=0;LedG_H<=0;LedY_H<=0;LedR_V<=0;LedG_V<=0;LedY_V<=0;end
endcase assign led15=state;
endmodule
module SEG7_LUT input [3:0] iDIG;output reg
always @(iDIG)begin
case(iDIG)4'h1: oSEG = 7'b1111001;
//---t----4'h2: oSEG = 7'b0100100;// |
| 4'h3: oSEG = 7'b0110000;// lt rt
4'h4: oSEG = 7'b0011001;// |
| 4'h5: oSEG = 7'b0010010;//---m----4'h6: oSEG = 7'b0000010;// |
| 4'h7: oSEG = 7'b1111000;// lb rb 4'h8: oSEG = 7'b0000000;// |
| 4'h9: oSEG = 7'b0011000;//---b----4'ha: oSEG = 7'b0001000;4'hb: oSEG = 7'b0000011;4'hc: oSEG = 7'b1000110;4'hd: oSEG = 7'b0100001;4'he: oSEG = 7'b0000110;[6:0] oSEG;[6:0] oSEG;(oSEG,iDIG);
end
4'hf: oSEG = 7'b0001110;4'h0: oSEG = 7'b1000000;endcase endmodule 編譯工程
保存文件,將文件放在所建工程所在路徑下 點(diǎn)擊主界面工具欄中的圖標(biāo)
也可點(diǎn)擊菜單欄中“Processing”,點(diǎn)擊“Start Compilation”
分配關(guān)鍵如下:
Clk_50M Input PIN_AD15 LedG_H Output PIN_AD9 LedG_V Output PIN_AJ6 LedR_H Output PIN_AJ7)LedR_V Output PIN_AJ5)LedY_H Output PIN_AD8 LedY_V Output PIN_AK5 Rst Input PIN_AA23 Seg7_HH[6] Output PIN_G1 Seg7_HH[5] Output PIN_H3 Seg7_HH[4] Output PIN_H2 Seg7_HH[3] Output PIN_H1 Seg7_HH[2] Output PIN_J2 Seg7_HH[1] Output PIN_J1 Seg7_HH[0] Output PIN_K3
Seg7_HL[6] Seg7_HL[5] Seg7_HL[4] Seg7_HL[3] Seg7_HL[2] Seg7_HL[1] Seg7_HL[0] Seg7_VH[6] Seg7_VH[5] Seg7_VH[4] Seg7_VH[3] Seg7_VH[2] Seg7_VH[1] Seg7_VH[0] Seg7_VL[6] Seg7_VL[5] Seg7_VL[4] Seg7_VL[3] Seg7_VL[2] Seg7_VL[1] Seg7_VL[0] Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output Output PIN_E4 PIN_F4 PIN_G4 PIN_H8 PIN_H7 PIN_H4 PIN_H6 PIN_AD17 PIN_AF17 7 PIN_AE17 7 PIN_AG16 PIN_AF16 7 PIN_AE16 7 PIN_AG13 PIN_AD12 PIN_AD11 PIN_AF10 8 PIN_AD10 PIN_AH9 8 PIN_AF9 8 PIN_AE8 8
燒寫(xiě)代碼
在管腳配置完成后,還需將工程再編譯一次,成功后,點(diǎn)擊主界面工具欄中的亦可點(diǎn)擊主界面菜單欄中“Tools”,點(diǎn)擊“Programmer”
進(jìn)入代碼燒寫(xiě)界面后,點(diǎn)擊“Start”,當(dāng)“Progress”為100%時(shí),表示燒寫(xiě)完成,這是可觀察DE2-70板現(xiàn)象
獲得預(yù)期的效果,兩組的信號(hào)紅黃綠燈交替切換,計(jì)數(shù)器記為零時(shí)信號(hào)燈切換狀態(tài),紅燈35s,黃燈5s,綠燈30s。三,心得體會(huì)
通過(guò)本次實(shí)驗(yàn)初步了解了EDA技術(shù),熟悉了FPGA開(kāi)發(fā)板的開(kāi)發(fā)流程,鍛煉了動(dòng)手能力。