- UID
- 111482
- 帖子
- 5976
- 积分
- 19792
- 威望
- 13159
- 金币
- 4654721
- 贡献
- 6623
- 职业
- 单片机编程家电维修
- 注册时间
- 2007-9-21
- 最后登录
- 2012-1-7
|
1#
发表于 2009-4-14 09:50
| 只看该作者
本帖最后由 13013963877 于 2011-5-22 11:38 编辑
;*****************************************************************
; PWM 控制10v内可调电源程序输出电压你可以设定要修改电压转换程序 * *
; 不得用于商业用途 *
; 晶振为12MHZ 3位数码管显示 步进电压0.039V 254级 *
; 利用定时器控制产生占空比可变的 PWM 波 *
; 按K1,PWM值增加,则占空比减小 *
; 按K2,PWM值减小,则占空比增加 *
;*****************************************************************
;定义各存储器单元-----------------------
OUT EQU P2.0 ;PWM输出
ZX EQU P0 ;显示口
SMG EQU P2.5 ;个位
SMS EQU P2.6 ;十位
SMB EQU P2.7 ;百位
INCKEY EQU P1.0 ;K1,PWM值增加键
DECKEY EQU P1.7 ;K2,PWM值减小键。
PWM EQU 2FH ;PWM存储器
;30H-34H UDAT计算用
DP1 EQU 35H ;显示缓冲器
DP2 EQU 36H ;
DP3 EQU 37H ;
;39H 3AH 3BH
;-----------------------
ORG 0000H
SJMP START
ORG 000BH
AJMP INTT0
ORG 001BH
AJMP INTT1
ORG 0030H
;-----------------------
;主程序
;定时器0工作在模式1,定时器1工作在模式2。
;初始化--------------------
START:
MOV SP,#50H
MOV ZX,#00H
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV TMOD,#21H
MOV PWM,#0FFH ;初始输出电压最低
MOV TH1,PWM ;脉宽调节
MOV TL1,#00H
MOV TH0,#0FFH ;延时常数
MOV TL0,#00H ;频率调节3921HZ
MOV R1,#11
MOV R0,#30H ;清各单元
QW: MOV @R0,#00H
INC R0
DJNZ R1,QW
SETB EA
SETB ET0 ;开T0中断
SETB ET1 ;开T1中断
SETB TR0 ;启动T0控制T1启动
;主程序--PWM值在1-255之间-------------------------------------
LOOP: ACALL UDAT ;调电压转换程序
ACALL DISP ;调显示程序
MOV A,PWM ;脉宽调节
JB INCKEY,LOOP1 ;增加键是否按下
CALL DELAY ;延时去抖动
JB INCKEY,LOOP1 ;有键盘按下转
CJNE A,#0FFH,PWMINC;最大值没到继续加到0FFH
SJMP LOOP
;调节脉宽(脉宽小于最大值需要加)
PWMINC:
INC PWM ;调节脉宽(脉宽减小)
SJMP LOOP ;跳到主程序
;再次判断键盘
LOOP1: JB DECKEY,LOOP2 ;减小键是否按下?PWM值减小键
CALL DELAY ;延时去抖动
JB DECKEY,LOOP2 ;K2,PWM值减小键
CJNE A,#01H,PWMDEC ;是否到最小值?没到可以减到2
SJMP LOOP
;调节脉宽(脉宽大于最大值需要减小)
PWMDEC:
DEC PWM ;调节脉宽(脉宽增加)
LOOP2: SJMP LOOP ;跳到主程序
;主程序----------------到此结束---
;---------------------------------------------------
;T0中断服务子程序 (频率)
;控制定时器1中断T0 ,把脉宽值送T1高8位,启动T1定时
;并且启动输出T0控制T1 PWM时数启动
;输出口启动先是高电平开始-------------------
INTT0:
CLR TR1
MOV TH0,#0FFH ;延时常数
MOV TL0,#00H ;频率调节3921HZ
MOV TH1,PWM ;PWM调整值送T1
SETB TR1 ;启动T1
CLR OUT ;启动 输出
RETI
;-----------------------------
;T1中断服务子程序(脉宽)TH1始终是+1值到0FFH溢出,中断
;控制PWM脉冲宽度T1定时的值就是脉宽值,T1中断时说明持续的脉宽够
;脉宽够时关断输出为高电平-------
INTT1: ;因为定时器1工作在模式2不需要重装数据
CLR TR1 ;脉宽调节结束
SETB OUT ;结束输出
RETI
;电压转换,计算,送显示数----------------
;电压转换程序,精确到0.039V
UDAT: MOV B,#39
MOV A,PWM
CPL A ;取反因为输出已反向
MUL AB
MOV 30H,A
MOV 31H,B
;双字节十六进制整数转换成双字节BCD码整数
;入口条件:待转换的双字节十六进制整数在31H,30H中。
;出口信息:转换后的三字节BCD码整数在3BH,3AH,39H中。
HB2: CLR A ;BCD码初始化
MOV 3BH,A
MOV 3AH,A
MOV 39H,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,30H ;从高端移出待转换数的一位到CY中
RLC A
MOV 30H,A
MOV A,31H
RLC A
MOV 31H,A
MOV A,39H ;BCD码带进位自身相加,相当于乘2
ADDC A,39H
DA A ;十进制调整
MOV 39H,A
MOV A,3AH
ADDC A,3AH
DA A
MOV 3AH,A
MOV A,3BH
ADDC A,3BH
MOV 3BH,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
MOV A,39H ;取小数点后2.3位
ANL A,#0FH ;取低4位
CLR C
SUBB A,#5 ;4舍5入
JC HB4 ;够5加1
MOV A,39H
ANL A,#0F0H ;取高4位
SWAP A ;高低字节交换
INC A ;加1
MOV DP1,A ;存入显示缓冲器1位
HB4: MOV A,39H ;不够直接存入
ANL A,#0F0H
SWAP A
MOV DP1,A
MOV A,3AH ;取整数及小数点后1位
ANL A,#0FH ;取低4位小数点后1位
MOV DP2,A ;存入显示缓冲器2位
MOV A,3AH
ANL A,#0F0H ;取整数高4位
SWAP A
MOV DP3,A ;存入显示缓冲器3位
RET
;延时子程序延时去抖动这里调显示4次
;-----------------------
DELAY:
MOV R7,#4
DELAY1: ACALL DISP
DJNZ R7,DELAY1
RET
;延时子程序------------------------------------
T1MS: MOV R5,#00H
TT: MOV R6,#9
DJNZ R6,$
DJNZ R5,TT
RET
;显示子程序------------------------------------
DISP:SETB SMG ;关各位选
SETB SMS
SETB SMB
MOV ZX,#00H ;关数据显示口
MOV DPTR,#DISPTAB ;送查表地址
MOV A,DP1 ;取要显示数
MOVC A,@A+DPTR ;查表
CPL A ;数据表为阳码取反为阴码去掉以下相同
MOV ZX,A ;显示输出
CLR SMG ;选择个位
LCALL T1MS ;调延时子程序
SETB SMG ;关位选
MOV ZX,#00H
MOV A,DP2
MOVC A,@A+DPTR
CPL A
MOV ZX,A
CLR SMS ; 十位
LCALL T1MS
SETB SMS
MOV ZX,#00H
MOV A,DP3
MOVC A,@A+DPTR
CPL A
MOV ZX,A
CLR SMB ; 百位
SETB P0.7 ;小数点在百位
LCALL T1MS
SETB SMB
MOV ZX,#00H
RET
DISPTABB 0C0H,0F9H,0A4H,0B0H,99H,
DB 92H,82H,0F8H,80H,90H
;0,1,2,3,4,5,6,7,8,9
;---------------------------------------------------
END
有好东西大家共同分享 |
-
2
评分次数
-
|