ARM技术william hill官网
直播中

陈义

11年用户 357经验值
擅长:模拟技术 嵌入式技术 控制/MCU 蓝牙
私信 关注
[经验]

自己写的51资料分享

转载自本人的博客地址:http://blog.csdn.net/chengdong1314/article/details/50042465

曾经我做过一件傻事--把51单片机的每一天汇编指令都研究透,
不管曾经怎样,重要的是,我真的做了,而且做得很好,很天真
为了纪念过去的天真,过去的无知,特发此文,不管别人怎么评价!!!!!!!!!
文件截图:

这是其中的一个程序的实验截图:

各个源代码:
51汇编之LEDhttp://download.csdn.net/detail/chengdong1314/930033151汇编之控制转移类指令http://download.csdn.net/detail/chengdong1314/930034151汇编之逻辑运算类指令http://download.csdn.net/detail/chengdong1314/9300347
51汇编之算术运算类指令http://download.csdn.net/detail/chengdong1314/9300367
51汇编之数据传送类命名http://download.csdn.net/detail/chengdong1314/930301351汇编之位操作类指令http://download.csdn.net/detail/chengdong1314/9303017

回帖(7)

陈义

2016-11-13 10:10:18
转载自本人的博客地址:http://blog.csdn.net/chengdong1314/article/details/50059335

这篇文章讲51芯片内部各个模块的汇编程序,这里不做实验,只贴代码:
串口工作方式1-汇编:
中断地址定义:
  ORG 0000H  ;伪指令 告诉编译器从0000H开始
  LJMP MAIN  ;64KB无条件跳转 跳转到main处执行
  ORG 0003H     ;外部中断0中断入口
  LJMP exter0
  ORG 000BH     ;T0溢出中断入口
  LJMP time_0  
  ORG 0013H     ;外部中断1中断入口
  LJMP exter1  
  ORG 001BH     ;T1溢出中断入口
  LJMP time_1
  ORG 0023H     ;串口中断入口
  LJMP USART_INT
  ORG 0100H  ;虽然这里是伪指令 但是确实有标明地址的作用

main:
MAIN:
  MOV SP,#3FH   ;设置栈低为5FH
  MOV num,#00H
  MOV wei,#07H
  MOV SCON,#50H
  MOV TMOD,#21H   //定时器0刷数码管 定时器1
  MOV TH1,#0FDH  //自动从装载
  MOV TL1,#0FDH
  SETB TR1  ;定时器1开始
  SETB ES  ;开定串口中断
  SETB PS    ;串口中断优先级为高
  MOV TH0,#0FFH
  MOV TL0,#000H
  SETB ET0   ;开定时中断
  CLR PT0    ;设置定时器0的中断优先级为低
  SETB TR0   ;开启定时器
  SETB EA      ;开总中断
  MOV num1,#00H  ;初始化数据
  MOV num2,#00H
  LCALL led_Static_display  ;数码管初始化
  ;********************死循环**********************
中断程序:
USART_INT:      
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  JNB RI,OVERUSART_INT  ;接收中断
  CLR RI  ;手动清除
  MOV UARTTEMP,SBUF
  MOV SBUF,UARTTEMP
  MOV LEDTEMP,UARTTEMP
  JNB TI,$
  CLR TI  ;手动清除  
  OVERUSART_INT:
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  RETI        ;中断结束返回



整个程序源代码:
  ;-----------------------数码管脚功能定义---------------------------   
  LED_wei EQU P2
  LED138_0 EQU P2.0
  LED138_1 EQU P2.1
  LED138_2 EQU P2.2
  LED_duan EQU P0
  LED_P EQU P1
  ;-------------------- 数码要显示的位、数据---------------------------
  wei EQU 30H    ;数码管位选
  num EQU 31H    ;数码管段选
  num1 EQU 32H    ;定时器0进中断数
  num2 EQU 33H    ;定时器1进中断数
  UARTTEMP EQU 34H    ;串口数据
  LEDTEMP EQU 35H    ;数码管数据
  ;-----------------------------------------------
  ORG 0000H  ;伪指令 告诉编译器从0000H开始
  LJMP MAIN  ;64KB无条件跳转 跳转到main处执行
  ORG 0003H     ;外部中断0中断入口
  LJMP exter0
  ORG 000BH     ;T0溢出中断入口
  LJMP time_0  
  ORG 0013H     ;外部中断1中断入口
  LJMP exter1  
  ORG 001BH     ;T1溢出中断入口
  LJMP time_1
  ORG 0023H     ;串口中断入口
  LJMP USART_INT
  ORG 0100H  ;虽然这里是伪指令 但是确实有标明地址的作用
  ;-----------------------------------------------
MAIN:
  MOV SP,#3FH   ;设置栈低为5FH
  MOV num,#00H
  MOV wei,#07H
  MOV SCON,#50H
  MOV TMOD,#21H   //定时器0刷数码管 定时器1
  MOV TH1,#0FDH  //自动从装载
  MOV TL1,#0FDH
  SETB TR1  ;定时器1开始
  SETB ES  ;开定串口中断
  SETB PS    ;串口中断优先级为高
  MOV TH0,#0FFH
  MOV TL0,#000H
  SETB ET0   ;开定时中断
  CLR PT0    ;设置定时器0的中断优先级为低
  SETB TR0   ;开启定时器
  SETB EA      ;开总中断
  MOV num1,#00H  ;初始化数据
  MOV num2,#00H
  LCALL led_Static_display  ;数码管初始化
  ;********************死循环**********************
while1:
  
  LJMP while1
  ;================================================
  ;外部中断0函数
  ;================================================
exter0:   
  RETI        ;中断结束返回
  ;================================================
  ;外部中断1函数
  ;================================================
exter1:   
  RETI        ;中断结束返回
  ;================================================
  ;定时器0中断函数
  ;================================================
time_0:      
  PUSH 07H
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  MOV TH0,#0FFH
  MOV TL0,#000H
  INC num1
  MOV A,num1
  CJNE A,#01, OVERtime_0
  MOV num1,#00H
  MOV 07H,#10H
  FOR:
  MOV num,LEDTEMP  ;显示串口数据
  ANL num,#0FH  ;低位
  MOV wei,#07H
  LCALL led_Static_display
  LCALL DELAY1ms
  MOV num,LEDTEMP  
  ANL num,#0F0H   ;高位
  MOV A,num
  RR A
  RR A
  RR A
  RR A
  MOV num,A
  MOV wei,#06H
  LCALL led_Static_display
  LCALL DELAY1ms
  DJNZ 07H,FOR
  OVERtime_0:
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  POP 07H
  RETI        ;中断结束返回
  ;================================================
  ;定时器1中断函数
  ;================================================
time_1:      

  RETI        ;中断结束返回
  ;================================================
  ;定时器1中断函数
  ;================================================
USART_INT:      
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  JNB RI,OVERUSART_INT  ;接收中断
  CLR RI  ;手动清除
  MOV UARTTEMP,SBUF
  MOV SBUF,UARTTEMP
  MOV LEDTEMP,UARTTEMP
  JNB TI,$
  CLR TI  ;手动清除  
  OVERUSART_INT:
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  RETI        ;中断结束返回
  ;================================================
  ;数码管静态显示函数
  ;================================================
led_Static_display:
  ANL wei, #07H
  MOV A,#078H
  ANL A,LED_wei
  ORL A, wei
  MOV wei,A
  MOV A,num  
  MOV DPTR,#numtab
  MOVC A,@A+DPTR  ;查表取数据
  MOV LED_wei,wei
  MOV LED_duan,A
  RET
  ;================================================
  ;各种参数的延时子函数
  ;================================================
DELAY100us:     ;100us  
  MOV R6,#06H
  DEL11: MOV R7,#08H
  DEL12: DJNZ R7,DEL12
  DJNZ R6,DEL11
  RET

DELAY500us:    ;500us
  MOV R6,#0CH   ;288
  DEL21: MOV R7,#18H
  DEL22: DJNZ R7,DEL22
  DJNZ R6,DEL21
  RET
  
DELAY1ms:    ;1ms
  MOV R6,#18H   
  DEL61: MOV R7,#18H
  DEL62: DJNZ R7,DEL62
  DJNZ R6,DEL61
  RET

DELAY40ms:    ;延时40ms  500得1ms
  MOV R6,#100
  DEL41: MOV R7,#200
  DEL42: DJNZ R7,DEL42
  DJNZ R6,DEL41
  RET

DELAY256ms:        ;延时256ms
  MOV R5,#05H
  DEL51: MOV R6,#100
  DEL52: MOV R7,#0FFH
  DEL53: DJNZ R7,DEL53
  DJNZ R6,DEL52
  DJNZ R5,DEL51
  RET
  
DELAY500ms:        ;延时256ms
  MOV R5,#0AH
  DEL81: MOV R6,#100
  DEL82: MOV R7,#0FFH
  DEL83: DJNZ R7,DEL83
  DJNZ R6,DEL82
  DJNZ R5,DEL81
  RET
  
DELAY1s:    ;1秒
  MOV R5,#16H
  DEL31: MOV R6,#100
  DEL32: MOV R7,#0FFH
  DEL33: DJNZ R7,DEL33
  DJNZ R6,DEL32
  DJNZ R5,DEL31
  RET
  
DELAY10s:    ;10秒
  MOV R5,#0DCH
  DEL71: MOV R6,#100
  DEL72: MOV R7,#0FFH
  DEL73: DJNZ R7,DEL73
  DJNZ R6,DEL72
  DJNZ R5,DEL71
  RET
numtab: DB  03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H,000H
end

keil工程整体源码:
串口工作方式1-汇编http://download.csdn.net/detail/chengdong1314/9303147



举报

陈义

2016-11-13 10:11:55
转载自本人博客:http://blog.csdn.net/chengdong1314/article/details/50061429

这篇文章讲51芯片内部各个模块的汇编程序,这里不做实验,只贴代码:
定时器模块程序:
中断地址,中断调用:

  ;-----------------------------------------------
  ORG 0000H  ;伪指令 告诉编译器从0000H开始
  LJMP MAIN  ;64KB无条件跳转 跳转到main处执行
  ORG 0003H     ;外部中断0中断入口
  LJMP exter0
  ORG 000BH     ;T0溢出中断入口
  LJMP time_0  
  ORG 0013H     ;外部中断1中断入口
  LJMP exter1  
  ORG 001BH     ;T1溢出中断入口
  LJMP time_1
  ORG 0100H  ;虽然这里是伪指令 但是确实有标明地址的作用
  ;-----------------------------------------------


主函数 main:
MAIN:
  MOV SP,#3FH   ;设置栈低为5FH
  MOV num,#00H
  MOV wei,#07H
  MOV TMOD,#11H
  MOV TH0,#4CH
  MOV TL0,#00H
  MOV TH1,#4CH
  MOV TL1,#00H
  SETB ET0   ;开定时中断
  CLR PT0    ;设置定时器0的中断优先级为低
  SETB TR0   ;开启定时器
  SETB ET1
  SETB PT1
  SETB TR1
  SETB EA      ;开总中断
  MOV num1,#00H  ;初始化数据
  MOV num2,#00H
  MOV LEDTEMP,#0FEH
  LCALL led_Static_display  ;数码管初始化
  ;********************死循环**********************


中断函数:
  ;================================================
  ;定时器0中断函数
  ;================================================
time_0:      
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  MOV TH0,#4CH
  MOV TL0,#00H
  INC num1
  MOV A,num1
  CJNE A,#020, OVERtime_0
  INC num
  MOV A,num
  CJNE A,#010H,rigthnumtime_0
  MOV num,#00H
  rigthnumtime_0:
  LCALL led_Static_display
  MOV num1,#00H
  OVERtime_0:
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  RETI        ;中断结束返回
  ;================================================
  ;定时器1中断函数
  ;================================================
time_1:      
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  MOV TH1,#4CH
  MOV TL1,#00H
  INC num2
  MOV A,num2
  CJNE A,#02H, OVERtime_1
  MOV A,LEDTEMP
  RR A
  MOV LEDTEMP,A
  MOV LED_P,LEDTEMP
  MOV num2,#00H
  OVERtime_1:
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  RETI        ;中断结束返回
  ;================================================
  ;数码管静态显示函数
  ;================================================


整个程序的代码:
  ;-----------------------数码管脚功能定义---------------------------   
  LED_wei EQU P2
  LED138_0 EQU P2.0
  LED138_1 EQU P2.1
  LED138_2 EQU P2.2
  LED_duan EQU P0
  LED_P EQU P1
  ;-------------------- 数码要显示的位、数据---------------------------
  wei EQU 30H    ;数码管位选
  num EQU 31H    ;数码管段选
  num1 EQU 32H    ;定时器0进中断数
  num2 EQU 33H    ;定时器1进中断数
  LEDTEMP EQU 34H    ;小灯数据暂存
  ;-----------------------------------------------
  ORG 0000H  ;伪指令 告诉编译器从0000H开始
  LJMP MAIN  ;64KB无条件跳转 跳转到main处执行
  ORG 0003H     ;外部中断0中断入口
  LJMP exter0
  ORG 000BH     ;T0溢出中断入口
  LJMP time_0  
  ORG 0013H     ;外部中断1中断入口
  LJMP exter1  
  ORG 001BH     ;T1溢出中断入口
  LJMP time_1
  ORG 0100H  ;虽然这里是伪指令 但是确实有标明地址的作用
  ;-----------------------------------------------
