⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fengmingqi.txt

📁 用单片机实现蜂鸣器
💻 TXT
📖 第 1 页 / 共 2 页
字号:
                JNB     READ_CODE,FKW
                MOV     R7,#04H
                MOV     30H,#SHAKE_HAND1
                MOV     31H,#SHAKE_HAND2
                MOV     32H,#SHAKE_HAND3
                MOV     33H,#SHAKE_HAND4
                MOV     R0,#30H         ;发送握手信号
NEXT_CMD:       MOV     A,@R0
                MOV     C,ACC.7         ;发送BIT7和比BIT6                                                                                      7777
                MOV     SEND_PORT1,C
                MOV     C,ACC.6
                MOV     SEND_PORT2,C
                SETB    WRITE_CODE
                JB      READ_CODE,$

                MOV     C,ACC.5         ;发送BIT5和比BIT4
                MOV     SEND_PORT1,C
                MOV     C,ACC.4
                MOV     SEND_PORT2,C
                CLR     WRITE_CODE
                JNB     READ_CODE,$

                MOV     C,ACC.3         ;发送BIT3和比BIT2
                MOV     SEND_PORT1,C
                MOV     C,ACC.2
                MOV     SEND_PORT2,C
                SETB    WRITE_CODE
                JB      READ_CODE,$

                MOV     C,ACC.1         ;发送BIT1和比BIT0
                MOV     SEND_PORT1,C
                MOV     C,ACC.0
                MOV     SEND_PORT2,C
                CLR     WRITE_CODE
                JNB     READ_CODE,$
                INC     R0              ;指向下一个数据
                DJNZ    R7,NEXT_CMD
                CLR     TR1             ;停止运行定时器T1
                CLR     ET1             ;禁止定时器T1中断
                CLR     TF1
                MOV     A,#0FFH
                MOV     P2,A
                SETB    UPDATE_EN
                AJMP    KEY_OFF

ALARM_OK:       CLR     BEEP_PORT
                MOV	R0,#00H		;延时约132ms
		MOV	R1,#00H
INIT_A:		DJNZ	R1,$
                CLR     MEM_CS          ;清除X5045的看门狗定时器
                NOP
                SETB    MEM_CS
		DJNZ	R0,INIT_A
                SETB    BEEP_PORT
                RET

READ_APROM_SET: CLR     A
                MOV     CHPENR,A        ;禁止改变CHPCON寄存器内容
                MOV     TCON,A          ;TR0=0,定时器0停止工作
                MOV     IP,A
                MOV     IE,#82H         ;允许定时器0中断
                MOV     TMOD,#01H       ;设置T0为16位定时器模式

                CLR     A
                MOV     SFRCN,A         ;读取APROM命令代码
                MOV     SFRAL,A         ;设置读取数据的器始地址
                MOV     SFRAH,A
                MOV     A,#0FEH         ;定时时间为2us
                MOV     T0_L8,A
                MOV     TL0,A
                MOV     A,#0FFH
                MOV     T0_H8,A
                MOV     TH0,A
                RET

READ_PAGE:      MOV     R0,#00H         ;设置读取的数据的存放首地址
READ_LOOP:      SETB    TR0
                MOV     PCON,#01H       ;进入IDLE工作模式,准备读取APROM中一个字节的内容
                MOV     A,SFRFD         ;读取APROM中一个字节的内容
                MOVX    @R0,A
                INC     SFRAL           ;修改地址指针,指向下一个数据单元
                INC     R0
                MOV     A,R0
                JNZ     READ_LOOP
                INC     SFRAH
                CLR     WRITE_CODE      ;设置数据传送的握手信号
WAIT_SHAKE:     CLR     MEM_CS          ;清除X5045的看门狗定时器
                NOP
                SETB    MEM_CS
                JB      READ_CODE,WAIT_SHAKE;等待主机响应信号

                MOV     R7,#00H         ;设置工作次数
                MOV     R0,#00H
NEXT_ROM:       MOVX    A,@R0
                MOV     C,ACC.7         ;发送BIT7和比BIT6                                                                                      7777
                MOV     SEND_PORT1,C
                MOV     C,ACC.6
                MOV     SEND_PORT2,C
                SETB    WRITE_CODE
                JNB     READ_CODE,$

                MOV     C,ACC.5         ;发送BIT5和比BIT4
                MOV     SEND_PORT1,C
                MOV     C,ACC.4
                MOV     SEND_PORT2,C
                CLR     WRITE_CODE
                JB      READ_CODE,$

                MOV     C,ACC.3         ;发送BIT3和比BIT2
                MOV     SEND_PORT1,C
                MOV     C,ACC.2
                MOV     SEND_PORT2,C
                SETB    WRITE_CODE
                JNB     READ_CODE,$

                MOV     C,ACC.1         ;发送BIT1和比BIT0
                MOV     SEND_PORT1,C
                MOV     C,ACC.0
                MOV     SEND_PORT2,C
                CLR     WRITE_CODE
                JB      READ_CODE,$
                INC     R0              ;指向下一个数据
                DJNZ    R7,NEXT_ROM
                MOV     A,#0FFH
                MOV     P2,A
                CLR     WRITE_CODE
                CLR     MEM_CS          ;清除X5045的看门狗定时器
                NOP
                SETB    MEM_CS
                MOV     A,SFRAH
                XRL     A,#80H          ;判断是否到达终止地址7FFFH
                JNZ     READ_PAGE
                RET

RECEIVE_SHAKE:  MOV     R7,#00H
                DJNZ    R7,$            ;延时等待512us

                MOV     P2,#0FFH
KHR:            CLR     MEM_CS          ;清除X5045的看门狗定时器
                NOP
                SETB    MEM_CS
                JB      WRITE_CODE,KHR  ;等待芯片擦除并查空完毕
                CLR     READ_CODE       ;设置响应获取擦除信息的握手信号标志
                MOV     R7,#14H         ;获取芯片擦除状态信息(共有20字节)
                MOV     R0,#90H
GET_BLANK:      JNB     WRITE_CODE,$    ;首先获取7,6位数据
                MOV     A,P2
                SETB    READ_CODE
                MOV     C,ACC.RECEIVE1  ;保留7,6位数据
                MOV     B.7,C
                MOV     C,ACC.RECEIVE2
                MOV     B.6,C

                JB      WRITE_CODE,$    ;接着获取5,4位数据
                MOV     A,P2
                CLR     READ_CODE
                MOV     C,ACC.RECEIVE1  ;保留5,4位数据
                MOV     B.5,C
                MOV     C,ACC.RECEIVE2
                MOV     B.4,C

                JNB     WRITE_CODE,$    ;获取3,2位数据
                MOV     A,P2
                SETB    READ_CODE
                MOV     C,ACC.RECEIVE1  ;保留3,2位数据
                MOV     B.3,C
                MOV     C,ACC.RECEIVE2
                MOV     B.2,C

                JB      WRITE_CODE,$    ;接着获取1,0位数据
                MOV     A,P2
                CLR     READ_CODE
                MOV     C,ACC.RECEIVE1  ;保留1,0位数据
                MOV     B.1,C
                MOV     C,ACC.RECEIVE2
                MOV     B.0,C
                MOV     A,B
                MOV     @R0,A
                INC     R0
                DJNZ    R7,GET_BLANK    ;不到20个字节,继续

                MOV     A,#0FFH
                MOV     P2,A

                MOV     R7,#14H         ;获取芯片擦除状态信息(共有20字节)
                MOV     R0,#90H
                MOV     DPTR,#PROG_SHAKE
FKT:            CLR     A
                MOVC    A,@A+DPTR
                XRL     A,@R0           ;比较数据是否符合系统要求
                JNZ     SHAKE_ERROR
                INC     R0
                INC     DPTR
                DJNZ    R7,FKT
                RET

SHAKE_ERROR:    CLR     MEM_CS          ;在线编程握手信号错误,则不再响应命令
                MOV     A,#0FFH
                MOV     P2,A
                SETB    MEM_CS
                SJMP    SHAKE_ERROR

PROG_SHAKE:     DB      ISP_SHAKE0      ;在线编程握手标志数据0
                DB      ISP_SHAKE1      ;在线编程握手标志数据1
                DB      ISP_SHAKE2      ;在线编程握手标志数据2
                DB      ISP_SHAKE3      ;在线编程握手标志数据3

                DB      ISP_SHAKE4      ;在线编程握手标志数据4
                DB      ISP_SHAKE5      ;在线编程握手标志数据5
                DB      ISP_SHAKE6      ;在线编程握手标志数据6
                DB      ISP_SHAKE7      ;在线编程握手标志数据7

                DB      ISP_SHAKE8      ;在线编程握手标志数据8
                DB      ISP_SHAKE9      ;在线编程握手标志数据9
                DB      ISP_SHAKEA      ;在线编程握手标志数据A
                DB      ISP_SHAKEB      ;在线编程握手标志数据B

                DB      ISP_SHAKEC      ;在线编程握手标志数据C
                DB      ISP_SHAKED      ;在线编程握手标志数据D
                DB      ISP_SHAKEE      ;在线编程握手标志数据E
                DB      ISP_SHAKEF      ;在线编程握手标志数据F

                DB      ISP_SHAKEG      ;在线编程握手标志数据G
                DB      ISP_SHAKEH      ;在线编程握手标志数据H
                DB      ISP_SHAKEI      ;在线编程握手标志数据I
                DB      ISP_SHAKEJ      ;在线编程握手标志数据J

BEEP_ONE:       MOV	A,#BEEP_ON_TIME ;设置蜂鸣器发声时间
                MOV     BEEP_WAVE,A
                CLR     BEEP_PORT       ;打开蜂鸣器
                SETB    BEEP_FLAG
                RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -