包括温度检测/4线步进电机/键盘模拟音量/点阵显示等
单片机源程序如下:
- ;*******************************************************************************
- ;*文件: 5key_volume_con.asm *
- ;*版本: ver1.0 *
- ;*功能描述: 混合键盘模拟音量数码管显示 *
- ;* 上两键:左键音量-,右键音量+ *
- ;* 下三键:左键音量24级,中键音量32级,右键音量05级 *
- ;*备注: *
- ;*软件仿真: PROTEUS 6 *
- ;*******************************************************************************
- KEY_OK BIT 00H
- VOLNUMB EQU 22H
- PHONE EQU 21H
- COUNTER EQU 23H ;用于显示的计数器
- KEYVAL EQU 25H
- DISPBUF EQU 5EH
- FIRST BIT P2.7 ;第一位数码管的位控制
- SECOND BIT P2.6 ;第二位数码管的位控制
- TMRVAR EQU 60110 ;65536-5000*12/11.0592 定时器初值5毫秒
- ;===============================================================================
- ORG 0000H
- JMP START
- ORG 0*8+3 ;INT0中断入口
- RETI
- ORG 1*8+3 ;TIMER0中断入口
- JMP INT_T0 ;转去定时器0中断服务程序入口
- ORG 2*8+3 ;INT1中断入口
- RETI
- ORG 3*8+3 ;TIMER1中断入口
- RETI
- ORG 4*8+3 ;串行中断入口
- RETI
- ;===============================================================================
- START:
- mov sp,#5fh
- mov p1,#0ffh
- mov p3,#0ffh
- mov volnumb,#40h
- call init_t0
- setb ea
- ;===============================================================================
- LOOP:;主程
- ACALL KEY
- JB KEY_OK,KEYPROC
- ACALL DISP_VOL
- AJMP LOOP
- ;===============================================================================
- disp_vol:;显示处理
- mov a,volnumb
- swap a
- anl a,#0fh
- mov dispbuf,a;十位到DISPBUF
- mov a,volnumb
- anl a,#0fh
- mov dispbuf+1,a;个位到DISPBUF+1
- ret
- ;==============================================================================
- keyproc:;键处理散转
- mov a,keyval
- mov keyval,#00h
- rl a
- mov dptr,#tab_key
- jmp @a+dptr
- tab_key:
- ajmp loop
- ajmp volup
- ajmp voldw
- ajmp volrsum
- ajmp vol24
- ajmp vol05
- ;===============================================================================
- KEY:;键盘程序
- clr key_ok;清键按下标志
- orl p3,#11000000b;下面三键判断
- clr key_ok
- mov a,p3
- orl a,#00111111b
- cpl a
- jz key_1
- acall delay
- acall delay
- mov a,p3
- orl a,#00111111b
- jz key_1
- nop
- jnb acc.7,keydw1
- nop
- jb acc.6,key_ret
- setb key_ok
- mov keyval,#3
- key_ret1:mov a,p3
- orl a,#00111111b
- cpl a
- jnz key_ret1;键松开否
- ajmp key_ret
- key_ret:ret
- keydw1:
- nop
- jnb acc.6,keydw2
- setb key_ok
- mov keyval,#4
- jmp key_ret1
- keydw2: setb key_ok
- mov keyval,#5
- jmp key_ret1
- key_1:
- setb p3.6
- clr p3.7 ;vol+按下
- nop
- nop
- jnb p3.6,key01
-
- clr p3.6;vol-按下
- setb p3.7
- nop
- nop
- jnb p3.7,key02
-
- keyexit: ajmp key_ret
- key01:
- acall delay
- acall delay
- nop
- nop
- jb p3.6,key01_ret
- setb key_ok
- mov keyval,#1
- nop
- acall delay
- acall delay
- key01_ret:jnb p3.6,$
- ajmp keyexit
- key02:
- acall delay
- acall delay
- nop
- nop
- jb p3.7,key02_ret
- setb key_ok
- mov keyval,#2
- nop
- acall delay
- acall delay
- key02_ret:jnb p3.7,$
- ajmp keyexit
- delay:; 去键抖延时
- push psw
- setb rs0
- mov r7,#50
- d1: mov r6,#50
- d2: djnz r6,d2
- djnz r7,d1
- pop psw
- ret
- ;===============================================================================
- volup:;键盘音量+
- mov phone,volnumb
- mov a,phone
- xrl a,#70h
- jz volup1
- acall uaa
- mov volnumb,phone
- jmp loop
- volup1: mov volnumb,#70h
- jmp loop
- ;===============================================================================
- voldw:;键盘音量-
- mov phone,volnumb
- mov a,phone
- jz voldw1
- acall daa
- mov volnumb,phone
- jmp loop
- voldw1: mov volnumb,#00h
- jmp loop
- ;===============================================================================
- volrsum:;32级
- mov volnumb,#32h
- ajmp loop
- vol24:;24级
- mov volnumb,#24h
- ajmp loop
- vol05:;05级
- mov volnumb,#05h
- ajmp loop
- ;===============================================================================
- uaa:;递增1
- mov a,phone
- swap a
- anl a,#0fh
- mov r5,a
- mov a,phone
- anl a,#0fh
- nop
- cjne a,#09h,uaa_1
- nop
- mov r4,#00h
- inc r5
- ajmp uaa_2
- uaa_1:
- inc a
- mov r4,a
- uaa_2:
- mov a,r5
- swap a
- add a,r4
- mov phone,a
- ret
- ;===============================================================================
- daa:;递减1
- mov a,phone
- swap a
- anl a,#0fh
- mov r5,a
- mov a,phone;
- anl a,#0fh
- jnz daa_1
- mov r4,#09h
- dec r5
- nop
- sjmp daa_2
- daa_1:
- dec a
- mov r4,a
- daa_2:
- mov a,r5;
- swap a
- add a,r4
- mov phone,a
- ret
- ;===============================================================================
- INIT_T0: ;初始化T0为5毫秒的定时器
- MOV TMOD,#01H
- MOV TH0,#HIGH(TMRVAR)
- MOV TL0,#LOW(TMRVAR)
- SETB ET0 ;开T0中断
- SETB TR0 ;定时器0开始运行
- RET ;返回
- ;===============================================================================
- ;以下是中断程序,实现数码管显示
- INT_T0: ;定时器T0的中断响应程序
- PUSH ACC ;ACC入栈
- PUSH PSW ;PSW入栈
- MOV TH0,#HIGH(TMRVAR)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
Proteus单片机仿真实例大全[1].part001.rar
(500 KB, 下载次数: 11)
|