收藏 分享(赏)

pic汇编实例.doc

上传人:scg750829 文档编号:6784399 上传时间:2019-04-22 格式:DOC 页数:149 大小:725KB
下载 相关 举报
pic汇编实例.doc_第1页
第1页 / 共149页
pic汇编实例.doc_第2页
第2页 / 共149页
pic汇编实例.doc_第3页
第3页 / 共149页
pic汇编实例.doc_第4页
第4页 / 共149页
pic汇编实例.doc_第5页
第5页 / 共149页
点击查看更多>>
资源描述

1、MCD1 实战一,LED8 位流水灯霹雳灯;该实战的目的作为学习和应用 MCD1 在线调试工具套件,进行项目的软件和硬件;联合调试的范例程序,也就是当做一个用户程序实例,而演示板暂时充当用户电;路的角色。这样就构成了一个软件、硬件齐全的自制项目模拟环境。;本程序实现的功能是,把端口 RC 的 8 条引脚全部设置为输出模式,依次从引脚 RC0;到 RC7 送出高电平,然后再依次从引脚 RC7 到 RC0 送出高电平,并且周而复始,从而;使得与该端口 C 相连的 8 只发光二极管 LED 循环依次点亮,其效果类似于一个简单的霹雳灯。;该程序可用于 PIC16F87X(A)所有系列;PIC 单片机学

2、习网 http:/;*;霹雳灯程序。文件名为“mcd-led1.ASM”;*status equ 3h ;定义状态寄存器地址portc equ 7h ;定义端口 C 的数据寄存器地址trisc equ 87h ;定义端口 C 的方向控制寄存器地址flag equ 25h ;定义一个控制左移/右移的标志寄存器;*org 000h ;定义程序存放区域的起始地址nop ;放置一条 ICD 必须的空操用指令bsf status,5 ;设置文件寄存器的体 1movlw 00h ;对端口 C 的方向控制码 00H 先送 Wmovwf trisc ;再由 W 转移到方向控制寄存器bcf status,5 ;

3、恢复到文件寄存器体 0movlw 01h ;将 00000001B 先送 Wmovwf portc ;再由 W 转移到数据寄存器bsf flag,0 ;将左右移标志位置 1,首先进行左移 LEDbcf status,0 ;先清除 C 标志位loop btfss status,0 ;测试进位/借位位,是 1 则修改标志goto loop1 ;是 0 则不修改标志comf flag,1 ;FLAG 的 BIT0 作为标志位,把它取反loop1 btfss flag,0 ;判断标志位,是 1 则跳到循环左移goto loop2 ;是 0 则跳到循环右移rlf portc,0 ;循环左移端口 C 数据

4、寄存器,结果送 Wmovwf portc ;将结果再送回端口 C 的数据寄存器goto loop3 ;跳过下面两条指令loop2 rrf portc,0 ;循环右移端口 C 数据寄存器,结果送回 Wmovwf portc ;将结果再送回端口 C 的数据寄存器 ;loop3 call delay ;调用廷时子程序goto loop ;返回;-廷时子程序-delay ;子程序名,也是子程序入口地址movlw 0ffh ;将外层循环参数值 FFH 经过 Wmovwf 20h ;送入用作外循环变量的 20H 单元lp0 movlw 0ffh ;将内层循环参数值 FFH 经过 Wmovwf 21h ;送

5、入用作内循环变量的 21H 单元lp1 decfsz 21h,1 ;变量 21H 内容递减,若为 0 跳跃goto lp1 ;跳转到 LP1 处decfsz 20h,1 ;变量 20H 内容递减,若为 0 跳跃goto lp0 ;跳跃到 LP0 处return ;返回主程序end ;源程序结束;*; 进入该实战演练的工序流程如下:; 1.软硬件的安装:按照本说明书前面讲的”MPLAB-ICD 的安装和使用”一节内介绍的方法操作即可.; 2.创建源文件和编辑源文件;在此介绍一种不同于前面讲的创建源文件的方法,用 Windows 附件中的”记事本”; 这个为大家所熟知和好用的文件编辑器,并且可以方

6、便的加入中文注释.不过有两点需要注意,一是注释前面的; 分号”;”必须用西文半角输入;二是必须用”.asm”扩展名存储到事先建立的一个专用子目录下.; 3.打开 MPLAB 集成开发环境:首先在 WINDOWS 环境下,选用开始程序Microchip MPLABMPLAB 命令,启动 MPLAB; 并进入 MPLAB 的桌面.; 4.创建项目:选用菜单 FileNew 或 ProjectNew Project,在事先建立的一个专用子目录下创建一个新项目,将; 用记事本创建的源文件加入到该项目中.; 5.建立项目中的目标文件:选择菜单 Project Build All(项目建立所有文件),MP

7、LAB 将自动调用 MPASM 将项目; 文件管理下的源文件(.asm)汇编成十六进制的目标文件(.hex).; 6.ICD 参数设置:通过菜单命令 ProjectEdit Project 或者OptionDevelopment Mode,将开发模式设置为; ”MPLAB ICD Debugger”,点击 OK 按钮,打开 ICD 的工作窗口,在调试阶段,可以按照说明书图 2-10 设置各项,但需注意; OSCILLATOR 应设置为 XT 方式,尤其需要说明的是,选中“Enable Debug Mode”(使能调试模式)选项,在向目; 标单片机烧写机器码程序时,会将调试临控程序同时写入单片机

8、的指定程序存储器区域,然后才允许用 ICD 方式调试。; 7.电路设置:将演示板的 S1 全部拔到 ON,S4 全部拔到 OFF,S13 的第 5、第 6、第 7 全部拔到 OFF ,LCD 不要插在演示板上,; 以使端口 C 只与 8 只发光二极管接通;将用于选择频率的插针跳线插到”XT OSC”位置上.; 8.向目标单片机烧写目标程序:用户在点击功能按钮”Program”向目标单片机烧写机器码程序时,会等待一段时间,; 并且在条状的状态信息栏中,出现提示信息。有一点需要引起注意,就是PIC16F87X 单片机的 FLASH 程序存储器的擦写; 周期是有限的,大约为 1000 次,应尽量节省

9、它的使用寿命。; 9.运行和调试用户程序和用户电路:在各项参数设置好后,将 ICD 的工作窗口最小化,利用前面讲的”运行及调试”中介; 绍的几种方法进行调试.当用自动单步方式调试时,建议临时禁止廷时子程序发挥作用,具体的方法是,可在 CALL DELAY 指; 令前添加一个分号,并且重新汇编一次.为了学习目的,在调试过程中可以人为地加入一些软件漏洞(BUG)或硬件故障,来模; 仿单片机端口引脚的片内或片外故障.; 10.定型烧写目标单片机;经过多次重复上述步骤的反复修改和调试,使得程序和电路在联机状态完全正常,这时可以进行; 定型烧写,即将 ICD 窗口中的”Enable Debug Mode

10、”(使能调试模式)选项消除,不再将调试临控程序写入单片机中.; 11.独立运行验收:上一步中的烧写过程完成后,即可将 ICD 模块和 ICD 仿真头(或演示板)之间的 6 芯电缆断开,让单片机在; 演示板独立运行,观察实际效果.;MCD1 实战二:单键触发 8 位二进制累加计数器;程序文件名为“MCD-LED2.ASM“;PIC 单片机学习网 http:/;该程序的目的是让大家熟悉输入、输出端口的使用;该程序的功能是把演示板当做一个按键计数器。刚刚接通电源时,8 只发光二极管都不亮。;表示计数器初值为 0,当按下开关 S3(RB0)时,计数器的值加 1,发光二极管 D3 点亮,表示值 1,然后

11、松开;按钮;再次按下开关 S3(RB0)时,计数器的值又加 1,发光二极管 D4 点亮,表示值 2,依次类推,反复循环。;程序清单:;*status equ 3h ;定义状态寄存器地址portb equ 6h ;定义端口 B 的数据寄存器地址trisb equ 86h ;定义端口 B 的方向控制寄存器地址portc equ 7h ;定义端口 C 的数据寄存器地址trisc equ 87h ;定义端口 C 的方向控制寄存器地址data1 equ 20h ;定义一个廷时变量寄存器data2 equ 21h ;定义另一个廷时变量寄存器n1 equ d13 ;定义一个外层循环廷时常数n2 equ 0f

