




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一部分实验目的及要求实验目的本课程设计是在理论课程的基础上,重点培养学生的动手能力,通过理论计算、实际编程、调试、测试、分析查找故障,解决在实际设计中的问题,使设计好的电路能正常工作,为下一部结合实际的硬件系统设计准备条件。实验基本要求:设计一串口通信程序,波特率9600,通过RS232串口自环。自动循环发送数据串(设计在程序中),接收并存储和显示该数据串。数据串单次发送由按键启动,接收端显示数据串和数据串数、正确接收数和错误数。数据串选择发送(预存10种数据串),通过按键选择发送,接收、存储并按序显示。根据提供的参考工程,在proteus平台自己重新画出实验所需要的电气原理图,并在此基础上编写相对应的程序,实现其功能,学习proteus软件的使用,其中包括原理图器件的选取、原理图的电气连接、程序的编写编译以及运行,并能查出其错误等。第二部分实验工具及实验器件1.Proteus7.5以及Keil4软件的使用Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。在PROTEUS绘制好原理图后,调入已编译好的目标代码文件:*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。而*.HEX文件则由Keil软件编译后生成。Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件,而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。有了proteus和keil软件我们就需要在这两个软件中建立我们所需要的工程进行实验,具体步骤如下:第一步:在Keil4中建立一个新的工程,命名为“软件实验”,如图2-1。图2-1第二步:选择使用的单片机芯片,我们选择ATMEL公司生产的89C51,如图2-2。图2-2第三步:将新创建的.c文件添加到Target1中,如图2-3。图2-3这样我们就可以在keil4的环境下对单片机的程序进行编译和运行了。2.51单片机AT89C5151单片机是对目前所有兼容Intel8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flashrom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。目前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是52系列的单片机一般不具备自编程能力。当前常用的51系列单片机主要产品有:*Intel的:80C31、80C51、87C51,80C32、80C52、87C52等;*ATMEL的:89C51、89C52、89C2051等;89C51单片机的内部结构为:单一+5V电源供电;CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;ROM:用以存放程序、一些原始数据和表格;I/O口:四个8位并行I/O口,既可用作输入,也可用作输出;T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;五个中断源的中断控制系统;一对全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振荡频率为12M。RS-232电平转换芯片MAX232第一部分是电荷泵电路。由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。第二部分是数据转换通道。由7、8、9、10、11、12、13、14脚构成两个数据通道。其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。第三部分是供电。15脚GND、16脚VCC(+5v)。完成连接之后的电路图如图2-4所示。图2-411和12口分别连接51单片机的RxD(P3.0)、TxD(P3.1)。三态输出的8D透明锁存器74HC37374HC373的输出端Q0~Q7可直接与总线相连。当三态允许控制端OE为低电平时,Q0~Q7为正常逻辑状态,可用来驱动负载或总线。当OE为高电平时,Q0~Q7呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。当锁存允许端LE为高电平时,Q随数据D而变。当LE为低电平时,Q被锁存在已建立的数据电平。二线制I2CCMOS串行EEPROM24C086.8155引脚以及功能。8155是一个有40引脚的塑封芯片,功能较强,广泛的应用在计算机电路中。它有两个8位口A、B和一个6位口C,总共可以扩展出22条接线。它含一个可预置的计数器,计数范围从2到16383,可用于延时、计数或分频。它内部还有256字节的RAM,可以补充CPU内存的不足。为了能够设置芯片的工作方式和了解芯片的状态,内部还有命令寄存器和状态寄存器。8155各引脚功能说明如下:RST:复位信号输入端,高电平有效。复位后,3个I/O口均为输入方式。AD0~AD7:三态的地址/数据总线。与单片机的低8位地址/数据总线(P0口)相连。单片机与8155之间的地址、数据、命令与状态信息都是通过这个总线口传送的。:读选通信号,控制对8155的读操作,低电平有效。:写选通信号,控制对8155的写操作,低电平有效。:片选信号线,低电平有效。IO/:8155的RAM存储器或I/O口选择线。当IO/=0时,则选择8155的片内RAM,AD0~AD7上地址为8155中RAM单元的地址(00H~FFH);当IO/=1时,选择8155的I/O口,AD0~AD7上的地址为8155I/O口的地址。
ALE:地址锁存信号。8155内部设有地址锁存器,在ALE的下降沿将单片机P0口输出的低8位地址信息及,IO/的状态都锁存到8155内部锁存器。因此,P0口输出的低8位地址信号不需外接锁存器。PA0~PA7:8位通用I/O口,其输入、输出的流向可由程序控制。PB0~PB7:8位通用I/O口,功能同A口。PC0~PC5:有两个作用,既可作为通用的I/O口,也可作为PA口和PB口的控制信号线,这些可通过程序控制。TIMERIN:定时/计数器脉冲输入端。TIMEROUT:定时/计数器输出端。VCC:+5V电源。
2、8155的地址编码及工作方式
在单片机应用系统中,8155是按外部数据存储器统一编址的,为16位地址,其高8位由片选线提供,=0,选中该片。当=0,IO/=0时,选中8155片内RAM,这时8155只能作片外RAM使用,其RAM的低8位编址为00H~FFH;当=0,IO/=1时,选中8155的I/O口,其端口地址的低8位由AD7~AD0确定,如表6-6所示。这时,A、B、C口的口地址低8位分别为01H、02H、03H(设地址无关位为0)。
表6-68155芯片的I/O口地址AD7~AD0选择I/O口A7A6A5A4A3A2A1A0××××××××××××××××××××××××××××××000011001100010101命令/状态寄存器A口B口C口定时器低8位定时器高6位及方式8155的A口、B口可工作于基本I/O方式或选通I/O方式。C口可工作于基本I/O方式,也可作为A口、B口在选通工作方式时的状态控制信号线。当C口作为状态控制信号时,其每位线的作用如下:PC0:AINTR(A口中断请求线)PC1:ABF(A口缓冲器满信号)PC2:(A口选通信号)PC3:BINTR(B口中断请求线)PC4:BBF(B口缓冲器满信号)PC5:(B口选通信号)8155的I/O工作方式选择是通过对8155内部命令寄存器设定控制字实现的。命令寄存器只能写入,不能读出,命令寄存器的格式如图6-16所示。在ALT1~ALT4的不同方式下,A口、B口及C口的各位工作方式如下:ALT1:A口,B口为基本输入/输出,C口为输入方式。ALT2:A口,B口为基本输入/输出,C口为输出方式。ALT3:A口为选通输入/输出,B口为基本输入/输出。PC0为AINTR,PC1为ABF,PC2为,PC3~PC5为输出。ALT4:A口、B口为选通输入/输出。PC0为AINTR,PC1为ABF,PC2为,PC3为BINTR,PC4为BBF,PC5为。7.LED液晶显示器件7seg-mpx8-ca7SEG-MPX8-CA八个共阳二极管显示器12345678是阳公共端图三LED液晶显示器件7seg-mpx8-ca数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都有个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5*8=40跟I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个,实际应用时需要增加译码驱动进行驱动,增加了硬件电路的复杂性。动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的八个显示比划“a,b,c,d,e,f,g,h”的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立I/O线控制,当单片机输出字形码时,所有数码管都接受到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通恐慌只打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动,在轮流显示过程中,每位数码管的点亮时间为1—2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就使一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。第三部分实验原理图及程序代码硬件部分电路设计电路图如图:软件部分设计这部分的程序如下:#include<reg51.h>#include<stdio.h>#include<absacc.h>#include<string.h>#defineucharunsignedchar#defineuintunsignedint#definepaXBYTE[0x0001]//定义8155口地址#definepbXBYTE[0x0002]#definecontrol8155XBYTE[0x0000]sbitSCK=P1^0;sbitSDA=P1^1;sbitE=P3^7;sbitSEND=P3^1;sbitREV=P3^0;sbitK1=P3^2;sbitK2=P3^3;sbitK3=P2^3;uchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0123456789存码表ucharpos[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选,选中数码管dataunsignedcharstr1[16]={"Starting"};dataunsignedcharstr2[16]={"Recieved:"};dataunsignedcharsend[16]={"testnumber"};uchartemp;inti;voiddelay(unsignedintt){unsignedinti,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}voiddelayXus(ucharx)//微秒延时{while(--x);}voiddelayXms(ucharx)//毫秒延时{uchari;while(x--){for(i=250;i>0;i--){;}}}voidstart(){SDA=1;delay(3);SCK=1;delay(3);SDA=0;delay(3);SCK=0;delay(3);}voidstop(){SDA=0;delay(3);SCK=1;delay(3);SDA=1;delay(3);}voidU4_init(){SCK=1;delay(3);SDA=1;delay(3);}voidresponds(){uchari;i=0;SCK=1;SDA=1;delay(3);while(SDA==1&&i<250)i++;SCK=0;delay(3);}voidwrite_dat(uchardat)//写一个字节{uchari,temp;temp=dat;for(i=0;i<8;i++){temp=temp<<1;SDA=CY;delay(3);SCK=1;delay(50);SCK=0;}}voidwrite(ucharadd,uchardat)//写一个字节dat到地址add{start();write_dat(0xa0);responds();write_dat(add);responds();write_dat(dat);responds();stop();}ucharread_dat()//读一个字节{ uchara,r,temp; SDA=1; //接收前记得释放数据线,即拉高sda。 delay(3); for(a=0;a<8;a++) //循环八次以此接收一字节数据 { SCK=1; //sck置高,使接收数据稳定。 delay(3);r=r<<1; //接收数据处理,存入i2c_r变量中。 temp=SDA; r=r|temp; SCK=0; //sck置低,准备接受下个数据位。 delay(3); } returnr;}ucharread(ucharadd)//从地址add中读取一个字节{uchardat;start();write_dat(0xa0);responds();write_dat(add);responds();start();write_dat(0xa1);responds();dat=read_dat();delayXus(2);stop();returndat;}voidwritedata(){uchari;ucharstr[8]={0xf9,0xa4,0xb0,0xc0,0xf9,0xa4,0xb0,0xc0};for(i=0;i<8;i++){write(i,str[i]);}str[0]=0xa4;str[1]=0xb0;str[2]=0x99;str[3]=0xf9;str[4]=0xa4;str[5]=0xb0;str[6]=0x99;str[7]=0xf9;for(i=8;i<16;i++){write(i,str[i-8]);}str[0]=0x4f;str[1]=0x5b;str[2]=0x4f;str[3]=0x66;str[4]=0x66;str[5]=0x4f;str[6]=0x5b;str[7]=0x06;for(i=16;i<24;i++){write(i,str[i-16]);}str[0]=0x99;str[1]=0x92;str[2]=0x82;str[3]=0xb0;str[4]=0x99;str[5]=0x92;str[6]=0x82;str[7]=0xb0;for(i=24;i<32;i++){write(i,str[i-24]);}str[0]=0x92;str[1]=0x82;str[2]=0xf8;str[3]=0x99;str[4]=0x92;str[5]=0x82;str[6]=0xf8;str[7]=0x99;for(i=32;i<40;i++){write(i,str[i-32]);}str[0]=0x82;str[1]=0xf8;str[2]=0x80;str[3]=0x92;str[4]=0x82;str[5]=0xf8;str[6]=0x80;str[7]=0x92;for(i=40;i<48;i++){write(i,str[i-40]);}str[0]=0xf8;str[1]=0x80;str[2]=0x90;str[3]=0x82;str[4]=0xf8;str[5]=0x80;str[6]=0x90;str[7]=0x82;for(i=48;i<56;i++){write(i,str[i-48]);}str[0]=0x80;str[1]=0x90;str[2]=0xc0;str[3]=0xf8;str[4]=0x80;str[5]=0x90;str[6]=0xc0;str[7]=0xf8;for(i=56;i<64;i++){write(i,str[i-56]);}str[0]=0x90;str[1]=0xc0;str[2]=0x88;str[3]=0x80;str[4]=0x90;str[5]=0xc0;str[6]=0x88;str[7]=0x80;for(i=64;i<72;i++){write(i,str[i-64]);}str[0]=0xc0;str[1]=0x88;str[2]=0x83;str[3]=0x90;str[4]=0xc0;str[5]=0x88;str[6]=0x83;str[7]=0x90;for(i=72;i<80;i++){write(i,str[i-72]);}}voidsend_char(uchartemp1){SBUF=temp1;while(!TI);TI=0;}voidMAX232_init(){TMOD=0x20;TH1=252;TL1=252;TR1=1;PCON=0x80;SCON=0x50;}voidmain(){inti,j,set;charb,t;ucharword[16],recv[8];U4_init();writedata();delay(50);set=0;while(1){control8155=0x03;for(i=0;i<8;i++) { pa=pos[i];pb=0x88; //pb=send[i]; delay(5); } }while(1){while(K2){while(!K1){if(!K2)break;}while(K1){if(!K2)break;}if(!K2)break;delay(30);set++;if(set>10){set=0;}}MAX232_init();while(!K2);control8155=0x03;delay(30);switch(set){case1:for(i=0;i<8;i++){send[i]=read(i);}for(i=0;i<8;i++){ send_char(send[i]); delay(50); if(RI==1) {RI=0; temp=SBUF; recv[i]=temp; } delay(100);}while(K3) //show{ for(i=0;i<8;i++) { pa=pos[i]; pb=send[i]; delay(5); } delay(5);}delay(5);while(!K3);pa=0x00;pb=0xff;break;break;case2: for(i=8;i<16;i++){send[i-8]=read(i);}for(i=0;i<8;i++){ send_char(send[i]); delay(50); if(RI==1) {RI=0; temp=SBUF; recv[i]=temp; } delay(100);} break;case3:for(i=16;i<24;i++){send[i-16]=read(i);}for(i=0;i<8;i++){ send_char(send[i]); delay(50); if(RI==1) {RI=0; temp=SBUF; recv[i]=temp; } delay(100);} break;case4:for(i=24;i<32;i++){send[i-24]=read(i);}for(i=0;i<8;i++){ send_char(send[i]); delay(50); if(RI==1) {RI=0; temp=SBUF; recv[i]=temp; } delay(100);} break;case5:for(i=32;i<40;i++){send[i-32]=read(i);}for(i=0;i<8;i++){ send_char(send[i]); delay(50); if(RI==1) {RI=0; temp=SBUF; recv[i]=temp; } delay(100);} break;case6:for(i=40;i<48;i++){send[i-40]=read(i);}for(i=0;i<8;i++){ send_char(send[i]); delay(50); if(RI==1) {RI=0; temp=SBUF; recv[i]=temp; } delay(100);} break;case7:for(i=48;i<56;i++){send[i-48]=read(i);}for(i=0;i<8;i++){ send_char(send[i]); delay(50); if(RI==1) {RI=0; temp=SBUF; recv[i]=temp; } delay(100);}break;case8:for(i=56;i<64;i++){send[i-56]=read(i);}for(i=0;i<8;i++){ send_char(send[i]); delay(50); if(RI==1) {RI=0; temp=SBUF; recv[i]=temp; } delay(100);}break;case9:for(i=64;i<72;i++){send[i-64]=read(i);}for(i=0;i<16;i++){ send_char(send[i]); delay(50); if(RI==1) {RI=0; temp=SBUF; recv[i]=temp; } delay(100);}break;case10:for(i=72;i<80;i++){send[i-72]=read(i);}for(i=0;i<8;i++){ send_char(send[i]); delay(50); if(RI==1) {RI=0; temp=SBUF; recv[i]=temp; } delay(100);}break;}delay(2000);}}第四部分实验测试结果程序启动后,先执行写入数据,我们可以看到存入24c08中的10组数据。K2按键是用于发出传送数据的指令,随后自动接收并显示在屏幕上,系统初始时,我设置了一个特殊的状态,通过选择键K1来控制输出的字符串,这个选择键可以按下多次,执行:跳过/循环的功能,K3键是擦除屏幕,其中,在选择字符串时,特地在屏幕中显示序号。具体过程由以下图片详解。初始
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO/IEC GUIDE 21-2:2005 FR Regional or national adoption of International Standards and other International Deliverables - Part 2: Adoption of International Deliverables ot
- 企业战略管理模拟试卷
- 各行业综合知识总结
- 描述家乡的景物美景写景作文5篇范文
- 生物学生态学知识点总结
- 银行理论考试试题及答案
- 六一亚运活动方案
- 医药初级考试试题及答案
- 六一商业活动策划方案
- 六一学校防疫活动方案
- GB 2759-2015食品安全国家标准冷冻饮品和制作料
- 2023年广东省东莞市中考化学试卷
- 项目2 辨认液压基本回路《液压与气压传动实训指导书》
- 地铁项目安全风险评估报告2019
- iatf16949培训教材课件
- 商品猪场日处理200立方污水处理工程设计预案
- 《新课标改革下语文教学中新型师生关系构建研究(论文)》
- 新苏教版牛津英语 英语四年级下册期末试卷
- 生产异常停线管理规范标准
- DB32∕T 4064-2021 江苏省城镇燃气安全检查标准
- 四川省泸州市泸县2021-2022学年八年级下学期期末数学试题(word版只含选择填空题答案)
评论
0/150
提交评论