单片机实验指导书xx版.doc_第1页
单片机实验指导书xx版.doc_第2页
单片机实验指导书xx版.doc_第3页
单片机实验指导书xx版.doc_第4页
单片机实验指导书xx版.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机实验指导书XX版 实验一8051简单编程与调试实验目的通过简单小程序的输入和调试,熟悉并掌握Keil的使用。 学会Proteus与Keil的整合调试。 实验基本要求建立三个项目,分别输入存储块清零、二进制BCD码及二进制ASCII码转换的汇编源程序,并进行仿真调试。 画出实验程序的流程框图。 实验步骤采用Keil Cx51开发8051单片机应用程序一般需要经过下面几个步骤 1、在?Vision2集成开发环境中创建一个新项目(Project),并为该项目选定合适的单片机CPU器件。 在菜单栏中选择“Project”“New Project”,弹出“Create NewProject”对话框,选择目标路径,在“文件名”栏中输入项目名后,单击“保存(S)”按钮,弹出“Selecte Devicefor Target”对话窗口。 在此对话窗口的“Data base”栏中,单击“Atmel”前面的“+”号,或者直接双击“Atmel”,在其子类中选择“AT89C51”,确定CPU类型。 如图所示。 点击“确定”按钮后,弹出如下的对话框1如果是进行汇编语言编程选择“否”。 2、利用?Vision2的文件器编写C语言(或汇编语言)源程序文件,并将文件添加到项目中去。 一个项目可以包含多个文件,除源程序文件外还可以有库文件或文本说明文件。 在?Vision2的菜单栏中选择“File”“New”命令,新建文档,然后在菜单栏中选择“File”“Save”命令,保存此文档,这时会弹出“Save As”对话窗口,在“文件名(N)”一栏中,为此文本命名,注意要填写扩展名“.asm”。 单击“保存(S)”按钮,这样在编写汇编代码时,Keil会自动识别汇编语言的关键字,并以不同的颜色显示,以减少输入代码时出现的语法错误。 程序编写完后,再次保存。 在Keil中“Project Workspace”子窗口中,单击“Target1”前面的“+”号,展开此目录。 在“Source Group1”文件夹上单击鼠标右键,在右键菜单中选择“Add FiletoGroup Source1”,弹出“Add Fileto Group”对话窗口,在此对话窗口的“文件类型”栏中,选择“Asm SourceFile”,并找到刚才编写的.asm文件,双击此文件,将其添加到Source Group中,此时“Project Workspace”子窗口如图所示。 23、通过?Vision2的各种选项,配置Cx51编译器、Ax51宏汇编器、BL51/.Lx51连接定位器以及Debug调试器。 在“Project Workspace”窗口中的“Target1”文件夹上单击鼠标右键,在弹出的右键菜单中选择“Option forTarget”选项,这时会弹出“Options forTarget”对话窗口,在此对话窗口中选择“Output”选项卡,选中“Create HEXFile”选项,如图所示。 4、利用?Vision2的构造(Buid)功能对项目中的源程序文件进行编译连接,生成绝对代码和可选的HEX文件,如果出现编译连接错误则返回到第2步,修改源程序中的错误后重新构造整个项目。 在Keil的菜单栏中选择“Project”“Build Target”命令,编译汇编源文件。 如果编译成功,则在“Output Window”子窗口中会显示如图所示的信息;如果编译不成功,双击“Output Window”窗口中的错误信息,则会在窗口中指示错误语句。 5、将没有错误的绝对代码装入?Vision2调试器进行仿真调试,调试成功后将HEX文件写入到单片机应用系统的EPROM中。 3在Keil的菜单栏中,选择“Debug”“Start/Stop DebugSession”选项,进入程序调试环境,如图所示。 按“F11”键,单步运行程序。 在“Project Workspace”窗口中,可以查看累加器、通用寄存器及特殊功能寄存器的变化。 在“Memory”窗口中,可以看到每执行一条语句后存储空间的变化。 在“Address”栏中,输入“D:30H”,查看AT89C51的片内直接寻址空间。 程序调试完毕后,再次在菜单栏中选择“Debug”“Start/Stop DebugSession”选项,退出调试环境。 在Proteus中调试程序打开Proteus ISIS环境,在菜单栏中选择“File”“Load Design”弹出“Load ISISDesign File”对话窗口,选择要打开的Proteus的.DSN设计文件。 在本实验中,设计文件为本实验子目录下的Basic.DSN单击鼠标右键选中AT89C51并单击鼠标左键,打开“Edit Component”对话窗口,在此窗口中的“Program4File”栏中,选择先前用Keil生成的.HEX文件,如图所示。 单击Proteus ISIS界面左下角的按钮,进入程序调试状态,并在“Debug”菜单中打开“8051CPU Registers”、“8051CPU Internal(IDATA)Memory”及“8051CPU SFRMemory”三个观察窗口,按“F11”键,单步运行程序。 在程序运行过程中,可以在这三个窗口中看到各寄存器及存储单元的动态变化。 Proteus与Keil整合调试及电路仿真在Proteus的“Debug”菜单中选择“Use RemoteDebug Monitor”选项,如图所示。 选择Keil的“Project”“Options forTargetTarget1”,在弹出的对话框中,单击Debug选项卡,单击右上部的下三角按钮选择“Proteus VSMMonitor-51Driver”如图所示。 5单击“Setting”进入对话框填写如图所示的IP地址和端口号。 在Keil中,在菜单栏中选择“Debug”“Start/Stop DebugSession”选项,Keil系统进入调试状态。 同时Proteus也进入调试状态。 这时可以调整这两个软件窗口的大小,使它们同时出现在桌面上,这样就可以同时观察这两个软件运行的情况了。 在Proteus的调试状态下,在“Debug”菜单中打开“8051CPU Registers”、“8051CPU Internal(IDATA)Memory”、“8051CPU SFRMemory”三个观察窗口,在单步运行程序的过程中,可以在这三个窗口中看到各寄存器以及存储单元的动态变化。 6实验内容1Porteus模型为BASIC.DSN如下图所示。 一、存储块置全“1”源代码汇编语言源程序ORG00H START EQU30H MOV R1,#START;起始地址MOV R7,#32;Rn中设置32字节计数值MOV A,#0FFH LOOP:MOVR1,A INC R1;指向下一个地址DJNZ R7,LOOP;计数值减1,不为零继续SJMP$END在下划线处填入适当指令。 输入源程序,编译无误后,用单步执行的方法,观察各个相应存储单元和寄存器中内容的变化。 解释STARTEQU30H。 【答】将30H定义为START 二、二进制BCD码转换源代码汇编语言源程序RESULT EQU30H ORG00H LJMPSTART START:MOV SP,#40H;堆栈指针指向40H MOV A,#123LCALL BINTOBAC7SJMP$BINTOBAC:MOV B,#100DIV AB;除以100得百位数MOV RESULT,A MOV A,B MOV B,#10DIV AB;余数除以10得十位数MOV RESULT+1,A MOV RESULT+2,B;余数为个位数RET END在下划线处填入适当指令。 用单步执行的方法,观察子程序调用过程中堆栈指针的变化。 三、二进制ASCII码转换源代码汇编语言源程序RESULT EQU30H ORG00H START:MOV A,#1AH LCALLBINTOHEX;调用BINTOHEX子程序LJMP$BINTOHEX:MOV DPTR,#ASCIITAB;表的首址ASCIITAB送DPTR MOV B,A;暂存A SWAPA ANLA,#0FH;取A的高四位MOVC A,A+DPTR;查ASCII表MOV RESULT,A MOV A,B;恢复A ANLA,#0FH;取低四位MOVC A,A+DPTR;查ASCII表MOV RESULT+1,A RETASCIITAB:DB0123456789ABCDEF;定义数字对应的ASCII表END在下划线处填入适当指令。 单步运行程序观察查表指令的执行过程。 把LJMP$这条指令注释掉,然后全速运行该程序,然后让其停止观察程序执行到哪里?【答】一直重复调用不停止8实验内容2输入、汇编、调试下列四个程序,通过信息窗口观察并回答问题。 1、程序a.asm ORG0000H MOV30H,#87H MOV A,#69H ADD A,30H NOPEND问CY=0,(A)=F0H,OV=0将程序中的指令NOP改为指令DA A后问CY=1,(A)=56H,OV= 02、程序b.asm ORG0000H MOVSP,#60H MOV DPTR,#0A679H PUSH DPH PUSH DPL MOV A,#80H PUSH ACC POPB POP30H POP31H NOPEND问(SP)=60H,(A)=80H,(30H)=79H(B)=80H,(DPH)=A6H,(DPL)=79H 3、程序c.asm ORG0000H MOV DPTR,#TAB MOV A,#05H MOVC A,A+DPTR NOPORG1000H TAB:DB6FH,30H,96H,75H,0A8H,0FEH DB49H,8AH,5FH,0B6H,7FH,0C4H END问执行完MOVC A,A+DPTR以后,(A)=FEH,P=0,P=0,(31H)=A6H, 94、程序d.asm ORG0000H MOV A,#02H MOV B,A RLA ADDA,B MOV DPTR,#TAB JMPA+DPTR NOPORG0800H TAB:LJMP1000H LJMP2000H LJMP3000H LJMP4000H END问执行完JMPA+DPTR以后,PC=0806H10实验二汇编语言程序设计(一)实验目的通过上机实验掌握单片机汇编语言程序的编写和调试。 实验基本要求按实验内容上机输入并调试实验程序。 画出实验程序的流程框图。 实验内容Proteus模型为BASIC.DSN。 一、内存块移动汇编语言源程序ORG00H MOV R1,#00H;设置源地址MOV R2,#40H MOV R7,#0MOV R3,#00H;设置目标地址;设置计数值;将源地址(3000H)赋DPTR;取源地址中的数据;将目标地址(4000H)赋DPTR;将源地址中的数据送到目标地址;源地址加1;目标地址加1START:MOV R0,#30H LOOP:MOV DPH,R0MOV DPL,R1MOV DPH,R2MOV DPL,R3MOVXDPTR,A INC R1MOVX A,DPTR INC R3LJMP$END DJNZ R7,LOOP输入源程序,编译无误后,用单步执行的方法,观察各个相应存储单元和寄存器中内容的变化。 11 二、程序转跳表汇编语言源程序ORG00H MOV A,#0MOV A,#1MOV A,#2MOV A,#3LJMP$ADDA,ACC JMPA+DPTR AJMP FUNC0AJMP FUNC1AJMP FUNC2AJMPFUNC3MOV30H,#0MOV31H,#1MOV32H,#2MOV33H,#3END;AJMP为二字节指令,地址偏移量*2;设置基址;跳转到目标地址;设置地址偏移量;设置地址偏移量;设置地址偏移量;设置地址偏移量START:CALL FUNCENTERCALL FUNCENTERCALL FUNCENTERCALL FUNCENTERFUNCENTER:MOVDPTR,#FUNCTAB FUNCTAB:FUNC0:FUNC1:FUNC2:FUNC3:RET RET RETRET输入源程序,编译无误后,用单步执行的方法,观察各个相应存储单元和寄存器中内容的变化。 三、数据排序汇编语言源程序ORG00H EQU EQU10;数据个数50H;数据起始地址;首地址输入到R012SIZE ARRAYFLAG SORT:BIT00H;交换标志MOV R0,#ARRAY MOV R7,#SIZE-1;数据个数减一输入到R7CLR FLAG;交换标志置零COON:MOV A,R0;将首地址中的内容读到A MOVR2,A;将数据写入到R2中INC R0;首地址加一MOVB,R0;将首地址中的内容读到B CJNE A,B,NOTEQUAL;不相等则跳转SJMP NEXTNOTEQUAL:JC NEXT;前小后大,不交换SETB FLAG;前大后小,置交换标志XCH A,R0;交换DEC R0;R0减1XCH A,R0INC R0NEXT:DJNZ R7,COON;R7不等于0时转到GOON(即没有交换完)JB FLAG,SORT;FLAG=1时转到SORT使FLAG清零SJMP$END把数据按从小到大排序S1.asm程序S1.asm ORG0000H MOVR0,#30H MOVR7,#20H MOVDPTR,#1000H LOOP1:CLR AMOVC A,A+DPTR MOVR0,A INC R0INC DPTRDJNZ R7,LOOP1NOP NOPLJMP$ORG1000H DB23H,45H,0A5H,7FH,8DH,0CDH,33H,0BFH DB0FH,66H,9AH,8CH,33H,69H,50H,2DH DB6DH,45H,0FEH,90H,0ABH,3CH,67H,88H DB0EDH,0FFH,00H,21H,63H,9DH,77H,45H END思考题13 四、调试程序 1、在这个程序中的32个数据原来在哪里?这个程序完成了什么操作?【答】在片内程序存储区;把程序存储区的32个数据传送到内部30H数据区 2、如果把MOVC A,A+DPTR改成MOVX A,A+DPTR会发生什么情况?【答】把数据区相应寻址地址里存的数据传送到累加器A 3、程序中的ORG指令起什么作用?【答】用于定位,把ORG之后的程序放在指定的地址里 4、将上述程序修改成将32个数据传送到外部数据区2050H开始的单元中去。 【答】ORG0000H MOVR7,#20H MOVR0,#10H MOVR1,#00H MOVR2,#20H MOVR3,#50H LOOP:CLR AMOV DPH,R0MOV DPL,R1MOVC A,A+DPTR MOVDPH,R2MOV DPL,R3MOVXDPTR,A INC R1INCR3DJNZ R7,LOOP ORG1000H DB23H,45H,0A5H,7FH,8DH,0CDH,33H,0BFH DB0FH,66H,9AH,8CH,33H,69H,50H,2DH DB6DH,45H,0FEH,90H,0ABH,3CH,67H,88H DB0EDH,0FFH,00H,21H,63H,9DH,77H,45H END14实验三汇编语言程序设计(二)实验目的通过上机实验掌握单片机汇编语言程序的编写和调试。 实验基本要求按实验内容上机输入并调试实验程序。 画出实验程序的流程框图。 实验内容 一、调试S2.asm、S3.asm两个程序并完成思考题程序S2.asm ORG0000H MOV30H,#68H MOV31H,#0AFH MOV40H,#9AH MOV41H,#59H MOVR0,#30H MOVR1,#40H MOVR7,#02H CLRC LOOP2:MOV A,R0ADDC A,R1MOVR0,A INCR0INCR1DJNZ R7,LOOP2MOV A,#00H ADDC A,#00H MOVR0,A LJMP$END思考题 1、程序运行结束时,(32H)=01H,(31H)=09H,(30H)=02H 2、观察程序运行时,CY,OV,P,AC标志位的变化。 3、修改原始数据为8421码(压缩BCD码),并把程序改成8421码(压缩BCD码)加法程序,并运行该程序。 ORG0000H15MOV30H,#68H MOV31H,#82H MOV40H,#51H MOV41H,#69H MOVR0,#30H MOVR1,#40H MOVR7,#02H CLRC LOOP:MOV A,R0ADDCA,R1DA AMOVR0,A INCR1INCR0DJNZ R7,LOOP MOV A,#00H ADDCA,#00H MOVR0,A SJMP$END程序S3.asm ORG0000H MOVSP,#60H MOV A,#68H MOVB,#7EH MOVDPTR,#20A8H MOVR0,#74H MOVR1,#49H MOV08H,#30H MOV09H,#50H SETBRS0PUSHDPHPUSHDPLPUSH BPUSHACCMOVR0,A XCHA,B MOVR1,A POPACC POPDPL CLRRS0NOP NOPEND16思考题 1、(A)=68H,(B)=68H,(DPH)=20H,(DPL)=7EH,(SP)=62H, 2、(74H)=00H,(49H)=00H,(30H)=68H,(50H)=7EH保护和恢复现场数据的规则是什么?【答】通过使用堆栈 二、编程并调试B1.asm和B2.asm B1.asm已知(30H)=89H,(31H)=41H,编写并调试一个程序将30H,31H中的内容进行字节分离为四个字节,高四位为零,低四位为分离后的内容,存放在32H35H的单元中。 ORG0000H MOV30H,#89H MOV31H,#41H MOVR0,#30H MOVR1,#32H MOVR7,#02H LOOP:MOV A,R0MOVB,A SWAPA ANLA,#0FH MOVR1,A INCR1MOV A,B ANLA,#0FH MOVR1,A INCR1INCR0DJNZ R7,LOOP SJMP$END B2.asm已知(30H)=89H,(31H)=41H,编写并调试一个程序将30H,31H中的内容进行循环右移五次。 17实验四功能模块一(I/O口)实验目的通过实验掌握单片机的输入输出应用。 实验基本要求按实验内容上机输入并调试实验程序。 画出实验程序的流程框图。 实验内容 11、多路开关指示AT89C51单片机的P1.0P1.3接4个二极管,P1.4P1.7接4个开关,编程读取开关状态,使得对应的发光二极管反映开关状态(开关闭合,对应的灯亮)。 Porteus模型为Multi Switch.DSN如下图所示。 程序设计开关状态检测,对于单片机来说,是检测其I/O口的输入。 可以轮流检测每个开关状态。 根据每个开关的状态让相应的发光二极管指示。 18汇编语言源程序ORG00H START:;读取P1口数据;交换A中高四位与低四位的位置;与0F0H相或;将开关状态送LED显示;转移到START END问题为什么A要与0F0H相或? 2、键盘显示AT89C51的并行口P3上接44键盘,P3.0P3.3为行线,P3.4P3.7位2列线,在数码管上显示每个按键的序号。 Porteus模型为4X4KeyBoard.DSN如下图所示。 程序设计每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码,计算公式为键值=行号行数+列号假设9号键按下,它所在的行号为2,列号为1,该键的行数为4,则键值为24+1=9。 汇编语言源程序LINE EQU30H19ROW VALEQUEQUORG31H32H00H START:MOVDPTR,#TABLE MOV P2,#00H LSCAN:MOV P3,#0F0H L1:JNB P3.0,L2LCALL DELAYJNB P3.0,L2MOV LINE,#00H LJMPRSCAN L2:JNB P3.1,L3LCALL DELAYJNB P3.1,L3MOV LINE,#01H LJMPRSCAN L3:JNB P3.2,L4LCALL DELAYJNB P3.2,L4MOV LINE,#02H LJMPRSCAN L4:JNB P3.3,L1LCALL DELAYJNB P3.3,L1MOV LINE,#03H RSCAN:MOV P3,#0FH C1:JNB P3.4,C2MOV ROW,#00H LJMPCALCU C2:JNB P3.5,C3MOV ROW,#01H LJMPCALCU C3:JNB P3.6,C4MOV ROW,#02H LJMPCALCU C4:JNB P3.7,C1MOV ROW,#03H CALCU:MOV A,LINE MOVB,#04H MULAB ADDA,ROW MOVVAL,A;段码表首地址;数码管显示初始化;列线置高电平,行线置低电平;逐行扫描;存行号;存行号;存行号;存行号;行线列线电平互换;逐列扫描;存列号;存列号;存列号;存列号;根据行号和列号计算键值;存键值20MOVC A,A+DPTR;要据键值查段码MOV P2,A;输出段码显示LJMP LSCANDELAY:MOVR6,#20D1:MOVR7,#250DJNZ R7,$DJNZR6,D1RET TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB7FH,6FH,77H,7CH,39H,5EH,79H,71H END C语言#includeunsigned chartab16=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void dlms()unsigned inti;for(i=250;i0;i-)unsigned charkbscan()unsigned charlscode=0x01,rscode=0x10,line,row,temp;P3=0xf0;if(P3&0x0f)!=0x00)dlms();if(P3&0x0f)!=0x00)P3=0xf0;for(line=0;line4;line+)temp=P3;if(temp=(0xf0|lscode)break;else lscode=lscode1;P3=0x0f;21for(row=0;row4;row+)temp=P3;if(temp=(0x0f|rscode)return(line*4+row);else rscode=rscode0;k-)for(j=20;j0;j-)for(i=248;i0;i-)实验内容2参照键盘显示程序,根据教科书上的例子编写一个行反转法键输入程序,在数码管上显示每个按键的“0F”序号。 24实验五功能模块二(定时器)实验目的通过实验掌握单片机的功能模块定时器不同工作模式的设置和应用。 实验基本要求按实验内容上机输入并调试实验程序。 画出实验程序的流程框图。 实验内容 一、定时器实验AT89C51单片机的实验电路如图所示,P1.0口接一个发光二极管,编写程序,控制发光二极管闪烁,时间间隔1s,要求采用AT89C51单片机的内部定时器计时,用中断方式,采用工作方式2。 Porteus模型为External Interrupt.DSN如下图所示。 程序设计要求设置内部计数器用作定时器,是对机器周期数计数。 每个机器周期的长度是12个振荡器振荡周期。 单片机晶振用12MHz,工作方式2,即8位自动重装方式定时器,定时100微秒中断一次,通过计算,得到定时常数=156,然后对100微秒中断次数计数10000次,就是1s。 汇编语言源程序25ORG TICK00H1000030H40H;10000100us=1s;100us时间常数(12M);100us计数单元256-100EQU T100us EQUC100us EQULEDBUF EQULED BITP1.0SJMP START ORG002BH T0INT:PUSH PSWMOVA,C100us+1JNZ GOONDEC C100us GOON:DEC C100us+1MOVA,C100us ORLA,C100us+1JNZ EXITMOV C100us,#HIGH(TICK)MOV C100us+1,#LOW(TICK)CPL LEDBUFEXIT:POP PSWRETI START:MOV TMOD,#02H MOV TH0,#155MOV TL0,#155MOV IE,#82H SETB TR0CLR LEDBUFCLR LED MOV C100us,#HIGH(TICK)MOV C100us+1,#LOW(TICK)LOOP:MOV C,LEDBUF MOVLED,C LJMP LOOP ENDC语言#includeunsigned intc100us;bit LEDBUF=0x280;sbit LED=P10;void timer0(void)interrupt1using1c100us=c100us-1;跳至主程序;中断服务子程序起始地址;状态保护;秒计数值减1;100us计数器不为0,返回;100us计数器为0,重置计数器;取反LED;中断返回;方式2,定时器;置定时器初值;开中断;开始定时;设置10000次计数值26if(c100us=0)c100us=10000;LEDBUF=!LEDBUF;main()TMOD=0x02;TH0=156;TL0=156;EA=1;ET0=1;TR0=1;LED=0;c100us=10000;for(;)LED=LEDBUF; 二、定时/计数器T0作定时应用用AT89C51的定时器/计数器T0产生2s的定时,每当2s定时到来时,更换指示灯闪亮,每个指示灯闪亮的时间为0.2s,也就是说,开始D1指示灯闪亮0.2s,当2s定时到来之后,D2开始闪亮0.2s,如此循环下去。 0.2s的闪亮时间也由定时/计数器T0完成。 Proteus模型为Timer Application.DSN,如下图所示。 27程序设计要求定时2s,采用16位定时50ms,共定时40次才可达到2s,每50ms产生一次中断,定时的40次数在中断服务程序中完成,同样,对于0.2s的定时,需要4次中断才可以达到0.2s。 由于每次2s定时完成时,D1D4要交替闪亮。 采用ID来识别,当ID=0时,D1在闪亮;当ID=1时,D2在闪亮;当ID=2时,D3在闪亮;当ID=3时,D4在闪亮。 仔细体会在程序中对ID状态的判断,并实现轮流闪亮的编程方法。 汇编语言源程序COUNT EQU30H FLASHEQU31H ORG00H SJMPSTART ORG0BH;定时器0中断入口LJMP INT_T0START:MOV COUNT,#00H MOV FLASH,#00H MOV TMOD,#01H;定时器工作方式1MOV TH0,#60;定时器初值MOV TL0,#176MOV IE,#82H;开中断SETB TR0;启动定时器SJMP$;等待中断INT_T0:MOVA,COUNT CJNE A,#00H,I1;D1闪烁CPL P1.0INC FLASH MOVA,FLASH CJNE A,#40,RETUNE;达到2秒?MOV FLASH,#00H INCCOUNT LJMPRETUNE;D2闪烁I1:CJNEA,#01H,I2CPL P1.1INC FLASH MOVA,FLASH CJNEA,#40,RETUNE;达到2秒?MOV FLASH,#00H INCCOUNT LJMPRETUNE I2:CJNEA,#02H,I3;D3闪烁CPL P1.2INC FLASH MOVA,FLASH CJNEA,#40,RETUNE;达到2秒?MOV FLASH,#00H INCCOUNT LJMPRETUNE28I3:CJNEA,#03H,RETUNE;D4闪烁CPL P1.3INC FLASH MOVA,FLASH CJNEA,#40,RETUNE;达到2秒?MOVFLASH,#00H MOVCOUNT,#00H LJMPRETUNE RETUNE:MOV TH0,#60;恢复初值MOV TL0,#176RETI ENDC语言#includecharCOUNT=0x30;char FLASH=0x31;sbit D1=P10;sbit D2=P11;sbit D3=P12;sbit D4=P13;main()COUNT=0;FLASH=0;TMOD=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;IE=0x82;TR0=1;while (1)void timer0()interrupt1using0TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(COUNT=0)D1=!D1;FLASH+;if(FLASH!=40)return;FLASH=0;COUNT+;29else if(COUNT=1)D2=!D2;FLASH+;if(FLASH!=40)return;FLASH=0;COUNT+;else if(COUNT=2)D3=!D3;FLASH+;if(FLASH!=40)return;FLASH=0;COUNT+;else if(COUNT=3)D4=!D4;FLASH+;if(FLASH!=40)return;FLASH=0;COUNT=0; 三、计数器从AT89C51单片机的P3.4口输入外部时钟,编写程序,对外部脉冲个数进行计数,并将计数值用8位发光二极管以二进制数显示出来。 程序设计要求AT89C51内部定时/计数器用作计数器,外部时间计数脉冲由P3.4引入定时器T0,单片机在每个机器周期采样一次T0引脚的输入波形,如果有跳变,则计数值自动加1。 Proteus模型为Counter Design.DSN,如下图所示。 30汇编语言源程序ORG0000H MOV TMOD,#00000101B;置T0计数器方式1MOV TH0,#0;置T0初值MOV TL0,#0SETB TR0;T0运行LOOP:MOVP1,TL0;记录P1口脉冲个数LJMPLOOP;返回ENDC语言#includevoid main()TMOD=0x05;TH0=0;TL0=0;TR0=1;for(;)P1=TL0;31实验六功能模块三(中断)实验目的通过实验掌握单片机的功能模块中断的设置和应用。 实验基本要求按实验内容上机输入并调试实验程序。 画出实验程序的流程框图。 实验内容 一、外部中断AT89C51单片机的P3.2/INT0引脚接一个开关,模拟外部中断源,编写程序,当外部中断发生时,对其作出响应(以发光二极管的亮/灭来指示)。 程序设计外部中断的初始化设置共有三项内容中断总允许即EA=“1”,外部中断允许即EXi=“1”,中断方式设置。 中断方式设置一般有两种方式,即电平方式和脉冲方式,这里采用脉冲方式,当前一次为高电平后一次为低电平时为有效中断请求。 因此高电平状态和低电平状态至少维持一个周期,中断请求信号由引脚INT0(P3.2)和INT1(P3.3)引入。 Proteus模型为External Interrupt.DSN。 32汇编语言源程序LED ORGLJMP BIT00H STARTP1.030H LEDBUFEQU;中断入口地址;中断处理指令LEDBUF LEDCLR START:CLR;外部中断0下降沿触发;打开外部中断允许位(EX0)及总中断允许位(EA)LJMP$;等待中断INTERRUPT:;保护现场CPL LEDBUF;取反LEDMOVC,LEDBUF MOVLED,C POPPSW;恢复现场RETI ENDC语言#includebit LEDBUF=0x280;sbit LED=P10;void int0()interrupt0using1LEDBUF=!LEDBUF;LED=LEDBUF;main()LEDBUF=0;TCON=0x01;IE=0x81;for(;)33 二、方波发生器1)方波发生器采用T0工作在定时器方式1,实现周期为100ms的方波输出。 接线如下图所示。 实验模型为Square WaveGenerator.DSN。 由虚拟示波器观察和测量P3.0,P3.1的输出波形。 程序设计要求计算定时器初值,用中断方式工作,初始化定时器。 在中断服务程序中实现方波输出。 ORG0000H SJMPMAIN ORG000BH SJMPD_T0ORG0030H MAIN:MOVTMOD,#01H MOVP3,#0FEH MOV TH0,#3CH MOV TL0,#0B0H MOV IE,#0FFH SETBTR0SJMP$D_T0:CLR TR0CLR EACPL P3.0CPL P3.1MOVTH1,#3CH MOVTL1,#0B0H SETBTR0SETB EARETI END342)利用中断从P3.0输出连续脉冲方波,f osc=6MHz,脉冲方波高低脉宽都为100us。 ORG0000H LJMPSTR ORG0100H STR:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论