日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
單片機(jī)C51編程幾個(gè)有用的模塊(2)
單片機(jī)C51編程幾個(gè)有用的模塊(2)
 更新時(shí)間:2008-8-17 16:47:20  點(diǎn)擊數(shù):6
【字體: 字體顏色
應(yīng)用舉例
現(xiàn)在來舉例說明上述幾個(gè)模塊的使用方法。
硬件環(huán)境描述:
為了控制一盞燈,需要單片機(jī)提供一個(gè)做控制功能的開關(guān)量,這里不描述外部接口電路,只說明當(dāng)單片機(jī)的P10腳為高電平時(shí),燈滅,當(dāng)P10腳為低電平時(shí),燈亮。
可以通過計(jì)算機(jī)由串口發(fā)送命令來控制,或通過一個(gè)按鍵(push&nbspbutton不是自鎖式的按鍵)來手動(dòng)控制(按鍵接在P11腳上,當(dāng)鍵沒有按下時(shí),P11電平為高,鍵按下時(shí),引腳電平被接低),當(dāng)使用按鍵手動(dòng)控制的時(shí)候,需要給計(jì)算機(jī)發(fā)送通知。
設(shè)定串口通訊指令如下:
數(shù)據(jù)包由0xff做包頭,4個(gè)字節(jié)長,第二個(gè)字節(jié)為命令代碼,第三個(gè)字節(jié)為數(shù)據(jù),最后一個(gè)字節(jié)為校驗(yàn)位。
命令和數(shù)據(jù)代碼有如下組合:
(計(jì)算機(jī)發(fā)給單片機(jī))
0x10&nbsp0x01: 計(jì)算機(jī)控制燈亮。(數(shù)據(jù)位是非零值即可)
0x10&nbsp0x00: 計(jì)算機(jī)控制燈滅。
(單片機(jī)發(fā)給計(jì)算機(jī))
0x11&nbsp0x01:單片機(jī)正常執(zhí)行控制指令,返回。(數(shù)據(jù)位是非零值即可)
0x11&nbsp0x00: 單片機(jī)不能夠正常執(zhí)行控制指令,或控制指令錯(cuò)(不明含義的數(shù)據(jù)包或校驗(yàn)錯(cuò)等)。
0x12&nbsp0x01:手動(dòng)控制燈亮。(數(shù)據(jù)位是非零值即可)
0x12&nbsp0x00: 手動(dòng)控制燈滅。

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

輸入代碼:
代碼的具體編寫過程略。下面是最后的Config.h文件及Example.c文件。
//
//&nbspfile:&nbspConfig.h
//
#ifndef&nbsp_CONFIG_H_
#define&nbsp_CONFIG_H_
#include <Atmel/At89x52.h> // 使用AT89C52做控制
#include “../Common/Common.h” // 使用自定義的數(shù)據(jù)類型
#define&nbspTIMER_RELOAD&nbsp922 //&nbsp11.0592MHz晶振,1ms中斷周期
#define&nbspTIMER_KBSCANDELAY&nbsp40 //&nbsp40ms重檢測按鍵狀態(tài),即40ms消抖
#define&nbspSCOMM_AsyncInterface // 使用異步通訊服務(wù)
#define&nbspIsPackageHeader(x) ((x) ==&nbsp0xff) // 判斷包頭是不是0xff
#define&nbspIsPackageTailer(x,&nbspy,&nbspz) ((y) <= (z)) // 判斷包的長度是不是足夠
#endif //&nbsp_CONFIG_H_

//
//&nbspfile:&nbspExample.c
//
#include <Atmail/At89x52.h>
#include “../Common/Common.h”
#include “../Common/Timer.h”
#include “../Common/Scomm.h”
#include “../Common/KBScan.h”

BIT&nbspgbitLampState =&nbsp1; // 燈的狀態(tài),缺省為off

static&nbspvoid&nbspInitialize()
{
InitTimerModule(); // 初始化時(shí)鐘模塊
InitSCommModule(0xfd,&nbspTRUE); // 初始化通訊模塊,11.0592MHz晶振,
// 波特率為19200
EA =&nbsp1; // 開中斷
}

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

// 在中斷外部響應(yīng)時(shí)鐘中斷事件
void&nbspOnTimerEvent() 
{
//&nbspdo&nbspnothing
}

// 控制外部燈
static&nbspvoid&nbspTriggerLamp(BIT&nbspbEnable) 
{
P10 = ~bEnable; // 需要反相控制
}

// 鍵掃描回調(diào)函數(shù)
BYTE&nbspKBScan() 
{
BIT&nbspb;
P11 =&nbsp1; // 讀之前拉高引腳電平
b =&nbspP11; // 讀入引腳狀態(tài)
return ~b; // 數(shù)據(jù)反相做掃描碼
}

// 計(jì)算校驗(yàn)和
static&nbspBYTE&nbspCalcCheckSum(BYTE*&nbsppbyBuf,&nbspBYTE&nbspbyLen)
{
BYTE&nbspby,&nbspbySum =&nbsp0;
for(by =&nbsp0;&nbspby <&nbspbyLen;&nbspby++)
bySum +=&nbsppbyBuf[by];
return&nbsp0 –&nbspbySum;
}

// 接收到鍵盤消息回調(diào)函數(shù)
void&nbsponKeyPressed(BYTE&nbspbyvalue,&nbspBYTE&nbspbyState)
{
BYTE&nbspby[4];
if(byState ==&nbsp0)
{
switch(byvalue)
{
case&nbsp0x01:
gbitLampState = ~g&nbspbitLampState; // 燈狀態(tài)取反
TriggerLamp(gbitLampState); // 執(zhí)行控制
by[0] =&nbsp0xff; // 構(gòu)造數(shù)據(jù)包
by[1] =&nbsp0x12;
by[2] = (BYTE)gbitLampState;
by[3] =&nbspCalcCheckSum(by,&nbsp3); // 求校驗(yàn)和
SendPackage(by,&nbsp4); // 發(fā)送數(shù)據(jù)包
break;
// 處理其它掃描碼
default:
break;
}
}

// 接收到數(shù)據(jù)包回調(diào)函數(shù)
void&nbspOnRecePackage(BYTE*&nbsppbyBuf,&nbspBYTE&nbspbyBufLen)
{
BYTE&nbspby[4];
by[0] =&nbsp0xff;
by[1] =&nbsp0x11;
if(byBufLen !=&nbsp4  &nbsppbyBuf[3] !=&nbspCalcCheckSum(pbyBuf,&nbsp3))
{
by[2] =&nbsp0;
by[3] =&nbspCalcCheckSum(by,&nbsp3);
SendPackage(by,&nbsp4); // 處理長度或校驗(yàn)和不正確
}

switch(pbyBuf[1])
{
case&nbsp0x10:
gbitLampState = (BIT)pbyBuf[2];
TriggerLamp(gbitLampState);
by[2] =&nbsp1;
by[3] =&nbspCalcCheckSum(by,&nbsp3);
SendPackage(by,&nbsp4); // 發(fā)送成功執(zhí)行通知
break;

default: // 不知道的命令
by[2] =&nbsp0;
by[3] =&nbspCalcCheckSum(by,&nbsp3);
SendPackage(by,&nbsp4); // 發(fā)送沒有成功執(zhí)行通知
break;
}
[1] [2]  下一頁
  • 上一篇: 單片機(jī)C51編程幾個(gè)有用的模塊(1)
  • 下一篇: 單片機(jī)或者嵌入式系統(tǒng)的開發(fā)規(guī)范化問題
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

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

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1