ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:357.74KB ,
资源ID:12260892      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12260892.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验一LED显示控制82C55A并行接口数码管显示控制实验.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验一LED显示控制82C55A并行接口数码管显示控制实验.docx

1、实验一LED显示控制82C55A并行接口数码管显示控制实验实验1 LED显示控制、82C55A并行接口数码管显示控制一、实验目的和内容1掌握三态门,锁存器构成简单IO端口的原理及应用2完成流水灯及其控制的编程实验3进一步掌握8255的使用原理4掌握动态LED数码显示的原理5完成动态LED数码显示的编程实验(LED显示控制部分)二、实验电路及说明实验电路图1,2,3所示,74ALS273锁存器的输出控制LED发光管的亮暗(1:亮0:暗)74ALS273的CLK被一些地址线所控制,它的地址为60H(16进制) ADD7, ADD6, ADD5, ADD4, ADD3, ADD2, ADD1, AD

2、D0 0 1 1 0 0 0 0 0只有这时7430与非门才输出低电平(八段LED是阴极型)在DOS下,它的真实地址为PCI接口板的IO地址加上60H为真实地址。如PCI的IO起始地址0为E000H , IO起始地址1为E400H。 74ALS273的地址为E460H。注意:PCI板卡分配了2块IO空间,IO空间0是分配给PCI板卡内部寄存器使用的,即9052专用,空间大小128BYTE。IO空间1是分配给PCI板卡用户电路使用的,其大小为256BYTE。流水灯原理如下:K1、K2是八位拔动开关(位于区域F)的左边第1、2位。K1K2H 发光管从上到下移位K1L,K2H 发光管从下到上移位KI

3、H,K2L 发光管全部闪烁K1K2L退出注:ON方向为L,OFF方向为HK1、K2为主板上J41数码拔动开关的1、2位。 图1 图2 图3三、程序方框图 四 、程序代码录入程序时,请特别注意”1”与英文字母”l”的区别,文件的扩展名为C,即文件名一定是?-?.C。在每个源程序的开头必须加上如下的注解,并按各人实际填写。/*源程序的文件名:实验序号(01-08)-实验组号(01-24).C实验名称:_实验组号:_学生姓名及学号:_ _*/#include #include #include “PCIcard.h”int d1=0,m_bit=0x1;void main() int err,rio

4、,flagm; int m_k0(); void m_k1(); void m_k2(); void m_k3(); err=findPCIcard(); if (err!=0) printf(The PCI card isnt found!n); flagm=0; err=getPCIbase0(); iobase0=iobase0&0xfffc; /从PCI配置空间读入的与地址空间有关的数据其bit 0位为1, printf(IOBase0=%xHn,iobase0); /表明此空间为IO空间参与PCI总线地址译码 err=getPCIbase1(); iobase1=iobase1&0x

5、fffc; printf(IOBase1=%xHn,iobase1); err=getPCImembase1(); err=getPCImembase0(); membase0=membase0+membase1 (7) ; if (temp=0x1) m_bit=m_bit|0x80; outportb(ioadd1,m_bit); delay1(); return; void delay1() /延时 int i,j,a=0; for (i=1;i=5000;i+) for (j=1;j=10000;j+) a=a+0; return; 将PCIcard.h 与上述的C源程序存放在同一目录

6、下, PCIcard.h的内容如下:#include #include #include unsigned long int iobase0,iobase1,membase0,membase1;unsigned long int interrupt_line,ioadd1=0x60;unsigned char bh;unsigned char bl;int findPCIcard(void); /找寻PCI卡的总线号及设备号及功能号int getPCIbase0(void); /获得PCI卡的IO0的地址int getPCIbase1(void);int getPCImembase0(void

7、);int getPCImembase1(void);int getPCIIRQ(void);struct dx int dl; int dh; mydx;int findPCIcard(void) /找寻PCI卡的总线号及设备号及功能号 union REGS regs; regs.h.ah=0xb1; regs.h.al=0x02; /寻找指定厂商和设备号的PCI卡的位置 regs.x.cx=0x8376; regs.x.dx=0x10eb; /输入要寻找的厂商号和设备号 regs.x.si=0x00; /输入要寻找的PCI卡索引号 int86(0x1a,®s,®s); /调用指

8、定的X86中断 bl=regs.h.bl; /返回的设备号高5位,低3位为功能号 bh=regs.h.bh; /返回的总线号 return(regs.h.ah); /返回状态int getPCIbase0(void) /获得PCI卡的IO0的地址 union REGS regs; /定义用C语言调用BIOS中断所用的寄存器组合 regs.h.ah=0xb1; /调用PCI BIOS中断 regs.h.al=0x09; /配置空间用字的方式读入 regs.x.di=0x14; /PCI配置空间中基地址0的地址 regs.h.bl=bl; /要读入配置空间的PCI卡的设备号和功能号 regs.h.

9、bh=bh; /要读入配置空间的PCI卡的总线号 int86(0x1a,®s,®s); /调用指定的X86中断 iobase0=regs.x.cx; /CX为返回的IO0的基地址 return(regs.h.ah); /返回状态int getPCIbase1(void) union REGS regs; /同上 regs.h.ah=0xb1; regs.h.al=0x09; regs.x.di=0x1c; /PCI配置空间基地址1的地址 regs.h.bl=bl; regs.h.bh=bh; int86(0x1a,®s,®s); iobase1=regs.x.cx; r

10、eturn(regs.h.ah);int getPCImembase0(void) union REGS regs; /同上 regs.h.ah=0xb1; regs.h.al=0x09; regs.x.di=0x18; /PCI配置空间存储器基地址0的低位地址 regs.h.bl=bl; regs.h.bh=bh; int86(0x1a,®s,®s); membase0=regs.x.cx; return(regs.h.ah);int getPCImembase1(void) union REGS regs; /同上 regs.h.ah=0xb1; regs.h.al=0x09;

11、 regs.x.di=0x1a; /PCI配置空间存储器基地址0的高位地址 regs.h.bl=bl; regs.h.bh=bh; int86(0x1a,®s,®s); membase1=regs.x.cx; return(regs.h.ah);int getPCIIRQ(void) union REGS regs; /同上 regs.h.ah=0xb1; regs.h.al=0x09; regs.x.di=0x3c; /PCI配置空间中断线的地址 regs.h.bl=bl; regs.h.bh=bh; int86(0x1a,®s,®s); interrupt_line

12、=regs.x.cx; return(regs.h.cl);五、思考题:1、在图1中,从数据端口送出”1”使LED亮,还是使LED灭? 2、将K1L、K2L这一点亮退出功能修改为:自上而下一个一个点亮,然后自下而上一个一个熄灭,循环不断。3、根据框图和原理填写源程序中的空白处,并写出注解。(82C55A并行接口数码管实验部分)二、实验电路及说明实验电路如图6所示。动态LED数码显示的原理如下:8255的A口工作简单输出方式(1:亮,0:暗)输出数据(段码)控制所有数码管的不同段。PB03设置为输出,控制4个LED数码管公共端的电流通路(0:通,1:断),轮流使其中一个数码管亮,从而构成动态LE

13、D数码显示器。 编程要求:设立一计数单元,该单元做09999的十进制加计数。编制动态LED数码显示的子程序和计数单元计数并显示的主程序。显示0F数字并循环。 图6图7三、硬件实验步骤本实验在板上由G与B部分组成,有短路块与跳线两种方式。短路块为缺省方式。下面介绍跳线方式。1、把J16的短路块去掉2、通过跳线把G区的PA0与数码管部分的B区A相连;3、PA1与B相连4、PA2与C相连5、PA3与D相连6、PA4与E相连7、PA5与F相连8、PA6与G相连9、PA7与DP相连10、把B区的J36、J38、J35、J39的短路块去掉11、J37的第1脚与PB0相连12、J37的第2脚与PB2相连13