MAIN:
  MOV SP,#3FH   ;设置栈低为5FH
  MOV num,#00H
  MOV wei,#07H
  MOV TMOD,#11H
  MOV TH0,#4CH
  MOV TL0,#00H
  MOV TH1,#4CH
  MOV TL1,#00H
  SETB ET0   ;开定时中断
  CLR PT0    ;设置定时器0的中断优先级为低
  SETB TR0   ;开启定时器
  SETB ET1
  SETB PT1
  SETB TR1
  SETB EA      ;开总中断
  MOV num1,#00H  ;初始化数据
  MOV num2,#00H
  MOV LEDTEMP,#0FEH
  LCALL led_Static_display  ;数码管初始化
  ;********************死循环**********************
while1:
  LJMP while1
  ;================================================
  ;外部中断0函数
  ;================================================
exter0:   
  RETI        ;中断结束返回
  ;================================================
  ;外部中断1函数
  ;================================================
exter1:   
  RETI        ;中断结束返回
  ;================================================
  ;定时器0中断函数
  ;================================================
time_0:      
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  MOV TH0,#4CH
  MOV TL0,#00H
  INC num1
  MOV A,num1
  CJNE A,#020, OVERtime_0
  INC num
  MOV A,num
  CJNE A,#010H,rigthnumtime_0
  MOV num,#00H
  rigthnumtime_0:
  LCALL led_Static_display
  MOV num1,#00H
  OVERtime_0:
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  RETI        ;中断结束返回
  ;================================================
  ;定时器1中断函数
  ;================================================
time_1:      
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  MOV TH1,#4CH
  MOV TL1,#00H
  INC num2
  MOV A,num2
  CJNE A,#02H, OVERtime_1
  MOV A,LEDTEMP
  RR A
  MOV LEDTEMP,A
  MOV LED_P,LEDTEMP
  MOV num2,#00H
  OVERtime_1:
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  RETI        ;中断结束返回
  ;================================================
  ;数码管静态显示函数
  ;================================================
led_Static_display:
  ANL wei, #07H
  ANL LED_wei,#0F8H
  MOV A,wei
  ORL LED_wei,A
  MOV A,num  
  MOV DPTR,#numtab
  MOVC A,@A+DPTR  ;查表取数据
  MOV LED_duan,A
  RET
  ;================================================
  ;各种参数的延时子函数
  ;================================================
DELAY100us:     ;100us  
  MOV R6,#06H
  DEL11: MOV R7,#08H
  DEL12: DJNZ R7,DEL12
  DJNZ R6,DEL11
  RET

DELAY500us:    ;500us
  MOV R6,#0CH   ;288
  DEL21: MOV R7,#18H
  DEL22: DJNZ R7,DEL22
  DJNZ R6,DEL21
  RET
  
DELAY1ms:    ;1ms
  MOV R6,#18H   
  DEL61: MOV R7,#18H
  DEL62: DJNZ R7,DEL62
  DJNZ R6,DEL61
  RET

DELAY40ms:    ;延时40ms  500得1ms
  MOV R6,#100
  DEL41: MOV R7,#200
  DEL42: DJNZ R7,DEL42
  DJNZ R6,DEL41
  RET

DELAY256ms:        ;延时256ms
  MOV R5,#05H
  DEL51: MOV R6,#100
  DEL52: MOV R7,#0FFH
  DEL53: DJNZ R7,DEL53
  DJNZ R6,DEL52
  DJNZ R5,DEL51
  RET
  
DELAY500ms:        ;延时256ms
  MOV R5,#0AH
  DEL81: MOV R6,#100
  DEL82: MOV R7,#0FFH
  DEL83: DJNZ R7,DEL83
  DJNZ R6,DEL82
  DJNZ R5,DEL81
  RET
  
DELAY1s:    ;1秒
  MOV R5,#16H
  DEL31: MOV R6,#100
  DEL32: MOV R7,#0FFH
  DEL33: DJNZ R7,DEL33
  DJNZ R6,DEL32
  DJNZ R5,DEL31
  RET
  
DELAY10s:    ;10秒
  MOV R5,#0DCH
  DEL71: MOV R6,#100
  DEL72: MOV R7,#0FFH
  DEL73: DJNZ R7,DEL73
  DJNZ R6,DEL72
  DJNZ R5,DEL71
  RET