12、fh ;定义一个内层廷时常数rp0 equ 5h ;定义状态寄存器的页选位 RP0;*org 000h ;定义程序存放区域的起始地址nop ;放置一条 ICD 必须的空操作指令bsf status,rp0 ;设置文件寄存器体 1movlw 00h ;将端口 C 的方向控制码 00H 先送 Wmovwf trisc ;再转到方向寄存器,将其设置为输出movlw 0ffh ;同理,将端口 B 设置为输入movwf trisb ;bcf status,rp0 ;恢复到文件寄存器体 0movlw 00h ;送计器初值 00H 到 RC 口显示movwf portc ;check btfsc portb

13、,0 ;测试 S3 按下否?是!跳过下条指令goto check ;否!则循环检测call delay ;调用廷时子程序,消除按钮抖动的影响btfsc portb,0 ;再次测试 S3 按下否?是!跳过下条指令goto check ;否!则循不检测incf portc,1 ;端口 C 的数据寄存器加 1,并送 LED 显示check1 btfss portb,0 ;测试 S3 断开否?是!跳过下条指令goto check1 ;否!则循不检测call delay ;调用廷时子程序,消除按钮抖动的影响btfss portb,0 ;再次测试 S3 断开否?是!跳过下条指令goto check1 ;否

14、!则循不检测goto check ;返回;*10MS 廷时子程序*delay ;子程序名,也是子程序入口地址movlw n1 ;将外层循环参数值送到 DATA1movwf data1 ;lp0 movlw n2 ;将内层循环参数值送到 DATA2movwf data2 ;lp1 decfsz data2,1 ;变量 DATA2 内容递减,若为 0 则跳跃goto lp1 ;跳转到 LP1decfsz data1,1 ;变量 DATA1 内容递减,若为 0 则跳跃goto lp0 ;跳转到 LP0return ;返回主程序end ;源程序结束;*; 进入该实战演练的工序流程如下:; 1.软硬件的

15、安装:按照本说明书前面讲的”MPLAB-ICD 的安装和使用”一节内介绍的方法操作即可.; 2.创建源文件和编辑源文件;在此介绍一种不同于前面讲的创建源文件的方法,用 Windows 附件中的”记事本”; 这个为大家所熟知和好用的文件编辑器,并且可以方便的加入中文注释.不过有两点需要注意,一是注释前面的; 分号”;”必须用西文半角输入;二是必须用”.asm”扩展名存储到事先建立的一个专用子目录下.; 3.打开 MPLAB 集成开发环境:首先在 WINDOWS 环境下,选用开始程序Microchip MPLABMPLAB 命令,启动 MPLAB; 并进入 MPLAB 的桌面.; 4.创建项目:选

16、用菜单 FileNew 或 ProjectNew Project,在事先建立的一个专用子目录下创建一个新项目,将; 用记事本创建的源文件加入到该项目中.; 5.建立项目中的目标文件:选择菜单 Project Build All(项目建立所有文件),MPLAB 将自动调用 MPASM 将项目; 文件管理下的源文件(.asm)汇编成十六进制的目标文件(.hex).; 6.ICD 参数设置:通过菜单命令 ProjectEdit Project 或者OptionDevelopment Mode,将开发模式设置为; ”MPLAB ICD Debugger”,点击 OK 按钮,打开 ICD 的工作窗口,在

17、调试阶段,可以按照说明书图 2-10 设置各项,但需注意; OSCILLATOR 应设置为 XT 方式,尤其需要说明的是,选中“Enable Debug Mode”(使能调试模式)选项,在向目; 标单片机烧写机器码程序时,会将调试临控程序同时写入单片机的指定程序存储器区域,然后才允许用 ICD 方式调试。; 7.电路设置:将演示板的 S1 全部拔到 ON,S4 全部拔到 OFF,S13 的第 1 拔到 ON、第 5、第 6、第 7 全部拔到 OFF ,LCD 不要插在演示板上,; 以使端口 C 只与 8 只发光二极管接通;将用于选择频率的插针跳线插到”XT OSC”位置上.; 8.向目标单片机

18、烧写目标程序:用户在点击功能按钮”Program”向目标单片机烧写机器码程序时,会等待一段时间,; 并且在条状的状态信息栏中,出现提示信息。有一点需要引起注意,就是PIC16F87X 单片机的 FLASH 程序存储器的擦写; 周期是有限的,大约为 1000 次,应尽量节省它的使用寿命。; 9.运行和调试用户程序和用户电路:在各项参数设置好后,将 ICD 的工作窗口最小化,利用前面讲的”运行及调试”中介; 绍的几种方法进行调试.当用自动单步方式调试时,建议临时禁止廷时子程序发挥作用,具体的方法是,可在 CALL DELAY 指; 令前添加一个分号,并且重新汇编一次.为了学习目的,在调试过程中可以

19、人为地加入一些软件漏洞(BUG)或硬件故障,来模; 仿单片机端口引脚的片内或片外故障.; 10.定型烧写目标单片机;经过多次重复上述步骤的反复修改和调试,使得程序和电路在联机状态完全正常,这时可以进行; 定型烧写,即将 ICD 窗口中的”Enable Debug Mode”(使能调试模式)选项消除,不再将调试临控程序写入单片机中.; 11.独立运行验收:上一步中的烧写过程完成后,即可将 ICD 模块和 ICD 仿真头(或演示板)之间的 6 芯电缆断开,让单片机在; 演示板独立运行,观察实际效果.;实战三、花样 LED 闪烁灯;该实战的目的是让大家进一步熟悉 IO 口输入输出的的使用;随着大家对

20、程序指令的进一定熟悉,本实例减略了简单的注释;通过前面的实例大家对 PIC16F87X(A)的寄存器已经有了初步的认识,本实例不再;单独定义寄存器,引入了 PIC16F877 的预定义文件;PIC 单片机学习网 陈学乾 http:/;程序名为“MCD-LED3.ASM“;*;* 本程序是一个 LED 灯的循环闪烁程序,用 INT 键(S3)来切换*;* 闪烁模式 *;*include ;*-MODESEL equ 20hMODESELB equ 21hCount equ 22hCount1 equ 23hCount2 equ 24hPORTDB equ 25h;*-org 0nopgoto s

21、tartorg 4goto ISRorg 10startclrf PORTC ;清 D 口movlw 00hmovwf MODESEL ;初始化模式选择寄存器movwf MODESELBmovlw b10010000movwf INTCON ;初始化中断控制bsf STATUS,RP0clrf TRISC ;设 C 口全为输出movlw b10111111OPTION ;选择 INT 下降沿有效bcf STATUS,RP0call FMselmovwf PORTDBmovwf PORTCmain btfsc PORTB,0 ;goto $+6 ; call Delay ; 按键去抖动btfsc

22、 PORTB,0goto $+3 ; /call FMsel ;/movwf PORTDBmovf MODESELB,W ;movwf MODESEL ;call LongDelaybcf STATUS,Crlf PORTDB,1btfsc STATUS,Cbsf PORTDB,0movf PORTDB,Wmovwf PORTCgoto main;*-Delay ; call 指令占用 2 个指令周期clrf Count ; 清 Count 占用 1 个指令周期Dloopdecfsz Count,f ; 这两行指令将延时goto Dloop ; (256 * 3) -1 个指令周期return

23、 ; return 占用 2 个指令周期;*-LongDelayclrf Countclrf Count1movlw 0x01movwf Count2LDloopdecfsz Count,fgoto LDloopdecfsz Count1,fgoto LDloopdecfsz Count2,fgoto LDloopreturn;*-FMselmovf MODESEL,wmovwf MODESELBmovf MODESEL,waddwf PCLretlw b11111000retlw b11110000retlw b11100000retlw b11000000retlw b10000000mo

