初识汇编C51

一、 综合设计实验1:片内并行I/O口应用
1、 实验目的:
学习掌握单片机I/O口应用。
2、 实验工具:
电脑、Keil μVision、普中实验仪。
3、 实验内容:
汇编语言编程并在实验仪实现:检测电路中3个按键的状态,按下按键 时,实现不同的动作。具体要求:
按键1按下:静态数码管显示键号,4个LED指示灯轮流点亮, 呈走马灯状态,相邻指示灯点亮的时间间隔为约1秒钟,并不断 循环;
按键2按下:静态数码管显示键号,继电器动作,某LED亮 ;
按键3按下:所有动作结束;

;P1.0 is key0 
;P1.1 is key1
;P1.2 is key2
;P1.4 is relay
;P0.0-7 is led 0
;P2.0-7 is degital displayer
ORG 0000H
	MOV P0,#0FEH
	MOV P1,#0FFH
	MOV P2,#0FFH
KEYSCAN:
	JNB P1.0,KEY0DOWN
	JNB P1.1,KEY1DOWN
	JNB P1.2,KEY2DOWN
	JMP KEYSCAN

KEY0DOWN:
	CALL DELAY200ms
	MOV A,#0
	CALL KEYNUMDISP
	CALL LEDINTERM
	JMP KEYSCAN


KEY1DOWN:
	CALL DELAY200ms
	MOV A,#1
	CALL KEYNUMDISP
	CALL RELAYLED
	JMP KEYSCAN

KEY2DOWN:
	CALL DELAY200ms
	MOV A,#2
	CALL SHUTUP
	JMP KEYSCAN



DELAY200ms:
	MOV R5,#50
DELAY200ms1:
	MOV R6,#10
DELAY200ms2:
	MOV R7,#100
	DJNZ R7,$
	DJNZ R6,DELAY200ms2
	DJNZ R5,DELAY200ms1
	RET

KEYNUMDISP:
	MOV DPTR,#DUANXIAN
	MOVC A,@A+DPTR
	MOV P2,A
	RET

LEDINTERM:
;MOV P2,#0FEH
	CALL DELAY200ms
	CALL DELAY200ms
	CALL DELAY200ms
	CALL DELAY200ms
	MOV A,P0
	RL A
	MOV P0,A
	RET

RELAYLED:
	CLR P1.4
	RET

SHUTUP:
	MOV P0,#0FFH
	MOV P1,#0FFH
	MOV P2,#0FFH
	RET

DUANXIAN: DB 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
END

可能出错的地方:
1.JNB 和 JB 不会自动将当前PC值入栈,故在KEY0DOWN(KEY1DOWN)中使用RET会跳转到ORG 0000H,从而使用JMP KEYSCAN跳转至主函数执行,此操作会导致同时按下按键0和按键1时,只有按键0起作用,对此加以利用可以实现按键优先级的排序。
2.最好不要随意给代码规定地址(ORG),此操作会导致烧录程序所用时间大大增加。所有代码直接在主函数之后写即可

二、 综合设计实验2:片内定时器/计数器应用
1、 实验目的:
学习掌握单片机定时器/计数器应用。
2、 实验工具:
电脑、Keil μVision、普中实验仪。
3、 实验内容: 汇编语言编程并在实验仪实现:
按键1接于INT0、按键2接于INT1;
按键1按下:启动片内定时器且使用定时器中断方式实现1-9秒 定时,并在静态数码管显示秒数;
按键2按下:停止定时器定时工作;

;P2 IS DIGTAL DISPLAYER
;P3.2 IS KEY1 P3.3 IS KEY2
COUNTER DATA 30H
ORG 0000H
	LJMP 0100H  ;MAIN PROGRAM
ORG 0003H
	LJMP INT_0  ;INT0 PROGRAM
ORG 000BH
	LJMP INT_T0 ;INTT0 PROGRAM
ORG 0013H
	LJMP INT_1  ;INT1 PROGRAM

ORG 0100H
	MOV A,#0
	MAIN:
	;INT 
	MOV SP,#60 ;SET SP
	MOV IE,#85H;ENABLE T0 AND T1 
	MOV IP,#00H;PRIORITY ALL LOW
	SETB IT0;LOW V TRICKER
	SETB IT1;LOW V TRICKER
	
	JMP $

	INT_0:
	MOV TMOD,#01H;T0 MOD1 INNER
	MOV TH0,#0D8H;COUNT 10MS
	MOV TL0,#0F0H
	MOV COUNTER,#100;DO THIS 100 TIMES
	SETB ET0;ENABLE TT0
	SETB TR0;START TO DO THINGS
	RETI

	INT_1:
	CLR ET0;
	RETI

	INT_T0:
	DJNZ COUNTER,NEXT1
	MOV COUNTER,#100
	CALL DISPNUM
NEXT1:
	MOV TH0,#0D8H
	ORL TL0,#0F0H
	RETI

DISPNUM:
	INC A
	CJNE A,#10,NEXT2
	MOV A,#0
	
NEXT2:
	MOV DPTR,#ARRAY
	PUSH ACC
	MOVC A,@A+DPTR
	MOV P2,A
	POP ACC
	RET

ARRAY:
	DB 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
	END

可能出错的地方:
1.在DISPNUM中调用NEXT2时,使用了查表指令,改变了ACC的值,故之前需对ACC进行入栈操作。否则会出现灯不亮的现象。

三、 综合设计实验3:片内串行通信接口应用
1、 实验目的:
学习掌握单片机串口应用。
2、 实验工具:
电脑、Keil μVision、普中实验仪。
3、 实验内容: 汇编语言编程并在实验仪实现:
串口助手发送1个0-9的十进制数,实验仪接收并在静态数码管显示。

;P2 IS DIGTAL DISPLAYER
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP INTS

ORG 0100H
MAIN:
	MOV TMOD,#20H;T1 MOD 2
	MOV TH1,#0F3H;USE 4800bps CALCULATE 
	MOV TL1,#0F3H
	MOV PCON,#80H;SMOD=1
	SETB TR1;START TO COUNT
	MOV SCON,#50H;SM0=0,SM1=1-->MOD1,REN=1
	MOV IE,#90H;EA=1 ES=1

DISP:
	MOV DPTR,#ARRAY
	MOV A,SBUF
	SUBB A,#030H
	MOVC A,@A+DPTR
	MOV P2,A
	JMP DISP

INTS:
	PUSH ACC
	MOV A,SBUF
	CLR RI
	MOV SBUF,A
DO:
	JB TI,NEXT
	JMP DO
NEXT:
	CLR TI
	POP ACC
	RETI

ARRAY:
	DB 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
	END

可能出错的地方:
1.串口发出的数据和十进制的0-9之间相差0030H,需对得到串行口的数据进行处理后才可使用。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值