機電之家資源網
單片機首頁|單片機基礎|單片機應用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
單片機C51編程幾個有用的模塊
單片機C51編程幾個有用的模塊
 更新時間:2008-8-19 13:46:23  點擊數:66
【字體: 字體顏色
應用舉例

現在來舉例說明上述幾個模塊的使用方法。

硬件環(huán)境描述:

    為了控制一盞燈,需要單片機提供一個做控制功能的開關量,這里不描述外部接口電路,只說明當單片機的P10腳為高電平時,燈滅,當P10腳為低電平時,燈亮。

    可以通過計算機由串口發(fā)送命令來控制,或通過一個按鍵(push button不是自鎖式的按鍵)來手動控制(按鍵接在P11腳上,當鍵沒有按下時,P11電平為高,鍵按下時,引腳電平被接低),當使用按鍵手動控制的時候,需要給計算機發(fā)送通知。

    設定串口通訊指令如下:

    數據包由0xff做包頭,4個字節(jié)長,第二個字節(jié)為命令代碼,第三個字節(jié)為數據,最后一個字節(jié)為校驗位。

    命令和數據代碼有如下組合:

(計算機發(fā)給單片機)
0x10 0x01: 計算機控制燈亮。(數據位是非零值即可)
0x10 0x00: 計算機控制燈滅。
(單片機發(fā)給計算機)
0x11 0x01:單片機正常執(zhí)行控制指令,返回。(數據位是非零值即可)
0x11 0x00: 單片機不能夠正常執(zhí)行控制指令,或控制指令錯(不明含義的數據包或校驗錯等)。
0x12 0x01:手動控制燈亮。(數據位是非零值即可)
0x12 0x00: 手動控制燈滅。

建立工程:

    在硬盤上建立文件夾Projects,在Projects下建立Common文件夾及Example文件夾。將各模塊的頭文件及實現文件拷貝到Common文件夾下(推薦使用這樣的文件組織結構,其它工程也可以建立在Projects下,各工程共享Common文件夾中的代碼)。

    啟動KeilC的IDE,在Example下建立新工程,將各模塊的實現文件包含進工程。

    在Example文件夾下建立Output文件夾,更改工程設置,將Output作為輸出文件和List文件的輸出文件夾(推薦使用這樣的結構,當保存工程文件時,可以簡單的刪除Output文件夾中的內容而不會誤刪有用的工程文件)。

    建立工程配置頭文件Config.h及工程主文件Example.c,并將Exmaple.c文件加入工程。

輸入代碼:
代碼的具體編寫過程略。下面是最后的Config.h文件及Example.c文件。
//
// file: Config.h
//
#ifndef _CONFIG_H_
#define _CONFIG_H_
#include <Atmel/At89x52.h> // 使用AT89C52做控制
#include “../Common/Common.h” // 使用自定義的數據類型
#define TIMER_RELOAD 922 // 11.0592MHz晶振,1ms中斷周期
#define TIMER_KBSCANDELAY 40 // 40ms重檢測按鍵狀態(tài),即40ms消抖
#define SCOMM_AsyncInterface // 使用異步通訊服務
#define IsPackageHeader(x) ((x) == 0xff) // 判斷包頭是不是0xff
#define IsPackageTailer(x, y, z) ((y) <= (z)) // 判斷包的長度是不是足夠
#endif // _CONFIG_H_

//
// file: Example.c
//
#include <Atmail/At89x52.h>
#include “../Common/Common.h”
#include “../Common/Timer.h”
#include “../Common/Scomm.h”
#include “../Common/KBScan.h”

BIT gbitLampState = 1; // 燈的狀態(tài),缺省為off

static void Initialize()
{
InitTimerModule(); // 初始化時鐘模塊
InitSCommModule(0xfd, TRUE); // 初始化通訊模塊,11.0592MHz晶振,
// 波特率為19200
EA = 1; // 開中斷
}

void main()
{
Initialize(); // 初始化
while(TRUE) // 主循環(huán)
{
ImpTimerService(); // 實現時鐘中斷服務,如鍵盤掃描
AsyncRecePackage(4); // 接收4個字節(jié)長的數據包
}
}

// 在中斷外部響應時鐘中斷事件
void OnTimerEvent()
{
// do nothing
}

// 控制外部燈
static void TriggerLamp(BIT bEnable)
{
P10 = ~bEnable; // 需要反相控制
}

// 鍵掃描回調函數
BYTE KBScan()
{
BIT b;
P11 = 1; // 讀之前拉高引腳電平
b = P11; // 讀入引腳狀態(tài)
return ~b; // 數據反相做掃描碼
}

// 計算校驗和
static BYTE CalcCheckSum(BYTE* pbyBuf, BYTE byLen)
{
BYTE by, bySum =
[1] [2]  下一頁
  • 上一篇: 如何成為單片機開發(fā)高手
  • 下一篇: 單片機編程技巧-功能強大的時鐘中斷
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網友評論:(只顯示最新5條。)
    關于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務100強網站

    網站經營許可證:浙B2-20080178-1