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

发布者:shtlsw最新更新时间:2019-10-18 来源: eefocus关键字:51单片机  led灯渐变  PWM调光 手机看文章 扫描二维码
随时随地手机看文章

PWM控制led灯渐亮渐灭程序
适用ME500开发系统
短接JP41-2选用8个LED灯
PWM—PulseWidthModulation(脉冲宽度调制)
PWM足?种周期?走而高低电平的rV空比可以调制的方波信兮.
按K2—下,PWM值减小,则占空比增加。
兗度逐渐增加,直到8个LED灯达到高亮,蜂鸣器响。
按K1—下,PWM值增加,则占空比减小。
立度逐渐减弱,直到8个LED灯达到最峭,蜂鸣器响。

单片机汇编语言源程序如下:

; PWM 控制 LED 灯渐亮渐灭程序

; 适用 ME500 开发系统

; 晶振为11.0592M

; 利用定时器控制产生占空比可变的 PWM 波

; 按K1,PWM值增加,则占空比减小,LED 灯渐暗。

; 按K2,PWM值减小,则占空比增加,LED 灯渐亮。

; 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。


;----------------------------

         PWM   EQU  7FH            ;PWM赋初始值

         OUT   EQU  P0             ;8个LED灯的接口


         INCKEY EQU  P1.4          ;K1,PWM值增加键。

         DECKEY EQU  P1.5          ;K2,PWM值减小键。


         BEEP   EQU  P3.7

;----------------------------

         ORG   0000H

         SJMP  START

         ORG   000BH

         SJMP  INTT0

         ORG   001BH

         SJMP  INTT1

         ORG   0030H

;----------------------------

;主程序

;定时器0工作在模式1,定时器1工作在模式2。

;----------------------------

START:

          MOV  SP,#30H

          MOV TMOD,#21H

          MOV TH1,PWM              ;脉宽调节

          MOV TL1,#00H

          MOV TH0,#0FCH             ;1ms延时常数

          MOV TL0,#066H             ;频率调节

          SETB EA

          SETB ET0

          SETB ET1

          SETB TR0


LOOP:     MOV A,PWM                ;

          JB INCKEY,LOOP1          ;增加键是否按下?

          CALL DELAY               ;延时去抖动

          JB INCKEY,LOOP1

          CJNE A,#0FFH,PWMINC      ;是否到最大值?

          CALL  BEEP_BL            ;是,蜂鸣器报警。

          SJMP LOOP

PWMINC:

          INC PWM                  ;调节脉宽(脉宽减小)

          SJMP LOOP


LOOP1:    JB DECKEY,LOOP2          ;减小键是否按下?

          CALL DELAY               ;延时去抖动

          JB DECKEY,LOOP2

          CJNE A,#02H,PWMDEC       ;是否到最小值?

          CALL  BEEP_BL            ;是,蜂鸣器报警。

          SJMP LOOP

PWMDEC:

          DEC PWM                  ;调节脉宽(脉宽增加)

LOOP2:    SJMP LOOP


;------------------------------

;T0中断服务子程序   (频率)

;控制定时器1中断

;------------------------------

INTT0:

          CLR  TR1

          MOV TH0,#0FCH             ;1ms延时常数

          MOV TL0,#066H              ;频率调节

          MOV  TH1,PWM

          SETB TR1

          MOV  OUT,#00H             ;启动输出

          RETI

;------------------------------

;T1中断服务子程序      (脉宽)

;控制PWM脉冲宽度

;------------------------------

INTT1:

          CLR  TR1         ;脉宽调节结束

          MOV  OUT,#0FFH   ;结束输出

          RETI

;------------------------------

;10ms延时子程序

;------------------------------

DELAY:

          MOV R6,#50

DELAY1:

          MOV R7,#100

          DJNZ R7,$

          DJNZ R6,DELAY1

          RET

;-----------------------------------------------

;蜂鸣器响一声子程序

;-----------------------------------------------

BEEP_BL:

           MOV   R6,#100

  BL1:     CALL  BL2

           CPL   BEEP

           DJNZ  R6,BL1

           MOV   R5,#25

           CALL  DELAY2

           RET


  BL2:     MOV   R7,#180

  BL3:     NOP

           DJNZ  R7,BL3

           RET

DELAY2:                    ;延时R5×10MS

           MOV   R6,#50

  BL4:     MOV   R7,#100

  BL5:     DJNZ  R7,BL5

           DJNZ  R6,BL4

           DJNZ  R5,DELAY2

           RET

;---------------------------------------------------

           END


C语言版本:

/*********************************************************/


#include

#include

unsigned int PWM=0xff70 ;   //赋初值

void delayms(unsigned char ms);

void delay(unsigned char t);

sbit k1=P3^0;

sbit k2=P1^0;

sbit k3=P1^1;

/*********************************************************/

void main()

{   

    int a,b;

    int temp;

    temp=a^b;

    TMOD=0x11 ;

        TH0=0xfe ;           //1ms延时常数

    TL0=0xcd ;           //频率调节

    TH1=PWM/256 ;            //脉宽调节

    TL1=PWM%256 ;

        EA=1;

        ET0=1;

        ET1=1;

    TR0=1 ;

    while(1)

     {

            if(k2==0)

                  {

                     PWM=PWM+0x01;

                         while(k2==0);

                   }

             if(k3==0)

                 {

                   PWM=PWM-0x01;

                   while(k3==0);

         }

      }

}


/*********************************************************/

// 定时器0中断服务程序  (频率)

/*********************************************************/

void timer0() interrupt 1 

{  

    TR1=0 ;

    TH0=0xfe;

    TL0=0xcd ;

        TR0=0 ;

    TH1=PWM/256 ;            //脉宽调节

    TL1=PWM%256 ;

    TR1=1 ;

        TR0=1 ;

    k1=0;      //启动输出

}


/*********************************************************/

// 定时器1中断服务程序 (脉宽)

/*********************************************************/

void timer1() interrupt 3 

    TR1=0 ;

    k1=1;     //结束输出


}


/*********************************************************/

//蜂鸣器子程序

/*********************************************************/


/*void Beep()     

  {

    unsigned char i  ;

    for (i=0  ;i<100  ;i++)

      {

        delay(100)  ;

        BEEP=!BEEP  ;                //Beep取反

      } 

    BEEP=1  ;                        //关闭蜂鸣器

        delayms(100);

  } 


/*********************************************************/

// 延时子程序

/*********************************************************/  

void delay(unsigned char t)

   unsigned char i;

   while(t--)

     {

       for(i=0;i<10;i++)

            {

              delayms(100);

            }

        }

}


……………………




关键字:51单片机  led灯渐变  PWM调光 引用地址:51单片机led灯渐变PWM调光(渐亮渐灭)C语言和汇编源程序

上一篇:单片机自动浇花系统
下一篇:51单片机自动凉衣服源程序电路图与实物图

推荐阅读最新更新时间:2024-11-08 04:03

基于51单片机+LCD1602显示
LCD1602介绍 LCD1602相关引脚 LCD1602写命令、写数据相关操作图 根据上面时序图和时序参数图我们可以写出 写命令代码 和写数据代码 写命令 代码 写命令 void write_com(char command) { RS = 0; RW = 0; //高读低写 LCD = command; delay5ms(); //这里延时最低要30纳秒 我们直接给5ms E = 1;//使能拉高 delay5ms(); //最低要求延迟150纳秒 我们直接给5ms E = 0; } 写数据 代码 写数据 void write_data(char data) {
[单片机]
基于<font color='red'>51单片机</font>+LCD1602显示
跟我学51单片机(五):单片机动态扫描驱动数码管
  一、本文内容提要   本刊第四期介绍了单片机外接键盘的原理,并给出了应用实例。本期将介绍单片机动态驱动段式数码管。通过该讲,读者可以掌握段式数码管的工作原理和如何通过动态驱动的方法设计电路以及程序。   二、原理简介   常用的段式数码管有七段式和八段式,八段比七段多了一个小数点,其他的基本相同。所谓的几段就是指数码管里有相应的几个小LED 发光二极管,通过控制不同的LED 的亮灭来显示出不同的字形(见图1(a))。从各发光二极管的电极连接方式又可以分为共阳极和共阴极两种类型。共阴极则是所有的二极管的阴极连接在一起,而阳极是分离的(见图1(b));而共阳极就是所有二极管的阳极是公共相连,而阴极则是分离的(见图1(c))。本
[单片机]
跟我学<font color='red'>51单片机</font>(五):单片机动态扫描驱动数码管
关于51单片机字符串 EEPROM存储与读取的问题
题目如下 通过串口助手控制 LCD 显示屏,通过 LCD1602 显示并保存在 EEPROM 中,实现 数据的掉电保存(例 如:串口向单片机发送一串英文字符,该字符在 LCD 上显示出 来,若按下 k1 则实现数据的保存,按下 k2 实 现读取上次保存的数据,显示在 1602 上) 效果如下 #include reg52.h //此文件中定义了单片机的一些特殊功能寄存器 #include i2c.h #include string.h typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit LSA=P2^2; sbi
[单片机]
关于<font color='red'>51单片机</font>字符串 EEPROM存储与读取的问题
51单片机控制数码管动态显示程序
说明: 驱动四位一体数码管动态显示数字,可方便的移植到其它程序中。 例如:1、硬件改为三位一体或二位一体数码管,只需修改Display_Scan()函数COM个数。 2、本例中,采用了共阴数码管,如果用在共阳数码管,只需修改相应段码表。   本程序使用P0口作为段码数据发送端,P2.0-P2.3作为数码管扫描选通, 使用P0口时,因单片机内部没有上拉电阻,所以要外接上拉电阻(参考阻值470欧姆). // STC89C52RC // +---------------+ // | | // | | Digital Number // | | _______________________ // | | | __ __ __ __
[单片机]
实例源码2---基于51单片机的摇摇棒制作
#include #define uchar unsigned char #define uint unsigned int sbit key = P3^0;//定义切换画面开关 uchar Key_num;//定义按键次数 uchar Int0_num=0;//定义中断次数 uchar Direction;//定义摇动方向(从左到右) uchar code Embed ={ 0x40,0x00,0x20,0x00,0xd0,0x3f,0x4c,0x40,0x43,0x40,0x44,0x42,0x48,0x44,0xd8,0x43, 0x30,0x78,0x10,0x00,0x00,0x00,0xfc,0x07,0x00,0
[单片机]
51单片机串行口速率设置
/* 51单片机速率设置公式 波特率=SYSclk/(32*12*(256-TH1) */ #ifndef MONITOR51 SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ TH1 = 221; /* TH1: reload value for 1200 baud @ 16MHz */ TR1 = 1; /* TR1: timer 1 run
[单片机]
51单片机三线串行驱动12864液晶
以前写12864的液晶程序都是用的并行的方式,这种方式焊接起来很麻烦,而且占用的IO口比较多。 今天尝试使用串行方式来驱动该模块。 本程序是基于STC89C52的12864串行模式的程序,硬件电路连接只需要5根线,VCC GND RS RW E , 只需要三个个IO 口就可以显示,大大节省了资源。 12864液晶芯片是st7920。自带中文字库。 该程序功能:实现使用12864液晶显示字符、汉字(程序有详细的中文注释)。 已经调试通过,很好用。 下面是电路原理图 其时序图如下: 根据其时序图写出其代码如下: #include reg52.h #include stdlib.h #include intrins.h
[单片机]
<font color='red'>51单片机</font>三线串行驱动12864液晶
51单片机学习总结
1、什么是单片机 在一片集成电路芯片上集成微处理器、存储器、I/O接口电路,从而构成了单芯片微型计算机,即单片机。 Intel公司推出了MCS-51系列单片机:集成 8位CPU、4K字节ROM、128字节RAM、4个8位并口、1个全双工串行口、2个16位定时/计数器。寻址范围64K,并有控制功能较强的布尔处理器。 2、单片机的作用 用到单片机的项目经验介绍 手持粮库温度寻检设备 毕设答辩打分器 电话台灯 自动感应水龙头 凡是与控制或简单计算有关的电子设备都可以用单片机来实现,再根据具体实际情况选择不同性能的单片机,如:atmel,stc,pic,avr,凌阳,80C51,arm等 工业自动化:数据采集、测控技术。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved