请教PIC单片机高手
谁能帮帮解说一下用汇编编程的乘除法运算是怎么编写的(是PIC单片机哦)
全部回复(8)
正序查看
倒序查看
现在还没有回复呢,说说你的想法
〓利瑪電子(新加坡)有限公司〓SKM400GB128D現貨137-1410 2508
〓利瑪電子(新加坡)有限公司〓SKM300GB128DE現貨137-1410 2508
〓利瑪電子(新加坡)有限公司〓SKM200GB128D現貨137-1410 2508
〓利瑪電子(新加坡)有限公司〓SKM400GB176D現貨137-1410 2508
〓利瑪電子(新加坡)有限公司〓137-1410 2580〓
※※※※※※利瑪電子(新加坡)有限公司※※※※※※※
★是一家專注於國際品牌功率模塊銷售為主的龍頭企業★
★在國際國內同行業中享有較高的知名度和良好的声誉★
〓代理及經銷的世界品牌:〓
1: 三菱(MITSUBISHI) 2: 富士(FUJI) 3: 東芝(TOSHIBA)
4: 三社(SANREX) 5:三肯(SANKEN) 6:日立(HITACHI)
7:西門康(SEMIKRON) 8:西門子(SIEMENS) 9:艾赛斯(IXYS)
10: IR(國際整流器) 11:欧派克(EUPEC) 12:英飛凌(INFINEON)
13:仙童(FAIRCHILD) 14: 泰科(TYCO) 15: 摩托羅拉(MOTOEOLA)
16: 新電元(SHINDENGEN) 17: 西碼(WESTCODE) 18: 日之初(HINODE)
19: 博仕曼(BUSSMANN) 20: (CATELEC) 21: (APT)
22: (ABB) 23: 賽靈思(XILINX) 24: 歐姆龍(OMRON)
銷售産品:IGBT、GTR、IPM、PIM、可控硅、整流橋、快恢複二極管、軟恢複二極管.
電解電容、場效應管、消特基、高頻無感電容.快速熔斷器.等等!!!
如:美國 日本 德國 英國 西班牙 瑞士等國際知名品牌
◆◆◆熱忱歡迎業界人士來電來函垂詢!!!◆◆◆
◆國際現貨供應商==來自原廠的品質==出售一流的服務◆
聯繫人:周先生
手機:137-1410-2508
電話:(86)-0755-88 364656
地址:深圳市羅湖區嘉賓路彭年酒店旁東佳大廈17樓
◆◆◆網絡聯繫方式◆◆◆
QQ:173943820
MSN:sz-lima@hotmail.com
E-mail:limapower@21cn.com
Http:www.lima-power.com.sg
〓利瑪電子(新加坡)有限公司〓SKM300GB128DE現貨137-1410 2508
〓利瑪電子(新加坡)有限公司〓SKM200GB128D現貨137-1410 2508
〓利瑪電子(新加坡)有限公司〓SKM400GB176D現貨137-1410 2508
〓利瑪電子(新加坡)有限公司〓137-1410 2580〓
※※※※※※利瑪電子(新加坡)有限公司※※※※※※※
★是一家專注於國際品牌功率模塊銷售為主的龍頭企業★
★在國際國內同行業中享有較高的知名度和良好的声誉★
〓代理及經銷的世界品牌:〓
1: 三菱(MITSUBISHI) 2: 富士(FUJI) 3: 東芝(TOSHIBA)
4: 三社(SANREX) 5:三肯(SANKEN) 6:日立(HITACHI)
7:西門康(SEMIKRON) 8:西門子(SIEMENS) 9:艾赛斯(IXYS)
10: IR(國際整流器) 11:欧派克(EUPEC) 12:英飛凌(INFINEON)
13:仙童(FAIRCHILD) 14: 泰科(TYCO) 15: 摩托羅拉(MOTOEOLA)
16: 新電元(SHINDENGEN) 17: 西碼(WESTCODE) 18: 日之初(HINODE)
19: 博仕曼(BUSSMANN) 20: (CATELEC) 21: (APT)
22: (ABB) 23: 賽靈思(XILINX) 24: 歐姆龍(OMRON)
銷售産品:IGBT、GTR、IPM、PIM、可控硅、整流橋、快恢複二極管、軟恢複二極管.
電解電容、場效應管、消特基、高頻無感電容.快速熔斷器.等等!!!
如:美國 日本 德國 英國 西班牙 瑞士等國際知名品牌
◆◆◆熱忱歡迎業界人士來電來函垂詢!!!◆◆◆
◆國際現貨供應商==來自原廠的品質==出售一流的服務◆
聯繫人:周先生
手機:137-1410-2508
電話:(86)-0755-88 364656
地址:深圳市羅湖區嘉賓路彭年酒店旁東佳大廈17樓
◆◆◆網絡聯繫方式◆◆◆
QQ:173943820
MSN:sz-lima@hotmail.com
E-mail:limapower@21cn.com
Http:www.lima-power.com.sg
0
回复
提示
@da2007
晕,多少位还不是一样的!
LIST p=16f877
INCLUDE p16f877.inc
ACCALO EQU 20 ;存放乘数低8位
ACCAHI EQU 21 ;存放乘数高8位
ACCBLO EQU 23 ;存放被乘数低8位和乘积第16~23位
ACCBHI EQU 24 ;存放被乘数高8位和乘积第24~31位
ACCCLO EQU 26 ;存放乘积低8位
ACCCHI EQU 27 ;存放乘积高8位
ACCDLO EQU 28 ;临时寄存器
ACCDHI EQU 29 ;临时寄存器
TEMP EQU 2A ;临时寄存器
SIGN EQU 2B ;存放乘积的符号
ORG 0X0000
START GOTO MAIN
;***16×16位乘法子程序,入口地址ACCB×ACCA,出口地址ACCB和ACCC ***
ORG 0X0100
D_mpy CALL S_SIGN ;求取乘积的符号,并对负数取补
CALL SETUP ;调用子程序,将ACCB的值送ACCD
INCF TEMP
CLRF ACCCHI ;清ACCC
CLRF ACCCLO
MLOOP BCF STATUS,C ;清进位位
RRF ACCDHI ;ACCD右移
RRF ACCDLO
BTFSC STATUS,C ;判断是否需要相加
CALL D_add ;加乘数至ACCB,见加法程序
BCF STATUS,C ;清进位位
RRF ACCBHI ;右移部分乘积
RRF ACCBLO
RRF ACCCHI
RRF ACCCLO
DECFSZ TEMP ;乘法完成否?
GOTO MLOOP ;否,继续求乘积
BTFSS SIGN,7 ;是,确定乘积的符号
GOTO OVER ;为正,乘法结束
COMF ACCCLO ;为负,乘积取补
INCF ACCCLO
BTFSC STATUS,Z
DECF ACCCHI
COMF ACCCHI
BTFSC STATUS,Z
NEG_B DECF ACCBLO ;
COMF ACCBLO
BTFSC STATUS,Z
DECF ACCBHI
COMF ACCBHI
OVER RETURN ;子程序返回
;****************************************
SETUP MOVLW .15 ;初始化TEMP寄存器
MOVWF TEMP
MOVF ACCBHI,0 ;ACCB送ACCD
MOVWF ACCDHI
MOVF ACCBLO,0
MOVWF ACCDLO
CLRF ACCBHI ;清ACCB
CLRF ACCBLO
RETURN ;子程序返回
;*******乘法运算确定结果符号判断子程序******
S_SIGN MOVF ACCAHI,0 ;ACCAHI异或ACCBHI,结果送SIGN单元
XORWF ACCBHI,0
MOVWF SIGN
BTFSS ACCBHI,7 ;ACCB为负吗?
GOTO CHEK_A ;否,检查ACCA
CALL NEG_B ;是,求取ACCB绝对值
CHEK_A BTFSC ACCAHI,7 ;ACCA为负吗?
CALL NEG_A ;ACCA为负,求取ACCA绝对值,
;见双字节加法程序
RETURN ;ACCA和ACCB均为正,返回
帮帮分析一下该程序是采用什么数学公式计算的,谢谢了
INCLUDE p16f877.inc
ACCALO EQU 20 ;存放乘数低8位
ACCAHI EQU 21 ;存放乘数高8位
ACCBLO EQU 23 ;存放被乘数低8位和乘积第16~23位
ACCBHI EQU 24 ;存放被乘数高8位和乘积第24~31位
ACCCLO EQU 26 ;存放乘积低8位
ACCCHI EQU 27 ;存放乘积高8位
ACCDLO EQU 28 ;临时寄存器
ACCDHI EQU 29 ;临时寄存器
TEMP EQU 2A ;临时寄存器
SIGN EQU 2B ;存放乘积的符号
ORG 0X0000
START GOTO MAIN
;***16×16位乘法子程序,入口地址ACCB×ACCA,出口地址ACCB和ACCC ***
ORG 0X0100
D_mpy CALL S_SIGN ;求取乘积的符号,并对负数取补
CALL SETUP ;调用子程序,将ACCB的值送ACCD
INCF TEMP
CLRF ACCCHI ;清ACCC
CLRF ACCCLO
MLOOP BCF STATUS,C ;清进位位
RRF ACCDHI ;ACCD右移
RRF ACCDLO
BTFSC STATUS,C ;判断是否需要相加
CALL D_add ;加乘数至ACCB,见加法程序
BCF STATUS,C ;清进位位
RRF ACCBHI ;右移部分乘积
RRF ACCBLO
RRF ACCCHI
RRF ACCCLO
DECFSZ TEMP ;乘法完成否?
GOTO MLOOP ;否,继续求乘积
BTFSS SIGN,7 ;是,确定乘积的符号
GOTO OVER ;为正,乘法结束
COMF ACCCLO ;为负,乘积取补
INCF ACCCLO
BTFSC STATUS,Z
DECF ACCCHI
COMF ACCCHI
BTFSC STATUS,Z
NEG_B DECF ACCBLO ;
COMF ACCBLO
BTFSC STATUS,Z
DECF ACCBHI
COMF ACCBHI
OVER RETURN ;子程序返回
;****************************************
SETUP MOVLW .15 ;初始化TEMP寄存器
MOVWF TEMP
MOVF ACCBHI,0 ;ACCB送ACCD
MOVWF ACCDHI
MOVF ACCBLO,0
MOVWF ACCDLO
CLRF ACCBHI ;清ACCB
CLRF ACCBLO
RETURN ;子程序返回
;*******乘法运算确定结果符号判断子程序******
S_SIGN MOVF ACCAHI,0 ;ACCAHI异或ACCBHI,结果送SIGN单元
XORWF ACCBHI,0
MOVWF SIGN
BTFSS ACCBHI,7 ;ACCB为负吗?
GOTO CHEK_A ;否,检查ACCA
CALL NEG_B ;是,求取ACCB绝对值
CHEK_A BTFSC ACCAHI,7 ;ACCA为负吗?
CALL NEG_A ;ACCA为负,求取ACCA绝对值,
;见双字节加法程序
RETURN ;ACCA和ACCB均为正,返回
帮帮分析一下该程序是采用什么数学公式计算的,谢谢了
0
回复
提示
@andrew.yang
呵呵,所有都是一样的啦,有兴趣联系我一下,共同进步啊QQ178843781/MSN:SHZHYZL@HOTMAIL.COM/FLY_MAN100@163.COM
高手好,我有一个问题,我用的是PIC16F690,我们做的是电子镇流器,用单片机和485通讯,我把接收放在中断里了,可是当我一个数一个数的发时,接收是没问题的,当我一下发一串数时就不好用了
;**************************************************************
;** 中断服务子程序 **
; *************************************************************
ORG 010H
INTERRUPT:
;------------软件现场保护和恢复-----
MOVWF W_TEMP ;1 暂存累加器 W,不影响STATUS的值
SWAPF STATUS,0 ;1 (用SWAPF才不会影响STATUS的值)
MOVWF STATUS_TEMP ;1 暂存状态寄存器 WTATUS
MOVF PCLATH,0 ;1
MOVWF PCLATH_TEMP ;1 暂存程序指针寄存器高位 PCLATH
; ------------------------------------------------------------------------------------------------------------
BCF STATUS,RP1 ; 此语句必需!!
BCF STATUS,RP0 ; 1 BANK0
bcf STATUS,IRP
BTFSS PIR1,RCIF
GOTO TM0_INT
BTFSC RCV_SIGN,1
GOTO RECEIVE
MOVF RCREG,0
SUBLW 55H
BTFSS STATUS,Z
GOTO TIM_CHN_OVER
BSF RCV_SIGN,1 ;;;;置1表示数据头对,可以继续接收
MOVLW RCV_BUF
MOVWF FSR
CLRF RCV_CNT
GOTO TIM_CHN_OVER
RECEIVE:
BTFSC RCSTA,OERR
GOTO YICHU
MOVF RCREG,0
MOVWF INDF
INCF FSR
INCF RCV_CNT
MOVF RCV_CNT,0
SUBLW 09H ;L-RCV_CNT,L>RCV_CNT C=1;L<=RCV_CNT C=0;;;;09H 是接收10个数
BTFSS STATUS,C ;rcv_cnt<=10跳转
GOTO RCV_NT2 ;rcv_cnt>10,不再接收
RCSTA,CREN;;;;;;;;;;;;;;;;;;;;;;关接受
;BSF RCV_SIGN,6 ;;;;;;;;;;;;;;;;;;;;;;;置1表示接收数据超时.
GOTO TIM_CHN_OVER
YICHU:
BCF RCSTA,CREN
CLRF RCV_SIGN
MOVF RCREG,0
MOVF RCREG,0
BSF RCSTA,CREN
GOTO TIM_CHN_OVER
RCV_NT2:
BCF RCSTA,CREN ;;;;;;;;;;;;;;;;;;;;;;;;;关接受
BSF RCV_SIGN,5 ;;;;;;;;;;;;;;;;;;;;接收数据成功.
GOTO TIM_CHN_OVER
;*******************************************************************************
TM0_INT:
BTFSS INTCON,T0IF
GOTO TIM_CHN_OVER
CLOCK:
;----- 长延时-TIMER0 --------------------------
; BCF STATUS,RP0 ; 1 BANK0
BCF INTCON,T0IF ; 清Timer0 溢出中断标志,允许下次进入中断
;INCFSZ TIMER0L,1 ;;;;;;;;;;;;;;;;;;;;;;;;;;1107
MOVF TIMER0L,0 ; (TIMER0L+1)计时
ADDLW 1H ;
MOVWF TIMER0L
BTFSS STATUS,C
GOTO ADD1
MOVF TIMER0H,0 ; (TIMER0H+1)计时
ADDLW 1H
MOVWF TIMER0H
;INCF TIMER0H,1
;---- 调光计时器 TIMER1、TIMER2L计时,这里采用3个字节---------
ADD1:
;INCFSZ TIMER1L,1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;1107
MOVF TIMER1L,0
ADDLW 1H
MOVWF TIMER1L
BTFSS STATUS,C
GOTO TIAOGUANG
;INCFSZ TIMER1H,1 ;;;;;;;;;;;;;;;;;;;;;;;;;;1107
MOVF TIMER1H,0
ADDLW 1H
MOVWF TIMER1H
BTFSS STATUS,C
GOTO TIAOGUANG
ADD2:
MOVF TIMER2L,0
SUBLW 0FBH ; 防止调光计时器溢出,计时时间已经足够长
BTFSS STATUS,C
GOTO TIM_CHN_OVER
;INCF TIMER2L,1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1107
MOVF TIMER2L,0
ADDLW 1H
MOVWF TIMER2L
;----- 调光控制 ----------------
TIAOGUANG:
CLRWDT
STAGE3:
MOVF TIMER2L,0
ADDLW 01H
SUBWF SEC_STAGE_TIME,0 ; 10小时,切换到第三阶段,10小时 = 10*3600*1000/13.1072 = 29E8D6H
; 10分钟,切换到第三阶段,10分钟 = 10*60*1000/13.1072 = B16DH
BTFSC STATUS,C
GOTO STAGE2
MOVF TIMER1H,0
ADDLW 01H
SUBWF SEC_STAGE_TIME+1,0
BTFSC STATUS,C
GOTO STAGE2
MOVF TIMER1L,0
ADDLW 01H
SUBWF SEC_STAGE_TIME+2,0
BTFSC STATUS,C
GOTO STAGE2
MOVF PERCENT_POWER+1,0 ;
MOVWF P_REF ; 第三阶段功率设定值;**bus_i_set ;;;;;55H对应150W ;;8AH对应250W
GOTO TIM_CHN_OVER
STAGE2:
MOVF TIMER2L,0
ADDLW 01H
SUBWF FIR_STAGE_TIME,0 ; 5小时,切换到第二阶段,5小时 = 5*3600*1000/13.1072 = 14F46BH
; 5分钟,切换到第二阶段,5分钟 = 5*60*1000/13.1072 = 58B6H
; 5.5小时,切换到第二阶段,5.5小时 = 5.5*3600*1000/13.1072 = 170CDCH
BTFSC STATUS,C
GOTO TIM_CHN_OVER
MOVF TIMER1H,0
ADDLW 01H
SUBWF FIR_STAGE_TIME+1,0
BTFSC STATUS,C
GOTO TIM_CHN_OVER
MOVF TIMER1L,0
ADDLW 01H
SUBWF FIR_STAGE_TIME+2,0
BTFSC STATUS,C
GOTO TIM_CHN_OVER
MOVF PERCENT_POWER,0
MOVWF P_REF ; 第二阶段功率设定值;**bus_i_set ;;;;;73H对应210W
GOTO TIM_CHN_OVER
;-----恢复中断现场---------------------------
TIM_CHN_OVER:
CLRWDT ;1
MOVF PCLATH_TEMP,0 ;1
MOVWF PCLATH ;1 恢复程序指针寄存器高位 PCLATH
SWAPF STATUS_TEMP,0 ;1 (用SWAPF才不会影响STATUS的值)
MOVWF STATUS ;1 恢复状态寄存器 WTATUS
SWAPF W_TEMP,1 ;1
SWAPF W_TEMP,0 ;1 restore pre-isr W register contents
RETFIE ;2 中断返回
;**************************************************************
;** 中断服务子程序 **
; *************************************************************
ORG 010H
INTERRUPT:
;------------软件现场保护和恢复-----
MOVWF W_TEMP ;1 暂存累加器 W,不影响STATUS的值
SWAPF STATUS,0 ;1 (用SWAPF才不会影响STATUS的值)
MOVWF STATUS_TEMP ;1 暂存状态寄存器 WTATUS
MOVF PCLATH,0 ;1
MOVWF PCLATH_TEMP ;1 暂存程序指针寄存器高位 PCLATH
; ------------------------------------------------------------------------------------------------------------
BCF STATUS,RP1 ; 此语句必需!!
BCF STATUS,RP0 ; 1 BANK0
bcf STATUS,IRP
BTFSS PIR1,RCIF
GOTO TM0_INT
BTFSC RCV_SIGN,1
GOTO RECEIVE
MOVF RCREG,0
SUBLW 55H
BTFSS STATUS,Z
GOTO TIM_CHN_OVER
BSF RCV_SIGN,1 ;;;;置1表示数据头对,可以继续接收
MOVLW RCV_BUF
MOVWF FSR
CLRF RCV_CNT
GOTO TIM_CHN_OVER
RECEIVE:
BTFSC RCSTA,OERR
GOTO YICHU
MOVF RCREG,0
MOVWF INDF
INCF FSR
INCF RCV_CNT
MOVF RCV_CNT,0
SUBLW 09H ;L-RCV_CNT,L>RCV_CNT C=1;L<=RCV_CNT C=0;;;;09H 是接收10个数
BTFSS STATUS,C ;rcv_cnt<=10跳转
GOTO RCV_NT2 ;rcv_cnt>10,不再接收
RCSTA,CREN;;;;;;;;;;;;;;;;;;;;;;关接受
;BSF RCV_SIGN,6 ;;;;;;;;;;;;;;;;;;;;;;;置1表示接收数据超时.
GOTO TIM_CHN_OVER
YICHU:
BCF RCSTA,CREN
CLRF RCV_SIGN
MOVF RCREG,0
MOVF RCREG,0
BSF RCSTA,CREN
GOTO TIM_CHN_OVER
RCV_NT2:
BCF RCSTA,CREN ;;;;;;;;;;;;;;;;;;;;;;;;;关接受
BSF RCV_SIGN,5 ;;;;;;;;;;;;;;;;;;;;接收数据成功.
GOTO TIM_CHN_OVER
;*******************************************************************************
TM0_INT:
BTFSS INTCON,T0IF
GOTO TIM_CHN_OVER
CLOCK:
;----- 长延时-TIMER0 --------------------------
; BCF STATUS,RP0 ; 1 BANK0
BCF INTCON,T0IF ; 清Timer0 溢出中断标志,允许下次进入中断
;INCFSZ TIMER0L,1 ;;;;;;;;;;;;;;;;;;;;;;;;;;1107
MOVF TIMER0L,0 ; (TIMER0L+1)计时
ADDLW 1H ;
MOVWF TIMER0L
BTFSS STATUS,C
GOTO ADD1
MOVF TIMER0H,0 ; (TIMER0H+1)计时
ADDLW 1H
MOVWF TIMER0H
;INCF TIMER0H,1
;---- 调光计时器 TIMER1、TIMER2L计时,这里采用3个字节---------
ADD1:
;INCFSZ TIMER1L,1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;1107
MOVF TIMER1L,0
ADDLW 1H
MOVWF TIMER1L
BTFSS STATUS,C
GOTO TIAOGUANG
;INCFSZ TIMER1H,1 ;;;;;;;;;;;;;;;;;;;;;;;;;;1107
MOVF TIMER1H,0
ADDLW 1H
MOVWF TIMER1H
BTFSS STATUS,C
GOTO TIAOGUANG
ADD2:
MOVF TIMER2L,0
SUBLW 0FBH ; 防止调光计时器溢出,计时时间已经足够长
BTFSS STATUS,C
GOTO TIM_CHN_OVER
;INCF TIMER2L,1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1107
MOVF TIMER2L,0
ADDLW 1H
MOVWF TIMER2L
;----- 调光控制 ----------------
TIAOGUANG:
CLRWDT
STAGE3:
MOVF TIMER2L,0
ADDLW 01H
SUBWF SEC_STAGE_TIME,0 ; 10小时,切换到第三阶段,10小时 = 10*3600*1000/13.1072 = 29E8D6H
; 10分钟,切换到第三阶段,10分钟 = 10*60*1000/13.1072 = B16DH
BTFSC STATUS,C
GOTO STAGE2
MOVF TIMER1H,0
ADDLW 01H
SUBWF SEC_STAGE_TIME+1,0
BTFSC STATUS,C
GOTO STAGE2
MOVF TIMER1L,0
ADDLW 01H
SUBWF SEC_STAGE_TIME+2,0
BTFSC STATUS,C
GOTO STAGE2
MOVF PERCENT_POWER+1,0 ;
MOVWF P_REF ; 第三阶段功率设定值;**bus_i_set ;;;;;55H对应150W ;;8AH对应250W
GOTO TIM_CHN_OVER
STAGE2:
MOVF TIMER2L,0
ADDLW 01H
SUBWF FIR_STAGE_TIME,0 ; 5小时,切换到第二阶段,5小时 = 5*3600*1000/13.1072 = 14F46BH
; 5分钟,切换到第二阶段,5分钟 = 5*60*1000/13.1072 = 58B6H
; 5.5小时,切换到第二阶段,5.5小时 = 5.5*3600*1000/13.1072 = 170CDCH
BTFSC STATUS,C
GOTO TIM_CHN_OVER
MOVF TIMER1H,0
ADDLW 01H
SUBWF FIR_STAGE_TIME+1,0
BTFSC STATUS,C
GOTO TIM_CHN_OVER
MOVF TIMER1L,0
ADDLW 01H
SUBWF FIR_STAGE_TIME+2,0
BTFSC STATUS,C
GOTO TIM_CHN_OVER
MOVF PERCENT_POWER,0
MOVWF P_REF ; 第二阶段功率设定值;**bus_i_set ;;;;;73H对应210W
GOTO TIM_CHN_OVER
;-----恢复中断现场---------------------------
TIM_CHN_OVER:
CLRWDT ;1
MOVF PCLATH_TEMP,0 ;1
MOVWF PCLATH ;1 恢复程序指针寄存器高位 PCLATH
SWAPF STATUS_TEMP,0 ;1 (用SWAPF才不会影响STATUS的值)
MOVWF STATUS ;1 恢复状态寄存器 WTATUS
SWAPF W_TEMP,1 ;1
SWAPF W_TEMP,0 ;1 restore pre-isr W register contents
RETFIE ;2 中断返回
0
回复
提示
@吴增贤
高手好,我有一个问题,我用的是PIC16F690,我们做的是电子镇流器,用单片机和485通讯,我把接收放在中断里了,可是当我一个数一个数的发时,接收是没问题的,当我一下发一串数时就不好用了;**************************************************************;** 中断服务子程序 **;*************************************************************ORG010HINTERRUPT:;------------软件现场保护和恢复-----MOVWFW_TEMP;1暂存累加器W,不影响STATUS的值SWAPFSTATUS,0;1(用SWAPF才不会影响STATUS的值)MOVWFSTATUS_TEMP;1暂存状态寄存器WTATUSMOVFPCLATH,0;1MOVWFPCLATH_TEMP;1暂存程序指针寄存器高位PCLATH;------------------------------------------------------------------------------------------------------------BCFSTATUS,RP1;此语句必需!!BCFSTATUS,RP0 ;1BANK0bcfSTATUS,IRPBTFSSPIR1,RCIFGOTOTM0_INTBTFSCRCV_SIGN,1GOTORECEIVEMOVFRCREG,0SUBLW55HBTFSSSTATUS,ZGOTOTIM_CHN_OVERBSFRCV_SIGN,1 ;;;;置1表示数据头对,可以继续接收MOVLWRCV_BUFMOVWFFSRCLRFRCV_CNTGOTOTIM_CHN_OVERRECEIVE:BTFSCRCSTA,OERRGOTOYICHUMOVFRCREG,0MOVWFINDFINCFFSRINCFRCV_CNTMOVFRCV_CNT,0SUBLW09H;L-RCV_CNT,L>RCV_CNTC=1;L
用个串口调试工具什么的,抓串数据看看,是不是波特率没设好
0
回复
提示