;定义与ADC有关的特殊功能寄存器 ADC_CONTR EQU 0C5H ADC_DATA EQU 0C6H P1M0 EQU 91H P1M1 EQU 92H ;定义与PWM有关的特殊功能寄存器 CCON EQU 0D8H ;PCA控制寄存器的位描述 7(CF)PCA计数器阵列溢出标志 ;6(CR)PCA计数器阵列运行控制位 1(CCF1)PCA模块1中断标志 ;0(CCF0)PCA模块0中断标志 CMOD EQU 0D9H ;PCA模式寄存器 7(CIDL)计数器阵列空闲控制0时工作,1时停止 ;2,1(PCA计数脉冲先择) 0(ECF)PCA计数溢出中断使能 CCAPM0 EQU 0DAH ;PCA比较/捕获模块寄存器的位分配6(ECOMn)使能比较器 ;为1时使能比较器功能 5(CAPPn)正捕获,为1时使能上升沿 ;4(CAPNn)负捕获,为1时使能下降沿捕获 3(MATn)匹配 ;2(TOGn)翻转 1(PWMn)脉宽调节模式,为1时,使能CEXn ;脚用作脉宽调节输出 0(ECCFn)使能CCFn中断 CCAPM1 EQU 0DBH ;同上 CL EQU 0E9H ;PCA计数器高8位 CH EQU 0F9H ;PCA计数器低8位 CCAP0L EQU 0EAH ;PCA模式寄存器0低8位 CCAP0H EQU 0FAH ;PCA模式寄存器0高8位 CCAP1L EQU 0EBH ;PCA模式寄存器1低8位 CCAP1H EQU 0FBH ;PCA模式寄存器1高8位 CR BIT CCON.6 ;PCA计数器允许位 1时允许 CF BIT CCON.7 EPCA BIT IE.6 ;PCA中断屏蔽位 PCA_PWM0 EQU 0F2H ;PCA模块0寄存器 PCA_PWM1 EQU 0F3H ;PCA模块1寄存器 ADDPWM BIT 00H SUBPWM BIT 01H DATA_TEMP EQU 21H ;数据暂存 PULSE_WIDTH EQU 30H ;PWM脉宽暂存 ;定义变量 STEP EQU 02H ;PWM脉宽变化步长 ORG 00H JMP MAIN ORG 50H MAIN: MOV SP,#5FH MOV R6,#00H MOV DATA_TEMP,#80H ;设置反馈电压为2.56V MOV CMOD,#82H ;PCA在空闲模式下停止PCA计数器工作 ;PCA时钟模式为fosc/2 ;禁止PCA计数器溢出中断 MOV CCON,#00H ;禁止PCA计数器工作,清除中断标志、计数器溢出标志 MOV CL,#00H MOV CH,#00H ;计数器清0 MOV CCAPM0,#42H ;允许比较器功能 将CEX0设置为PWM输出 MOV PCA_PWM0,#00H MOV PULSE_WIDTH,#0DCH ;送%86的脉宽比 CLR ADDPWM CLR SUBPWM SETB EPCA SETB EA SETB CR MAIN0: CALL AD CALL PWM MOV A,R6 ANL P1,A ;便于观察 CALL DELAY JMP MAIN0 AD: CALL SET_P1_ADC_CHANNELS ;设置P1口为适宜AD转换的模式 MOV A,#00H ;P1.0为电压采样输入 CALL GET_AD_RESULT ;调用AD转换,并存储转换结果 CLR C MOV R6,A SUBB A,DATA_TEMP JZ AD2 JC AD1 SETB SUBPWM ;如果输出电压大于2.56V则须减小PWM宽度 JMP AD2 AD1: SETB ADDPWM AD2: RET GET_AD_RESULT: ANL ADC_CONTR,#0E0H ;1110,0000 清ADC_FLAG(结束标志),ADC_START(启动控制)位和低3位(模拟通道选择) ANL A,#07H ;0000,0111 清0高5位,选择通道 ORL ADC_CONTR,A ;设置AD当前通道 MOV A,#02H CALL DELAY ;延时,使输入电压达到稳定 CLR A MOV ADC_DATA,A ;清AD转换结果寄存器 ORL ADC_CONTR,#08H ;0000,1000 令ADC_START=1 启动AD转换 WAIT_AD_FINISHE: MOV A,#10H ;0001,0000 测试AD转换是否结束 ANL A,ADC_CONTR JZ WAIT_AD_FINISHE ;如未完成AD转换则跳转到等待 ANL ADC_CONTR,#0E7H ;0111,0111 如完成则清ADC_FLAG位和ADD_START位为0,并停止AD转换 MOV A,ADC_DATA RET SET_P1_ADC_CHANNELS: MOV P1,#0FFH ;将P1口置高,为AD转换作准备 ORL ADC_CONTR,#80H ;1000,0000 打开AD转换电源 MOV P1M0,#01H MOV P1M1,#01H ;0000,0001 设P1.0为开漏状态 MOV A,#20H CALL DELAY ;稳定电源 RET PWM: MOV A,PULSE_WIDTH JNB ADDPWM,PWM1 CLR ADDPWM ADD A,#STEP JMP PWM_EXIT PWM1: JNB SUBPWM,PWM_EXIT CLR SUBPWM CLR C SUBB A,#STEP PWM_EXIT: MOV PULSE_WIDTH,A MOV CCAP0H,A RET DELAY: MOV R4,A DELAY_LOOP1: MOV R2,#02H MOV R3,#50 DELAY_LOOP2: DJNZ R3,DELAY_LOOP2 DJNZ R2,DELAY_LOOP2 DJNZ R4,DELAY_LOOP1 RET END