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