接口扩展与应用_第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

提交评论