一、 综合设计实验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,需对得到串行口的数据进行处理后才可使用。