您的位置:首页 > 其它

测透51汇编 51单片机串口模块程序

2015-11-26 18:17 344 查看
这篇文章讲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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: