打印

麻烦用过PIC16F616的高手指教

[复制链接]
2354|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tstdy2008|  楼主 | 2011-7-6 09:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用PIC16F616单片机的PWM单输出控制场效应管来驱动直流电机,我用汇编做的,不知道怎么的就是出不来脉宽波形,请高手指点下,我的程序那里有问题?
沙发
tstdy2008|  楼主 | 2011-7-6 09:52 | 只看该作者
一半的程序:



LIST P=16F616
#INCLUDE<P16F616.INC>

__CONFIG _BOD_ON&_IOSCFS4&_CP_OFF&_MCLRE_ON&_PWRTE_ON&_WDT_OFF&_INTOSCIO

              CBLOCK   20H
     COUNT3   
     COUNT2   
     COUNT1   
     COUNT0   
              ENDC

              ORG       00H
              NOP
              NOP
              NOP  
              GOTO     MAIN

MAIN          CLRF     COUNT3
              CLRF     COUNT2
              CLRF     COUNT1
              CLRF     COUNT0
              BCF      STATUS,RP0        ;A口初始化
              CLRF     PORTA
              BSF      STATUS,RP0
              CLRF     ANSEL             ;A口为数字I/O
              MOVLW    028H
              MOVWF    TRISA             ;A口<5:3>为输入 <4,2:0>为输出
              BCF      STATUS,RP0        ;C口初始化
              CLRF     PORTC
              BSF      STATUS,RP0
              MOVLW    0FH               ;C口<3:0>为模拟输入端口 <5:4>为数字I/O
              MOVWF    ANSEL
              MOVLW    0FH               ;C口<3:0>为输入 <5:4>为输出
              MOVWF    TRISC     
              BCF      STATUS,RP0

LOOP         BTFSC    PORTC,3           ;ON/OFF按键是否有按下
              GOTO     NOPUSH            ;ON/OFF按键没有按下
              BTFSC    COUNT3,0          ;ON/OFF按键按下,判断马达是运转还是停止
              GOTO     STOPMOTOR         ;马达运转,则停止马达运转
              BTFSS    PORTC,0           ;马达停止,判断液面开关是ON/OFF
              GOTO     LOOP              ;液面开关ON
              BTFSC    PORTA,5           ;液面开关OFF,判断温度保护是否开启
              GOTO     TIMER             ;温度保护没有开启,去检测拨码开关状态
              BSF      PORTC,4           ;温度保护开启,报警,点亮ALARM LED
              GOTO     LOOP
     
NOPUSH        BTFSS    COUNT3,0          ;判断马达是运转还是停止
              GOTO     LOOP              ;马达停止
              BTFSS    PORTC,0           ;判断液面开关是ON/OFF
              GOTO     STOPMOTOR         ;液面开关ON,停止马达运转
              BTFSS    PORTA,5           ;液面开关OFF,判断温度保护是否开启
              GOTO     ALARM             ;温度保护开启,报警
              BCF      PORTC,4           ;报警清0
              GOTO     LOOP
              
ALARM         BSF      PORTC,4           ;报警,点亮ALARM LED
STOPMOTOR     BCF      STATUS,RP0
              CLRF     T2CON             ;关闭TIMER2
              BSF      STATUS,RP0     
              CLRF     PR2               ;PWM周期清0
              BCF      STATUS,RP0
              CLRF     CCP1CON           ;关闭PWM输出
              CLRF     CCPR1L            ;清占空比
              BCF      PIR1,1            ;TEMER2中断标志位清0
              BCF      PORTC,5           ;PWM端口输出清0
              BCF      COUNT3,0           
              CLRF     T1CON             ;TIMER1清0
              CLRF     TMR1L
              CLRF     TMR1H
              BCF      PIR1,0
              CLRF     COUNT2
              CLRF     COUNT1
              CLRF     COUNT0
              GOTO     LOOP

TIMER         BCF      PORTC,4           ;报警清0,熄灭ALARM LED
              BTFSC    PORTC,2           ;拨码开关S2是ON还是OFF
              GOTO     S1                ;S2是OFF,判断拨码开关S1是ON还是OFF
              BTFSC    PORTC,1           ;S2是ON,判断拨码开关S1是ON还是OFF
              GOTO     SET5MIN           ;S1是OFF,转去5分钟定时程序
              CALL     RUNMOTOR          ;S1是ON,无定时运转马达
              GOTO     LOOP

S1            BTFSC    PORTC,1           
              GOTO     LOOP              ;S1是OFF,马达不动作,返回住程序
              GOTO     SET10MIN          ;S1是ON,转去10分钟定时程序

使用特权

评论回复
板凳
tstdy2008|  楼主 | 2011-7-6 09:52 | 只看该作者
另一半:

SET5MIN       CALL     RUNMOTOR          ;马达运转
              BCF      STATUS,RP0        ;T1付初值
              MOVLW    00H
              MOVWF    TMR1L
              MOVLW    00H
              MOVWF    TMR1H
              MOVLW    0B1H              ;开启T1定时器
              MOVWF    T1CON
              MOVLW    05AH              ;最外循环次数90次(5分钟)
              MOVWF    COUNT2
              MOVLW    02H               ;外循环次数2次
              MOVWF    COUNT1
LOOP1         MOVLW    0FFH              ;内循环次数255次
              MOVWF    COUNT0