14、、J37的第3脚与PB1相连14、J37的第4脚与PB3相连四、程序框图 BCD码头与7段码关系0 0c0H, 1 0f9H 2 0a4H 3 0b0H 4 99H5 92H 6 82H 7 0f8H 8 80H 9 98HA 88H B 83H C 0c6H D 0a1H E 86HF 8eH五.程序代码(八段数码显示)#include #include #include “PCIcard.h”unsigned long int ic8255a=0x0,ic8255b=0x1,ic8255type=0x3;int buffer110=0x0c0,0x0f9,0x0a4,0x0b0,0x99,

15、0x92,0x82,0x0f8,0x80,0x98;int dis14=0,0,0,0;void main() int err,count1,flagm=1,flag1=1; void plus1(); void mydisp1(); int mypckey(); err=findPCIcard(); if (err!=0) printf(The PCI card isnt found!n); flagm=0; err=getPCIbase0(); iobase0=iobase0&0xfffc; /从PCI配置空间读入的与地址空间有关的数据其bit 0位为1, printf(IOBase0=%

16、xHn,iobase0); /表明此空间为IO空间参与PCI总线地址译码 err=getPCIbase1(); iobase1=iobase1&0xfffc; printf(IOBase1=%xHn,iobase1); err=getPCImembase1(); err=getPCImembase0(); membase0=membase0+membase116; /左移16位,将高位地址变换成双字中的高位字 printf(MEMBase0=%lxHn,membase0); err=getPCIIRQ(); printf(PCI IRQ = %dn,err); ic8255a=ic8255a+

17、iobase1; /获取8255 A、B口和控制寄存器的地址 ic8255b=ic8255b+iobase1; ic8255type=ic8255type+iobase1; printf(Press e to exit:n); /显示提示字符 outportb( (1) ); /初始化8255 outportb(ic8255a,(2) ); /灭所有的段 outportb(ic8255b,(3) ); /灭所有的位 do /主循环 count1=0xff; /设置计数值 plus1(); /将显示数据加1 flag1=1; /将小循环标志置位 do /小循环 mydisp1(); /调显示子程

18、序 count1=count1-1; /计数值减1 if (count1=0) /判断是否退出小循环 flag1=0; while (flag1=1); flagm=mypckey(); /扫描键盘 while (flagm=1);/ return; int mypckey() /扫描键盘子程序 int pckey1(); int flagk,judge; judge=pckey1(); if (judge=e) flagk=0; else flagk=1; return (flagk); int pckey1() /调用int 21H中断 union REGS regs; regs.h.ah

19、=0x6; regs.h.dl=0x0ff; int86(0x21,®s,®s); return(regs.h.al); void plus1() /加1子程序 int i; dis10=dis10+1; for (i=0;i=10) dis1i=dis1i-10; dis1i+1=dis1i+1+1; else break; if (dis13=10) dis13=0; return; void mydisp1() /显示子程序 void delay1(); int i,a1,a2=0x0fe; for (i=0;i=3;i+) outportb(ic8255a,0x0ff);

20、a1=buffer1dis1i; outportb(ic8255a,a1); outportb(ic8255b,a2); a2=a21; a2=a2| ( 4) ; /作用是:(5) delay1(); return; void delay1() /延时子程序 int i,j,a=0; for (i=1;i=50;i+) for (j=1;j=1000;j+) a=a+0; return; 思考题:1本实验采用的LED数码管是共阳的还是共阴的?7407的作用是什么?28255的端口是如何初始化的? 如何实现动态显示的?用示波器观察PB口的波形,分别画出PB0,PB1,PB2,PB3的波形。3Delay1()的延时时间应在什么范围内,可以使LED没有闪烁感?4仔细观察LED为什么不该亮的段有隐隐的闪亮?仔细分析mydiap1()中输出数据的先后关系,如何改进可以消除上述现象?5分析main(),CPU 的时间主要花在哪个函数上?常用什么方法可以减少对CPU的占用时间?

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1