接口擴展與應用_第1頁
接口擴展與應用_第2頁
接口擴展與應用_第3頁
接口擴展與應用_第4頁
接口擴展與應用_第5頁
已閱讀5頁,還剩19頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

主要內容: 簡單I/O接口的擴展; 通用接口的使用;

LED顯示接口的應用;

鍵盤輸入接口的應用。第9章接口擴展與應用1AA’BCDB’C’D’DCBA00010011001001100100110010001001順逆應用舉例【例7.1】試編制一個4相8拍步進電機驅動程序。

步進電機

4相8拍節拍表2步進電機接口電路P1.3P1.2P1.1P1.0P1.4P1.5P3.2(INT0)+5V方向DIRA方式MOD點動BCD步進電機3#include<Reg51.h>#define

uchar

unsignedchar/*單步定時常數0,定時時間50ms(fosc=6MHz)*/constintTC0=-25000;/*連續定時常數1,定時時間10ms(fosc=6MHz)*/constintTC1=-5000;sbitDIR=P1^4;/*定義P1.4腳名*/sbitMOD=P1^5;/*定義P1.5腳名*/要求:1.P1.4狀態確定旋轉方向:0=逆時針、1=順時針2.P1.5狀態確定運轉形式:0=手動、1=連續3.P3.2輸入單步運行信號:0=停止、1=運轉利用定時器0作為連續運行的節拍發生器,利用P1.3~P1.0作為步進電機節拍輸出控制口。4/*步進電機節拍表*/const

ucharrht[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};uchar

rhi=0;/*節拍索引*/time0()interrupt1/*T0中斷服務*/{if(MOD){TH0=TC1>>8;/*重裝定時器0連續時常*/TL0=TC1&0xff;}

else{TH0=TC0>>8;/*重裝定時器0單步時常*/TL0=TC0&0xff;}P1=~rht[rhi];/*輸出節拍*/

if(DIR)/*根據方向選擇調整下一節拍索引*/

if(rhi=

=0)rhi=7;else

rhi-

-;

else

if(rhi=

=7)rhi=0;else

rhi+

+;}【例7.1】(續)5main(){TH0=TC1>>8;/*裝入定時器0連續運行時常*/TL0=TC1&0xff;P1=0xff;EA=1;ET0=1;TR0=1;

while(1){if(MOD) /*T0工作在定時方式、模式1*/TMOD=0x01; /*置T0內啟動*/

elseTMOD=0x09; /*置T0外啟動*/}}【例7.1】(續)6通用接口芯片Intel8155簡介主要構成:

2個8位并行口,1個6位并行口;

1個14位計數器,1個256字節RAMTINRAM256BytePAPCPBPA7~PA0ALERSTAD7~0IO/MI/O控制TOUT14位初值寄存器PC5~PC3PB7~PB0PC2~PC0地址鎖存CERDWR14位減1計數器計數控制并口控制78155RAM/端口地址分配IO/MA7A6A5A4A3A2A1A0訪問電路方向0××××××××RAM寫/讀1×××××000命令/狀態口寫/讀1×××××001

8位并行口PA寫/讀1×××××010

8位并行口PB寫/讀1×××××011

6位并行口PC寫/讀1×××××100計數器低8位值寫1×××××101計數器高6位值寫88155命令與狀態字76543210TC1TC0IEBIEAPC1PC0BDADPA、PB口方向0-輸入1-輸出并口工作方式PA、PB口中斷允許0-禁止請求1-允許請求計數器控制PC1PC0說明00

PA、PB為基本輸入/輸出口,PC為基本輸入口01

PA、PB為基本輸入/輸出口,PC為基本輸出口10

PA為選通輸入/輸出口,PC口的0~2為其狀態/控制線;

PB為基本輸入/輸出口,PC口的3~5為基本輸出口11

PA為選通輸入/輸出口,PC口的0~2為其狀態/控制線;

PB為選通輸入/輸出口,PC口的3~5為其狀態/控制線。命令字:98155命令與狀態字(續)76543210-RZIEBFIRIEBFIRTC1TC0說明00空操作01停止計數10計數器歸0后,停止計數。11計數初值裝入后,若計數器沒工作則將其啟動中斷請求PA口計數器歸0緩沖器滿中斷允許PB口計數器控制狀態字108155計數器初值與工作方式76543210C7C6C5C4C3C2C1C0低8位計數初值IC高6位計數初值IC計數器工作方式M1M0說明00單次計數,方波輸出。(計數值>IC/2,TOUT=1;否則TOUT=0,計數結束TOUT=1。)01連續計數,方波輸出。(計數值>IC/2,TOUT=1;否則TOUT=0。)10單次計數,脈沖輸出。(計數值≠1時,TOUT=1;計數值=1時,TOUT=0。)11連續計數,脈沖輸出。(計數值≠1時,TOUT=1;計數值=1時,TOUT=0。)76543210M1M0C14C12C11C10C9C811

4位LED數碼管顯示掃描驅動程序(1/100秒計時器),其中:1.8155的PA為字型口(PA0~PA6對應字段a~g,低電平亮)2.8155的PB為位置口(PB4~PB7對應#0~#3位,高電平有效)3.利用T0作為5ms掃描定時器,兼做1/100秒計時器【例7.2】PA0PB7PB6PB5PB4ALE來自MCS-51ALE數據總線DBRD地址總線ABWRRD8155AD7~0CEPA1PA6abg地址譯碼WRCC3CC2CC1CC012#include<Reg51.h>#define

uchar

unsignedchar#define

uint

unsignedint#defineCMD(uchar

xdata*)0xffe8/*8155的命令口地址*/#definePA(uchar

