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

📄 fengmingqi.txt

📁 用单片机实现蜂鸣器
💻 TXT
📖 第 1 页 / 共 2 页
字号:
MEM_SO		BIT	P3.0
MEM_SCK		BIT	P3.1
MEM_SI		BIT	P3.2             
MEM_CS 		BIT	P1.7

BEEP_PORT	BIT	P3.4            ;蜂鸣器控制端口

WORK_PORT       EQU     P2              ;系统升级时的工作端口
SHAKE_HIGH      EQU     0F7H            ;11110111B
SHAKE_LOW       EQU     0FBH            ;11111011B

RECEIVE1        EQU     03H             ;器件在线升级时的数据接收端口1(P2.3)
RECEIVE2        EQU     02H             ;器件在线升级时的数据接收端口1(P2.2)
SEND_PORT1      BIT     P2.3            ;器件在线升级时的数据发送端口1
SEND_PORT2      BIT     P2.2            ;器件在线升级时的数据发送端口2
READ_CODE       BIT     P2.1
WRITE_CODE      BIT     P2.0

;CHPCON          EQU     0BFH            ;W78E58B专用寄存器
;CHPENR          EQU     0F6H            ;W78E58B专用寄存器
;SFRAL           EQU     0C4H            ;W78E58B专用寄存器
;SFRAH           EQU     0C5H            ;W78E58B专用寄存器
;SFRFD           EQU     0C6H            ;W78E58B专用寄存器
;SFRCN           EQU     0C7H            ;W78E58B专用寄存器
;T2MOD           EQU     0C9H            ;W78E58B定时器2工作模式寄存器
IDLE_L8         EQU     0F0H
IDLE_H8         EQU     0FFH


KEY_ACK         BIT     20H.0		;按键已响应标志
UPDATE_EN       BIT     20H.1           ;软件升级时握手成功标志,为1时有效
LEFT_RIGHT      BIT     20H.2           ;屏幕左边数据已显示完标志,为1有效
IN_BLANK        BIT     20H.3           ;处于闪烁显示时,定时更换显示标志
SHAKE_ENABLE    BIT     20H.4           ;允许发送软件升级的握手信号标志
CHANGE_PORT     BIT     20H.5           ;定时更换端口数据状态标志
BEEP_FLAG       BIT     20H.6           ;蜂鸣器工作允许标志
START_EN        BIT     20H.7		;允许启动升级标志

BEEP_ON_TIME    EQU     05H     ;蜂鸣器发声时间

SHAKE_HAND1     EQU     0C6H    ;系统握手数据1
SHAKE_HAND2     EQU     03AH    ;系统握手数据2
SHAKE_HAND3     EQU     09EH    ;系统握手数据3
SHAKE_HAND4     EQU     0B5H    ;系统握手数据4

ISP_SHAKE0      EQU     90H     ;在线编程握手标志数据0
ISP_SHAKE1      EQU     06H     ;在线编程握手标志数据1
ISP_SHAKE2      EQU     4CH     ;在线编程握手标志数据2
ISP_SHAKE3      EQU     12H     ;在线编程握手标志数据3

ISP_SHAKE4      EQU     01H     ;在线编程握手标志数据4
ISP_SHAKE5      EQU     0F0H    ;在线编程握手标志数据5
ISP_SHAKE6      EQU     75H     ;在线编程握手标志数据6
ISP_SHAKE7      EQU     0A8H    ;在线编程握手标志数据7

ISP_SHAKE8      EQU     82H     ;在线编程握手标志数据8
ISP_SHAKE9      EQU     0C2H    ;在线编程握手标志数据9
ISP_SHAKEA      EQU     97H     ;在线编程握手标志数据A
ISP_SHAKEB      EQU     55H     ;在线编程握手标志数据B

ISP_SHAKEC      EQU     0C2H    ;在线编程握手标志数据C
ISP_SHAKED      EQU     0AAH    ;在线编程握手标志数据D
ISP_SHAKEE      EQU     74H     ;在线编程握手标志数据E
ISP_SHAKEF      EQU     14H     ;在线编程握手标志数据F

ISP_SHAKEG      EQU     19H     ;在线编程握手标志数据G
ISP_SHAKEH      EQU     96H     ;在线编程握手标志数据H
ISP_SHAKEI      EQU     31H     ;在线编程握手标志数据I
ISP_SHAKEJ      EQU     0DEH    ;在线编程握手标志数据J

T1_H8           EQU     0B1H    ;20ms
T1_L8           EQU     0E0H


;以下是存储单元分配使用情况
T0_H8           EQU     10H
T0_L8           EQU     11H
SYSTEM_STATUS   EQU     16H     ;系统工作状态存放单元

KEY_DATA        EQU     44H     ;按键键值临时存放单元
KEY_AGE_COUNT   EQU     45H     ;按键年龄计数单元
BEEP_WAVE       EQU     47H     ;蜂鸣器发声时间
STACK_POINT     EQU     69H     ;系统堆栈指针,实质上堆栈区由6AH单元开始




                ORG     0000H
                LJMP    MAIN_LOADER


                ORG     000BH
                CLR     TR0             ;定时器T0停止运行
                MOV     A,T0_L8         ;重新设置定时器初值
                MOV     TL0,A
                MOV     A,T0_H8
                MOV     TH0,A
                RETI

                ORG     001BH           ;10ms
                MOV     TH1,#T1_H8
                MOV     TL1,#T1_L8
                CLR     MEM_CS          ;首先清除X5045的看门狗定时器
                NOP
                SETB    MEM_CS
                JB      SHAKE_ENABLE,PRM
                AJMP    KEYBOARD
PRM:            MOV     A,#SHAKE_HIGH
                JB      CHANGE_PORT,PRN
                MOV     A,#SHAKE_LOW
PRN:            MOV     P2,A
                CPL     CHANGE_PORT
                JB      READ_CODE,PRQ
                MOV     P2,#0FFH
                SETB    START_EN
                CLR     SHAKE_ENABLE
PRQ:            JB	BEEP_FLAG,BEEP_WORK;蜂鸣器服务检查程序
                NOP                     ;冗余指令,抗干扰用
                NOP
TASK_END:       RETI

BEEP_WORK:      DJNZ    BEEP_WAVE,END_BEEP
                SETB    BEEP_PORT       ;结束发声
                CLR     BEEP_FLAG
END_BEEP:       RETI


MAIN_LOADER:    CLR     EA
                MOV     SP,#STACK_POINT ;设置系统堆栈指针
                MOV     A,#0FFH
                MOV     P0,A
                MOV     P1,A
                MOV     P2,A
                MOV     P3,A
                CLR     A
                MOV	IP,A
		MOV	IE,A
		MOV	PSW,A           ;设定0区工作寄存器
		MOV	TCON,A
		MOV	T2CON,A

                LCALL   ALARM_OK

                MOV     CHPENR,#87H     ;设置允许改变CHPCON数据命令
                MOV     CHPENR,#59H
                MOV     CHPCON,#13H     ;进入在线编程状态,同时使能片内AUX_RAM
                CLR     A
                MOV     CHPENR,A        ;禁止改变CHPCON寄存器内容

                MOV     TCON,A
                MOV     IP,A
                MOV     IE,#82H         ;允许定时器0中断,准备从IDLE模式唤醒
                MOV     A,#IDLE_L8
                MOV     T0_L8,A
                MOV     TL0,A
                MOV     A,#IDLE_H8
                MOV     T0_H8,A
                MOV     TH0,A
                MOV     TMOD,#01H       ;设置T0为16位定时器模式
                MOV     TCON,#10H       ;启动定时器0工作
                MOV     PCON,#01H       ;进入IDLE工作模式,准备进入在线编程状态

READY_UPDATE:   CLR     MEM_CS          ;清除X5045的看门狗定时器
                NOP
                SETB    MEM_CS

                CLR     A
                MOV	20H,A		;系统工作标志单元
		MOV	21H,A           ;系统工作标志单元
                MOV	KEY_AGE_COUNT,A	;按键年龄
		MOV	KEY_DATA,A	;保存键值
                MOV     SYSTEM_STATUS,A

                MOV     TCON,A
                MOV     TMOD,#11H       ;设置T0,T1为16位定时器模式
                MOV     TH1,#T1_H8
                MOV     TL1,#T1_L8
                CLR     TF1
                SETB    TR1             ;启动定时器T1
                SETB    ET1             ;允许定时器T1中断
                SETB    EA              ;允许全局中断

                JNB     UPDATE_EN,$     ;等待软件升级的握手信号
                CLR     UPDATE_EN

                LCALL   RECEIVE_SHAKE   ;等待接收芯片擦除并查空完毕信息

                LCALL   READ_APROM_SET  ;器件编程
                LCALL   READ_PAGE

                LCALL   READ_APROM_SET  ;编程效验
                LCALL   READ_PAGE

                MOV     A,#0FFH
                MOV     P2,A
                LCALL   ALARM_OK
                SJMP    READY_UPDATE

KEYBOARD:       MOV	A,P1		;读取键盘口的状态
                ORL     A,#11111001B    ;屏蔽不需要的数据位,系统暂未用到
                CPL     A		;将ACC取反
                JZ	NO_KEY		;没有键压下,转NO_KEY
                INC	KEY_AGE_COUNT	;按键年龄加一
		XCH	A,KEY_DATA	;保存键值
		XRL	A,KEY_DATA	;与上次按键相同否?
		JZ	SAME_KEY	;相同,转SAME_KEY
NO_KEY:         CLR     A
                MOV	KEY_AGE_COUNT,A ;不同,按键年龄清零
		CLR	KEY_ACK		;清除'按键已响应'标志
                RETI

SAME_KEY:       MOV	A,#0FEH         ;单击键年龄初始化为40ms
		ADD	A,KEY_AGE_COUNT
		JC	ACCEPT		;按键年龄已到,转ACCEPT处理
MPY:            RETI		        ;年龄未到,不作处理
ACCEPT:         JB	KEY_ACK,KEY_OFF

UPDATE_REQ:     MOV     A,KEY_DATA
                JB      ACC.1,SEND_EN
                JB      ACC.2,SEND_EN
                SJMP    KEY_OFF
SEND_EN:        JB      START_EN,SEND_COMMAND
                SETB    SHAKE_ENABLE   ;设置允许发送软件升级的握手信号标志
                CLR     CHANGE_PORT
                LCALL	BEEP_ONE
KEY_OFF:	SETB	KEY_ACK		;设置'按键已响应'标志
                CLR     A
		MOV	KEY_AGE_COUNT,A	;按键年龄清零
NRP:            RETI

SEND_COMMAND:   CLR     WRITE_CODE      ;接口信号
FKW:            CLR     MEM_CS          ;首先清除X5045的看门狗定时器
                NOP
                SETB    MEM_CS

⌨️ 快捷键说明

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