找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3529|回复: 1
收起左侧

LED台灯PWM控制汇编程序.ASM

[复制链接]
ID:70976 发表于 2014-12-27 13:25 | 显示全部楼层 |阅读模式
  1. ;/*******************************************************************************
  2. ;* 标题: LED台灯程序*
  3. ;* 文件: LED台灯PWM控制.asm *
  4. ;* 日期: 2009-11-28 *
  5. ;* 版本: 1.0*
  6. ;* 作者: 部分程序参考网上修改而成,本人最终改编测试,特别对原作致敬!*
  7. ;* 邮箱: wqhanxing@163.com *
  8. ;********************************************************************************
  9. ; LED台灯程序*
  10. ; 利用定时器控制产生占空比可变的PWM 波*
  11. ; 按K1,PWM 值增加,则占空比减小,LED 灯渐暗。*
  12. ; 按K2,PWM 值减小,则占空比增加,LED 灯渐亮。*
  13. ; 我的5644遥控器上的0~9数字键对应10个亮度等级。*
  14. ; 当PWM 值增加到最大值或减小到最小值时,蜂鸣器将报警*
  15. ; 资源:p1 口,数码管。p3.4,p3.5 亮度控制按键P3.0 PWM端口,p3.1 蜂鸣器报警*
  16. ;********************************************************************************
  17.         LEVEL0        EQU        2FH;        亮度等级9
  18.         LEVEL1        EQU        4FH;        亮度等级8
  19.         LEVEL2        EQU        6FH;        亮度等级7
  20.         LEVEL3        EQU        8FH;        亮度等级6
  21.         LEVEL4        EQU        0AFH;        亮度等级5
  22.         LEVEL5        EQU        0BFH;        亮度等级4
  23.         LEVEL6        EQU        0CFH;        亮度等级3
  24.         LEVEL7        EQU        0DFH;        亮度等级2
  25.         LEVEL8        EQU        0EFH;        亮度等级1
  26.         LEVEL9        EQU        0FFH;        亮度等级0

  27.         PWM         EQU 7FH         ;PWM 赋初始值

  28.         LED_RAM        EQU        30H
  29.         IRCOM         EQU 50H        ;50H-53H IR 使用
  30.         IR_NEW        EQU 60H        ;新的遥控代码值用

  31.         LED_PORT        EQU        P1         ;数码管接口,共阴极
  32.         PWM_OUT         EQU P3.0 ;PWM控制输出接口       
  33.         INCKEY                 EQU P3.5 ;K1,PWM 值增加键。
  34.         DECKEY                 EQU P3.4 ;K2,PWM 值减小键。
  35.         BEEP                 EQU P3.1 ;蜂鸣器
  36.         IRIN                EQU P3.2         

  37. ;---------------------------
  38.         ORG 0000H
  39.         SJMP START
  40.         ORG 0003H
  41.         LJMP  REMOT        ;IRF         
  42.         ORG 000BH
  43.         SJMP INTT0
  44.         ORG 001BH
  45.         SJMP INTT1
  46.         ORG 0030H
  47. ;---------------------------
  48. ;主程序
  49. ;定时器0 工作在模式1,定时器1 工作在模式2。
  50. ;---------------------------

  51. START:       
  52.         MOV SP,#30H
  53.         MOV TMOD,#21H
  54.         MOV IP,#00001010B
  55.         MOV TH1,PWM ;脉宽调节
  56.         MOV TL1,#00H
  57.          
  58.         MOV TH0,#0FEH ;1ms 延时常数0FC
  59.         MOV TL0,#0CH ;频率调节066

  60.         SETB EA                ;开总中断
  61.         SETB ET0         ;定时器0允许
  62.         SETB ET1         ;定时器1允许
  63.         SETB TR0         ;定时器0启动
  64.         SETB EX0        ;外中断0打开
  65.         SETB IT0                ;外中断0采用脉冲方式               ;
  66. LOOP:
  67.         LCALL DISPLAY
  68.         MOV A,PWM ;
  69.         JB INCKEY,LOOP1 ;增加键是否按下?
  70.         CALL DELAY ;延时去抖动
  71.         JB INCKEY,LOOP1
  72.         CJNE A,#0FFH,PWMINC ;是否到最大值?
  73.         CALL BEEP_BL ;是,蜂鸣器报警。
  74.         SJMP LOOP

  75. PWMINC: INC PWM ;调节脉宽(脉宽减小)
  76.         SJMP LOOP

  77. LOOP1:         JB DECKEY,LOOP2 ;减小键是否按下?
  78.         CALL DELAY ;延时去抖动
  79.         JB DECKEY,LOOP2
  80.         CJNE A,#01H,PWMDEC ;是否到最小值?
  81.         CALL BEEP_BL ;是,蜂鸣器报警。
  82.         SJMP LOOP

  83. PWMDEC: DEC PWM ;调节脉宽(脉宽增加)
  84. LOOP2:         SJMP LOOP

  85. ;-----------------------------
  86. ;T0 中断服务子程序(频率)
  87. ;控制定时器1 中断
  88. ;-----------------------------
  89. INTT0:        
  90.         CLR TR1
  91.         MOV TH0,#0FEH ;1ms 延时常数
  92.         MOV TL0,#0CH ;频率调节
  93.         MOV TH1,PWM
  94.         SETB TR1
  95.         CLR PWM_OUT ;启动输出
  96.         RETI

  97. ;-----------------------------
  98. ;T1 中断服务子程序(脉宽)
  99. ;控制PWM 脉冲宽度
  100. ;-----------------------------
  101. INTT1:        
  102.         CLR TR1 ;脉宽调节结束
  103.         SETB  PWM_OUT ;结束输出
  104.         RETI

  105. ;-----------------------------
  106. ;************************有接收到遥控器信号*******
  107. REMOT:       
  108.         CLR EA
  109.         PUSH  ACC
  110.         PUSH  PSW
  111.         SETB PSW.3        ;选择工作寄存器组1(SETB PSW.3)
  112.         CLR PSW.4        ;                 (CLR  PSW.4)      
  113.         MOV R0,#IRCOM
  114. I1: JNB IRIN,I2 ;等待IR 信号出现
  115.         JMP IR_SHOW1;I1;原值I1
  116. I2: MOV R4,#20
  117. I20: CALL DEL
  118.         DJNZ R4,I20
  119.         JB IRIN,IR_SHOW1;I1 ;确认IR 信号出现
  120. I21: JB IRIN,I3 ;等IR 变为高电平
  121.         CALL DEL
  122.         JMP I21
  123. I3: MOV R3,#0 ;8 位数清为0
  124. LL:        JNB IRIN,I4 ;等IR 变为低电平
  125.         CALL DEL
  126.         JMP LL
  127. I4: JB IRIN,I5 ;等IR 变为高电平
  128.         CALL DEL
  129.         JMP I4
  130. I5: MOV R2,#0 ;0.14ms 计数
  131. L1: CALL DEL
  132.         JB IRIN, N1 ;等IR 变为高电平;IR=0,检查R2 中的计数值
  133.         MOV A,#8
  134.         CLR C
  135.         SUBB A,R2 ;判断高低位;IF C=0 BIT=0
  136.         MOV A,@R0
  137.         RRC A
  138.         MOV @R0,A ;处理完一位
  139.         INC R3
  140.         CJNE R3,#8,LL ;需处理完8 位
  141.         MOV R3,#0
  142.         INC R0
  143.         CJNE R0,#54H,LL ;收集到4 字节了
  144.         JMP IR_SHOW
  145. N1: INC R2
  146.         CJNE R2,#30,L1 ;30--0.14ms 计数过长则时间到自动离开
  147.         JMP IR_SHOW1
  148. ;------------------------------------------------
  149. IR_SHOW:                ;使用我的5644遥控器。
  150.         MOV  A,50H      ;
  151.         XRL  A,#40H     ;判断遥控器低8位地址是否正确(40H)
  152.         JNZ  IR_SHOW1       ;
  153.         MOV  A,51H
  154.         XRL  A,#3FH     ;再判断遥控器高8位地址是否正确(3FH)
  155.         JNZ  IR_SHOW1
  156.         MOV A,52H
  157.         CPL A ;                                将52H 取反后和53H 比较
  158.         CJNE A,53H,IR_SHOW1 ;如果不等表示接收数据发生错误,放弃。
  159.         CALL D1;        解码成功则调用相应按键的处理程序+++++++++++++++++++++++++
  160. ;        MOV A,IR_NEW
  161. ;        CJNE A,#0FFH,IR_PWM;不是数字键则退出
  162. ;        JMP IR_SHOW1
  163. IR_PWM:
  164.         MOV DPTR,#IR_ASC
  165.         MOV A,IR_NEW
  166.         MOVC A,@A+DPTR
  167.         MOV PWM,A
  168. IR_SHOW1:
  169.         POP  PSW
  170.         POP  ACC
  171.         SETB IRIN
  172.         SETB EA
  173.         RETI

  174. D1:        MOV A,52H
  175.         CJNE A,#01H,D2  ;是数字键1吗?
  176.         MOV IR_NEW,#01H        ;是则送数据01H
  177.         CALL BEEP_BL ;蜂鸣器报警。
  178.         RET

  179. D2:        CJNE A,#02H,D3  ;是数字键2吗?
  180.         MOV IR_NEW,#02H        ;是则送数据02H
  181.         CALL BEEP_BL ;蜂鸣器报警。
  182.         RET

  183. D3:        CJNE A,#03H,D4  ;是数字键3吗?
  184.         MOV IR_NEW,#03H        ;是则送数据03H
  185.         CALL BEEP_BL ;蜂鸣器报警。
  186.         RET

  187. D4:        CJNE A,#04H,D5  ;是数字键4吗?
  188.         MOV IR_NEW,#04H        ;是则送数据04H
  189.         CALL BEEP_BL ;蜂鸣器报警。
  190.         RET

  191. D5:        CJNE A,#05H,D6  ;是数字键5吗?
  192.         MOV IR_NEW,#05H        ;是则送数据05H
  193.         CALL BEEP_BL ;蜂鸣器报警。
  194.         RET

  195. D6:        CJNE A,#06H,D7  ;是数字键6吗?
  196.         MOV IR_NEW,#06H        ;是则送数据06H
  197.         CALL BEEP_BL ;蜂鸣器报警。
  198.         RET

  199. D7:        CJNE A,#07H,D8  ;是数字键7吗?
  200.         MOV IR_NEW,#07H        ;是则送数据07H
  201.         CALL BEEP_BL ;蜂鸣器报警。
  202.         RET

  203. D8:        CJNE A,#08H,D9  ;是数字键8吗?
  204.         MOV IR_NEW,#08H        ;是则送数据08H
  205.         CALL BEEP_BL ;蜂鸣器报警。
  206.         RET

  207. D9:        CJNE A,#09H,D0  ;是数字键9吗?
  208.         MOV IR_NEW,#09H        ;是则送数据09H
  209.         CALL BEEP_BL ;蜂鸣器报警。
  210.         RET

  211. D0:        CJNE A,#00H,D15        ;是数字键0吗?
  212.         MOV IR_NEW,#00H        ;是则送数据00H
  213.         CALL BEEP_BL ;蜂鸣器报警。
  214.         RET

  215. D13:CJNE A,#11H,D14        ;是音量加键吗?实现速度加
  216.         MOV IR_NEW,#0FFH;非数字键标示为0FFH
  217.         INC PWM
  218.         MOV A,PWM
  219.         CJNE A,#00H,D13_OUT
  220.         CALL BEEP_BL ;蜂鸣器报警。
  221.         MOV PWM,#0FFH
  222. D13_OUT:
  223.         RET

  224. D14:CJNE A,#10H,D15        ;是音量减键吗?实现速度减
  225.         MOV IR_NEW,#0FFH;非数字键标示为0FFH
  226.         DEC PWM
  227.         MOV A,PWM
  228.         CJNE A,#0FFH,D14_OUT        ;9
  229.         CALL BEEP_BL ;蜂鸣器报警。
  230.         MOV PWM,#01H
  231. D14_OUT:
  232.         RET
  233. D15:
  234. ;        MOV IR_NEW,#0FFH;非数字键标示为0FFH
  235.         RET
  236. ;**********************************************
  237. ;判断显示程序
  238. ;-------------
  239. DISPLAY:
  240. DIS0:       
  241.         MOV A,PWM
  242.         SUBB A,#LEVEL0
  243.         JNC DIS1
  244.         MOV LED_RAM,#9
  245.         JMP LED_DISP
  246. DIS1:       
  247.         MOV A,PWM
  248.         SUBB A,#LEVEL1
  249.         JNC DIS2
  250.         MOV LED_RAM,#8
  251.         JMP LED_DISP
  252. DIS2:       
  253.         MOV A,PWM
  254.         SUBB A,#LEVEL2
  255.         JNC DIS3
  256.         MOV LED_RAM,#7
  257.         JMP LED_DISP
  258. DIS3:       
  259.         MOV A,PWM
  260.         SUBB A,#LEVEL3
  261.         JNC DIS4
  262.         MOV LED_RAM,#6
  263.         JMP LED_DISP
  264. DIS4:       
  265.         MOV A,PWM
  266.         SUBB A,#LEVEL4
  267.         JNC DIS5
  268.         MOV LED_RAM,#5
  269.         JMP LED_DISP
  270. DIS5:       
  271.         MOV A,PWM
  272.         SUBB A,#LEVEL5
  273.         JNC DIS6
  274.         MOV LED_RAM,#4
  275.         JMP LED_DISP
  276. DIS6:       
  277.         MOV A,PWM
  278.         SUBB A,#LEVEL6
  279.         JNC DIS7
  280.         MOV LED_RAM,#3
  281.         JMP LED_DISP
  282. DIS7:       
  283.         MOV A,PWM
  284.         SUBB A,#LEVEL7
  285.         JNC DIS8
  286.         MOV LED_RAM,#2
  287.         JMP LED_DISP
  288. DIS8:       
  289.         MOV A,PWM
  290.         SUBB A,#LEVEL8
  291.         JNC DIS9
  292.         MOV LED_RAM,#1
  293.         JMP LED_DISP

  294. DIS9:       
  295.         MOV A,PWM
  296.         SUBB A,#LEVEL9
  297.         JNC LED_DISP
  298.         MOV LED_RAM,#0

  299. LED_DISP:
  300.         MOV DPTR,#LED_ASC
  301.         MOV A,LED_RAM
  302.         MOVC A,@A+DPTR
  303.         MOV LED_PORT,A
  304.         RET

  305. LED_ASC:;共阴极LED代码
  306.         DB 3FH,06H,5BH,4FH,66H;0~F代码
  307.         DB 6DH,7DH,07H,7FH,6FH
  308.         DB 77H,7CH,39H,5EH,79H
  309.         DB 71H
  310.         DB 0BFH,086H,0DBH,0CFH,0E6H;0.~9.(带小数点)代码
  311.         DB 0EDH,0FDH,087H,0FFH,0EFH
  312.         DB 039H;字符“C”
  313. ;****************************************************
  314. IR_ASC:
  315.         DB 0FAH,0EAH,0DAH,0CAH,0BAH
  316.         DB 0A0H, 80H, 60H, 40H, 02H

  317. ;------------------------------------------------
  318.                 ; DELAY R5*0.14MS
  319. DEL:        MOV R5,#1 ;IR 解码使用
  320. DEL0:         MOV R6,#2
  321. DEL1:         MOV R7,#32
  322. DEL2:         DJNZ R7,DEL2
  323.                 DJNZ R6,DEL1
  324.                 DJNZ R5,DEL0
  325.                 RET

  326. ;------------------------
  327. ;10ms 延时子程序,按键去抖动用
  328. DELAY:
  329.         MOV R5,#50
  330. DELAY1:
  331.         MOV R6,#100
  332.         DJNZ R6,$
  333.         DJNZ R5,DELAY1
  334.         RET
  335.          
  336. ;-----------------------------------------------
  337. ;蜂鸣器响一声子程序
  338. BEEP_BL:MOV R6,#100
  339. BL1:CALL BL2
  340.         CPL BEEP
  341.         DJNZ R6,BL1         
  342.         MOV R5,#25
  343.         CALL DELAY2
  344.         RET         
  345. BL2:MOV R7,#180
  346. BL3:NOP
  347.         DJNZ R7,BL3
  348.         RET
  349. DELAY2: MOV R6,#50        ;延时R5×10MS
  350. BL4:         MOV R7,#100
  351. BL5:         DJNZ R7,BL5
  352.                 DJNZ R6,BL4
  353.                 DJNZ R5,DELAY2
  354.                 RET
  355. ;---------------------------------------------------
  356.         END
复制代码


回复

使用道具 举报

ID:95342 发表于 2015-11-17 21:48 | 显示全部楼层
真的太感谢楼主了,资料很有帮助
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表