由于这学期毕设需要用到PIC单片机及其若干模块,在此记录若干个简单模块应用的实例,以便将来查询借鉴。
按钮控制灯具调光器
项目实现功能:
让CCP1模块工作于PWM模式,从CCP1引脚输出一PWM信号,该信号的占空比受控于一只按钮开关,利用该PWM信号去控制一只与灯泡串连的可控硅(或光电耦合可控硅)的导通程度,从而达到调光的目的。
在刚刚接通电源时灯泡不亮;当按下按钮开关时,灯泡开始从暗到亮逐渐变化,到达最亮点之后(即全开),又开始从亮到暗逐渐变化,到达最暗点后(即全熄),又开始从暗到亮逐渐变化;当松开按钮时,灯泡的亮度维持不变。
软件设计思路:
将PWM信号的周期设定为最大值,并且固定不变;将PWM信号的脉宽规划为可调(递减或递增),对于调解过程的控制方法是通过采样RB0端口引脚的电平。
人的眼睛对于灯光强度分辨能力并不强,因此设计成从最暗到最亮分为256步台阶,已经能够满足需要。当10位脉宽寄存器的最低2位固定下来,只改变高8位CCPRIL即可,这样可以使程序大大地得到简化。
TMR2每中断一次,就控制RC7引脚上的LED7亮灭交替变换一次,可帮助判断程序的运行状况。
汇编程序清单:
LIST P=16F877
INCLUDE "P16F877.INC"
INC_F EQU 70H ;定义一个递增标志寄存器,只用末位
ORG 000H ;复位适量单元地址
NOP ;放置一条ICD所需的NOP指令
GOTO START ;
ORG 004H ;
*************************中断服务子程序*********************
MOVLW B'10000000';
XORWF PORTC,1 ;将RC7引脚的LED7改变状态
BCF PIR1,TMR2IF
;清除TMR2中断标志位
BTFSC PORTB,0 ;判断按钮开关的状态是否按下
RETFIE ;没有按下!不需要修改脉宽,返回
BTFSS INC_F,0 ;判断递增标志位是否等于1
GOTO DEC ;否!转递减
INC INCF CCPR1L,F ;脉宽递增
COMF CCPR1L,W ;检测当前是最亮状态否
BTFSC STATUS,Z ;最亮时CCPR1L=FFH,取反得00H,Z=1
INCF INC_F,F ;是!递增标志位取反
RETFIE ;返回
DEC DECF CCPR1L,F ;脉宽递减
BTFSC STATUS,Z ;检测当前是否最暗态,最暗时CCPR1L=00H,Z=1
INCF INC_F,F ;是!递减标志位取反
RETFIE ;返回
*************************主程序**************************
START BSF STATUS,RP0 ;选BANK1
MOVLW B’01111011’ ;设置CCP1和RC7脚为输出
MOVWF TRISC ;
MOVLW 0XFF ;设定PWM周期为最大值FFH
MOVWF RP2 ;
MOVWF INC_F ;设置递增标志位
BSF PIE1,TMR2IE ;开放TMR2中断
BCF STATUS,RP0 ;选BANK0
BSF INTCON,PEIE ;使能外设中断
BSF INTCON,GIE ;使能全局中断
MOVLW 0X0C ;设定CCP1模块为:
MOVWF CCP1CON ;PWM输出、脉宽低2位固定为00
CLRF CCPR1L ;脉宽清0
CLRF T2CON ;设定TMR2: 后分频比1:1
;预分频比1:1
BSF T2CON,1 ;重新设置预分频比为1:16
BSF T2CON,TMR2ON ;开启TMR2
LOOP NOP ;
GOTO LOOP ;等TMR2中断,刷新脉宽值
**********************************************************
END ;源程序结束