單片機(jī)、紅外遙控接收電路、狀態(tài)指示電路、控制電路以及單片機(jī)的一些外圍電
路組成單片機(jī)紅外遙控接收器。
使用單片機(jī)中的 T0來做紅外脈沖計(jì)數(shù)器,T1來做計(jì)數(shù)時(shí)間控制器。接收管收到收 個(gè)紅外脈沖后,就觸發(fā)外部中斷1,計(jì)數(shù)器 T0、定時(shí)器 T1就開始工作。當(dāng)定時(shí)溢出時(shí), 計(jì)數(shù)器 T0被中斷程序隨之關(guān)閉,通過判定所讀入的計(jì)數(shù)數(shù)值,來定下將操作的對(duì)象(遙 控按鍵)對(duì)它進(jìn)行相對(duì)的操作,控制電路來控制負(fù)載的狀態(tài)。下圖3-7為紅外遙控接收 器設(shè)計(jì)原理框圖。
3.4 交通燈電路圖
3.4.1 交通燈電路圖
交通燈電路如圖 3-8 所示。
圖 3-8 交通燈電路圖
圖中大部分連線采用總線形式。共四個(gè)二位陰極數(shù)碼管,這四個(gè)數(shù)碼管分別用
來顯示四個(gè)路口的倒計(jì)時(shí),數(shù)碼管的陽極都接到 STC89C52 的 P0 口,陰極接到 P2 口; 共 12 個(gè)發(fā)光二極管,其中 4 個(gè)綠色發(fā)光二極管,4個(gè)紅色發(fā)光二極管,4 個(gè)黃色發(fā)光 二極管,四個(gè)路口每個(gè)路口各有一個(gè)紅(禁行)、一個(gè)黃(警告)發(fā)光二極管,一個(gè)綠 色發(fā)光二極管(通行),四個(gè)人行道,每個(gè)人行道兩邊各有一紅、黃、綠發(fā)光二極管, 另外一個(gè)按鍵按鈕用于繁忙模式和夜間模式的轉(zhuǎn)換,其中四個(gè)路口的二極管接到 P1 口, 人行道的發(fā)光二極管接到 P3 口,繁忙模式和特殊模式的指示燈接 P2 口。
3.4.2 電源電路設(shè)計(jì)
該電路為一個(gè)輸出+5V 直流電壓的穩(wěn)壓電源電路。IC 采用集成穩(wěn)壓器 7805,C1、C
3 分別為輸入端和輸出端濾波電容,RL 為負(fù)載電阻。當(dāng)輸出電較大時(shí),7805 應(yīng)配上散 熱板。電源電路圖如圖 3-9 所示。
圖 3-9 電源電路圖
如圖所示,220V 的交流電壓經(jīng)過一個(gè)變壓器生成一個(gè) 9V 的交流電壓,通過轉(zhuǎn)換電 路進(jìn)入集成穩(wěn)壓器 7805,最終輸出一個(gè)+5V 的直流電壓,可以提供穩(wěn)定的電源。
3.4.3 按鍵電路設(shè)計(jì)
按鍵電路如圖 3-10 所示。
本設(shè)計(jì)設(shè)置了有 3 個(gè)按鍵——S1:S 鍵接 P3.6,S2:J 鍵接 P3.0,S3:F 鍵接 P3.7。 每個(gè)按鍵一端接地,另一端接上拉電阻。低電平有效,當(dāng)按鍵按下端口接地,單片機(jī)捕獲 到低電平,從而知道相應(yīng)的輸入信息。
按鍵功能如下:S 鍵是用來啟動(dòng)正常模式,J 鍵是用來啟動(dòng)上下班高峰的繁忙模式,F(xiàn) 鍵是用來啟動(dòng)深夜特殊模式。
3.5 本章小結(jié)
本章內(nèi)容前面一部分主要從理論上介紹了硬件設(shè)計(jì)的內(nèi)容,后半部分結(jié)合電路圖 把理論與實(shí)物相結(jié)合,介紹了系統(tǒng)的工作原理以及設(shè)計(jì)原理。當(dāng)然我設(shè)計(jì)的簡(jiǎn)易交通 燈還是有很多不足的地方,需要以后再根據(jù)實(shí)際情況不斷加強(qiáng)功能。
第 4 章 軟件設(shè)計(jì)
4.1 程序主體設(shè)計(jì)流程
全部控制程序?qū)嶋H上分為若干模塊:鍵盤設(shè)置處理程序,狀態(tài)燈控制程序,LED 顯 示程序,消抖動(dòng)延時(shí)程序,中斷服務(wù)子程序等。交通燈的總流程圖如圖 4-1 所示。
圖 4-1 主程序流程圖
電路系統(tǒng)上電,設(shè)置初始紅燈等待時(shí)間 90 秒,即 S1 狀態(tài)為正常模式狀態(tài),即在 非上下班高峰時(shí)段,此時(shí)交通燈正常運(yùn)行,紅燈等待時(shí)間為 90 秒;S2 為上下班高峰繁 忙模式,此時(shí)通過紅外遙控或者按鍵來轉(zhuǎn)換交通燈的運(yùn)行模式,紅燈等待時(shí)間為 40 秒; S3 為深夜特殊模式,此時(shí)通過紅外遙控或者按鍵可以控制,無需紅燈等待時(shí)間。
4.2 按鍵設(shè)計(jì)
首先程序不斷掃描模式設(shè)置鍵,分別記為:S 鍵,J 鍵,F(xiàn) 鍵對(duì)應(yīng)IO端口的P
3.6,P3.0,P3.7,低電平有效,按鍵順序是指定的,若直接按 S 鍵,則為正常模式,然后進(jìn)入 下一程序;若再按 J 鍵,則為繁忙模式,然后進(jìn)入下一程序;若按下 F 鍵,則為特殊模式, 并進(jìn)入下一程序。
程序的開始要判斷是否有鍵按下,可以不斷將 J 鍵值和 F 鍵值相或,或值為 0 則表示 沒有鍵按下,即交通燈正常運(yùn)行,為 1 則表示有鍵按下,交通燈啟動(dòng)了上下班高峰模式或者深夜特殊模式。
接下來要判斷具體是那個(gè)鍵,若為 J 鍵,則表示啟動(dòng)的是上下班高峰模式,進(jìn)入下一 程序,否則為 F 鍵,則表示啟動(dòng)的是深夜特殊模式,用 R0 存值,同時(shí)還需判斷此時(shí) S 鍵 是否按下,若按下,則表示恢復(fù)正常模式,進(jìn)入下一程序。
在這個(gè)過程中,S,J 鍵的計(jì)數(shù)是循環(huán)的,從 S 鍵按下設(shè)置的初值 90 開始,減到 J 鍵 按下設(shè)置的值 40 則循環(huán)回到初值 90。
4.3 定時(shí)器的參數(shù)設(shè)計(jì)
定時(shí)器工作的時(shí)候需要給計(jì)數(shù)器傳送計(jì)數(shù)器的初值,該值要傳送到 TL 和 TH 中。 定時(shí)器是運(yùn)用加法記數(shù),可以從全 1 到全 0 的時(shí)候自動(dòng)的產(chǎn)生一個(gè)溢出中斷請(qǐng)求。這 樣我們就可以把計(jì)數(shù)器它記滿為 0 所需要的計(jì)數(shù)值設(shè)為 C,把計(jì)數(shù)初值設(shè)為 TC,計(jì)算
通式如下:
很明顯一秒鐘超過了計(jì)數(shù)器所能表示的最大時(shí)間,因而我們就必須采用軟件和定 時(shí)器相結(jié)合的方法去解決這個(gè)難題。
軟件延時(shí)部分:MCS-51 的工作頻率為 12MHZ。機(jī)器周期與主頻有關(guān),機(jī)器周期是 主頻的 12 倍,所以一個(gè)機(jī)器周期的時(shí)間為 12*(1/12M)=1us。我們可以知道具體每條 指令的周期數(shù),這樣我們就可以通過指令的執(zhí)行條數(shù)來確定 1 秒的時(shí)間。由于單片機(jī) 運(yùn)行的速度非常快,所以其他的一些指令的執(zhí)行耗時(shí)可以不用考慮。
設(shè)定一個(gè)初值是 40 的軟件計(jì)數(shù)器讓 T0 定時(shí)為 50 毫秒。這樣的話每次 T0 到了 50 毫秒的時(shí)候處理器就響應(yīng)溢出的中端請(qǐng)求,并且進(jìn)入中斷服務(wù)的子程序。在中斷服務(wù) 的子程序里,CPU 先讓軟件的計(jì)數(shù)器減少 1,再去判斷其是否是零。如果是零的話表示 一秒就到了。定時(shí)器要設(shè)為 50 毫秒,T0 工作方式必須在 1 上,初值計(jì)算如下:
TC=M-T*T0=216-50ms=15536=3CBOH 定時(shí)器 0 中斷流程如圖 4-2 所示:

圖 4-2 定時(shí)器 0 中斷流程圖
/**********************T0 中斷服務(wù)程序*******************/
void timer0(void)interrupt 1 using 1
{
static uchar count; TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++;
if(count==10)
{
if(Flag_SN_Yellow==1) //測(cè)試南北黃燈標(biāo)志位
{SN_Yellow=~SN_Yellow;}
洛陽理工學(xué)院電氣工程與自動(dòng)化學(xué)院項(xiàng)目設(shè)計(jì)說明書
if(Flag_EW_Yellow==1) //測(cè)試東西黃燈標(biāo)志位
{EW_Yellow=~EW_Yellow;}
}
if(count==20)
{
Time_EW--; Time_SN--;
if(Flag_SN_Yellow==1) //測(cè)試南北黃燈標(biāo)志位
{SN_Yellow=~SN_Yellow;}
if(Flag_EW_Yellow==1) //測(cè)試東西黃燈標(biāo)志位
{EW_Yellow=~EW_Yellow;}
count=0;
}
}
4.4 中斷原理
本系統(tǒng)主要使用了外部中斷,中斷信號(hào)有兩個(gè)引腳 INT0、INT1 進(jìn)行輸入,低電平 時(shí)有效,CPU 每個(gè)時(shí)鐘周期都會(huì)檢測(cè) INT0 和 INT1 上的信號(hào),STC89C52 允許外部中斷 以電平方式或負(fù)邊沿方式兩種中斷方式輸入中斷請(qǐng)求信號(hào),可由用戶通過設(shè)置 TCON 中 IT0 和 IT1 位的狀態(tài)來實(shí)現(xiàn)。以 IT0 為例,IT0=0,為電平觸發(fā)的方式,IT0=1,是負(fù)邊 沿觸發(fā)的方式,本設(shè)計(jì)采用電平方式,IE0 為其中斷標(biāo)志位,有中斷信號(hào)則置位,中斷 服務(wù)子程序響應(yīng)后,IE0 自動(dòng)清零。IE 中的 EA 為允許中斷的總控制位,為 1 開啟,EX0 為外部中斷允許控制位,為 1 開啟。在優(yōu)先級(jí)的允許下,一旦有外部中斷信號(hào)產(chǎn)生, 單片機(jī) CPU 首先保護(hù)斷點(diǎn),PC 值進(jìn)棧,然后執(zhí)行相應(yīng)的中斷服務(wù)子程序,執(zhí)行完后, 用 RETI 指令返回,此時(shí) CPU 會(huì)從堆棧中取保存的斷點(diǎn)地址,送回 PC,程序再正常執(zhí)行,ED 倒計(jì)時(shí)顯示。
外部中斷流程圖如圖 4-3 所示。

子程序如下:
圖 4-3 外部中斷 0 中斷流程圖
/**********************外部 0 中斷服務(wù)程序******************/
void INT0_srv(void)interrupt 0 using 1
{
EX0=0; //關(guān)中斷
if(Nomor_Button==0) //測(cè)試按鍵是否按下,按下來為正常狀態(tài)
{
EW1=90; SN1= 40; EWL1=19; SNL1=19;
Busy_LED=0; //關(guān)繁忙信號(hào)燈
Special_LED =0; //關(guān)特殊信號(hào)燈
洛陽理工學(xué)院電氣工程與自動(dòng)化學(xué)院項(xiàng)目設(shè)計(jì)說明書
}
if(Busy_Btton==0) //測(cè)試按鍵是否按下,按下為繁忙狀態(tài)
{
EW1=45; SN1=30; EWL1=14; SNL1=14;
Special_LED=0; //關(guān)特殊信號(hào)燈
Busy_LED=1; //開繁忙信號(hào)燈
}
if(Special_Btton==0)//測(cè)試按鍵是否按下,按下為特殊狀態(tài)
{
EW1=75; SN1=55; EWL1=19; SNL1=19;
Busy_LED=0; //關(guān)繁忙信號(hào)燈
Special_LED =1;//開特殊信號(hào)燈
}
EX0=1; //開中斷
}
4.5 狀態(tài)燈顯示及判斷
在本設(shè)計(jì)中,實(shí)際控制的燈只有 6 個(gè),即:東西紅燈,東西綠燈,東西黃燈,南 北紅燈,南北綠燈,南北黃燈。IO 端口均是低電平有效。共有 4 種狀態(tài):東西紅燈亮, 南北綠燈亮(11011101);東西紅燈亮,南北黃燈亮(10111101);東西綠燈亮,南北 紅燈亮(11101101);東西黃燈亮,南北紅燈亮(11100111)。
在用于顯示發(fā)光二極管時(shí),直接由 MOV 指令將十六進(jìn)制碼送入 P2 口。
剛才的 4 個(gè)狀態(tài)是依次變換的,這就要涉及到狀態(tài)的判斷和銜接了。先把 P2 端口 的值與所有的 4 個(gè)狀態(tài)碼比較,若相同則判斷成功當(dāng)前狀態(tài),再把下一狀態(tài)的狀態(tài)碼 送顯 P2 即可。狀態(tài)燈定義如下:(見附件)
計(jì)時(shí)每 1 秒都要刷新 1 次,那么計(jì)時(shí)滿 1 秒時(shí)就要將存儲(chǔ)時(shí)間的工作寄存器 R4 減 1,然后送入顯示程序中顯示。下面要將時(shí)間數(shù)據(jù) R4 的十位,個(gè)位分開送顯 P1, P0 端口,首先將 R4 除以 10,整數(shù)即十位放在 A 中,余數(shù)即個(gè)位放在 B 中,設(shè)置 7 段 顯示數(shù)據(jù)的數(shù)據(jù)表,用數(shù)據(jù)指針寄存器 DPTR 指向數(shù)據(jù)表的首地址,再加上 A 中的偏 移量,就可以指向十位數(shù)字,然后送顯即可,個(gè)位顯示同理。設(shè)計(jì)中得延時(shí)程序都是 用軟件完成,通過程序執(zhí)行一條指令的時(shí)間,再加上了兩次累減嵌套來實(shí)現(xiàn)。
在按鍵計(jì)數(shù)的過程里,存在機(jī)械抖動(dòng)和軟件方面的沖突,比如程序檢測(cè)到了有按鍵 按下,就計(jì)數(shù)一次,而事實(shí)上,按鍵閉合后在微觀上還會(huì)彈起然后閉合,一直達(dá)到穩(wěn)定狀態(tài), 所以后面的彈落會(huì)沒有效果,為了使程序不要出現(xiàn)這一現(xiàn)象,我們特別添加了上面所說 的延時(shí)消抖程序,可以在第一次檢測(cè)到閉合時(shí),調(diào)用了一定時(shí)間的延時(shí)程序。
下面是顯示北向的時(shí)間程序,其他方向依此類推:
1 SMG_XS=Data[bei/10]; //顯示北的十位
1 SMG_KZ=0xfd; //允許北十位顯示
1 delay(t); //小延時(shí)一下,使數(shù)碼管顯示更清楚
1 SMG_KZ=0xff; //關(guān)閉數(shù)碼管顯示(消隱)
1 SMG_XS=Data[bei%10]; //顯示北的個(gè)位
1 SMG_KZ=0xfe; //允許北個(gè)位顯示
1 delay(t); //小延時(shí)一下,使數(shù)碼管顯示更清楚
1 SMG_KZ=0xff; //關(guān)閉數(shù)碼管顯示(消隱)
4.7 本章小結(jié)
本章是軟件設(shè)計(jì)部分,給出了相關(guān)運(yùn)算過程還有一部分重要的程序段,對(duì)定時(shí)原 理還有中斷原理給出了很多相關(guān)知識(shí),這些都是單片機(jī)運(yùn)行的關(guān)鍵,所以做了比較充 分的介紹。
PROTEUS 仿真圖如圖 5-1 所示。
圖 5-1 PROTEUS 仿真圖
本設(shè)計(jì)完全用仿真軟件在電腦上對(duì)目標(biāo)電路原理圖和程序進(jìn)行檢測(cè)和調(diào)試。調(diào)試 過程中單片機(jī)相應(yīng)輸入端由通用鍵盤和鼠標(biāo)設(shè)定,運(yùn)行狀態(tài)、各寄存器狀態(tài)、端口狀 態(tài)等都可以在指定的窗口區(qū)域顯示出來,以確定程序運(yùn)行有無錯(cuò)誤。
目標(biāo)程序糾錯(cuò):該階段工作通常在目標(biāo)程序編輯時(shí)就完成。一般來說,仿真軟件 能為用戶輸入的程序指令糾錯(cuò),包括書寫格式、標(biāo)號(hào)未定義或多重定義、轉(zhuǎn)移地址溢 出等錯(cuò)誤。
整體程序調(diào)試:即把各子程序整體連起來進(jìn)入到綜合電路調(diào)試,看是否能實(shí)現(xiàn)預(yù)計(jì)的功能顯示。在這階段若發(fā)生故障,可以考慮各子程序在運(yùn)行時(shí)是否破壞現(xiàn)場(chǎng),數(shù)
據(jù)緩沖單元是否發(fā)生沖突,標(biāo)志位的建立和清除在設(shè)計(jì)上是否失誤,堆棧是否溢出, 輸入輸出狀態(tài)是否正常等。
5.2 硬件實(shí)物演示圖片及簡(jiǎn)單介紹
圖 5-2 實(shí)物正面圖
如圖 5-2 所示,這是一個(gè)簡(jiǎn)易的交通燈,主要有四個(gè)按鍵開關(guān),一個(gè)作為控制器 的 STC89C52 芯片,四個(gè)雙位陰極數(shù)碼管顯示時(shí)間,十二個(gè)發(fā)光二極管表示通行狀態(tài)。
運(yùn)行中的實(shí)物圖展示:
圖 5-3 初始上電畫面
圖 5-3 為初始上電畫面,所有燈閃爍數(shù)次然后開始正常運(yùn)行,通過此時(shí)的狀態(tài)能 觀察出 LED 燈的運(yùn)行情況,如有損壞,則上電時(shí)燈不會(huì)閃爍。
圖 5-4 運(yùn)行中交通燈效果展示
圖 5-4 所示狀態(tài)為南北為綠燈,東西為紅燈,即表示南北車輛通行,東西方向車 輛禁止通行。
圖 5-5 特殊深夜模式
圖 5-5 為深夜特殊模式圖,當(dāng)特殊深夜模式開啟時(shí),四個(gè)方向上黃燈都開始閃爍, 紅綠燈都停止燃亮,方便了深夜少數(shù)車輛的通行。當(dāng)深夜結(jié)束時(shí),可以通過按鍵來轉(zhuǎn) 換工作模式。
5.3 本章小結(jié)
這部分主要展示了仿真與實(shí)物運(yùn)行的效果圖,并且加以說明。從效果上來看設(shè)計(jì) 還是比較成功的,由于時(shí)間緊迫,紅外遙控的設(shè)計(jì)部分還未加到實(shí)物中,但是特殊的 深夜模式還是成功地在實(shí)物中得以體現(xiàn)。總得來說,設(shè)計(jì)上還是有不足的地方,但是 一些基本的功能都能實(shí)現(xiàn)。
電路總圖: