当前位置:文档之家› 单片机试验源程序文件

单片机试验源程序文件

单片机实验指导书(实验源程序)实验二、三 I/O接口实验1、输出实验例1:ORG 0000HAJMP START ;跳转到初始化程序ORG 0033H;----- 主程序开始 -----START: MOV P1,#0FFH ;是所有LED熄灭ACALL DELAY ;调用延时子程序CLR P1.0 ;P1.0输出低电平,使LED3点亮ACALL DELAY ;调用延时子程序SETB P1.0 ;P1.0输出高电平,使LED3熄灭CLR P1.1 ;P1.1输出低电平,使LED4点亮ACALL DELAY ;调用延时子程序SETB P1.1 ;P1.1输出高电平,使LED4熄灭CLR P1.2 ;P1.2输出低电平,使LED5点亮ACALL DELAY ;调用延时子程序SETB P1.2 ;P1.2输出高电平,使LED5熄灭CLR P1.3 ;P1.3输出低电平,使LED6点亮ACALL DELAY ;调用延时子程序MOV P1, #0F0H ;LED3~LED6全部发光ACALL DELAY ;调用延时子程序AJMP START ;返回到标号START处再循环;----- 延时子程序 -----DELAY: MOV R5,#10LOOP: MOV R6,#200LOOP1: MOV R7,#250LOOP2: DJNZ R7,LOOP2DJNZ R6,LOOP1DJNZ R5,LOOPRET例2:ORG 0000HAJMP START ;跳转到初始化程序ORG 0033H;----- 主程序开始 -----START: MOV P1,#0FFH ;是所有LED熄灭ACALL DELAY ;调用延时子程序MOV ACC,#0FEH ;ACC中先装入LED3亮的数据(二进制的11111110) MOV P1,ACC ;将ACC的数据送P1口ACALL DELAY ;调用延时子程序MOV R0,#03H ;上句送到P1口的数据就点亮了LED1,所以将数据再移动3次就完成一个4位流水过程LOOP3: RL A ;将ACC中的数据左移一位MOV P1,A ;把ACC移动过的数据送p1口显示ACALL DELAY ;调用延时子程序DJNZ R0,LOOP3 ;没有移动够4次继续移动MOV P1, #0F0H ;LED3~LED6全部发光ACALL DELAY ;调用延时子程序AJMP START ;返回到标号START处再循环;----- 延时子程序 -----DELAY: MOV R5,#10LOOP: MOV R6,#200LOOP1: MOV R7,#250LOOP2: DJNZ R7,LOOP2DJNZ R6,LOOP1DJNZ R5,LOOPRET2、输入实验例1:;****************************************************************;* K1控制LED3亮灭交替 *;****************************************************************org 0star: mov p1,#0hmov p3,#0ffhst1: jb p3.2,$jnb p3.2,$cpl p1.0sjmp st1end例2:;****************************************************************************** ;* 按压实验板上的按钮K1,控制P1.0的LED亮灭 * ;* 按压K1,LED点亮,再次按压K1,LED熄灭 * ;* 程序没有进行按键消抖动处理,控制结果会因为按键抖动而出错 * ;* 按压K1十次,大概有3~5次输出会因为按键抖动而发生错误 * ;* 实验时请多按几次,观察一下效果,加深对按键消抖动重要性的认识 * ;******************************************************************************ORG 0000HAJMP START ;跳转到初始化程序ORG 0033HSTART: MOV SP,#60H ;SP初始化MOV P3,#0FFH ;端口初始化MAIN: JB P3.2,MAIN ;检测按键K1有没有按下CPL P1.0 ;执行按键命令,改变P1.0指示灯状态JNB P3.2,$ ;等待按键K1释放AJMP MAIN ;返回重新检测按键END例3:;****************************************************************************** ;* 按压实验板上的按钮K1,控制P1.0的LED亮灭 * ;* 按压K1,LED点亮,再次按压K1,LED熄灭 * ;* 程序进行了按键消抖动处理,不会出现控制结果出错的现象 * ;* 由此可以看出按键软件消抖动的功效 * ;******************************************************************************ORG 0000HAJMP START ;跳转到初始化程序ORG 0033HSTART: MOV SP,#60H ;SP初始化MOV P3,#0FFH ;端口初始化MAIN: JB P3.2,MAIN ;检测按键P3.2有没有按下ACALL YS20ms ;消前沿抖动延时,实现软件去抖动JB P3.2,MAIN ;再次检测按键,如果为高电平,则是抖动CPL P1.0 ;执行按键命令,改变P1.0指示灯状态JNB P3.2,$ ;等待按键释放AJMP MAIN ;返回重新检测按键YS20ms: MOV R7,#40 ;延时20ms子程序YS1: MOV R6,#229DJNZ R6,$DJNZ R7,YS1RET实验四多级外部中断控制实验例程:;************************************************************************ ;* INT0,INT1为边沿触发方式,INT1为高级中断*;* 主程序中8个LED轮流闪烁 * ;* 外中断程序0中,8个指示灯同时闪烁8次*;* 外中断程序1中,左右4个指示灯交替闪烁*;* 因为INT1为高级中断,所以INT1中断可以中断INT0中断程序 * ;* 即当按压K1进入外中断0时,8个LED同时闪烁,此时按压K2可以中断 * ;* TIN0的执行。

