单片机项目教学案例汇编
来源:村官 发布时间:2020-09-22 点击:
案例一 单片机最小系统设计
功能要求
设计一个单片机最小系统;
通过锁存器实现地址信息和数据信息的隔离。
硬件电路设计
1、方案设计结构示意图:
电路设计原理图:
参考程序
ORG 0000H
JMP MAIN
ORG 0040H
MAIN:
MOV SP,#07H
MOV DPTR,#0FF45H
MOV A,#88H
MOVX @DPTR,A
SJMP $
END
案例二 信号灯控制
功能要求
设计一个延时程序,使与P1.0相连的发光二极管每隔1秒亮一次;
采用循环控制,使8个发光二极管呈跑马灯方式闪烁,其中发光二
极管点亮时长为1秒,熄灭时长为2秒。
硬件电路设计
1、电路设计原理图
参考程序
org 0000h
ljmp start
org 100h
start:
mov dptr,#tab
mov a,#0
mov r3,#8
loop4: mov 30h,a
movc a,@a+dptr
mov p1,a
lcall delay
mov a,30h
inc a
mov 30h,a
movc a,@a+dptr
mov p1,a
lcall delay
lcall delay
mov a,30h
inc a
djnz r3,loop4
ljmp start
delay:
mov r7,#100
loop2:mov r6,#100
loop1: mov r5,#49
djnz r5,$
djnz r6,loop1
djnz r7,loop2
ret
tab: db 0feh,0ffh,0fdh,0ffh,0fbh,0ffh,0f7h,0ffh
db 0efh,0ffh,0dfh,0ffh,0bfh,0ffh,07fh ,0ffh
End
案例三 交通灯控制
功能要求
利用单片机设计制作具有下列功能的交通灯:
自动计时,由两位数码管静态显示;
发光二极管分四组分别代表东、南、西、北四个方向交通灯,东、西方向红灯亮时,南北方向绿灯亮;反之南北方向红灯亮时,东西方向绿灯亮;小灯每30S交替一次。
硬件电路设计
参考程序
ORG 0000H
LJMP START
ORG 0100H
BCD1 EQU 50H
BCD2 EQU 51H
START: MOV SP,#60H
STATE0:MOV A,#0F6H ;初始状态全红灯
MOV P1,A
MOV R2,#1 ;延时1秒
S0: LCALL BINBCD
LCALL DISPLAY
LCALL DELAY
DJNZ R2,S0
STATE1:MOV A,#0F5H ;南北绿灯,东西红灯
MOV P1,A
MOV R2,#20 ;延时20秒
S1:LCALL BINBCD
LCALL DISPLAY
LCALL DELAY
DJNZ R2,S1
STATE2:MOV A,#0F3H ;南北黄灯,东西红灯
MOV P1,A
MOV R2,#5 ;延时5秒
S2:LCALL BINBCD
LCALL DISPLAY
LCALL DELAY
DJNZ R2,S2
STATE3:MOV A,#0EEH ;南北红灯,东西绿灯
MOV P1,A
MOV R2,#20 ;延时20秒
S3:LCALL BINBCD
LCALL DISPLAY
LCALL DELAY
DJNZ R2,S3
STATE4:MOV A,#0DEH ;南北红灯,东西黄灯
MOV P1,A
MOV R2,#5 ;延时5秒
S4:LCALL BINBCD
LCALL DISPLAY
LCALL DELAY
DJNZ R2,S4
LJMP STATE1 ;转至状态1
DELAY:MOV R7,#20 ;1秒延时子程序
D1:MOV R6,#200
D2:MOV R5,#123
NOP
DJNZ R5,$
DJNZ R6,D2
DJNZ R7,D1
RET
BINBCD: MOV A,R2 ;二进制转换非压缩BCD码子程序
MOV B,#10
DIV AB
MOV BCD2,A ;存十位BCD码
MOV BCD1,B ;存个位BCD码
RET
DISPLAY: MOV A,BCD1 ;显示子程序
MOV DPTR,#TAB
MOVC A,@A+DPTR ;查个位字形码
MOV P2,A
MOV A,BCD2
MOVC A,@A+DPTR ;查十位字形码
MOV P0,A
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
END
案例四 简易电子密码锁设计
功能要求
初始状态下显示屏显示“HELLO”,并保持显示5秒后清屏;
如果密码输入错误则显示“ERROR”,并保持显示5秒后清屏;
如果密码输入正确则显示“RIGHT”,并保持显示5秒后清屏 。
硬件电路设计
系统方案设计理论图
键盘电路图
数码管显示电路
参考程序
*******************************************************
;以下8个字节存放8位数码管的段码
LED_BIT_1 EQU 30H
LED_BIT_2 EQU 31H
LED_BIT_3 EQU 32H
LED_BIT_4 EQU 33H
LED_BIT_5 EQU 34H
LED_BIT_6 EQU 35H
LED_BIT_7 EQU 36H
LED_BIT_8 EQU 37H
;以下6个字节存放初始密码
WORD_1 EQU 38H
WORD_2 EQU 39H
WORD_3 EQU 3AH
WORD_4 EQU 3BH
WORD_5 EQU 3CH
WORD_6 EQU 3DH
;以下6个字节存放用户输入的6位密码
KEY_1 EQU 3EH
KEY_2 EQU 3FH
KEY_3 EQU 40H
KEY_4 EQU 41H
KEY_5 EQU 42H
KEY_6 EQU 43H
;******************************************************
CNT_A EQU 44H
CNT_B EQU 45H
KEY_CNT EQU 46H ;已输出的密码位数
LINE EQU 47H ;按键行号
ROW EQU 48H ;按键列号
VAL EQU 49H ;键值
;******************************************************
;以下为初始化程序,包括数据存储空间初始化,设置初始密码
ORG 00H
SJMP START
ORG 0050H
START:MOV SP,#60H
MOV CNT_A,#00H ;程序初始化
MOV CNT_B,#00H
MOV KEY_CNT,#00H
MOV LINE,#00H
MOV ROW,#00H
MOV VAL,#00H
SETB P1.0
MOV LED_BIT_1,#00H ;段码存储区清0
MOV LED_BIT_2,#00H
MOV LED_BIT_3,#00H
MOV LED_BIT_4,#00H
MOV LED_BIT_5,#00H
MOV LED_BIT_6,#00H
MOV LED_BIT_7,#79H
MOV LED_BIT_8,#73H
MOV KEY_1,#00H ;输入密码存储区清0
MOV KEY_2,#00H
MOV KEY_3,#00H
MOV KEY_4,#00H
MOV KEY_5,#00H
MOV KEY_6,#00H
MOV WORD_1,#6 ;设置初始密码为"123456"
MOV WORD_2,#5
MOV WORD_3,#4
MOV WORD_4,#3
MOV WORD_5,#2
MOV WORD_6,#1
A0: LCALL DISP
;***********************************************************
;以下为键盘扫描程序,计算键值并存入VAL
LSCAN: MOV P3,#0F0H ;扫描行码
L1: JNB P3.0,L2
LCALL DLY_S
JNB P3.0,L2
MOV LINE,#00H
LJMP RSCAN
L2: JNB P3.1,L3
LCALL DLY_S
JNB P3.1,L3
MOV LINE,#01H
LJMP RSCAN
L3: JNB P3.2,L4
LCALL DLY_S
JNB P3.2,L4
MOV LINE,#02H
LJMP RSCAN
L4: JNB P3.3,A0
LCALL DLY_S
JNB P3.3,A0
MOV LINE,#03H
RSCAN: MOV P3,#0FH ;扫描列码
C1: JNB P3.4,C2
MOV ROW,#00H
LJMP CALCU
C2: JNB P3.5,C3
MOV ROW,#01H
LJMP CALCU
C3: JNB P3.6,C1
MOV ROW,#02H
CALCU: MOV A,LINE ;计算键值
MOV B,#03H
MUL AB
ADD A,ROW
MOV VAL,A
;**************************************************
;以下为按键处理程序,对不同的按键作出响应
CJNE A,#0AH,J1 ;是否为"CLR"键
MOV R1,KEY_CNT
CJNE R1,#00H,J2
LCALL ALARM_1
LJMP START
J2: LCALL SHIFTR
DEC KEY_CNT
W00:LCALL DISP ;等待按键抬起
MOV A,P3
CJNE A,#0FH,W01
LJMP A0
W01:MOV A,P3
CJNE A,#0F0H,W02
LJMP A0
W02:SJMP W00
J1: MOV A,VAL
CJNE A,#0BH,J3 ;判断是否为"ENTER"键
MOV R1,KEY_CNT
CJNE R1,#06H,J4
MOV A,WORD_1 ;比较密码
CJNE A,3EH,J5
MOV A,WORD_2
CJNE A,3FH,J5
MOV A,WORD_3
CJNE A,40H,J5
MOV A,WORD_4
CJNE A,41H,J5
MOV A,WORD_5
CJNE A,42H,J5
MOV A,WORD_6
CJNE A,43H,J5
CLR P1.0
MOV P2,#0ffh
LCALL DLY_L
LJMP START
J5: LCALL ALARM_2
LJMP START
J4: LCALL ALARM_1
LJMP START
J3: INC KEY_CNT ;按下数字键
MOV A,KEY_CNT
CJNE A,#07H,K1
LCALL ALARM_1
W10:LCALL DISP ;等待按键抬起
MOV A,P3
CJNE A,#0FH,W11
LJMP START
W11:MOV A,P3
CJNE A,#0F0H,W12
LJMP START
W12:SJMP W10
K1: LCALL SHIFTL
W20:LCALL DISP ;等待按键抬起
MOV A,P3
CJNE A,#0FH,W21
LJMP A0
W21:MOV A,P3
CJNE A,#0F0H,W22
LJMP A0
W22:SJMP W20
LJMP A0
ALARM_1:LCALL SEC ;操作错误报警
RET
ALARM_2:LCALL SEC ;密码错误报警
LCALL DLY_L
RET
;**************************************************
;音频信号产生程序,用于声音报警
SEC:
MOV R2, #100
SEC_LP:clr P1.7
LCALL T1MSD
NOP
setb P1.7
LCALL T1MSD
DJNZ R2,SEC_LP
RET
;**************************************************
;段码,输入密码左移子程序
SHIFTL: MOV LED_BIT_6,LED_BIT_5
MOV LED_BIT_5,LED_BIT_4
MOV LED_BIT_4,LED_BIT_3
MOV LED_BIT_3,LED_BIT_2
MOV LED_BIT_2,LED_BIT_1
MOV LED_BIT_1,#40H
MOV KEY_6,KEY_5
MOV KEY_5,KEY_4
MOV KEY_4,KEY_3
MOV KEY_3,KEY_2
MOV KEY_2,KEY_1
MOV KEY_1,VAL
RET
;**************************************************
;段码,输入密码右移子程序
SHIFTR: MOV LED_BIT_1,LED_BIT_2
MOV LED_BIT_2,LED_BIT_3
MOV LED_BIT_3,LED_BIT_4
MOV LED_BIT_4,LED_BIT_5
MOV LED_BIT_5,LED_BIT_6
MOV LED_BIT_6,#00H
MOV KEY_1,KEY_2
MOV KEY_2,KEY_3
MOV KEY_3,KEY_4
MOV KEY_4,KEY_5
MOV KEY_5,KEY_6
MOV KEY_6,#00H
RET
;**************************************************
;以下为数码显示子程序
DISP: PUSH ACC
PUSH PSW
SETB RS0
MOV R0,#LED_BIT_1
MOV R2,#8
MOV R3,#0FEH
DISP1: mov P2,R3
MOV P0,@R0
LCALL DLY_S
MOV a,R3
RL A
MOV R3,A
INC R0
djnz R2,DISP1
POP PSW
POP ACC
RET
;**********************************************
T1MSD:MOV R3, #2
D0:MOV R4, #250
DJNZ R4, $
DJNZ R3, D0
RET
DLY_S: MOV R6,#10
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
DLY_L: MOV R5,#100
D2: MOV R6,#100
D3: MOV R7,#248
DJNZ R7,$
DJNZ R6,D3
DJNZ R5,D2
RET
FINI: NOP
END
案例五 双机通信
功能要求
利用AT89S52串行口,通过双机通信,实现单片机之间数据块的传送
甲机发送,乙机接收;
甲机发送地址信息,然后发送一批数据;
乙机把接收到的地址信息作为存放数据的首地址,然后将数据存入相应单元;
校验方式:累加校验和。
硬件电路设计
硬件电路结构示意图
参考程序
发送方:ORG 0000H
AJMP MAIN
ORG 0100H
MAIN: MOV SP,#60H
MOV SCON,#40H ; 串行口以方式1工作
MOV TMOD,#20H ; T1以方式2工作
MOV TH1,#0FDH ; 波特率9600
MOV TL1,#0FDH
SETB TR1
MOV P1,#0FFH
MOV 30H,#0FFH ;设拨码开关初始值
K0: MOV A,P1 ;读入拨码开关
CJNE A,30H,K1 ;判断与前次是不是相同,不同则跳至K1
SJMP K0
K1: MOV 30H,A ;存入拨动开关新值
MOV SBUF,A ;输入SBUF发送
WAIT: JBC TI,K0 ;是否发送完毕?
SJMP WAIT
END
接收方:ORG 0000H
AJMP MAIN
ORG 0100H
MAIN: MOV SP,#60
MOV SCON,#50H
MOV TMOD,#20H
MOV TH1,#0FDH
MOV TL1,#0FDH
SETB TR1
MOV P1,#0FFH
K0: JB RI,KK ;是否接收到数据,有则跳至KK
SJMP K0
KK: MOV A,SBUF ;将接收到的数据保存到累加器
MOV P1,A ;输出至P1
CLR RI ;清除RI
SJMP K0
END
案例六 数字电压表设计
推荐访问:项目教学案例 单片机 汇编 教学案例