




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、军械工程学院计算机硬件技术基础课程创新型实验设计报告题 目: 基于8086的电子万年历设计组长:吴明春组员:谢林峰,宋群奇,洪鑫强,加央旦增指导教员: 谢方方 起止时间: 2016年11月25日-2016年12月28日目 录第一章 实验简介21.1 目的意义21.2 功能2第二章 相关硬件知识介绍22.1 可编程并行接口芯片8255A22.2 可编程计数器82533第三章 系统设计43.1 总体设计43.2 硬件电路设计53.3 软件编程设计63.3.1 汇编程序流程图63.3.2 程序解析7第四章 系统实现174.1 proteus仿真实验17第五章 小结195.1 设计总结195.2 设计
2、存在的问题195.3 心得体会19第一章 实验简介1.1 目的意义学习和掌握计算机中常用接口电路的应用和设计技术,学会针对不同的要求设计汇编程序代码,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学知识的应用能力以及分析问题解决问题的能力得到全面提高。1.2 功能电子万年历是人们生活中不可或缺的一种生活用品,对人们的生活起到了极大的帮助,我们通过它来知道今夕是何年、何月、何日、何时。本课题要设计一个电子万年历,以8086芯片组成的最小系统为基础,来设计一个电子万年历。
3、该电子万年历实现了以下几个功能:(1) 自动定时,该功能为电子万年历的基本功能,这里不做赘述;(2) 自动计算星期,在程序中引用蔡勒公式实现了自动计算星期。(3) 整点报时,该电子万年历实现了整点报时功能,极大地丰富了我们的生活。第2章 相关硬件知识介绍2.1 可编程并行接口芯片8255A 可编程并行接口芯片8255A是一种可编程并行I/O接口芯片,通过对它进行编程,选择不同的工作方式,可将其应用于基本输入输出、键盘接口等。本实验中,我们用了2片8255A芯片,将8255A作为时钟输入接口和数码管的输出接口。8255A的整体结构图如图1所示。图1 8255A连接图1.与CPU连接部分8255A
4、能并行传送8位数据,其数据线为D0D7,对应连接8086CPU的低八位;8086CPU数据线低八位与8255A相连,所以8255A内部各个端口使用偶地址,即8255A的A0、A1分别接8086CPU的A1、A2。此外CPU要对8255A进行读、写与片选操作,所以控制线为片选、复位、读、写信号。2.与外设接口部分8255A有3个并行接口A、B、C与外设连接,每个并行接口又有8根线与外设连接,所以8255A可以用24根线与外设连接,各并行接口的引脚编号如下:A口:编号为PA0PA7,用于8255A向外设输出8位并行数据B口:编号为PB0PB7,用于8255A向外设输出8位并行数据。C口:编号为PC
5、0PC7,用于8255A从外设读取8位并行数据。2.2 可编程计数器82531.与CPU连接部分8253能并行传送8位数据,其数据线为D0D7,对应连接8086CPU的低八位;8086CPU数据线低八位与8253相连,所以8253内部各个端口使用偶地址,即8253的A0、A1分别接8086CPU的A1、A2。此外CPU要对8253进行写入控制字和初值与片选操作,所以控制线为片选、写信号。2. 与外设连接部分8253的数据线D0D7与CPU的低八位数据线相连,传送8253的相关控制字,用来设定8253各端口的工作状态和输入计数初值。在本项目中,我们使用了8253的A口和B口,其中,A口CLK0与
6、信号源链接,工作于方式三,OUT0输出所需频率,与8255(U10)芯片的C口相连,实现定时;B口CLK1同样与信号源相连,工作于方式一,用以产生整点报时的信号。8253的整体结构图如图2所示。图2 8253连接图第三章 系统设计3.1 总体设计系统总设计图见图3。数码管8255A 8 0 8 6 CPU 时间数据数据8253 CLK(定时)图3 总体设计图系统运行后,由8253产生时钟信号,输入8255A(U10)的C口,扫描C口的状态,当扫描到一个时钟信号的时候,控制秒加一,这样就实现了定时。3.2 硬件电路设计8086CPU与三片74LS373和两片74LS245组成最小系统,使8086
7、工作在最小系统模式,三片74LS373的输出作为8086的地址总线(A0-A19),两片74LS245的输出作为8086的数据总线(D0-D15)。以一片74LS138作为片选,74LS138的输入是A12-A15,输出为,分别作为两片8255A和8253的片选信号。第一片8255A(U10)的A口和B口和C口都工作在方式0(基本输入输出模式),其中A口和B口输出,C口输入(扫描时钟信号),A口作为年月日输出数码管的片选信号,B口输出年月日到八位数码管。第二片8255A(U8)的A口和B口和C口都工作在方式0(基本输入输出模式),其中A口不用,B口和C口输入,C口用来作为时分秒和星期输出数码管
8、的片选信号,B口用来输出时分秒和星期到数码管。8253的0口输出时钟信号连接到第一片8255A(U10)的C口,工作在方式3,用以定时。1口用以产生闹钟信号,工作在方式0,驱动蜂鸣器发声。八位数码管用以显示年月日,片选信号接入8255A(U10)的A口,显示信号接入8255A(U10)的B口。三个两位数码管和一个单位数码管用来显示时分秒和星期,片选信号都接入8255A(U8)的C口,显示信号接入8255A(U8)的B口。硬件电路连接图:3.3 软件编程设计开始3.3.1 汇编程序流程图初始化两片8255和8253 写入数据产生片选信号和时间信号送入数码管显示判断闰年、月大、月小,时间处理图3
9、汇编程序流3.3.2 程序解析/第一片8255#define IOCON 8006H#define IOA 8000H#define IOB 8002H#define IOC 8004H/第二片8255#define IOCON1 9006H#define IOA1 9000H#define IOB1 9002H#define IOC1 9004H/8253#define A_0 0xA000#define A_1 0xA002#define A_2 0xA004#define A_CON 0xA006int table10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82
10、,0xf8,0x80,0x90; /共阳极编码0.9int xqing=0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8;/星期1.7int shuma8=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;/变量声明int n1;/年份的千位int n2;/年份的百位int n3;/年份的十位int n4;/年份的个位int nianx;int y1;/月份的十位int y2;/月份的个位int yuex;int t1;/天的十位int t2;/天的个位int tianx;int s1;/小时的十位int s2;/小时的个位int f1;/分钟
11、的十位int f2;/分钟的个位int fenx;int m1;/秒的十位int m2;/秒的个位int miaox;int xq;/星期int btn;/io接口int count=0;void outp(unsigned int addr, char data)/ Output byte to port _asm mov dx, addr mov al, data out dx, al char inp(unsigned int addr)/ Input byte from port char result; _asm mov dx, addr in ax, dx mov result,
12、ax return result; void delay() /延迟函数 int t=0; for(t=0;t<100;t+) ; void nian(int x)/对年份进行处理 n1=x/1000; x=x-1000*n1; n2=x/100; x=x-100*n2; n3=x/10; n4=x-10*n3; void yue(int x)/对月进行处理 if(x>9) y2=x%10; x=x-y2; y1=x/10; else y2=x;y1=0; void tian(int x)/对日进行处理 t2=x%10; x=x-t2; t1=x/10; void shi(int
13、x)/对时进行处理 s2=x%10; x=x-s2; s1=x/10; void fen(int x)/对分进行处理 f2=x%10;x=x-f2;f1=x/10; void miao(int x)/对秒进行处理 m2=x%10; x=x-m2; m1=x/10; void xingqi(void)/对星期处理 if(y2=1&&y1=0) y1=1; y2=3; else if(y2=2&&y1=0) y1=1; y2=4; xq=(10*n1+n2)/4-2*(10*n1+n2)+(10*n3+n4)+(10*n3+n4)/4+13*(10*y1+y2+1)
14、/5+10*t1+t2+1)%7; void xienian()/写年到数码管 int i=0; outp(IOA,shumai); outp(IOB,tablen1); i+; delay(); outp(IOA,shumai); outp(IOB,tablen2); i+; delay(); outp(IOA,shumai); outp(IOB,tablen3); i+; delay(); outp(IOA,shumai); outp(IOB,tablen4); delay(); void xieyue()/写月到数码管 int i=4; outp(IOA,shumai); outp(IO
15、B,tabley1); i+; delay(); outp(IOA,shumai); outp(IOB,tabley2); i+; delay(); void xietian()/写天到数码管 int i=6; outp(IOA,shumai); outp(IOB,tablet1); i+; delay(); outp(IOA,shumai); outp(IOB,tablet2); i+; delay(); void xieshi()/写小时到数码管 int i=0; outp(IOC1,shumai); outp(IOB1,tables1); delay(); i+; outp(IOC1,s
16、humai); outp(IOB1,tables2); delay(); void xiefen()/写分钟到数码管 int i=3; outp(IOC1,shumai); i+; outp(IOB1,tablef1); delay(); outp(IOC1,shumai); outp(IOB1,tablef2); delay(); void xiemiao()/写秒到数码管 int i=6; int x=0; outp(IOC1,shumai); i+; outp(IOB1,tablem1); delay(); outp(IOC1,shumai); outp(IOB1,tablem2); d
17、elay(); void xiexingqi()/写星期到数码管 int i=2; outp(IOC1,shumai); outp(IOB1,xqing(xq+4)%7); delay(); void runnian()/判断闰年 nianx=1000*n1+100*n2+10*n3+n4; tianx=10*t1+t2; yuex=10*y1+y2; if(nianx%4=0)&&(nianx%100!=0)|(nianx%400=0) if(yuex=2&&tianx>29) t1=0; t2=1; y2+; else if(yuex=2&&a
18、mp;tianx>28) t1=0; t2=1; y2+; void yueda()/月大(31天) yuex=10*y1+y2; tianx=10*t1+t2; if(yuex=1|yuex=3|yuex=5|yuex=7|yuex=8|yuex=10|yuex=12) if(tianx>31) t1=0; t2=1; y2+; if(yuex>11) y1=0; y2=1; n4+; if(n4>9) n4=0; n3+; if(n3>9) n3=0; n2+; if(n2>9) n2=0; n1+; void yuexiao()/月小(30天) yue
19、x=10*y1+y2; tianx=10*t1+t2; if(yuex=4|yuex=6|yuex=9|yuex=11) if(tianx>30) t1=0; t2=1; y2+; if(y2>9) y2=0; y1+; void zhengdian()/整点报时 fenx=10*f1+f2; miaox=10*m1+m2; if(fenx=0&&miaox=0) outp(A_CON,0x51); outp(A_1,0x04); void shijianchuli() /时间处理 yuex=10*y1+y2; tianx=10*t1+t2; if(btn=0b11
20、11111111111111) count+; if(count=40) count=0; m2+; if(m2>9) m2=0; m1+; if(m1>5) m1=0; f2+; if(f2>9) f2=0; f1+; if(f1>5) f1=0; s2+; if(s2>9) s2=0; s1+; else if(s1=2&&s2=4) s1=0; s2=0; f1=0; f2=0; m1=0; m2=0; t2+; xq+; runnian(); yuexiao(); yueda(); zhengdian(); if(t2>9) t2=0
21、; t1+; void main() outp(IOCON,0x89); outp(IOCON1,0x80); outp(A_CON,0x17); outp(A_0,0x02); btn=inp(IOC); nian(2017); yue(11); tian(30); xingqi(); shi(23); fen(59); miao(59); yue(11); while(1) xiexingqi(); xienian(); xieyue(); xietian(); xieshi(); xiefen(); xiemiao(); xiexingqi(); shijianchuli(); 第四章
22、系统实现4.1 proteus仿真实验图4 Proteus仿真图2.硬件部分遇到的困难及解决方法(1)在初次连接好后我们进行了调试,但不能正常工作,经检查有连线错误,改正后可以显示。(对于数码管的动态显示理解不够深刻,传输数据的数据的时候有时候显示不完全) (2)可以运行工作后,显示乱码,原因是只用了一片8255,用B口输出年月日时分秒和星期,导致数据混乱,所以,之后改为了两片8255。 第五章 小结5.1 设计总结通过对基于8086的电子万年历的设计,从电路到程序设计,再到对程序的调试,在整个的设计过程中学到了很多。用到了8255A的并行接口,将二进制的控制信息传入8086CPU中处理。在使用8255A接口的时候,都要对其进行初始化,这初始化程序的编写,有助于对这些接口芯片的工作原理的理解。总之,在实验中自己动手,把理论知识用于实践,从中能够学到
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化妆品与时尚彩妆系
- 油漆玻璃投资借贷合同3篇
- (NEW)2025年个人借款抵押担保合同4篇
- 肝脏疾病病理班
- 窒息患儿的急救流程与管理
- T/ZHCA 603-2021化妆品生产企业消毒技术规范
- 游戏机课程设计
- 院外急救基础与操作规范
- 2025西昌学院辅导员考试试题及答案
- 2025西安电力高等专科学校辅导员考试试题及答案
- 呼吸性酸中毒试题及答案
- 基于深度学习的手术机器人在后交叉韧带断裂中的导航优化-洞察阐释
- 检察院相关试题及答案
- 安全生产管理机制
- 遴选公务员笔试真题及答案
- 高瞻课程师幼互动
- 锅炉检修作业安全保障方案
- 2025-2030中国三醋酸纤维素膜行业市场现状供需分析及投资评估规划分析研究报告
- 中国艾滋病诊疗指南(2021年版)
- 医院培训课件:《急诊急救-消化道出血的护理》
- 三基三严培训课件
评论
0/150
提交评论