找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13489|回复: 3
收起左侧

51单片机led灯渐变PWM调光(渐亮渐灭)C语言和汇编源程序

[复制链接]
ID:400845 发表于 2018-9-21 09:12 | 显示全部楼层 |阅读模式
PWM控制led灯渐亮渐灭程序
适用ME500开发系统
短接JP41-2选用8个LED灯
PWM—PulseWidthModulation(脉冲宽度调制)
PWM足?种周期?走而高低电平的rV空比可以调制的方波信兮.
按K2—下,PWM值减小,则占空比增加。
兗度逐渐增加,直到8个LED灯达到高亮,蜂鸣器响。
按K1—下,PWM值增加,则占空比减小。
立度逐渐减弱,直到8个LED灯达到最峭,蜂鸣器响。

单片机汇编语言源程序如下:
  1. ; PWM 控制 LED 灯渐亮渐灭程序
  2. ; 适用 ME500 开发系统
  3. ; 晶振为11.0592M
  4. ; 利用定时器控制产生占空比可变的 PWM 波
  5. ; 按K1,PWM值增加,则占空比减小,LED 灯渐暗。
  6. ; 按K2,PWM值减小,则占空比增加,LED 灯渐亮。
  7. ; 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

  8. ;----------------------------
  9.          PWM   EQU  7FH            ;PWM赋初始值
  10.          OUT   EQU  P0             ;8个LED灯的接口

  11.          INCKEY EQU  P1.4          ;K1,PWM值增加键。
  12.          DECKEY EQU  P1.5          ;K2,PWM值减小键。

  13.          BEEP   EQU  P3.7
  14. ;----------------------------
  15.          ORG   0000H
  16.          SJMP  START
  17.          ORG   000BH
  18.          SJMP  INTT0
  19.          ORG   001BH
  20.          SJMP  INTT1
  21.          ORG   0030H
  22. ;----------------------------
  23. ;主程序
  24. ;定时器0工作在模式1,定时器1工作在模式2。
  25. ;----------------------------
  26. START:
  27.           MOV  SP,#30H
  28.           MOV TMOD,#21H
  29.           MOV TH1,PWM              ;脉宽调节
  30.           MOV TL1,#00H
  31.           MOV TH0,#0FCH             ;1ms延时常数
  32.           MOV TL0,#066H             ;频率调节
  33.           SETB EA
  34.           SETB ET0
  35.           SETB ET1
  36.           SETB TR0

  37. LOOP:     MOV A,PWM                ;
  38.           JB INCKEY,LOOP1          ;增加键是否按下?
  39.           CALL DELAY               ;延时去抖动
  40.           JB INCKEY,LOOP1
  41.           CJNE A,#0FFH,PWMINC      ;是否到最大值?
  42.           CALL  BEEP_BL            ;是,蜂鸣器报警。
  43.           SJMP LOOP
  44. PWMINC:
  45.           INC PWM                  ;调节脉宽(脉宽减小)
  46.           SJMP LOOP

  47. LOOP1:    JB DECKEY,LOOP2          ;减小键是否按下?
  48.           CALL DELAY               ;延时去抖动
  49.           JB DECKEY,LOOP2
  50.           CJNE A,#02H,PWMDEC       ;是否到最小值?
  51.           CALL  BEEP_BL            ;是,蜂鸣器报警。
  52.           SJMP LOOP
  53. PWMDEC:
  54.           DEC PWM                  ;调节脉宽(脉宽增加)
  55. LOOP2:    SJMP LOOP

  56. ;------------------------------
  57. ;T0中断服务子程序   (频率)
  58. ;控制定时器1中断
  59. ;------------------------------
  60. INTT0:
  61.           CLR  TR1
  62.           MOV TH0,#0FCH             ;1ms延时常数
  63.           MOV TL0,#066H              ;频率调节
  64.           MOV  TH1,PWM
  65.           SETB TR1
  66.           MOV  OUT,#00H             ;启动输出
  67.           RETI
  68. ;------------------------------
  69. ;T1中断服务子程序      (脉宽)
  70. ;控制PWM脉冲宽度
  71. ;------------------------------
  72. INTT1:
  73.           CLR  TR1         ;脉宽调节结束
  74.           MOV  OUT,#0FFH   ;结束输出
  75.           RETI
  76. ;------------------------------
  77. ;10ms延时子程序
  78. ;------------------------------
  79. DELAY:
  80.           MOV R6,#50
  81. DELAY1:
  82.           MOV R7,#100
  83.           DJNZ R7,$
  84.           DJNZ R6,DELAY1
  85.           RET
  86. ;-----------------------------------------------
  87. ;蜂鸣器响一声子程序
  88. ;-----------------------------------------------
  89. BEEP_BL:
  90.            MOV   R6,#100
  91.   BL1:     CALL  BL2
  92.            CPL   BEEP
  93.            DJNZ  R6,BL1
  94.            MOV   R5,#25
  95.            CALL  DELAY2
  96.            RET

  97.   BL2:     MOV   R7,#180
  98.   BL3:     NOP
  99.            DJNZ  R7,BL3
  100.            RET
  101. DELAY2:                    ;延时R5×10MS
  102.            MOV   R6,#50
  103.   BL4:     MOV   R7,#100
  104.   BL5:     DJNZ  R7,BL5
  105.            DJNZ  R6,BL4
  106.            DJNZ  R5,DELAY2
  107.            RET
  108. ;---------------------------------------------------
  109.            END
复制代码


C语言版本:
  1. /*********************************************************/

  2. #include<reg51.h>
  3. #include<intrins.h>
  4. unsigned int PWM=0xff70 ;   //赋初值
  5. void delayms(unsigned char ms);
  6. void delay(unsigned char t);
  7. sbit k1=P3^0;
  8. sbit k2=P1^0;
  9. sbit k3=P1^1;
  10. /*********************************************************/
  11. void main()
  12. {   
  13.     int a,b;
  14.     int temp;
  15.     temp=a^b;
  16.     TMOD=0x11 ;
  17.         TH0=0xfe ;           //1ms延时常数
  18.     TL0=0xcd ;           //频率调节
  19.     TH1=PWM/256 ;            //脉宽调节
  20.     TL1=PWM%256 ;
  21.         EA=1;
  22.         ET0=1;
  23.         ET1=1;
  24.     TR0=1 ;
  25.     while(1)
  26.      {
  27.             if(k2==0)
  28.                   {
  29.                      PWM=PWM+0x01;
  30.                          while(k2==0);
  31.                    }
  32.              if(k3==0)
  33.                  {
  34.                    PWM=PWM-0x01;
  35.                    while(k3==0);
  36.          }
  37.       }
  38. }

  39. /*********************************************************/
  40. // 定时器0中断服务程序  (频率)
  41. /*********************************************************/
  42. void timer0() interrupt 1
  43. {  
  44.     TR1=0 ;
  45.     TH0=0xfe;
  46.     TL0=0xcd ;
  47.         TR0=0 ;
  48.     TH1=PWM/256 ;            //脉宽调节
  49.     TL1=PWM%256 ;
  50.     TR1=1 ;
  51.         TR0=1 ;
  52.     k1=0;      //启动输出
  53. }

  54. /*********************************************************/
  55. // 定时器1中断服务程序 (脉宽)
  56. /*********************************************************/
  57. void timer1() interrupt 3
  58. {
  59.     TR1=0 ;
  60.     k1=1;     //结束输出

  61. }

  62. /*********************************************************/
  63. //蜂鸣器子程序
  64. /*********************************************************/

  65. /*void Beep()     
  66.   {
  67.     unsigned char i  ;
  68.     for (i=0  ;i<100  ;i++)
  69.       {
  70.         delay(100)  ;
  71.         BEEP=!BEEP  ;                //Beep取反
  72.       }
  73.     BEEP=1  ;                        //关闭蜂鸣器
  74.         delayms(100);
  75.   }

  76. /*********************************************************/
  77. // 延时子程序
  78. /*********************************************************/  
  79. void delay(unsigned char t)
  80. {
  81.    unsigned char i;
  82.    while(t--)
  83.      {
  84.        for(i=0;i<10;i++)
  85.             {
  86.               delayms(100);
  87.             }
  88.         }
  89. }

  90. ……………………

  91. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


0.png
所有资料51hei提供下载:
LED 渐亮渐灭.zip (475.07 KB, 下载次数: 205)
回复

使用道具 举报

ID:469585 发表于 2019-6-28 14:32 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:625977 发表于 2019-10-18 08:37 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

ID:139005 发表于 2020-3-23 23:15 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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