摘 要 主要由PC機(jī)與單片機(jī)進(jìn)行通訊,實(shí)現(xiàn)路燈根據(jù)環(huán)境亮度和定時(shí)自動(dòng)遠(yuǎn)程控制,實(shí)現(xiàn)路燈控制智能化。
關(guān)鍵詞 單片機(jī);遠(yuǎn)程;串行通訊;燈
中圖分類(lèi)號(hào) TN911 文獻(xiàn)標(biāo)識(shí)碼 A 文章編號(hào) 1673-9671-(2012)062-0144-02
現(xiàn)在的電子產(chǎn)品很多要和PC機(jī)連接在一起來(lái)實(shí)現(xiàn)控制,和PC機(jī)連接有很多的方法(USB、串口、并口等)來(lái)實(shí)現(xiàn)PC機(jī)與電子產(chǎn)品的通訊。這里使用的是串口來(lái)實(shí)現(xiàn)與PC通訊的通訊。主要由PC機(jī)與單片機(jī)進(jìn)行通訊來(lái)達(dá)到控制的目的。上位機(jī)是PC機(jī)軟件由VB6.0編寫(xiě),下位機(jī)由單片機(jī)電路構(gòu)成,PC機(jī)通過(guò)軟件與單片機(jī)通訊再由單片機(jī)控制外圍電路控制燈。
燈控制可以是人為進(jìn)行手工控制,也可以由時(shí)間和外部的亮度控制,時(shí)間由PC機(jī)上獲得,亮度由外部電路的光敏電阻獲得。從而實(shí)現(xiàn)智能控制。第一步我們寫(xiě)PC機(jī)上的軟件(在編寫(xiě)之前我們要先有硬件電路參照附錄電路)。
1 上位機(jī)軟件編程
上位機(jī)軟件界面如下圖:
1.1 發(fā)送數(shù)據(jù)協(xié)議
表1是上位機(jī)發(fā)送給下位機(jī)的協(xié)議表,例如:上位機(jī)發(fā)送數(shù)據(jù)01D,下位機(jī)接收到以后就會(huì)把街道1得燈打開(kāi);例如上位機(jī)發(fā)送數(shù)據(jù)18D,下位機(jī)接收到以后就會(huì)把8個(gè)街道燈的狀態(tài)依次發(fā)給上位機(jī)。
1.2 8路路燈單獨(dú)控制實(shí)現(xiàn)
總共有8路路燈分別有開(kāi)、關(guān)兩種狀態(tài)每一路路燈都有相對(duì)應(yīng)的一個(gè)按鍵控制。以街道1為例:
Private Sub C1_Click()’當(dāng)單擊街道1的按鍵后
If C1.Caption = “開(kāi)” Then’判斷現(xiàn)在的狀態(tài)
C1.Caption = “關(guān)”‘如果是開(kāi)變顯示“關(guān)”并發(fā)送開(kāi)的數(shù)據(jù)
MSComm1.Output = Chr(1)
Else
C1.Caption = “開(kāi)” ‘不是就變”開(kāi)”并發(fā)送關(guān)的數(shù)據(jù)
MSComm1.Output = Chr(2)
End If
End Sub
相對(duì)應(yīng)的發(fā)送數(shù)據(jù)看表3.1,當(dāng)點(diǎn)擊按鍵后根據(jù)現(xiàn)在的狀態(tài)發(fā)送路燈的開(kāi)、關(guān)數(shù)據(jù)給下位機(jī)。
1.3 Time1
Time1主要是用來(lái)讀取PC機(jī)上的時(shí)間。并把這個(gè)時(shí)間顯示出來(lái)
1)屬性的設(shè)置:Enabled屬性設(shè)置為T(mén)rue;Intervel屬性設(shè)置為1000毫秒。
2)程序:Private Sub Timer1_Timer()
L4.Caption = “現(xiàn)在時(shí)間:” Hour(Now) “:” Minute(Now) “:” Second(Now)
End Sub
3)程序執(zhí)行結(jié)果:讀取PC機(jī)上的時(shí)間并把其顯示在標(biāo)簽L4上。
1.4 Time2
Time2主要是用來(lái)發(fā)送現(xiàn)在的時(shí)間、開(kāi)燈的時(shí)間、關(guān)燈的時(shí)間、開(kāi)燈的亮度和關(guān)燈的亮度,給下位機(jī)。當(dāng)接收到“117”數(shù)據(jù)和單擊確定按鍵時(shí)觸發(fā)這個(gè)事件。
1)屬性的設(shè)置:Enabled屬性設(shè)置為False;由于下位機(jī)的工作頻率不高所以Intervel屬性設(shè)置為1030毫秒。
2)程序:Private Sub Timer2_Timer()
Static TT1 As Integer
Dim TT2 As String
Dim TT3 As Byte
TT1 = TT1 + 1
Select Case TT1
Case 1
TT2 = Chr(Hour(Now)) ‘送小時(shí)
MSComm1.Output = TT2
Case 2
TT2 = Chr(Minute(Now)) ‘送分鐘
MSComm1.Output = TT2
Case 3
TT2 = Chr(Second(Now))
MSComm1.Output = TT2
……………… ’*判斷時(shí)間把相應(yīng)的數(shù)據(jù)送出去
End Sub
1.5 時(shí)間、開(kāi)關(guān)燈數(shù)據(jù)發(fā)送按鍵
“確定”按鍵主要作用是:把修改后的開(kāi)燈時(shí)間、關(guān)燈的時(shí)間、開(kāi)燈的亮度、送關(guān)燈的亮度以及現(xiàn)在的時(shí)間數(shù)據(jù)送到下位機(jī)的觸發(fā)按鍵。
程序:
Private Sub C9_Click()
MSComm1.Output = Chr(17)
F1.Enabled = False
Timer2.Enabled = True
L16.Caption = “數(shù)據(jù)傳送中...”
End Sub
1.6 數(shù)據(jù)同步
“數(shù)據(jù)同步”按鍵主要作用:預(yù)防在特殊情況下把上位機(jī)的程序關(guān)掉,不知道相關(guān)的街道燈的開(kāi)、關(guān)情況時(shí)用來(lái)與下位機(jī)的數(shù)據(jù)同步用的。
程序 Private Sub C10_Click()
MSComm1.Output = Chr(18)
L16.Caption = “數(shù)據(jù)同步”
End Sub
現(xiàn)在我們有了PC機(jī)的軟件,要使PC機(jī)和電路通訊還要有下位機(jī)軟件:
2 下位機(jī)軟件編程
2.1 發(fā)送數(shù)據(jù)協(xié)議
表2是下位機(jī)發(fā)向上位機(jī)送的數(shù)據(jù)及意義,例如:當(dāng)下位機(jī)發(fā)送“117”數(shù)據(jù)時(shí)表示要向上位機(jī)請(qǐng)求發(fā)送現(xiàn)在的時(shí)間、開(kāi)燈的時(shí)間、關(guān)燈的時(shí)間、開(kāi)燈的亮度和關(guān)燈的亮度相關(guān)數(shù)據(jù)。
2.2 程序初始化
程序設(shè)計(jì):設(shè)置程序相關(guān)的數(shù)據(jù),設(shè)置波特率(和PC機(jī)的通訊頻率);開(kāi)定時(shí)器0,設(shè)置定時(shí)器的定時(shí)常熟50 ms;請(qǐng)求上位機(jī)發(fā)送數(shù)據(jù),并接收數(shù)據(jù)(開(kāi)燈的時(shí)間、關(guān)燈的時(shí)間、開(kāi)燈的亮度和關(guān)燈的亮度相關(guān)數(shù)據(jù));開(kāi)總中斷;開(kāi)定時(shí)器0中斷;開(kāi)串行中斷。
2.3 定時(shí)程序
定時(shí)中斷服務(wù)程序:定時(shí)時(shí)間50 ms,進(jìn)入服務(wù)程序;重新設(shè)定定時(shí)常數(shù)(50 ms);判斷是否已經(jīng)1秒,“否”退出,“是”秒寄存器+1;進(jìn)行60秒判斷,等于60S分鐘寄存器+1,秒寄存器清零。并進(jìn)行讀0804,把讀到的數(shù)據(jù)送到PC機(jī)上,并把比較時(shí)間、亮度標(biāo)志PD位置1。最后判斷一個(gè)小時(shí)了沒(méi),“是”小時(shí)寄存器+1,“否”退出。小時(shí)+1判斷是否24小時(shí)。等于小時(shí)寄存器清零。
2.4 開(kāi)關(guān)燈判斷
判斷開(kāi)燈或關(guān)燈的條件標(biāo)志位KGD分辨當(dāng)前燈的狀態(tài),等于1時(shí)執(zhí)行關(guān)燈的小時(shí)、分鐘、亮度比較是否達(dá)到關(guān)燈的范圍,達(dá)到就執(zhí)行關(guān)燈動(dòng)作,有一個(gè)條件不滿足就退出子程序;等于0時(shí)執(zhí)行開(kāi)燈的時(shí)間、亮度比較是否達(dá)到開(kāi)燈的范圍,達(dá)到就執(zhí)行開(kāi)燈動(dòng)作,有一個(gè)條件不滿足就退出子程序。
2.5 從PC機(jī)上加載相關(guān)數(shù)據(jù)
當(dāng)下位機(jī)向PC機(jī)請(qǐng)求相關(guān)的數(shù)據(jù)時(shí),PC機(jī)有響應(yīng)請(qǐng)求,下位機(jī)執(zhí)行數(shù)據(jù)加載程序。進(jìn)入程序先把要加載的數(shù)據(jù)串首地址加載到數(shù)據(jù)指針,然后把取到的數(shù)據(jù)存放到指針指向的地址內(nèi),數(shù)據(jù)指針加1。進(jìn)行判斷是否加載結(jié)束,“否”繼續(xù)加載數(shù)據(jù),直到數(shù)據(jù)加載結(jié)束。
2.6 亮度采集
2.6.1 電路
如附錄電路圖,電路光敏電阻R4受外部亮度的影響阻值會(huì)發(fā)生變化,從而導(dǎo)致CJ點(diǎn)電壓的變化,ADC0804就可以從第6腳VIN(+)采集到不同的電壓值并把這個(gè)模擬量轉(zhuǎn)化成數(shù)字量通過(guò)DB0~DB7傳送給單片機(jī)的P1口。(電路參考附錄)
ADC0804的RD端接單片機(jī)的P3.7用來(lái)控制讀A/D轉(zhuǎn)換的結(jié)果;WR端接單片機(jī)的P3.6用來(lái)控制A/D轉(zhuǎn)化的啟動(dòng);INTR端接單片機(jī)的P3.2用來(lái)發(fā)送轉(zhuǎn)換結(jié)束的信號(hào)。
2.6.2 采集程序
1)主要作用。通過(guò)ADC0804采集光敏電阻的電壓,并轉(zhuǎn)換成相應(yīng)的數(shù)據(jù)。
2)程序。根據(jù)電路的接法,先把p3.6置0來(lái)啟動(dòng)ADC0804,然后等待A/D轉(zhuǎn)換結(jié)束INTR端輸出0是代表A/D轉(zhuǎn)化結(jié)束,置0“p3.7”ADC0804把數(shù)據(jù)送到DB端,單片機(jī)再把數(shù)據(jù)從P1口讀進(jìn)來(lái),再置1“P3.7”。