R4 内存块移动; 移动3000H --> 4000H, 256 字节mov r0, #30h ;设置块的源地址mov r1, #00hmov r2, #40h ;设置块的目标地址mov r3, #00hmov r7, #25 ;设置移动长度25Loop:mov dph, r0mov dpl, r1movx a, @dpt ;从源地址取数mov dph, r2mov dpl, r3movx @dptr, a ;保存到目标地址cjne r1, #0ffh, Goon1;若r1不等于0ffh,则Goon1inc r0 ;;源地址加高8位加Goon1:inc r1 ;源地址加低8位加1cjne r3, #0ffh, Goon2inc r2Goon2:inc r3 ;目标地址加1djnz r7, Loop ;是否移动完ljmp $endR5 程序跳转org 0ljmp StartFunc0: mov a, #0retretFunc2: mov a, #2retFunc3: mov a, #3retFuncEnter:add a, acc ; ajmp 为二字节指令, 调用号X 2mov dptr, #FuncTabjmp @a+dptrFuncTab:ajmp Func0ajmp Func1ajmp Func2ajmp Func3Start:mov a, #0call FuncEntermov a, #1call FuncEntermov a, #2call FuncEntermov a, #3call FuncEnterljmp $endR6 数据排序Size equ 10 ; 数据个数Array equ 50h ; 数据起始地址Change equ 0 ; 交换标志Sort:mov r0, #Arraymov r7, #Size-1clr ChangeGoon:mov r2, ainc r0mov B, @r0cjne a, B, NotEqualsjmp NextNotEqual:jc Next ; 前小后大, 不交换setb Change ; 前大后小, 置交换标志xch a, @r0 ; 交换dec r0xch a, @r0inc r0Next:djnz r7, Goonjb Change, Sortljmp $endH1AP1口输入输出Loop:mov a, #01hmov r2, #8Output:mov P1, arl acall Delaydjnz r2, Outputljmp LoopDelay:mov r6, #0mov r7, #0DelayLoop:djnz r6, DelayLoopdjnz r7, DelayLoopretendH1BKeyLeft equ P1.0KeyRight equ P1.1LedLeft equ P1.2LedRight equ P1.3SETB KeyLeftSETB KeyRight Loop:MOV C,KeyLeftMOV LedLeft,CMOV C,KeyRightMOV Ledright,CLJMP LoopENDH2继电器控制Output equ P1.0 ; P1.0 portLoop:clr cmov Output,ccall Delaysetb cmov Output,ccall Delayljmp LoopDelay:mov r6, #0mov r7, #0 DLoop:djnz r7, DLoopdjnz r6, DLoopretendH3 74LS245读入数据CS245 equ 8000horg 0000hLoop:mov dptr,#CS245movx a, @dptrljmp LoopendH4 74LS273输出数据CS273 equ 8000hmov dptr, #CS273mov a, #1Loop:movx @dptr, arl anopljmp LoopendH5; 输出50% (5:5) 占空比PWM; 输出10% (1:9) 占空比PWM; 输出90% (9:1) 占空比PWMOUTPUT equ P1.0Loop:clr OUTPUTmov A, #3call Delaysetb OUTPUTmov a, #7call Delayljmp LoopDelay:mov r0, #0DLoop:djnz r0, DLoopdjnz acc, DLoopretendH6 音频控制Speaker equ P1.0Loop:clr Speakercall Delaysetb Speakercall Delayljmp LoopDelay:mov r0, #50djnz r0, $retendH7 用8255输入输出mode equ 082h ; 方式0,PA,PC输出,PB输入PortA equ 8000h ; Port APortB equ 8001h ; Port BPortC equ 8002h ; Port CCAddr equ 8003h ; 控制字地址org 0hmov a, #modemov dptr, #CAddrmovx @dptr,a ; 输出控制字;实验1:PortA输出EX_A:mov a,#80Hmov dptr,#PortAmov b,#8HOutA:movx @dptr,a ; 输出PortArr a ; 移位mov r5,#1call delay ; 延时djnz b, OutA;实验2:PortB 输入PortA 输出EX_B:mov dptr,#PortBmovx a,@dptr ; 读入PortBmov dptr,#PortAmovx @dptr,a ; 输出到PortAmov r5,#2call delayljmp 0delay:mov r7,#0ddd: djnz r7,ddddjnz r6,ddddjnz r5,dddretendH8Amov SCON, #0 ; 串口方式0mov a, #0aahmov SBUF, a ; 输出55hjnb ti, $clr tiljmp $endH8BLD equ P1.0DAT equ P1.1CLK equ P1.2setb CLKclr LDsetb LDmov r7, #8Next:rr amov c, DATmov ACC.7, cclr CLKsetb CLKdjnz r7, Nextljmp $endH9mov dptr, #8234hmov a, #56hmovx @dptr, amov dptr, #9234hmovx @dptr, amov TMOD, #00000101b ; 方式1,记数器mov TH0, #0mov TL0, #0setb TR0 ; 开始记数Loop:mov P1, TL0 ; 将记数结果送P1口ljmp LoopendH9ALD equ P1.0clr LDsetb LDmov SCON, #00010000bWait: jnb RI, Waitmov a, SBUFclr riljmp $endH9BLD equ P1.0DAT equ P1.1CLK equ P1.2setb CLKclr LDsetb LDmov r7, #8Next:rr amov c, DATmov ACC.7, cclr CLKsetb CLKdjnz r7, Nextljmp $endH10mov TMOD, #00000101b ; 方式1,记数器mov TH0, #0mov TL0, #0setb TR0 ; 开始记数Loop:mov P1, TL0 ; 将记数结果送P1口ljmp LoopendH11LED equ P1.0LEDBuf equ 0ljmp Startorg 3Interrupt0:push PSW ; 保护现场cpl LEDBuf ; 取反LEDmov c, LEDBufmov LED, cpop PSW ; 恢复现场retiStart:clr LEDBufclr LEDmov TCON, #01h ; 外部中断0下降沿触发mov IE, #81h ; 打开外部中断允许位(EX0)及总中断允许位(EA)ljmp $endH12Tick equ 10000 ; 10000 x 100us = 1sT100us equ 256-50 ; 100us时间常数(6M)C100us equ 30h ; 100us记数单元LEDBuf equ 0LED equ P1.0ljmp Startorg 000bhT0Int:push PSWmov a, C100us+1jnz Goondec C100usGoon:dec C100us+1mov a, C100usorl a, C100us+1jnz Exit ; 100us 记数器不为0, 返回mov C100us, #high(Tick)mov C100us+1, #low(Tick)cpl LEDBuf ; 100us 记数器为0, 重置记数器; 取反LEDExit:pop PSWretiStart:mov TMOD, #02h ; 方式2, 定时器mov TH0, #t100usmov TL0, #t100usmov IE, #10000010b ; EA=1, IT0 = 1setb TR0 ; 开始定时clr LEDBufclr LEDmov C100us, #high(Tick)mov C100us+1, #low(Tick)Loop:mov c, LEDBufmov LED, cljmp LoopendH13 D/ACS0832 equ 0a000hmov dptr, #CS0832mov a, #00hmovx @dptr, amov a, #40hmovx @dptr, amov a, #80hmovx @dptr, amov a, #0c0hmovx @dptr, amov a, #0ffhmovx @dptr, aljmp $endH14 A/Dmode equ 082h ; 方式0,PA,PC输出,PB输入CS0809 equ 8000hPortA equ 9000h ; Port APortB equ 9001h ; Port BPortC equ 9002h ; Port CCAddr equ 9003h ; 控制字地址org 0mov dptr,#CAddrmov a,#modemovx @dptr,amov dptr, #CS0809mov a, #0movx @dptr, a ; 起动A/Dmov a, #40hdjnz ACC, $ ; 延时> 100usmovx a, @dptr ; 读入结果mov r7,#100dly:mov dptr,#PortAmovx @dptr,adjnz r7,dly ;延时ljmp 0endH15 外部中断Flash equ 0 ; LED状态STOP equ 1SR equ p1.0 ; 南北红灯SY equ p1.1 ; 南北黄灯SG equ P1.2 ; 南北绿灯ER equ P1.3 ; 东西红灯EY equ P1.4 ; 东西黄灯EG equ p1.5 ; 东西绿灯ljmp Startorg 3setb STOP ; 南北, 东西均红灯retiStart:mov SP, #70mov TCON, #01h ; down edge IT0mov IE, #81h ; enable EA, EX0setb SR ; 南北, 东西均红灯clr SYclr SGclr EYclr EGclr STOPLoop:jb STOP, AllRedsetb SR ; 南北红灯, 东西绿灯clr SYclr SGclr ERclr EYsetb EGmov a, #20call Delayjb STOP, AllRedsetb SR ; 南北红灯, 东西黄灯闪clr SYclr SGclr ERclr EYclr EGclr Flashmov r7, #9Loop1:mov c, Flashmov EY, cmov a, #1call Delaycpl Flashdjnz r7, Loop1jb STOP, AllRedclr SR ; 南北绿灯, 东西红灯clr SYsetb SGsetb ERclr EGmov a, #20call Delayjb STOP, AllRedclr SR ; 东西红灯, 南北黄灯闪clr SYclr SGsetb ERclr EYclr EGclr Flashmov r7, #9Loop2:mov c, Flashmov SY, cmov a, #1call Delaycpl Flashdjnz r7, Loop2ljmp LoopAllRed:setb SRclr SYclr SGsetb ERclr EYclr EGclr STOPmov a, #10call Delayljmp LoopDelay: ; 延时子程序mov r1, #80Hmov r0, #0DelayLoop:jb STOP, ExitDelaydjnz r0, DelayLoopdjnz r1, DelayLoopdjnz ACC, DelayExitDelay:retendH16 八段数码管显示OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲Num equ 70h ; 显示的数据DelayT equ 75h ;ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #01call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管retStart:mov sp, #40hmov Num, #0MLoop:inc Nummov a, Nummov b, amov r0, #LEDBufFillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ; 数字转换成显示码mov @r0,a ; 显示在码填入显示缓冲inc r0inc bcjne r0, #LEDBuf+6, FillBufmov DelayT,#30DispAgain:call DisplayLED ; 显示djnz DelayT,DispAgainljmp MLoopendH17 键盘扫描OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲Num equ 70h ; 显示的数据DelayT equ 75h ;ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #01call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管retStart:mov sp, #40hmov Num, #0MLoop:inc Nummov a, Nummov b, amov r0, #LEDBufFillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ; 数字转换成显示码mov @r0,a ; 显示在码填入显示缓冲inc r0inc bcjne r0, #LEDBuf+6, FillBufmov DelayT,#30DispAgain:call DisplayLED ; 显示djnz DelayT,DispAgainljmp MLoopendOUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr, amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, LoopretTestKey:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 输出线置为0mov dptr, #INmovx a, @dptr ; 读入键状态cpl aanl a, #0fh ; 高四位不用retKeyTable: ; 键码定义db 16h, 15h, 14h, 0ffhdb 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07hGetKey:mov dptr, #OUTBITmov P2, dphmov r0, #Low(IN)mov r1, #00100000bmov r2, #6KLoop:mov a, r1 ; 找出键所在列cpl amovx @dptr, acpl arr amov r1, a ; 下一列movx a, @r0cpl aanl a, #0fhjnz Goon1 ; 该列有键入djnz r2, KLoopmov r2, #0ffh ; 没有键按下, 返回0ffhsjmp ExitGoon1:mov r1, a ; 键值= 列X 4 + 行mov a, r2dec arl arl amov r2, a ; r2 = (r2-1)*4mov a, r1 ; r1中为读入的行值mov r1, #4LoopC:rrc a ; 移位找出所在行jc Exitinc r2 ; r2 = r2+ 行值djnz r1, LoopCExit:mov a, r2 ; 取出键码mov dptr, #KeyTablemovc a, @a+dptrmov r2, aWaitRelease:mov dptr, #OUTBIT ; 等键释放clr amovx @dptr, amov r6, #10call Delaycall TestKeyjnz WaitReleasemov a, r2retStart:mov sp, #40hmov LEDBuf+0, #0ffh ; 显示8.8.8.8.mov LEDBuf+1, #0ffhmov LEDBuf+2, #0ffhmov LEDBuf+3, #0ffhmov LEDBuf+4, #0mov LEDBuf+5, #0MLoop:call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop ; 无键入, 继续显示call GetKey ; 读入键码anl a, #0fh ; 显示键码mov dptr, #LEDMapmovc a, @a+dptrmov LEDBuf+5, aljmp MLoopendH18 电子时钟OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲Hour equ 40hMinute equ 41hSecond equ 42hC100us equ 43hTick equ 10000T100us equ 256-50ljmp Startorg 000bhT0Int:push PSWpush ACCmov a, C100us+1jnz Goondec C100usGoon:dec C100us+1mov a, C100usorl a, C100us+1jnz Exitmov C100us, #high(Tick)mov C100us+1, #low(Tick)inc Secondmov a, Secondcjne a, #60, Exitmov Second, #0inc Minutemov a, Minutecjne a, #60, Exitmov Minute, #0inc Hourmov a, Hourcjne a, #24, Exitmov Hour, #0Exit:pop ACCpop PSWretiDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h DisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loopret; ===============================================ToLED:mov dptr, #LEDMapmovc a, @a+dptrretStart:mov TMOD, #02h ; 模式2, 定时器mov TH0, #T100usmov TL0, #T100usmov IE, #10000010b ; EA=1, IT0 = 1mov Hour, #0mov Minute, #0mov Second, #0mov C100us, #high(Tick)mov C100us+1, #low(Tick)setb TR0 ; 启动定时器0MLoop:mov a, Hourmov b, #10div abcall ToLEDmov LEDBuf, amov a, bcall ToLEDorl a, #80hmov LEDBuf+1, amov a, Minutemov b, #10div abcall ToLEDmov LEDBuf+2, amov a, bcall ToLEDorl a, #80hmov LEDBuf+3, amov a, Secondmov b, #10div abcall ToLEDmov LEDBuf+4, amov a, bcall ToLEDmov LEDBuf+5, acall DisplayLEDljmp MLoopendH19OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口HasRcv equ 20h.0 ; 接收标志位LEDBuf equ 40h ; 显示缓冲RCVBuf equ 50H ; 接收缓冲ORG 0000HLJMP START; 串行口中断程序ORG 0023HJNB TI,S0_RCLR TINOPSJMP S0_RETS0_R: ; 接收数据CLR RIMOV RCVBUF,SBUF ; 保存数据SETB HasRcv ; 提示收到数据NOPS0_RET:RETILEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, LoopretTestKey:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 输出线置为0mov dptr, #INmovx a, @dptr ; 读入键状态cpl aanl a, #0fh ; 高四位不用retKeyTable: ; 键码定义db 16h, 15h, 14h, 0ffhdb 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07hGetKey:mov dptr, #OUTBITmov P2, dphmov r0, #Low(IN)mov r1, #00100000bKLoop:mov a, r1 ; 找出键所在列cpl amovx @dptr, acpl arr amov r1, a ; 下一列movx a, @r0cpl aanl a, #0fhjnz Goon1 ; 该列有键入djnz r2, KLoopmov r2, #0ffh ; 没有键按下, 返回0ffhsjmp ExitGoon1:mov r1, a ; 键值= 列X 4 + 行mov a, r2dec arl arl amov r2, a ; r2 = (r2-1)*4mov a, r1 ; r1中为读入的行值mov r1, #4LoopC:rrc a ; 移位找出所在行jc Exitinc r2 ; r2 = r2+ 行值djnz r1, LoopCExit:mov a, r2 ; 取出键码mov dptr, #KeyTablemovc a, @a+dptrmov r2, aWaitRelease:mov dptr, #OUTBIT ; 等键释放clr amovx @dptr, amov r6, #10call Delaycall TestKeyjnz WaitReleasemov a, r2retSTART:MOV SP, #60HMOV IE, #0 ; DISABLE ALL INTERRUPTMOV TMOD,#020H ; 定时器1工作于方式2 (8位重装)MOV TH1, #0F3H ; 波特率?2400BPS @ 12MHzMOV TL1, #0F3HANL PCON,#07FH ; SMOD 位清零orl PCON,#80hMOV SCON,#050H ; 串行口工作方式设置MOV LEDBuf, #0ffh ; 显示8.8.8.8.mov LEDBuf+1, #0ffhmov LEDBuf+2, #0ffhmov LEDBuf+3, #0ffhmov LEDBuf+4, #0mov LEDBuf+5, #0SETB TR1SETB ESSETB EA;mov sbuf,a;jnb ti,$MLoop:jb HasRcv, RcvData ; 收到数据?call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop ; 无键入, 继续显示call GetKey ; 读入键码anl a, #0fh ; 通讯口输出键码MOV SBUF,ALJMP MLoopRcvData:clr HasRcv ; 是mov a, RcvBuf ; 显示数据anl a,#0fh ; 显示低位mov dptr, #LEDMapmovc a, @a+dptrmov LEDBuf+5, amov a,bswap a ; 显示高位anl a,#0fhmov dptr, #LEDMapmovc a, @a+dptrmov LEDBuf+4, aljmp MLoopENDH20 打印机; printer; ASM for MCS51mode equ 082hdport equ 08000h ; PA口,数据口status equ 08001h ; PB.0 忙状态ctl equ 08002h ; PC.0 选通控制contrl equ 08003h ; 8255 控制口stb equ 0 ; 选通位busy equ 0 ; 忙状态位org 0hjmp startdelay:mov r6,#0mov r7,#0dd: nopdjnz r7,dddjnz r6,ddretprint:push dphmov b,amov dptr, #statusrd_status:movx a,@dptr ; 读打印机状态jb acc.busy, rd_status ; 若忙,等待mov dptr,#dport ; 数据送出mov a,bmovx @dptr,amov dptr,#ctl ; 输出选通脉冲mov a,#1movx @dptr,amov a,#0movx @dptr,apop dplpop dphretstart:mov dptr, #contrlmov a, #modemovx @dptr,amov dptr, #string ; 被打印字串nextchar:clr amovc a,@a+dptrjnz prtchar ; 字串结束jmp $prtchar:call printinc dptr ; 下一字符jmp nextcharnopstring:db 'Hello World!',0dh,0ahdb 'I can print now',0dh,0ah,0ch,0,0endH21 直流电机; DC motor; ASM for MCS51mode equ 082hSTA TUS equ 08000hPORTA equ 08000hCTL equ 08003hCS0832 equ 09001hDC_P equ 0count0 equ 40count1 equ 41org 0hjmp startdelay:mov r5,#10mov r6,#0mov r7,#0ddd:djnz r7,ddddjnz r6,ddddjnz r5,dddretread:mov TMOD, #01 ; 16位计时clr TR0mov TH0, #0mov TL0, #0mov dptr, #STA TUSr_0: movx a,@dptrjnb acc.DC_P, r_0 ; 等待低电平完r_1: movx a,@dptrjb acc.DC_P, r_1 ; 等待高电平完setb TR0r_2: movx a,@dptrjnb acc.DC_P, r_2 ; 等待低电平完r_3: movx a,@dptrjb acc.DC_P, r_3 ; 等待高电平完clr TR0mov count0,TH0mov count1,TL0retstart:mov dptr, #CS0832mov a, #0ffhmovx @dptr, acall delay ; 等待电机运转稳定call read ; 读取时间mov dptr, #CS0832 ; 设断点,观察上次时间mov a, #0c0hmovx @dptr, acall delay ; 等待电机运转稳定call readmov dptr, #CS0832 ; 设断点,观察上次时间mov a, #040h ; 电机反转movx @dptr, acall delay ; 等待电机运转稳定call read ; 读取时间mov dptr, #CS0832 ; 设断点,观察上次时间mov a, #00h ; 电机反转加速movx @dptr, acall delay ; 等待电机运转稳定call readljmp $ ; 设断点,观察上次时间endH22 步进电机; step motor control; ASM for MCS51mode equ 082hcontrl equ 08003hctl equ 08000hAstep equ 01hBstep equ 02hCstep equ 04hDstep equ 08hdly_c equ 60horg 0hstep:mov a,#modemov dptr,#contrlmovx @dptr,amov dptr,#8002hmov a,#0movx @dptr,amov dly_c,#10hjmp loop1; 单/双八拍工作方式loop:mov dptr, #ctlmov a,#Astepmovx @dptr,acall delaymov a,#Astep+Bstepmovx @dptr,acall delaymov a,#Bstepmovx @dptr,acall delaymov a,#Bstep+Cstepmovx @dptr,acall delaymov a,#Cstepmovx @dptr,acall delaymov a,#Cstep+Dstepmovx @dptr,acall delaymov a,#Dstepmovx @dptr,acall delaymov a,#Dstep+Astepmovx @dptr,acall delaymov a, dly_cdec a ; 提高转速cjne a,#1, nn1 ; 最快速度inc ann1: mov dly_c,aljmp Loop; 双四拍工作方式loop1:mov dptr,#ctlmov a, #Astep+Bstepmovx @dptr,acall delaymov a, #Bstep+Cstepmovx @dptr,acall delaymov a, #Cstep+Dstepmovx @dptr,acall delaymov a, #Dstep+Astepmovx @dptr,acall delaymov a, dly_cdec acjne a,#2, nn2inc ann2: mov dly_c,ajmp loop1; 单四拍工作方式loop2:mov dptr,#ctlmov a,#Dstepmovx @dptr,acall delaymov a,#Cstepmovx @dptr,acall delaymov a,#Bstepmovx @dptr,acall delaymov a,#Astepmovx @dptr,acall delaymov a, dly_cdec acjne a,#3, nn3inc ann3: mov dly_c,ajmp loop2delay:mov r6,dly_cdd1:mov r7,#0djnz r7,$djnz r6,dd1retendH23 温度传感器LowTemp equ -99 ; A/D 0HighTemp equ 99 ; A/D 255ADPort equ 09000hCurTemp equ 51hOUTBIT equ 08002hOUTSEG equ 08004h ; 段控制口IN equ 08001hLEDBuf equ 60hORG 0000Hljmp StartLEDMAP:db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay:mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:mov r0, #LEDBufmov r1, #6mov r2, #00100000bLoop:mov dptr, #OUTBITmov a, #0movx @dptr, amov a, @r0mov dptr, #OUTSEGmovx @dptr, amov dptr, #OUTBITmov a, r2movx @dptr, amov r6, #1call Delaymov a, r2rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, aret; ================================ DisplayResult:mov a, CurTempjnb acc.7, GE0mov LEDBuf, #40h ; '-'dec acpl ajmp GoonGE0:mov LEDBuf, #0 ; ' ' Goon:mov b, #10div abmov dptr, #LEDMAPmovc a, @a+dptrmov LEDBuf+1, amov a, bmovc a, @a+dptrmov LEDBuf+2, amov LEDBuf+3, #0 ; ' 'mov LEDBuf+4, #0 ; ' 'mov LEDBuf+5, #0 ; ' 'retReadAD:mov dptr, #ADPortclr amovx @dptr, a ; start A/Dmov a, #80djnz acc, $ ; delaymovx a, @dptrmov b,amov a,#0ffhclr csubb a,bretReadTemp:mov r1, #0mov r2, #0mov r0, #16RLoop:call ReadADadd a, r2mov r2, ajnc GN1inc r1GN1:djnz r0, RLoopmov a, r2swap aanl a, #0fhxch a, r1swap aanl a, #0f0horl a, r1 ; a = r1r2/16mov b, #(HighTemp-LowTemp)mul abmov a, b ; /256add a, #LowTempmov CurTemp, aretStart:mov sp, #70hMLoop:call DisplayResultcall DisplayLEDcall ReadTempsjmp MLoopendH24 液晶CW ADD1 EQU 08000H ;写指令代码地址(E1)DW ADD1 EQU 08001H ;写显示数据地址(E1)CRADD1 EQU 08002H ;读状态字地址(E1)DRADD1 EQU 08003H ;读显示数据地址(E1)CW ADD2 EQU 08004H ;写指令代码地址(E2)DW ADD2 EQU 08005H ;写显示数进地址(E2)CRADD2 EQU 08006H ;读状态字地址(E2)DRADD2 EQU 08007H ;读显示数据地址(E2)PD1 EQU 3DH ;122/2 分成左右两半屏122x32COLUMN EQU 30HPAGE_ EQU 31H ;页地址寄存器D1,DO:页地址CODE_ EQU 32H ;字符代码寄存器COUNT EQU 33H ;计数器DIR equ 34hdtp1 equ 35hdtp2 equ 36hdtp3 equ 37hCTEMP EQU 38HCOM EQU 20H ;指令寄存器DAT EQU 21H ;数据寄存器ORG 0jmp mainmov dptr, #0f002hmov a,#56hmovx @dptr,amov a,#0movx a,@dptrJMP MAIN;---------------------------------------; 初始化程序INIT: MOV COM, #0E2H ;复位LCALL PROLCALL PR3MOV COM, #0A4H ;关闭休闭状态LCALL PROLCALL PR3MOV COM, #0A9H ;设置1/32占空比LCALL PROLCALL PR3MOV COM, #0A0H ;正向排序设置LCALL PROLCALL PR3MOV COM, #0C0H ;设置显示起始行为第一行LCALL PROLCALL PR3MOV COM, #0AFH ;开显示设置LCALL PROLCALL PR3RET;------------------------------------------------; 清屏CLEAR: MOV R4,#00H ;页面地址暂存器设置CLEAR1: MOV A,R4 ;取页地址值ORL A,#0B8H ;"或"页面地址设置代码MOV COM,A ;页面地址设置LCALL PROLCALL PR3MOV COM,#00H ;列地址设置为"0"LCALL PROLCALL PR3MOV R3,#50H ;一页清80个字节CLEAR2: MOV DAT,#00H ;显示数据为"0"LCALL PR1LCALL PR4DJNZ R3,CLEAR2 ;页内字节清零循环INC R4 ;页地址暂存器加一CJNE R4,#04H,CLEAR1;RAM区清零循环RET;-----------------------------------;1.写指令代码子程序(E1)PRO: PUSH DPLPUSH DPHMOV DPTR,#CRADD1 ;设置读状态字地址PR01: MOVX A,@DPTR ;读状态字JB ACC.7,PR01 ;判"忙"标志为句"0",否再读MOV DPTR,#CW ADD1 ;设置写指令代码地址MOV A,COM ;取指令代码MOVX @DPTR,A ;写指令代码POP DPHPOP DPLRET;------------------------------------;2.写显示数据子程序(E1)PR1: PUSH DPLPUSH DPHMOV DPTR,#CRADD1 ;设置读状态字地址PR11: MOVX A,@DPTR ;读状态宇JB ACC.7,PR11 ;判"忙"标志为"0",否再读MOV DPTR,#DW ADD1 ;设置写显示数据地址MOV A,DAT ;取数据MOVX @DPTR,A ;写数据POP DPHPOP DPLRET;-------------------------------------;3.读显示数据子程序(E1)PR2: PUSH DPLPUSH DPHMOV DPTR,#CRADD1 ;设置读状态字地址PR21: MOVX A,@DPTR ;读状态字JB ACC.7,PR21 ;判"忙"标志为"0"否,否再读MOV DPTR,#DRADD1 ;设置读显示数据地址MOVX A,@DPTR ;读数据MOV DA T,A ;存数据POP DPHPOP DPLRET;-------------------------------------;4.写指令代码子程序(E2)PR3: PUSH DPLPUSH DPHMOV DPTR,#CRADD2 ;设置读状态字地址PR31: MOVX A,@DPTR ;读状态字JB ACC.7,PR31 ;判"忙"陈志为"0"否,否再读MOV DPTR,#CW ADD2 ;设置写指令代码地址MOV A,COM ;取指令代码MOVX @DPTR,A ;写指令代码POP DPHPOP DPLRET;-------------------------------------; 5.写显示数据子程序(E2)PR4: PUSH DPLPUSH DPHMOV DPTR,#CRADD2 ;设置读状态字地址PR41: MOVX A,@DPTR ;读状态字JB ACC.7,PR41 ;判"忙"标志为"0"否,否再读MOV DPTR, #DW ADD2 ;设置写显示数据地址MOV A,DAT ;取数据MOVX @DPTR,A ;写数据POP DPHPOP DPLRET;---------------------------------------; 6.读显示数据子程序(E2)PR5: PUSH DPLPUSH DPHMOV DPTR,#CRADD2 ;设置读状态字地址PR51: MOVX A,@DPTR ;读状态字JB ACC.7,PR51 ;判"忙"标志为"0",否再读MOV DPTR,#DRADD2 ;设置写显示数据地址MOVX A,@DPTR ;读数据MOV DA T,A ;存数据POP DPHPOP DPLRET; 中文显示子程序CCW_PR: MOV DPTR,#CCTAB ;确定字符字模块首地址MOV A,CODE_ ;取代码MOV B,#20H ;字模块宽度为32个字节MUL AB ;代码×32ADD A,DPL ;字符字模块首地址MOV DPL,A ;字模库首地址+代码×32MOV A,BADDC A,DPHMOV DPH,APUSH COLUMN ;列地址入栈PUSH COLUMN ;列地址入栈MOV CODE_,#00H ;代码寄存器借用为间址寄存器CCW_1: MOV COUNT,#10H ;计数器设置为16MOV A,PAGE_ ;读页地址寄存器ANL A,#03H ;取页地址有效值ORL A,#0B8H ;"或"页地址设置代码MOV COM,A ;设置页地址LCALL PRoLCALL PR3POP COLUMN ;取列地址值MOV A,COLUMN ;读列地址寄存器CLR CSUBB A,#PD1 ;列地址-模块参数JC CCW_2 ;<0为左半屏显示区域(E1)MOV COLUMN,A ;≥0为右半屏显示区域(E2)MOV A,PAGE_SETB ACC.3 ;设置区域标志位。