单片机子程序(汇编)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.T0/T1产生方波:
知识点:中断,定时/计数器
TCON寄存器:
TMOD寄存器:
①用计时器T0使P1.0口输出1Hz (%50占空比) 的方波;
②通过P1.0口使发光二级管闪烁(0.5s)。
ORG 0000H
LJMP START
ORG 000BH ;T0
LJMP SJDL ;伪指令
ORG 0030H
START: MOV TMOD,#11H ;把T0、T1都置成16位定时器MOV TL0,#176 ;65536-15536=50000μs
MOV TH0,#60 ;设置计数器,定时50ms
SETB TR0 ;启动定时器T0
SETB EA ;打开总开关
SETB ET0 ; 打开分开关
MOV R7,#10 ; 设置延时(10*50ms=0.5秒)
MOV B,#0FFH;
XX1: NOP
NOP ;死循环/ 主程序
NOP
LJMP XX1
SJDL: MOV TL0,#176 ;
MOV TH0,#60 ;重置计数器
DJNZ R7,SS1
CPL P1.0 ; 取反
MOV R7,#10
SS1: RETI ;返回主程序
③用计时器T1使P1.6口输出1Hz (%30占空比) 的方波
ORG 0000H
LJMP START
ORG 001BH ;(T1)
LJMP SJDL
ORG 0030
START: MOV TMOD,#11H ;00010001,T1、T0都为方式一,定时器模式MOV TH1,#60 ;或者(#3CH)
MOV TL1,#176 ;0B0H 定时50ms
SETB TR1 ;启动定时器T1
SETB EA ;
SETB ET1 ;
MOV R7,#6 ;
LOOP: NOP
NOP
LJMP LOOP
SJDL: MOV TL1,#176 ;重置计数器
MOV TH1,#60 ;
DJNZ R7,XX1 ;减一不为0则转移
CPL P1.6 ;取反
MOV R7,#6 ;设置延时(6*50ms=0.3秒)
JB P1.6,XX1 ;若P1.6为高(1)则跳
MOV R7,#14 ;设置延时(14*50ms=0.7秒)
XX1: RETI
④用计时器T0使P1.0口输出10Hz (%50占空比) 的方波;
ORG 0000H
LJMP START
ORG 000BH ;T0
LJMP SJDL
ORG 0030H
START: MOV TMOD,#11H
MOV TL0,#176 ;65536-15536=50000μs
MOV TH0,#60 ;设置计数器,定时50ms
SETB TR0
SETB EA
SETB ET0
XX1:LJMP XX1
SJDL: MOV TL0,#176 ;
MOV TH0,#60 ;
CPL P1.0
ERTI
⑤波特率的计算方法:
假若现在单片机外接的晶振为11.0592MHz时,以T/C2作波特率发生器,根据波特率公式:
波特率=Fosc/2x16x(65536-t)
9600=11.0592MHz/2x16x(65536-t)
t=65500=0xFFD
2.内存,置数‘’
a)将20H ~ 7FH 置01H
MOV R0,#20H ;
MOV R7,#96 ;次数
XX1: MOV @R0,#01H
INC R0 ;
DJNZ R7,XX1
② ;区域指数,30H到39H置为1到10
ORG 0000H
LJMP START
START: MOV R1,#30H
MOV A,#01H
MOV R2,#10
XX1: MOV @R1,A
INC R1
INC A
DJNZ R2,XX1
END
3.排序
a)排序0,1,2,3...9 ---> 9,8,7,6 0
ORG 0000H
LJMP START
ORG 0030H
START: MOV R1,#90H
MOV A,#01H
MOV R2,#10
SETNUM: MOV @R1,A ;置数
INC R1
INC A
DJNZ R2,SETNUM
SHORT: MOV R0,#90H ;首地址
MOV R2,#9 ;字节数
MOV A,R0
MOV R1,A ;R1存放首地址,为了保存原始数据
MOV A,R2
MOV R4,A ;R4中存放字节数,为了保存原始数据
CLR F0 ;判断是否交换
MOV A,@R1 ;取出第一个数,给A,A作为中间量,此时A=1 LOOP: MOV R5,A ;将第一个数赋值给R5 ,此时R5=1 INC R1
CLR C ;清零进位位
MOV A,@R1 ;将第二个数也赋值给A,A还是作为中间量,此时A=2
SUBB A,R5 ;A=A-R5,R5值不变,此时A=1,C=0,R5=1
JC LOOP1 ;A<R5
SETB F0 ;设置交换位
MOV A,R5 ; 此时A=1,R5=1
XCH A,@R1 ; 此时A=2,@R1=1
DEC R1 ; 此时@R1=1
XCH A,@R1 ; 此时A=1,@R1=2
INC R1 ; 此时@R1=1
LOOP1: MOV A,@R1 ;将第二位数给中间位A,准备跳转到LOOP进行下一次排序DJNZ R4,LOOP ;最高交换9次
JB F0,SHORT ;如果还有交换发生,就从头开始,如果没有交换发生,则说明
排
序完成
RET
4.累加
(一)寻址方式;(详细见教材P.44)
①寄存器间接寻址:MOV A,@Ri ;i=0 / 1
如果Ri中的内容为40H,即从Ri中找到源操作数所在的单元的地址40H,然后把内部RAM40H地址单元中的内容传送给A。
②#Rn,立即数Rn,单元地址@Rn,间接寻址
③基址寄存器+变址寄存器间接寻址
MOVC A,@A+DPTR
如果A中内容为05H,DPTR的内容为0400H。
指令的结果是把程序存储器0405H单元的数传送给A。
本寻址方式的另外2条:
MOVC A,@A+PC
JMP @A+DPTR
(二)将30H~3FH中的数累加,和放到4041H
MOV R0,#30H ;首址赋给R0
MOV R7,#16 ;0~F共16个数
MOV 40H,#00H ;
MOV 41,#00H ;4041H清零
LOOP: MOV A,@R0 ;将30H单元的数赋给A
ADD A,41H ;相加结果放入A
MOV 41H,A ;A传送给41H
MOV A,#00H ;把A清零
ADDC A,40H ;带进位加
MOV 40H,A ;
INC R0 ;R0+1
DJNZ R7,LOOP ;
(三)将20H~7FH中的数累加到R3R4中(BCD加法):MOV R0,#20H ;
MOV R7,#96 ;
MOV R3,#00H ;
MOV R4,#00H ;
LOOP: MOV A,@R0 ;
ADD A,R4 ;A+R4→A
DA A ;
MOV R4,A ;
MOV A,#00H ;
ADDC A,R3 ;A+R3+Cy→A
DA A ;
MOV R3,A ;
INC R0 ;
DJNZ R7,LOOP ;
5.延时
a). ;执行循环次数
MOV 7DH,#K ;1
XX3:MOV 7EH,#M ;K
XX2: MOV 7FH,#N ;KM
XX1:DJNZ 7FH,XX1 ;KMN
DJNZ 7EH,XX2 ;KM
DJNZ 7DH,XX3 ;K
1重:0.5ms
2重:130ms
3重:33ms
( KMN + 2 KM + 2 K + 1)×2T
T:机器周期(P36)振荡频率F osc 时钟周期T osc=1/F osc
机器周期T cy=12×T osc
b)延时50ms
DEL: MOV R7,#210
XX1: MOV R6,#117
XX2: DJNZ R6,XX2
DJNZ R7,XX1
RET
6.跑马灯
MOV A,#0FEH
XX1: MOV P1,A
LCALL DEL500
JNB P3.7,XX2 ;按下P3.7键,跑马灯加快
LCALL DEL500
XX2: JNB P3.0,XX3 ;按下P3.0键,跑马灯反向
RL A
LJMP XX1
XX3: RR A
LJMP XX1
DEL500: MOV 7FH,#00H
DEL1: MOV 7EH,#00H
DEL2: NOP
NOP
DJNZ 7EH,DEL2
DJNZ 7FH,DEL1
RET
7.串行口通信
a)发送程序
ORG 0000H ;
LJMP START ;
ORG 0030H ;
START: MOV TMOD,#21H ;设置定时器工作方式(T0计时,T1波特率发生器)MOV TH1,#0FDH ; 设置波特率9600
MOV TL1,#0FDH ;
SETB TR1 ; 启动定时器1
MOV SCON,#50H ;设置串口工作方式,方式1
MOV A,#00H ;
XX1: JB P3.2,XX1 ;直接寻址位(P3.2)为1则转移
MOV SBUF,A ;启动发送
JNB TI,$ ;TI为0则跳,等待发送完
CLR TI ;清除标志位
INC A ;累加器A增1
LCALL DEL100 ;长调用子程序
LCALL DEL100 ;
LJMP XX1 ;
DEL100: MOV 7FH,#00H ;
DEL1: MOV 7EH,#00H ;
DJNZ 7EH,$ ;
DJNZ 7FH,DEL1 ;
RET ;
b)接收程序
ORG 0000H
LJMP START
ORG 0023H
LJMP JSYX
ORG 0030H
START: MOV TMOD,#21H ;T0计时,T1波特
MOV TH1,#0FDH ;设置波特率9600
MOV TL1,#0FDH ;
SETB TR1 ; 启动定时器1
MOV SCON,#50H ;设置串口工作方式,方式1
SETB EA ;打开总开关
SETB ES ;打开分开关
MOV A,#03H ;
LCALL FS
MOV A,#03H ;
LCALL FS
XX1: NOP
NOP
LJMP XX1
JSYX: CLR RI ;清接收标志位
MOV A ,SBUF ;接收数据
MOV R1,A ;
MOV P1,A ;
ANL A,#0FH ;A与00001111(取A的第四位)
MOV DPTR,#0100H ;
MOVC A,@A+DPTR ;
LCALL FS ;
MOV A,R1 ;
SW AP A ;高四位与低四位交换
ANL A,#0FH ;取A的第四位
MOV DPTR,#0100H ;定义基址寄存器位置(0100H)单元
MOVC A,@A+DPTR ;查表(累加器A为变址寄存器,DPTR为基址寄存器)
LCALL FS ;
NOP
RETI
FS: MOV R7,#08H ;
FS1: RRC A ;经过进位标志位的循环右移
MOV P1.0,C ;把A的数据模拟同步时序发送
CLR P1.1 ;
SETB P1.1 ;
DJNZ R7,FS1 ;
SETB P1.0 ;
RET
ORG 0100H ;数组的首址(从0100H开始存放数组)
DB 03H,9FH,25H,0DH,99H,49H,41H,1FH,01H,09H,11H,0C1H,63H,85H,61H,71H ;数组;分别对应0 1 2 3 4 5 6 7 8 9 A b C d E F 8.时钟(跑表)
ORG 0000H
LJMP START
ORG 000BH
LJMP SJDL
ORG 0030H
START: MOV TMOD,#11H ;16
MOV TH0,#216
MOV TL0,#243;55536 ;10ms
MOV DPTR,#0200H
XX1: MOV 30H,#00H ;放置显示数据位置 1
MOV 31H,#00H ; 23
MOV 32H,#00H ;45
LCALL XS ;清零
XX2: JB P3.3,XX2 ;开关
LCALL DEL10 ;延时消抖
JB P3.3,XX2 ;再次检测
NOP ;油建
SETB TR0 ;定时T0
SETB EA ;中断
SETB ET0
LCALL DEL10
LCALL DEL10
LCALL DEL10
;LCALL D EL10
XX3: JB P3.3,XX3
LCALL DEL10
JB P3.3,XX3
NOP ;YOU油建
CLR ET0
CLR TR0 ;关闭
LCALL DEL10
LCALL DEL10
LCALL DEL10
LCALL DEL10
LCALL DEL10
XX4: JB P3.3,XX4
LCALL DEL10
JB P3.3,XX4
NOP ;YOUYOU油建
LCALL DEL10
LCALL DEL10
LCALL DEL10
LCALL DEL10
LCALL DEL10
LJMP START ;转跳起始
;主程序结束
XS: MOV A,32H ;45
ANL A,#0FH ;与00001111
NOP
MOVC A,@A+DPTR ; 5
MOV SBUF,A
WW1: JNB TI,WW1 ;查TI=0,就跳WW1,为1时就往下走CLR TI
MOV A,32H
SW AP A
ANL A,#0FH
NOP
MOVC A,@A+DPTR ; 4
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,31H
ANL A,#0FH
NOP
MOVC A,@A+DPTR ; 3
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,31H
SW AP A
ANL A,#0FH
NOP
MOVC A,@A+DPTR ; 2
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,30H
ANL A,#0FH
NOP
MOVC A,@A+DPTR ; 1
MOV SBUF,A
JNB TI,$
CLR TI
CLR P3.2
SETB P3.2 ;放出去
RET
SJDL: MOV TL0,#243
MOV TH0,#216 ;重置10MS
MOV A,32H
ADD A,#01H
DA A
MOV 32H,A
MOV A,31H
ADDC A,#00H
DA A
MOV 31H,A
MOV A,30H
ADDC A,#00H
DA A
MOV 30H,A
LCALL XS
NOP
RETI
DEL10: MOV 7FH,#100
DEL1: MOV 7EH,#00H
DJNZ 7EH,$
DJNZ 7FH,DEL1
RET
ORG 0200H
DB 03H,9FH,25H,0DH, 99H,49H,41H,1FH,01H,09H,11H,0C1H,63H,85H,61H,71H ;0,1,2。