單片機(jī)C51編程幾個有用的模塊(2)_第1頁
單片機(jī)C51編程幾個有用的模塊(2)_第2頁
單片機(jī)C51編程幾個有用的模塊(2)_第3頁
單片機(jī)C51編程幾個有用的模塊(2)_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、單片機(jī)C51編程幾個有用的模塊(2)        應(yīng)用舉例    現(xiàn)在來舉例說明上述幾個模塊的使用方法。    硬件環(huán)境描述:    為了控制一盞燈,需要單片機(jī)提供一個做控制功能的開關(guān)量,這里不描述外部接口電路,只說明當(dāng)單片機(jī)的P10腳為高電平時,燈滅,當(dāng)P10腳為低電平時,燈亮。可以通過計算機(jī)由串口發(fā)送命令來控制,或通過一個按鍵(push button不是自鎖式的按鍵)來手動控制(按

2、鍵接在P11腳上,當(dāng)鍵沒有按下時,P11電平為高,鍵按下時,引腳電平被接低),當(dāng)使用按鍵手動控制的時候,需要給計算機(jī)發(fā)送通知。設(shè)定串口通訊指令如下:數(shù)據(jù)包由0xff做包頭,4個字節(jié)長,第二個字節(jié)為命令代碼,第三個字節(jié)為數(shù)據(jù),最后一個字節(jié)為校驗(yàn)位。命令和數(shù)據(jù)代碼有如下組合:(計算機(jī)發(fā)給單片機(jī))0x10 0x01: 計算機(jī)控制燈亮。(數(shù)據(jù)位是非零值即可)0x10 0x00: 計算機(jī)控制燈滅。(單片機(jī)發(fā)給計算機(jī))0x11 0x01:單片機(jī)正常執(zhí)行控制指令,返回。(數(shù)據(jù)位是非零值即可)0x11 0x00: 單片機(jī)不能夠正常執(zhí)行控制指

3、令,或控制指令錯(不明含義的數(shù)據(jù)包或校驗(yàn)錯等)。0x12 0x01:手動控制燈亮。(數(shù)據(jù)位是非零值即可)0x12 0x00: 手動控制燈滅。    建立工程:    在硬盤上建立文件夾Projects,在Projects下建立Common文件夾及Example文件夾。將各模塊的頭文件及實(shí)現(xiàn)文件拷貝到Common文件夾下(推薦使用這樣的文件組織結(jié)構(gòu),其它工程也可以建立在Projects下,各工程共享Common文件夾中的代碼)。    啟動Keil

4、C的IDE,在Example下建立新工程,將各模塊的實(shí)現(xiàn)文件包含進(jìn)工程。    在Example文件夾下建立Output文件夾,更改工程設(shè)置,將Output作為輸出文件和List文件的輸出文件夾(推薦使用這樣的結(jié)構(gòu),當(dāng)保存工程文件時,可以簡單的刪除Output文件夾中的內(nèi)容而不會誤刪有用的工程文件)。    建立工程配置頭文件Config.h及工程主文件Example.c,并將Exmaple.c文件加入工程。    輸入代碼:    代

5、碼的具體編寫過程略。下面是最后的Config.h文件及Example.c文件。/ file: Config.h/#ifndef _CONFIG_H_#define _CONFIG_H_#include <Atmel/At89x52.h>                 / 使用AT89C52做控制#include “./Common/Common

6、.h”                / 使用自定義的數(shù)據(jù)類型#define TIMER_RELOAD            922        / 11.0592MHz晶振,1ms中斷周期#define&#

7、160;TIMER_KBSCANDELAY    40        / 40ms重檢測按鍵狀態(tài),即40ms消抖#define SCOMM_AsyncInterface                / 使用異步通訊服務(wù)#define IsPackageHeader(x)

8、0;       (x) = 0xff)    / 判斷包頭是不是0xff#define IsPackageTailer(x, y, z)    (y) <= (z)    / 判斷包的長度是不是足夠#endif / _CONFIG_H_/ file: Example.c/

9、#include <Atmail/At89x52.h>#include “./Common/Common.h”#include “./Common/Timer.h”#include “./Common/Scomm.h”#include “./Common/KBScan.h”BIT gbitLampState = 1;                

10、;        / 燈的狀態(tài),缺省為offstatic void Initialize()    InitTimerModule();                        / 初始化時鐘模

11、塊    InitSCommModule(0xfd, TRUE);            / 初始化通訊模塊,11.0592MHz晶振,                       

12、0;                / 波特率為19200    EA = 1;                        &

13、#160;       / 開中斷void main()    Initialize();                            / 初始化  

14、  while(TRUE)                            / 主循環(huán)            ImpTimerService(); 

15、60;                  / 實(shí)現(xiàn)時鐘中斷服務(wù),如鍵盤掃描        AsyncRecePackage(4);                /

16、60;接收4個字節(jié)長的數(shù)據(jù)包/ 在中斷外部響應(yīng)時鐘中斷事件void OnTimerEvent()                            / do nothing/ 控制外部燈static void TriggerLamp(BIT

17、60;bEnable)        P10 = bEnable;                        / 需要反相控制/ 鍵掃描回調(diào)函數(shù)BYTE KBScan()    

18、0;   BIT b;    P11 = 1;                                / 讀之前拉高引腳電平   &

19、#160;b = P11;                                / 讀入引腳狀態(tài)    return b;     

20、0;                          / 數(shù)據(jù)反相做掃描碼/ 計算校驗(yàn)和static BYTE CalcCheckSum(BYTE* pbyBuf, BYTE byLen)    BYTE by,

21、60;bySum = 0;    for(by = 0; by < byLen; by+)        bySum += pbyBufby;    return 0  bySum;/ 接收到鍵盤消息回調(diào)函數(shù)void onKeyPressed(BYTE byValue,&#

22、160;BYTE byState)    BYTE by4;    if(byState = 0)            switch(byValue)                case

23、0;0x01:            gbitLampState = g    bitLampState;    / 燈狀態(tài)取反            TriggerLamp(gbitLampState);   

24、0;/ 執(zhí)行控制            by0 = 0xff;                    / 構(gòu)造數(shù)據(jù)包          &#

25、160; by1 = 0x12;            by2 = (BYTE)gbitLampState;            by3 = CalcCheckSum(by, 3);    / 求校驗(yàn)和  &

26、#160;         SendPackage(by, 4);            / 發(fā)送數(shù)據(jù)包            break;        / 

27、處理其它掃描碼        default:            break;    / 接收到數(shù)據(jù)包回調(diào)函數(shù)void OnRecePackage(BYTE* pbyBuf, BYTE byBufLen)    BYTE by4;  &

28、#160; by0 = 0xff;    by1 = 0x11;    if(byBufLen != 4 | pbyBuf3 != CalcCheckSum(pbyBuf, 3)            by2 = 0;   

29、60;    by3 = CalcCheckSum(by, 3);        SendPackage(by, 4);                 / 處理長度或校驗(yàn)和不正確        switch(pbyBuf1)        case 0x10:        gbitLampState = (BIT)pbyBuf2;        TriggerLamp(gbitLampState);        

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論