您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于8086的电子万年历打印稿
军械工程学院《计算机硬件技术基础》课程创新型实验设计报告题目:基于8086的电子万年历设计组长:吴明春组员:谢林峰,宋群奇,洪鑫强,加央旦增指导教员:谢方方起止时间:2016年11月25日-2016年12月28日1目录第一章实验简介..................................21.1目的意义..........................................21.2功能..............................................2第二章相关硬件知识介绍..........................22.1可编程并行接口芯片8255A...........................22.2可编程计数器8253..................................3第三章系统设计..................................43.1总体设计..........................................43.2硬件电路设计......................................53.3软件编程设计......................................63.3.1汇编程序流程图.........................................63.3.2程序解析...............................................7第四章系统实现.................................174.1proteus仿真实验.................................17第五章小结.....................................195.1设计总结.........................................195.2设计存在的问题...................................195.3心得体会.........................................192第一章实验简介1.1目的意义学习和掌握计算机中常用接口电路的应用和设计技术,学会针对不同的要求设计汇编程序代码,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学知识的应用能力以及分析问题解决问题的能力得到全面提高。1.2功能电子万年历是人们生活中不可或缺的一种生活用品,对人们的生活起到了极大的帮助,我们通过它来知道今夕是何年、何月、何日、何时。本课题要设计一个电子万年历,以8086芯片组成的最小系统为基础,来设计一个电子万年历。该电子万年历实现了以下几个功能:(1)自动定时,该功能为电子万年历的基本功能,这里不做赘述;(2)自动计算星期,在程序中引用蔡勒公式实现了自动计算星期。(3)整点报时,该电子万年历实现了整点报时功能,极大地丰富了我们的生活。第二章相关硬件知识介绍2.1可编程并行接口芯片8255A可编程并行接口芯片8255A是一种可编程并行I/O接口芯片,通过对它进行编程,选择不同的工作方式,可将其应用于基本输入输出、键盘接口等。本实验中,我们用了2片8255A芯片,将8255A作为时钟输入接口和数码管的输出接口。38255A的整体结构图如图1所示。图18255A连接图1.与CPU连接部分8255A能并行传送8位数据,其数据线为D0~D7,对应连接8086CPU的低八位;8086CPU数据线低八位与8255A相连,所以8255A内部各个端口使用偶地址,即8255A的A0、A1分别接8086CPU的A1、A2。此外CPU要对8255A进行读、写与片选操作,所以控制线为片选、复位、读、写信号。2.与外设接口部分8255A有3个并行接口A、B、C与外设连接,每个并行接口又有8根线与外设连接,所以8255A可以用24根线与外设连接,各并行接口的引脚编号如下:A口:编号为PA0~PA7,用于8255A向外设输出8位并行数据B口:编号为PB0~PB7,用于8255A向外设输出8位并行数据。C口:编号为PC0~PC7,用于8255A从外设读取8位并行数据。2.2可编程计数器82531.与CPU连接部分8253能并行传送8位数据,其数据线为D0~D7,对应连接8086CPU的低八位;8086CPU数据线低八位与8253相连,所以8253内部各个端口使用偶地址,即8253的A0、A1分别接8086CPU的A1、A2。此外CPU要对8253进行写入控制字和初值与片选操作,所以控制线为片选、写信号。2.与外设连接部分8253的数据线D0~D7与CPU的低八位数据线相连,传送8253的相关控制字,用来设定8253各端口的工作状态和输入计数初值。在本项目中,我们使用了8253的A口和B口,其中,A口CLK0与信号源链接,4工作于方式三,OUT0输出所需频率,与8255(U10)芯片的C口相连,实现定时;B口CLK1同样与信号源相连,工作于方式一,用以产生整点报时的信号。8253的整体结构图如图2所示。图28253连接图第三章系统设计3.1总体设计系统总设计图见图3。时间数据数据CLK(定时)图3总体设计图系统运行后,由8253产生时钟信号,输入8255A(U10)的C口,扫描C口的8086CPU8255A数码管82535状态,当扫描到一个时钟信号的时候,控制秒加一,这样就实现了定时。3.2硬件电路设计8086CPU与三片74LS373和两片74LS245组成最小系统,使8086工作在最小系统模式,三片74LS373的输出作为8086的地址总线(A0-A19),两片74LS245的输出作为8086的数据总线(D0-D15)。以一片74LS138作为片选,74LS138的输入是A12-A15,输出为0IO~7IO,分别作为两片8255A和8253的片选信号。第一片8255A(U10)的A口和B口和C口都工作在方式0(基本输入输出模式),其中A口和B口输出,C口输入(扫描时钟信号),A口作为年月日输出数码管的片选信号,B口输出年月日到八位数码管。第二片8255A(U8)的A口和B口和C口都工作在方式0(基本输入输出模式),其中A口不用,B口和C口输入,C口用来作为时分秒和星期输出数码管的片选信号,B口用来输出时分秒和星期到数码管。8253的0口输出时钟信号连接到第一片8255A(U10)的C口,工作在方式3,用以定时。1口用以产生闹钟信号,工作在方式0,驱动蜂鸣器发声。八位数码管用以显示年月日,片选信号接入8255A(U10)的A口,显示信号接入8255A(U10)的B口。三个两位数码管和一个单位数码管用来显示时分秒和星期,片选信号都接入8255A(U8)的C口,显示信号接入8255A(U8)的B口。硬件电路连接图:63.3软件编程设计3.3.1汇编程序流程图图3汇编程序流开始初始化两片8255和8253写入数据产生片选信号和时间信号送入数码管显示判断闰年、月大、月小,时间处理73.3.2程序解析//第一片8255#defineIOCON8006H#defineIOA8000H#defineIOB8002H#defineIOC8004H//第二片8255#defineIOCON19006H#defineIOA19000H#defineIOB19002H#defineIOC19004H//8253#defineA_00xA000#defineA_10xA002#defineA_20xA004#defineA_CON0xA006inttable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极编码0..9intxqing[]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};//星期1..7intshuma[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//变量声明intn1;//年份的千位intn2;//年份的百位intn3;//年份的十位intn4;//年份的个位intnianx;inty1;//月份的十位inty2;//月份的个位intyuex;intt1;//天的十位intt2;//天的个位inttianx;ints1;//小时的十位ints2;//小时的个位intf1;//分钟的十位intf2;//分钟的个位intfenx;intm1;//秒的十位intm2;//秒的个位intmiaox;intxq;//星期8intbtn;//io接口intcount=0;voidoutp(unsignedintaddr,chardata)//Outputbytetoport{__asm{movdx,addrmoval,dataoutdx,al}}charinp(unsignedintaddr)//Inputbytefromport{charresult;__asm{movdx,addrinax,dxmovresult,ax}returnresult;}voiddelay()//延迟函数{intt=0;for(t=0;t100;t++){};}voidnian(intx)//对年份进行处理{n1=x/1000;x=x-1000*n1;n2=x/100;x=x-100*n2;n3=x/10;n4=x-10*n3;}voidyue(intx)//对月进行处理9{if(x9){y2=x%10;x=x-y2;y1=x/10;}else{y2=x;y1=0;}}voidtian(intx)//对日进行处理{t2=x%10;x=x-t2;t1=x/10;}voidshi(intx)//对时进行处理{s2=x%10;x=x-s2;s1=x/10;}voidfen(intx)//对分进行处理{f2=x%10;x=x-f2;f1=x/10;}voidmiao(intx)//对秒进行处理{m2=x%10;x=x-m2;m1=x/10;}voidxingqi(void)//对星期处理{if(y2==1&&y1==0){y1=1;y2=3;10}elseif(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)/5+10*t1+t2+1)%7;}voidxienian()//写年到数码管{inti=0;outp(IOA,shuma[i]);outp(IOB,table[n1]);i++;delay();outp(IOA,shuma[i]);outp(IOB,table[n2]);i++;delay();outp(IOA,shuma[i]);outp(IOB,table[n3]);i++;delay();outp(IOA,shuma[i]);outp(IOB,table[n4]);delay();}voidxieyue()//写月到数码管{inti=4;outp(IOA,shuma[i]);outp(IOB,table[y1]);11i++;delay();outp(IOA,shuma[i]);outp(IOB,table[y2]);i++;delay();}voidxietian()//写天到数码管{inti=6;outp(IOA,shuma[i]);outp(IOB,table[t1]);i++;delay();outp(IOA,shuma[i]);outp(IOB,table[t2]);i++;delay();}voidxieshi()//写小时到数码管{inti=0
本文标题:基于8086的电子万年历打印稿
链接地址:https://www.777doc.com/doc-4250612 .html