xdata*)0xffe9/*8155的PA口地址*/#definePB(uchar

xdata*)0xffea/*8155的PB口地址*/#definePC(uchar

xdata*)0xffeb/*8155的PC口地址*/#defineTC0(-2500)/*T05ms時間常數*/#defineST10(2)/*10ms軟定時時間常數*/#defineSTFH(5)/*刷新25ms定時時常*/【例7.2】程序13uchardisp[4];/*顯示緩沖區*/uchart10ms;/*10ms軟定時器*/uchar

tfresh;/*刷新軟定時器*/uint

csec;/*1/100s計時器*/void

fresh(uint,uchar*);/*顯示掃描和定時中斷服務,每5ms一次*/time0()interrupt1{/*顯示掃描位置表*/

static

ucharpot[4]={0x1f,0x2f,0x4f,0x8f};

static

uchar

di=0;/*顯掃索引*/TH0=TC0>>8;/*重裝定時器0時常*/TL0=TC0&0xff;*PA=disp[di];/*當前字型送PA口*/*PB=pot[di];/*當前位置送PB口*/【例7.2】(續)14

/*顯示掃描和定時中斷服務(續)*/if(++di==4)di=0;

if(!(--t10ms))/*10ms定時*/{t10ms=ST10;

csec++;/*1/100s計數*/}

if(!(--tfresh))/*刷新定時*/{

tfresh=STFH;fresh(csec,disp);/*刷新顯示當前的1/100秒*/}}【例7.2】(續)15main(){TMOD=0x01;/*定時器0工作在定時方式、模式1、內啟動*/TH0=TC0>>8;/*裝入定時器0時常*/TL0=TC0&0xff;*CMD=0x43;/*8155初始化,PA、PB基本輸出,PC基本輸入*/*PA=0xff;/*關顯示*/*PB=0x0f;t10ms=ST10;

tfresh=STFH;

csec=0;fresh(csec,disp);/*刷新當前1/100秒顯示*/IE=0x82;/*開中斷,允許定時器0請求中斷*/TR0=1;/*啟動定時器0*/

while(1);/*等待定時器中斷請求*/}【例7.2】(續)16/*顯示刷新函數*/voidfresh(uint

x,uchar*y){/*0~9字型表*/

static

ucharfont[10]={0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0x0F8,0x80,0x90};

ucharq,r;r=x%100;/*將x轉換成BCD十進制數字字型送到y[]中*/q=x/100;y[0]=font[r%10];y[1]=font[r/10];y[2]=font[q%10];y[3]=font[(q/10)%10];}【例7.2】(續)17

設計一個4位LED數碼管顯示和3×3鍵盤掃描驅動程序。顯示:字符“In”和鍵入值“k”

其中:1.8155PA為字型口(PA0~PA6對應字段a~g,低電平亮)2.8155PB為位置口

PB0~PB2對應#0~#2KSCN位,低電平有效;

PB4~PB7對應#0~#3LED位,高電平有效。3.8155PC為鍵入口

PC0~PC2對應#0~#2KIN位,低電平有按鍵。利用T0作為5ms鍵盤/顯示掃描定時器。【例7.3】18數碼顯示與鍵盤接口電路PA0PB7PB6PB5PB4ALE來自MCS-51ALE數據總線DBRD地址總線ABWRRD8155AD7~0CEPA1PA6abg地址譯碼WRCC3CC2CC1CC0PB2PB1PB0PC2PC1PC0+5V03614725M0行1行2行2列1列0列19#include<Reg51.h>#define

uchar

unsignedchar#define

uint

unsignedint#defineCMD(uchar

xdata*)0xffe8/*8155的命令口地址*/#definePA(uchar

xdata*)0xffe9/*8155的PA口地址*/#definePB(uchar

xdata*)0xffea/*8155的PB口地址*/#definePC(uchar

xdata*)0xffeb/*8155的PC口地址*/#defineTC0(-2500)/*T05ms時間常數*/uchardisp[4];/*顯示緩沖區*/ucharkey; /*鍵掃描值輸出*/【例7.3】程序20/*鍵盤、顯示掃描和定時中斷服務,一次/5ms*/time0()interrupt1{/*掃描位置表*/

static

ucharpot[4]={0x1e,0x2d,0x4b,0x8f};/*鍵行值轉換表*/

static

ucharkct[8]={0x3,0x0,0x1,0x3,0x2,0x3,0x3,0x3};

static

uchar

si=0,kst=0;/*掃描索引,鍵盤狀態*/static

ucharkit,sit;/*鍵入值、掃描索引暫存*/

uchar

kc;/*鍵入值暫存*/TH0=TC0>>8;/*重裝定時器0時常*/TL0=TC0;*PA=disp[si];/*當前字型送PA口*/*PB=pot[si];/*當前位置送PB口*/

kc=~(*PC)&0x07;/*從PC口輸入鍵值*/【例7.3】(續)21if(!kst&&kc){kit=kc;sit=si;kst=1;}

else

if(si==sit){switch(kst){case1:

if(kc==kit)key=kct[kc]*3+si+1;

kst=2;

break;

case2:

if(!kc)kst=3;

break;

case3:

溫馨提示

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

評論

0/150

提交評論