24、vlw 00hmovwf MODESELBbsf INTCON,GIEretlw b11111000return;*-ISRbtfss INTCON,INTFgoto $+3bcf INTCON,INTFincf MODESELretfieend;*; 进入该实战演练的工序流程如下:; 1.创建源文件和编辑源文件;在此介绍一种不同于前面讲的创建源文件的方法,用 Windows 附件中的”记事本”; 这个为大家所熟知和好用的文件编辑器,并且可以方便的加入中文注释.不过有两点需要注意,一是注释前面的; 分号”;”必须用西文半角输入;二是必须用”.asm”扩展名存储到事先建立的一个专用子目录下.;

25、2.打开 MPLAB 集成开发环境:首先在 WINDOWS 环境下,选用开始程序Microchip MPLABMPLAB 命令,启动 MPLAB; 并进入 MPLAB 的桌面.; 3.创建项目:选用菜单 FileNew 或 ProjectNew Project,在事先建立的一个专用子目录下创建一个新项目,将; 用记事本创建的源文件加入到该项目中.; 4.建立项目中的目标文件:选择菜单 Project Build All(项目建立所有文件),MPLAB 将自动调用 MPASM 将项目; 文件管理下的源文件(.asm)汇编成十六进制的目标文件(.hex).; 5.ICD 参数设置:通过菜单命令 P

26、rojectEdit Project 或者OptionDevelopment Mode,将开发模式设置为; ”MPLAB ICD Debugger”,点击 OK 按钮,打开 ICD 的工作窗口,在调试阶段,可以按照说明书图 2-10 设置各项,但需注意; OSCILLATOR 应设置为 XT 方式,尤其需要说明的是,选中“Enable Debug Mode”(使能调试模式)选项,在向目; 标单片机烧写机器码程序时,会将调试临控程序同时写入单片机的指定程序存储器区域,然后才允许用 ICD 方式调试。; 6.电路设置:将演示板的 S1 全部拔到 ON,S4 全部拔到 OFF,S13 的第 1 拔到

27、 ON、第 5、第 6、第 7 全部拔到 OFF ,LCD 不要插在演示板上,; 以使端口 C 只与 8 只发光二极管接通;将用于选择频率的插针跳线插到”XT OSC”位置上.; 7.向目标单片机烧写目标程序:用户在点击功能按钮”Program”向目标单片机烧写机器码程序时,会等待一段时间,; 并且在条状的状态信息栏中,出现提示信息。有一点需要引起注意,就是PIC16F87X 单片机的 FLASH 程序存储器的擦写; 周期是有限的,大约为 1000 次,应尽量节省它的使用寿命。; 8.运行和调试用户程序和用户电路:在各项参数设置好后,将 ICD 的工作窗口最小化,利用前面讲的”运行及调试”中介

28、; 绍的几种方法进行调试.当用自动单步方式调试时,建议临时禁止廷时子程序发挥作用,具体的方法是,可在 CALL DELAY 指; 令前添加一个分号,并且重新汇编一次.为了学习目的,在调试过程中可以人为地加入一些软件漏洞(BUG)或硬件故障,来模; 仿单片机端口引脚的片内或片外故障.; 9.定型烧写目标单片机;经过多次重复上述步骤的反复修改和调试,使得程序和电路在联机状态完全正常,这时可以进行; 定型烧写,即将 ICD 窗口中的”Enable Debug Mode”(使能调试模式)选项消除,不再将调试临控程序写入单片机中.; 10.独立运行验收:上一步中的烧写过程完成后,即可将 ICD 模块和

29、ICD 仿真头(或演示板)之间的 6 芯电缆断开,让单片机在; 演示板独立运行,观察实际效果.;实战四简易四路抢答器;该抢答器供不多于 4 个参赛队或者个人的抢答比赛场合使用。每个参赛队的座位前;安装 1 只抢答按钮开关(用板上的 S9、S10、S11、S12)和一个信号灯(D4、D5、D6、D7)。;主持人座位前装一只复原开关(板上 S3)、1 只蜂鸣器(板上 BUZ1)和一个抢答器工作状态;指示灯(D10),每当主持人口头发出号令之后.哪个队先按下座位上的按钮开关,该座位的信;号灯就先被点亮,同时封锁其他按钮开关的活动.并且熄灭主持人座位上的状态指示灯和发出;三声类似于电话振铃的提示声,以

30、声明此次抢答动作已经完成.在主持人确认后,按下复原按钮;,状态指示灯重新点亮,并且同时发出“笛-笛-“声,为下一次抢答作好准备.;PIC 单片机学习网 陈学乾 http:/;程序文件名:“MCD-INTBUZ.ASM“;*;程序清单;*tmr0 equ 1h ;定义定时器/计数器 0 寄存器地址status equ 3h ;定义状态寄存器地址option_reg equ 81h ;定义选项寄存器地址option_temp equ 0a6h ;(在 BACK1)定义选项寄存器的备份寄存器的地址intcon equ 0bh ;定义中断控制寄存器地址portc equ 7h ;定义端口 RC 的数据

31、寄存器地址trisc equ 87h ;定义端口 RC 的方向控制寄存器地址portb equ 06h ;定义端口 RB 的数据寄存器地址trisb equ 86h ;定义端口 RB 的方向控制寄存器地址c equ 0 ;定义进位标志位的位地址z equ 2 ;定义 0 标志位的位地址w equ 0 ;定义传送目标寄存器为 W 的指示位f equ 1 ;定义传送目标寄存器为 RAM 的指示位t0if equ 2 ;定义 TMR0 中断标志位的位地址t0ie equ 5 ;定义 TMR0 中断使能位的位地址inte equ 4 ;定义外部中断使能位的位地址intf equ 1 ;定义外部中断标志

32、位的位地址count equ 20h ;定义一个计数器变量count1 equ 24h ;定义一个计数器变量count2 equ 25h ;定义一个计数器变量count3 equ 27h ;定义一个计数器变量count4 equ 28h ;定义一个计数器变量portb_b equ 21h ;为 PORTC 定义一个备份寄存器w_temp equ 7fh ;为 W 在体 0 和体 1 定义 2 个备份寄存器;w_temp equ 0ffh ;(若是 16F873/4,则需保留 FFH 单元)status_temp equ 23h ;为 STATUS 定义一个备份寄存器rp0 equ 5h ;定义

33、状态寄存器中的页选位 RP0;*复位向量和中断向量*org 000h ;nop ;设置一条 ICD 必须的空操作指令goto main ;org 0004h ;goto serv ;跳转到中断服务子程序;*主程序*mainbsf status,rp0 ;movlw 0 ;movwf trisc ;设置 RC 口全部为输出movlw 0ffh ;movwf trisb ;设置 RB 口全部为输入movlw 02h ;设置选项寄存器:上拉电阻启用;INT 下降沿触发movwf option_reg ;分频器给 TMR0;分频比 1:8bcf status,rp0 ;movlw 90h ;movwf

34、 intcon ;开发 INT 中断clrf portc ;RC 口灯全灭loopmovf portb,w ;读取 RB 口数据iorlw b11100001 ;送 RB 口的数到备份寄存器并将除S9、S10、S11、S12 以外的位全部送 1movwf portb_b ;xorlw 0ffh ;没有键按下转 LOOP 继续检测btfsc status,z ;goto loop ;call delay10ms ;防抖动廷时movf portb,w ;iorlw b11100001 ;xorwf portb_b,0 ;再次读取 RB 口的数据,与前一次读的数相同则键值有效btfsc status

35、,z ;goto loop ;comf portb_b,w ;取反以便使被按下按键的位为 1,其它位为 0movwf portc ;送 RC 口显示call tone3t ;调用发声三次子程序loop1comf portb,w ;检测按键是否有松开andlw b00011110 ;btfsc status,z ;goto loop ;松开了返回goto loop1 ;没松开继续检测;*中断服务子程序*serv ;*保存护现场部分*movwf w_temp ;保护 Wswapf status,w ;保护 STATUSclrf status ;选择体 0movwf status_temp ;将 S