numtab: DB  03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H,000H
end

keil工程整体源码:
keil工程整体源码:51汇编之双定时器数码管流水灯-汇编http://download.csdn.net/detail/chengdong1314/9303613



举报

陈义

2016-11-13 10:13:03
转载自本人博客:http://blog.csdn.net/chengdong1314/article/details/50061541

这篇文章讲51芯片内部各个模块的汇编程序,这里不做实验,只贴代码:
外部中断模块-汇编:

中断地址定义:
  ;-----------------------------------------------
  ORG 0000H  ;伪指令 告诉编译器从0000H开始
  LJMP MAIN  ;64KB无条件跳转 跳转到main处执行
  ORG 0003H     ;中断入口
  LJMP exter0  ;中断函数名
  ORG 0013H     ;中断入口
  LJMP exter1  ;中断函数名
  ORG 0100H  ;虽然这里是伪指令 但是确实有标明地址的作用
  ;-----------------------------------------------

主函数  main:
MAIN:
  MOV SP,#3FH   ;设置栈低为5FH
  LCALL DELAY40ms          ;延时40.301ms 64KB长调用子函数
  MOV num,#00H
  MOV wei,#07H
  SETB EX0        ;开启外部中断 0,即P32引脚
  SETB IT0      ;将外部中断0设为边沿触发方式
  CLR PX0        ;优先级为0   
  SETB EX1   
  SETB IT1   
  SETB PX1  ;1的中断优先级比0的高   外部中短1的优先级比0的高
  SETB EA        ;首先开启总中断
  ;********************死循环**********************
while1:
  LCALL led_Static_display
  INC num
  MOV A,num
  CJNE A,#011H,rigthnum
  MOV num,#00H
  rigthnum:
  LCALL DELAY500ms
  LCALL DELAY500ms
  LJMP while1
  ;================================================
  ;外部中断0函数
  ;================================================



中断函数:
exter0:   
  ;CLR EA
  PUSH 31H
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  PUSH 05H   
  PUSH 06H
  PUSH 07H
  ;SETB p3.2   ;延时消抖 这是一个方法,否则出中断的时候会出现错误
  ;LCALL DELAY40ms
  ;JB p3.2,OVER
  MOV numtemp,#03H
  while1exter0:
  MOV num,numtemp
  LCALL led_Static_display
  LCALL DELAY500ms
  MOV num,#10H  ;闪烁
  LCALL led_Static_display
  LCALL DELAY500ms
  DEC numtemp     
  MOV A,numtemp   
  CJNE A,#0FFH,while1exter0
  OVER:
  POP 07H   
  POP 06H
  POP 05H   
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  POP 31H
  CLR IE0   ;进中断的时候关中断,出中断的时候开中断,并清除中断标志位 这是方法二
  SETB EA
  RETI        ;中断结束返回
  ;================================================
  ;外部中断1函数
  ;================================================
exter1:   
  ;CLR EA
  PUSH 32H
  PUSH 31H
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  PUSH 05H   
  PUSH 06H
  PUSH 07H
  SETB p3.3   ;延时消抖 这是一个方法,否则出中断的时候会出现错误
  LCALL DELAY40ms
  JB p3.3,OVERexter1
  MOV numtemp,#04H
  while1exter1:
  MOV num,numtemp
  LCALL led_Static_display
  LCALL DELAY500ms
  MOV num,#10H  ;闪烁
  LCALL led_Static_display
  LCALL DELAY500ms
  INC numtemp     
  MOV A,numtemp   
  CJNE A,#08H,while1exter1
  OVERexter1:
  POP 07H   
  POP 06H
  POP 05H   
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  POP 31H
  POP 32H
  CLR IE1   ;进中断的时候关中断,出中断的时候开中断,并清除中断标志位 这是方法二
  ;SETB EA
  RETI        ;中断结束返回
  ;================================================
  ;数码管静态显示函数
  ;================================================

整个程序源代码:
  ;-----------------------数码管脚功能定义---------------------------   
  LED_wei EQU P2
  LED138_0 EQU P2.0
  LED138_1 EQU P2.1
  LED138_2 EQU P2.2
  LED_duan EQU P0
  ;-------------------- 数码要显示的位、数据---------------------------
  wei EQU 30H    ;数码管位选
  num EQU 31H    ;数码管段选
  numtemp EQU 32H    ;数码管段选暂存
  ;-----------------------------------------------
  ORG 0000H  ;伪指令 告诉编译器从0000H开始
  LJMP MAIN  ;64KB无条件跳转 跳转到main处执行
  ORG 0003H     ;中断入口
  LJMP exter0  ;中断函数名
  ORG 0013H     ;中断入口
  LJMP exter1  ;中断函数名
  ORG 0100H  ;虽然这里是伪指令 但是确实有标明地址的作用
  ;-----------------------------------------------
MAIN:
  MOV SP,#3FH   ;设置栈低为5FH
  LCALL DELAY40ms          ;延时40.301ms 64KB长调用子函数
  MOV num,#00H
  MOV wei,#07H
  SETB EX0        ;开启外部中断 0,即P32引脚
  SETB IT0      ;将外部中断0设为边沿触发方式
  CLR PX0        ;优先级为0   
  SETB EX1   
  SETB IT1   
  SETB PX1  ;1的中断优先级比0的高   外部中短1的优先级比0的高
  SETB EA        ;首先开启总中断
  ;********************死循环**********************
while1:
  LCALL led_Static_display
  INC num
  MOV A,num
  CJNE A,#011H,rigthnum
  MOV num,#00H
  rigthnum:
  LCALL DELAY500ms
  LCALL DELAY500ms
  LJMP while1
  ;================================================
  ;外部中断0函数
  ;================================================
exter0:   
  ;CLR EA
  PUSH 31H
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  PUSH 05H   
  PUSH 06H
  PUSH 07H
  ;SETB p3.2   ;延时消抖 这是一个方法,否则出中断的时候会出现错误
  ;LCALL DELAY40ms
  ;JB p3.2,OVER
  MOV numtemp,#03H
  while1exter0:
  MOV num,numtemp
  LCALL led_Static_display
  LCALL DELAY500ms
  MOV num,#10H  ;闪烁
  LCALL led_Static_display
  LCALL DELAY500ms
  DEC numtemp     
  MOV A,numtemp   
  CJNE A,#0FFH,while1exter0
  OVER:
  POP 07H   
  POP 06H
  POP 05H   
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  POP 31H
  CLR IE0   ;进中断的时候关中断,出中断的时候开中断,并清除中断标志位 这是方法二
  SETB EA
  RETI        ;中断结束返回
  ;================================================
  ;外部中断1函数
  ;================================================
exter1:   
  ;CLR EA
  PUSH 32H
  PUSH 31H
  PUSH DPH
  PUSH DPL
  PUSH PSW
  PUSH ACC
  PUSH 05H   
  PUSH 06H
  PUSH 07H
  SETB p3.3   ;延时消抖 这是一个方法,否则出中断的时候会出现错误
  LCALL DELAY40ms
  JB p3.3,OVERexter1
  MOV numtemp,#04H
  while1exter1:
  MOV num,numtemp
  LCALL led_Static_display
  LCALL DELAY500ms
  MOV num,#10H  ;闪烁
  LCALL led_Static_display
  LCALL DELAY500ms
  INC numtemp     
  MOV A,numtemp   
  CJNE A,#08H,while1exter1
  OVERexter1:
  POP 07H   
  POP 06H
  POP 05H   
  POP ACC
  POP PSW
  POP DPL
  POP DPH
  POP 31H
  POP 32H
  CLR IE1   ;进中断的时候关中断,出中断的时候开中断,并清除中断标志位 这是方法二
  ;SETB EA
  RETI        ;中断结束返回
  ;================================================
  ;数码管静态显示函数
  ;================================================
led_Static_display:
  ANL wei, #07H
  ANL LED_wei,#0F8H
  MOV A,wei
  ORL LED_wei,A
  MOV A,num  
  MOV DPTR,#numtab
  MOVC A,@A+DPTR  ;查表取数据
  MOV LED_duan,A
  RET
  ;================================================
  ;各种参数的延时子函数
  ;================================================
DELAY100us:     ;100us  
  MOV R6,#06H
  DEL11: MOV R7,#08H
  DEL12: DJNZ R7,DEL12
  DJNZ R6,DEL11
  RET

DELAY500us:    ;500us
  MOV R6,#0CH   ;288
  DEL21: MOV R7,#18H
  DEL22: DJNZ R7,DEL22
  DJNZ R6,DEL21
  RET
  
DELAY1ms:    ;1ms
  MOV R6,#18H   
  DEL61: MOV R7,#18H
  DEL62: DJNZ R7,DEL62
  DJNZ R6,DEL61
  RET

DELAY40ms:    ;延时40ms  500得1ms
  MOV R6,#100
  DEL41: MOV R7,#200
  DEL42: DJNZ R7,DEL42
  DJNZ R6,DEL41
  RET