相反,当INT1中断后,按压K1则不能中断INT1的执行 *;************************************************************************ ORG 0000HAJMP STARTORG 0003HJMP PGINT0ORG 0013HJMP PGINT1ORG 0033HSTART: MOV P0,#0FFHMOV P1,#0FFHMOV P2,#0FFHMOV P3,#0FFHMAIN: MOV IE,#10000101B ;INT0,INT1中断使能MOV IP,#00000100B ;INT1中断优先MOV TCON,#00000000B ;INT0,INT1为电平触发MOV SP,#60HMOV A,#0FEHLOOP: MOV P1,ACALL DELAYRL AJMP LOOPJMP MAINPGINT0: PUSH ACCMOV R2,#8LOOP0: MOV P1,#00HCALL DELAYMOV P1,#0FFHCALL DELAYDJNZ R2,LOOP0POP ACCRETIPGINT1: PUSH ACCMOV R3,#8LOOP1: MOV P1,#0FHCALL DELAYMOV P1,#0F0HCALL DELAYDJNZ R3,LOOP1POP ACCRETI;******** 延时子程序 ********DELAY: MOV R4,#80D1: MOV R5,#10D2: MOV R6,#228DJNZ R6,$DJNZ R5,D2DJNZ R4,D1RETEND实验五定时器/计数器实验程序一:ORG 0000HAJMP STARTORG 000BH ;定时器0的中断向量地址AJMP TIME0 ;跳转到真正的定时器程序处ORG 0030HSTART:MOV P1,#0FFH ;关所有灯MOV TMOD,#00000001B ;定时/计数器0工作于方式1MOV TH0,#15HMOV TL0,#0A0H ;即数5536SETB EA ;开总中断允许SETB ET0 ;开定时/计数器0允许SETB TR0 ;定时/计数器0开始运行LOOP: AJMP LOOP ;真正工作时,这里可写任意程序TIME0: ;定时器0的中断处理程序PUSH ACCPUSH PSW ;将PSW和ACC推入堆栈保护CPL P1.0MOV TH0,#15HMOV TL0,#0A0H ;重置定时常数POP PSWPOP ACCRETIEND程序二:ORG 0000HAT0: MOV P1,#0FFHMOV TMOD,#61H ;设置T1为计数器,工作于方式2;设置T0为定时器,工作于方式1 MOV TL1,#246MOV TH1,#246SETB TR1AT1: CPL P1.7AT2: MOV TL0,#00H ;MOV TH0,#4CH ;即数15536SETB TR0JNB TF0,$ CLR TF0CPL P1.0JNB TF1,AT2 CLR TF1SJMP AT1END实验六数码管显示实验;**********数码管显示"6"的程序1 **********MAIN: CLR P0.0 ;P0.0输出低电平,点亮数码管段码"a"SETB P0.1 ;P0.1输出高电平,熄灭数码管段码"b"CLR P0.2 ;P0.2输出低电平,点亮数码管段码"c"CLR P0.3 ;P0.3输出低电平,点亮数码管段码"d"CLR P0.4 ;P0.4输出低电平,点亮数码管段码"e"CLR P0.5 ;P0.5输出低电平,点亮数码管段码"f"CLR P0.6 ;P0.6输出低电平,点亮数码管段码"g"SETB P0.7 ;P0.7输出高电平,熄灭数码管段码"dp"CLR P2.0 ;P2.0输出低电平,选通数码管DG1SETB P2.1 ;P2.1输出高电平,不选通数码管DG2SETB P2.2 ;P2.2输出高电平,不选通数码管DG3SETB P2.3 ;P2.3输出高电平,不选通数码管DG4SETB P2.4 ;P2.4输出高电平,不选通数码管DG5SETB P2.5 ;P2.5输出高电平,不选通数码管DG5AJMP MAIN ;跳转到开始重新进行END ;程序结束;**********数码管显示"6"的程序2 **********MAIN: MOV P0,#82H ;将数字"6"的段码输出到P0口MOV P2,#0FEH ;从P2口输出数码管选通代码,让DG1显示,其它数码管关闭 AJMP MAIN ;跳转到开始重新进行END ;程序结束;****************************************************************;* ------ 在数码管上动态显示"89C51" ------ *;****************************************************************MAIN: MOV P0,#80H ;第1位数码管显示“8”CLR P2.5 ;允许第1位数码管显示ACALL DELAY ;显示延时一段时间MOV P0,#0FFH ;清除P0口字形码MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示MOV P0,#90H ;第2位数码管显示“9”CLR P2.4 ;允许第2位数码管显示ACALL DELAY ;显示延时一段时间MOV P0,#0FFH ;清除P0口字形码MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示MOV P0,#0C6H ;第3位数码管显示“C”CLR P2.3 ;允许第3位数码管显示ACALL DELAY ;显示延时一段时间MOV P0,#0FFH ;清除P0口字形码MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示MOV P0,#92H ;第4位数码管显示“5”CLR P2.2 ;允许第4位数码管显示ACALL DELAY ;显示延时一段时间MOV P0,#0FFH ;清除P0口字形码MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示MOV P0,#0F9H ;第5位数码管显示“1”CLR P2.1 ;允许第5位数码管显示ACALL DELAY ;显示延时一段时间MOV P0,#0FFH ;清除P0口字形码MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示AJMP MAIN ;跳转到开始重新进行;******** 延时子程序 ********DELAY: MOV R1,#10Y1: MOV R2,#100DJNZ R2,$DJNZ R1,Y1RETEND。

相关主题