36、TATUS 存入体 0 的备份寄存器;* 调查中断源*btfsc intcon,intf ;检查不是 INT 中断,返回goto intserv ;是!转到 INT 中断处理部分goto retfie0 ;*INT 中断处理部分*intservclrf portc ;令全部灯熄灭bsf portc,7 ;点亮 D10,表示就绪call tone630 ;调用高音子程序call delay ;调用 1S 廷时子程序call tone630 ;调用低音子程序bcf intcon,intf ;清除 INT 中断标志位;*恢复现场部分*retfie0swapf status_temp,w ;恢复 ST

37、ATUSmovwf status ;swapf w_temp,f ;恢复 Wswapf w_temp,w ;retfie ;中断返加;*低音调发生子程序(500HZ/50MS)*tone500movlw .50 ;循环次数寄存器赋初值movwf count ;50=500HZx0.05Sx2t5lop bcf intcon,t0if ;清除 TRM0 溢出中断标志位movlw .131 ;给 TMR0 装入初值 256-125=131movwf tmr0 ;启动定时器t5herebtfss intcon,t0if ;定时器溢出否goto t5here ;否!循环栓测movlw b0100000

38、0 ;只将 BIT6 置位xorwf portc,f ;只将 RC6(BUZ)脚电平反转,其余不变decfsz count,f ;循环次数递减,为 0,跳一步goto t5lop ;不为 0,跳回return ;返回;*高音调发生子程序(630HZ/50MS)*tone630movlw .63 ;循环次数寄存器赋初值movwf count1 ;63=630HZx0.05Sx2t6lop bcf intcon,t0if ;清除 TRM0 溢出中断标志位movlw .157 ;给 TMR0 装入初值 157=256-99movwf tmr0 ;启动定时器t6herebtfss intcon,t0i

39、f ;定时器溢出否goto t6here ;否!循环栓测movlw b01000000 ;只将 BIT6 置位xorwf portc,f ;只将 RC6(BUZ)脚电平反转,其余不变decfsz count1,f ;循环次数递减,为 0,跳一步goto t6lop ;不为 0,跳回return ;返回;*发声 1S 子程序(1S=10x(50ms+50ms)*tonelsmovlw .10 ;循环次数寄存器赋初值movwf count2 ;t1lopcall tone500 ;调用低音子程序call tone630 ;调用高音子程序decfsz count2,f ;循环次数递减,为 0,跳一步

40、goto t1lop ;不为 0,跳回return ;返回;*TMR0 廷时子程序 1S(1S=16x256x(256-12)US)*delaybsf status,rp0 ;设置文件寄存器体 1movf option_reg,w ;保护选项寄存器内容movwf option_temp ;movlw 07h ;重设选项寄存器;上拉电阻启用,INT下降沿触发movwf option_reg ;分频器给 TRM0;分频比值设为 1:256bcf status,rp0 ;恢复到文件寄存器体 0movlw .16 ;循环利用 TMROP 定时 16 次movwf count3 ;溢出次数寄存器d1lo

41、pbcf intcon,t0if ;清除 TMR0 溢出中断标志位bcf intcon,t0ie ;清除 TMR0 溢出中断使能位movlw .12 ;给 TMR0 装入初值 12=256-244movwf tmr0 ;启动定时器herebtfss intcon,t0if ;用查询法检测 TMR0 溢出否goto here ;否!返回decfsz count3,f ;是!溢出次数减 1,为 0,跳一步goto d1lop ;否!循环利用 TMR0bsf status,rp0 ;设置文件寄存器体 1movf option_temp,w ;恢复选项寄存器内容movwf option_reg ;bcf status,rp0 ;恢复到文件寄存器体 0return ;返回;*断续发声 3 次报警子程序*tone3tmovlw .3 ;循环次数寄存器赋初值movwf count4 ;t3lopcall tonels ;调用发声 1S 子程序call delay ;调用廷时 1S 子程序decfsz count4,f ;循环次数递减,为 0,跳一步goto t3lop ;不为 0,跳回return ;返回;*软件廷时 10MS 子程序*delay10msmovlw .13

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报