DELAY256ms:        ;延时256ms
  MOV R5,#05H
  DEL51: MOV R6,#100
  DEL52: MOV R7,#0FFH
  DEL53: DJNZ R7,DEL53
  DJNZ R6,DEL52
  DJNZ R5,DEL51
  RET
  
DELAY500ms:        ;延时256ms
  MOV R5,#0AH
  DEL81: MOV R6,#100
  DEL82: MOV R7,#0FFH
  DEL83: DJNZ R7,DEL83
  DJNZ R6,DEL82
  DJNZ R5,DEL81
  RET
  
DELAY1s:    ;1秒
  MOV R5,#16H
  DEL31: MOV R6,#100
  DEL32: MOV R7,#0FFH
  DEL33: DJNZ R7,DEL33
  DJNZ R6,DEL32
  DJNZ R5,DEL31
  RET
  
DELAY10s:    ;10秒
  MOV R5,#0DCH
  DEL71: MOV R6,#100
  DEL72: MOV R7,#0FFH
  DEL73: DJNZ R7,DEL73
  DJNZ R6,DEL72
  DJNZ R5,DEL71
  RET
numtab: DB  03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H,000H
end



keil工程整体源码:
51汇编之外部中断带优先级-汇编.ziphttp://download.csdn.net/detail/chengdong1314/9303641



举报

陈义

2016-11-13 10:13:53
转载自本人博客:http://blog.csdn.net/chengdong1314/article/details/50069361

这里我把我的所有的51单片机程序上传,这其中有一部分是我自己写的,也有很多的东西是网上找来自己整理的
这里的程序基本囊括了51的所有外设,都已经测试过了
再次声明,这些资料由本人整理或者编写

测透51的汇编部分已经在前面上传了
该程序里有汇编,更多的是C语言
这个帖子是我和51的学习说再见的留念

这是代码合集:
透彻51.ziphttp://download.csdn.net/detail/chengdong1314/9305053
文件目录如下:


├─126X64
│  ├─128X64-C
│  ├─128X64-汇编
│  ├─128X64分解寄存器-C
│  ├─串口128X64-C
│  └─寄存器拆解显示-汇编
├─15系列芯片探究
│  ├─ADC-C
│  │  ├─硬件中断法
│  │  └─软件查询法
│  ├─EEPROM-C
│  └─内部扩展RAM-C
├─1602-C
├─5110-C
├─ADC0809电压采集显示-c
├─C语言学习-c
│  ├─指针
│  │  ├─使用指针变量-两个数的排
│  │  ├─初识指针与二维数组
│  │  ├─字符串指针作函数的参数
│  │  ├─指向函数的指针变量
│  │  ├─指向数组的指针作函数的
│  │  ├─指针与二位数组更具体的
│  │  ├─指针函数
│  │  ├─指针初识-输出各个量
│  │  ├─指针存储的类型
│  │  ├─指针实现一维数组排序
│  │  ├─指针实现一维数组的输入
│  │  ├─指针实现一维数组的输入
│  │  ├─指针实现一维数组的输入
│  │  ├─指针实现一维数组的输入
│  │  ├─指针数组
│  │  ├─指针数组作函数的参数
│  │  ├─简单指针变量作函数参数
│  │  └─简单指针变量作函数参数
│  └─结构体
│      ├─使用结构体变量存储学生
│      ├─指向结构体数组的指针
│      ├─结构体变量的定义及使用
│      ├─结构体指针
│      ├─结构体指针做函数的参数
│      ├─结构体数组
│      └─链表节点的插入
├─DAC0832波形发生器
│  ├─DAC0832生成三角波-C
│  ├─DAC0832生成三角波-汇编
│  ├─DAC0832生成正弦波-C
│  └─DAC0832生成锯齿波-C
├─DS1302时钟芯片1602-C
├─DS18B20温度传感器1602-c
│  ├─DS18B20温度传感器1602(固化
│  └─DS18B20温度传感器1602(延时
├─IIC ADDA PCF8591-C
├─IIC AT24C02-C
├─LED
│  ├─数据递增-C
│  ├─点亮第一个灯
│  │  ├─点亮第一个灯-C
│  │  └─点亮第一个灯-汇编
│  └─跑马灯-C
├─LED_低功耗-C
├─NRF24L01-C
│  ├─以前测试不成功程序
│  │  ├─发送(测试不成功)
│  │  └─接收(测试不成功)
│  ├─发送0到32递增数码管显示(老
│  ├─发送按键输入数码管显示(老
│  ├─接收1602显示
│  └─收发一体(点灯显示)
├─UCOSII
│  ├─1.UCOSII原来程序 非书本例程
│  │  ├─Source
│  │  └─uCosii
│  ├─2.UCOSII 改善任务 非书本例
│  │  ├─Source
│  │  └─uCosii
│  ├─UCOSII书本例程
│  │  ├─Source
│  │  └─uCosii
│  ├─可从入函数
│  └─可从入函数 外部RAM地址不是
├─串口
│  ├─串口工作方式0-C
│  ├─串口工作方式1-汇编
│  ├─串口工作方式1(广泛)-C
│  ├─串口工作方式2-C
│  ├─串口工作方式3
│  ├─串口接收数组(截取数据)-C
│  └─模拟串口发送
│      └─1. 异步串口 UART(已校
│          ├─IO模拟发送(已校验
│          ├─外部中断模拟接收(
│          └─库函数(已校验)
├─书本汇编例子-汇编
├─可编程并口(8255A)-C
├─命令验证-汇编
│  ├─LED
│  ├─位操作类指令
│  │  ├─以Cy内容为条件的转移指
│  │  ├─以位地址内容为条件的转
│  │  ├─位传指令
│  │  ├─位变量修改指令
│  │  └─位逻辑操作指令
│  ├─控制转移类指令
│  │  ├─减1不为零转移指令
│  │  ├─子程序调用及返回指令
│  │  ├─无条件转移指令
│  │  ├─比较转移指令
│  │  └─累加器判零条件转移指令
│  ├─数据传送类命名
│  │  ├─交换指令
│  │  ├─堆栈操作指令
│  │  ├─数据传送到DPTR-唯一16位
│  │  ├─数据传送到工作寄存器Rn
│  │  ├─数据传送到直接地址
│  │  ├─数据传送到累加器A
│  │  ├─数据传送到间接地址
│  │  ├─程序储存器内容送累加器
│  │  └─累加器与片外RAM交流指令
│  ├─算术运算类指令
│  │  ├─不带进位的加法
│  │  ├─乘法指令
│  │  ├─减1指令
│  │  ├─加1指令
│  │  ├─带进位的减法
│  │  ├─带进位的加法
│  │  ├─累加器内容十进制调整
│  │  └─除法指令
│  └─逻辑运算类指令
│      ├─简单逻辑操作与移位指令
│      ├─逻辑与指令
│      ├─逻辑异或指令
│      └─逻辑或指令
├─外部中断与数码管
│  ├─外部中断与继电器蜂鸣器-c
│  ├─外部中断带优先级-c
│  ├─外部中断带优先级-汇编
│  ├─外部中断无优先级-c
│  ├─外部中断无优先级-汇编
│  ├─数码管中断加减-C
│  └─数码管显示递增-汇编
├─外部扩展RAM-C
├─定时器
│  ├─单定时器数码管-C
│  ├─双定时器数码管流水灯-C
│  └─双定时器数码管流水灯-汇编
├─并口(IO)-汇编
├─按键输入-C
│  ├─按键数码管设置
│  └─按键点灯
├─摇杆-C
├─数码管
│  ├─数码管动态显示(老板子)-C
│  ├─数码管静态显示-C
│  └─数码管静态显示(老板子)-C
├─测试程序
│  ├─测试程序-C
│  └─测试程序-汇编
├─点阵-C
│  ├─16X16汉字点阵(扩展模块上的
│  ├─8X16英文点阵(扩展模块上的
│  ├─8X8点阵(扩展模块上的点阵)
│  └─8X8点阵(直连方式开发板上的
├─矩阵键盘
│  ├─矩阵键盘128X64显示-C
│  └─矩阵键盘数码管显示-C
├─红外-c
│  ├─红外发送0到256
│  ├─红外接收1602显示中断延时法
│  └─红外接收1602显示程序延时法
├─蓝牙-c
│  ├─接收128X64
│  └─接收16X02
├─蜂鸣器演奏-C
│  ├─蜂鸣器演奏两只老虎-方式1
│  └─蜂鸣器演奏八月桂花-方式2
└─超声波测距-C



举报

张君

2016-11-19 11:00:28
吊                                                     
举报

dzzgdzlxh

2017-1-13 16:11:37
需要汇编51单片机开发 qq 1182201691
举报

thomas_king

2017-1-13 21:35:40
好东西好东西好东西好东西好东西好东西好东西
举报

更多回帖

发帖
×
20
完善资料,
赚取积分