LOOP0         BTFSS    PIR1,0            ;T1定时器记数是否有溢出
              GOTO     CHECK1            ;无溢出,转去检测是否有按键按下或液面开关闭合或温度保护等现象发生
CIRCLE1       DECFSZ   COUNT0,1
              GOTO     LOOP0
              DECFSZ   COUNT1,1
              GOTO     LOOP1
              DECFSZ   COUNT2,1
              GOTO     LOOP0
              CLRF     T1CON             ;定时结束,关闭T1定时器
              CLRF     TMR1L
              CLRF     TMR1H
              BCF      PIR1,0
              GOTO     STOPMOTOR

SET10MIN      CALL     RUNMOTOR          ;马达运转
              BCF      STATUS,RP0        ;T1付初值
              MOVLW    00H
              MOVWF    TMR1L
              MOVLW    00H
              MOVWF    TMR1H
              MOVLW    0B1H              ;开启T1定时器
              MOVWF    T1CON
              MOVLW    0B4H              ;最外循环次数180次(10分钟)
              MOVWF    COUNT2
              MOVLW    04H               ;外循环次数4次
              MOVWF    COUNT1
LOOP3         MOVLW    0FFH              ;内循环次数255次
              MOVWF    COUNT0
LOOP2         BTFSS    PIR1,0            ;T1定时器记数是否有溢出
              GOTO     CHECK2            ;无溢出,转去检测是否有按键按下或液面开关闭合或温度保护等现象发生
CIRCLE2       DECFSZ   COUNT0,1
              GOTO     LOOP2
              DECFSZ   COUNT1,1
              GOTO     LOOP3
              DECFSZ   COUNT2,1
              GOTO     LOOP2
              CLRF     T1CON             ;定时结束,关闭T1定时器
              CLRF     TMR1L
              CLRF     TMR1H
              BCF      PIR1,0            ;清TIMER1溢出标志位
              GOTO     STOPMOTOR

CHECK1        BTFSS    PORTC,3           ;检测ON/OFF开关是否有按下
              GOTO     STOPMOTOR         ;ON/OFF开关按下,停止马达运转
              BTFSS    PORTC,0           ;ON/OFF开关没有按下,检测液面开关
              GOTO     STOPMOTOR         ;液面开关ON,停止马达运转
              BTFSS    PORTA,5           ;液面开关OFF,检测温度保护是否开启
              GOTO     ALARM             ;温度保护开启,转去报警指示
              BCF      PORTC,4           ;温度保护没有开启,返回定时循环
              GOTO     CIRCLE1

CHECK2        BTFSS    PORTC,3           ;检测ON/OFF开关是否有按下
              GOTO     STOPMOTOR         ;ON/OFF开关按下,停止马达运转
              BTFSS    PORTC,0           ;ON/OFF开关没有按下,检测液面开关
              GOTO     STOPMOTOR         ;液面开关ON,停止马达运转
              BTFSS    PORTA,5           ;液面开关OFF,检测温度保护是否开启
              GOTO     ALARM             ;温度保护开启,转去报警指示
              BCF      PORTC,4           ;温度保护没有开启,返回定时循环
              GOTO     CIRCLE2

RUNMOTOR      BSF      STATUS,RP0
              BSF      TRISC,5           ;C口的第5位(PWM)口设为输入
              MOVLW    3EH               ;PWM周期=[(PR2)+1]*4*TOSC(时钟周期)*(TMR2预分频值)=16K HZ
              MOVWF    PR2
              BCF      STATUS,RP0
              MOVLW    7EH
              MOVWF    CCPR1L             ;占空比为50%=(CCPR1L:CCP1CON<5:4>)/[4*(PR2+1)]
              MOVLW    0CH                ;设定PWM单输出
              MOVWF    CCP1CON
              BCF      PIR1,1
              MOVLW    04H
              MOVWF    T2CON              ;启动TIMER2
              CLRF     PIE1
              CLRF     INTCON
   TEST       BTFSS    PIR1,TMR2IF
              GOTO     TEST
              BCF      TRISC,5            ;C口第5位输出
              BSF      COUNT3,0           

              RETURN           

        END

使用特权

评论回复
地板
Mary_luo| | 2011-7-6 14:23 | 只看该作者
高手呢?么人回啊!帮LZ顶一下:)

使用特权

评论回复
5
tstdy2008|  楼主 | 2011-7-6 17:11 | 只看该作者
那个脉冲的问题我知道是什么原因了,是:BCF      TRISC,5            ;C口第5位输出; 这个语句前面没有定位BANK 1,加上就可以了

使用特权

评论回复
6
tstdy2008|  楼主 | 2011-7-6 17:11 | 只看该作者
我的轻触开关的检测软件好象不对,请高手指点下,单个端口对应的轻触开关按键检测程序该怎么写呢?

使用特权

评论回复
7
l4157| | 2011-7-7 22:23 | 只看该作者
不用汇编好多年,没法帮你呀!你也可以用C呀,这样就不用管什么BANK啦!

使用特权

评论回复
8
tstdy2008|  楼主 | 2011-7-11 16:18 | 只看该作者
C还不太会用,因为是新手,所以先用汇编了,不过还是非常感谢您的回复,问题我已经解决了,谢谢!还是靠自己的努力.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

37

帖子

1

粉丝