51单片机的Timer,运用PWM完成呼吸灯

合集下载

51单片机pwm呼吸灯原理

51单片机pwm呼吸灯原理

51单片机pwm呼吸灯原理
呼吸灯是一种常见的电子灯光效果,在嵌入式系统中使用PWM(脉宽调制)
技术可以实现呼吸灯效果。

51单片机作为一种常用的嵌入式系统控制器,也可以
利用其内部的PWM功能来实现呼吸灯效果。

PWM是一种通过改变脉冲信号的高低电平比例来控制信号的占空比的技术。

在呼吸灯中,我们可以利用PWM的占空比来控制LED灯的亮度变化,从而实现
灯光逐渐变亮再逐渐变暗的效果。

实现51单片机的PWM呼吸灯效果需要主要以下几个步骤:
1. 配置单片机的PWM模块:先确定使用哪个定时器的PWM功能,然后设置
定时器工作模式和计数器初值。

2. 设置占空比:根据呼吸灯的效果要求,选择适当的周期和占空比。

通过改变PWM的脉冲信号的高电平时间和周期来控制LED的亮度变化。

3. 控制流程:编写程序,通过适当的控制结构如循环语句,在适当的时间段改
变PWM占空比,从而实现呼吸灯效果。

具体实现时,需要根据具体的单片机型号和编程语言来进行具体的配置和编程。

在编写程序时,可以利用定时器中断来实现精确的时间控制,以达到更加流畅的呼吸灯效果。

总之,通过合理配置51单片机的PWM模块,并编写相应的程序实现占空比
的变化控制,可以轻松实现呼吸灯效果。

这种效果不仅可以为电子产品增添美感,还可以用于指示、装饰等方面。

单片机呼吸灯原理

单片机呼吸灯原理

单片机呼吸灯原理介绍单片机呼吸灯是一种常见的电子制作项目,通过控制单片机的输出来实现灯光的呼吸效果。

本文将详细介绍单片机呼吸灯的原理以及实现步骤。

原理单片机呼吸灯的原理基于PWM(脉宽调制)技术,通过控制LED的亮度改变来实现呼吸灯效果。

具体原理如下:1.使用单片机的IO口控制LED的亮度,通过改变IO口输出的电平来调整LED的亮度。

通常,单片机的IO口输出电平为高电平(3.3V或5V)和低电平(0V)。

2.使用PWM技术控制IO口输出的电平占空比,占空比即高电平在一个周期中所占的比例。

占空比越大,LED的亮度越高;占空比越小,LED的亮度越低。

3.呼吸灯效果的实现是通过改变PWM的占空比来模拟人类呼吸的过程。

呼吸灯的亮度先逐渐增加到最大值,然后逐渐减小到最小值,再重复这个过程。

实现步骤下面是实现单片机呼吸灯的详细步骤:步骤一:硬件准备1.准备一个单片机开发板,如Arduino Uno。

2.准备一个LED,连接到开发板的一个IO口上。

3.连接一个适当的电阻,用于限流保护LED。

步骤二:软件编程1.在开发板上安装单片机开发环境,如Arduino IDE。

2.打开Arduino IDE,创建一个新的项目。

3.在项目中,使用PWM技术控制IO口输出的电平占空比。

具体代码如下:void setup() {pinMode(LED_PIN, OUTPUT);// 设置IO口为输出模式}void loop() {for (int brightness = 0; brightness <= 255; brightness++) {analogWrite(LED_PIN, brightness);// 通过改变PWM的占空比来控制LED的亮度delay(10);// 延时一段时间,使LED的亮度逐渐增加}for (int brightness = 255; brightness >= 0; brightness--) {analogWrite(LED_PIN, brightness);// 通过改变PWM的占空比来控制LED的亮度delay(10);// 延时一段时间,使LED的亮度逐渐减小}}步骤三:烧录程序1.将开发板连接到计算机上。

单片机实现呼吸灯效果的简单方法

单片机实现呼吸灯效果的简单方法

概述通本文基于e2s t u d i o开发环境,使用C P K-R A2L1评估板,配置定时器P W M输出,实现呼吸灯效果。

通过该项目可以学会如何使用开发环境新建项目、如何配置一个新的外设、如何调取外设驱动、如何基于F S P进行应用开发。

硬件准备首先需要准备一块评估板,这里我们使用瑞萨提供的R7F A2L1A B2D F M的评估板,芯片封装为P L Q P0064K B-C和内核C o r t e x-M23,最高运行主频为48M H z,具体如图所示。

该评估板支持U S B供电调试,非常适合客户项目前期的验证与开发。

开发板通过P501端口驱动一颗蓝色的L E D,原理如下图所示。

创建工程1、选择菜单的F i l e-N e w C/C++P r o j e c t,按照下图选择,然后点击下一步。

2、填写工程名称和工程的保存位置,请注意不要包含中文路径,点击N e x t。

3、F S P版本选择→器件选择→调试方式选择。

具体如下表,然后点击N e x t,下一个界面可以直接点击N e x t.4、选择工程模板,具体如下图,确认无误点击F i n i s h。

5、工程新建完成后,出现下图界面,此时可以确认一下自己配置的信息是否正确。

工程配置工程配置是项目的关键,涉及项目具体应用到的外设的配置,其中涉及B S P、C l o c k s、P i n s、I n t e r r u p t s、S t a c k s等的配置。

1、点击上一个界面的S t a c k s,增加本项目的T I M E R。

具体如下:2、点击新建的s t a c k,具体如下,弹出属性窗口。

注:若属性窗口无法弹出,可以从菜单W i n d o w-S h o w V i e w里面查找。

3、双击P r o p e r t i e s可全屏,双击可退出全屏。

属性的具体配置如下。

4、把管脚分配到P501,配置完成后,点击右上角的三角按钮(G e n e r a t e P r o j e c t C o n t e n t)。

51单片机PWM呼吸灯源程序

51单片机PWM呼吸灯源程序

51单片机PWM-呼吸灯源程序/*************************************************** **************** @file : main.c* @xu ran* @date : 2014年5月23日20:55:19 - 2014年5月23日22:32:12* @version : V2.0* @brief : PWM脉冲宽度调制技术实现呼吸灯************************************************* **************** @attention* 实验平台 : 51hei开发板* 单片机 : STC89C52RC MCU 晶振 : 11.0592 MHZ************************************************* ****************/#include //使用STC89C52库/* 三八译码器74HC138 */sbit ADDR3 = P1^3;sbit ENLED = P1^4;sbit PWMOUT = P0^0; //LED0/* PWM占空比 */unsigned char code pwmTable[] = {3, 5, 8, 11, 13, 16, 21, 24, 27, 30, 33, 36, 40, 45, 49,53, 55, 57, 61, 65, 67, 69, 72, 75, 79, 82, 86, 89, 91,93, 96, 99}; // dc%/* PWM的高电平和低电平的定时器的重载值 */ unsigned char Highthr0, Hightlr0;unsigned char Lowthr0, Lowtlr0;/* 定时器T1计数装载值 */unsigned char thr1, tlr1;/* PWM 频率计数值 */unsigned long tmp = 0;/******************local functiondefines**************************/void ConfigPWM(unsigned int fr, unsigned char dc); void ConfigTimer1(unsigned int xms);/******************************************************************//*** @brief : 主函数* @param : 无* @retval : 无*/void main(void){P0 = 0xFF; //初始化P0数据口ADDR3 = 1;ENLED = 0; //选择LEDP1 = (P1 & 0xF8) | 0x06; //LEDS6PWMOUT = 1; //初始化为熄灭ConfigPWM(100, 2); //PWM频率为100HZ, 占空比为2% ConfigTimer1(50); //50ms调整一次占空比EA = 1; //开启总中断!while (1); //wait interrupt happen!}/*** @brief : 配置PWM 调制PWM脉冲宽度* @param : PWM的脉冲宽度 PWM的占空比* @retval : 无*/void ConfigPWM(unsigned int fr, unsigned char dc) {unsigned int high = 0, low = 0;tmp = (11059200/12/fr); //fr频率的计数值high = (tmp * dc) / 100; //高电平计数值low = tmp - high; //低电平计数值high = 65536 - high; //高电平的计数定时器装载初值low = 65536 - low; //低电平的计数定时器装载初值Highthr0 = (unsigned char)(high >;>; 8);Hightlr0 = (unsigned char)high; //高电平Lowthr0 = (unsigned char)(low >;>; 8);Lowtlr0 = (unsigned char)low; //低电平/* 配置Timer0 方式1 */TMOD &= 0xF0; //清零T0控制位TMOD |= 0x01; //方式1TH0 = Highthr0;TL0 = Hightlr0; //先装高电平TR0 = 1;ET0 = 1; //开启定时器T0中断}/*** @brief : 配置Timer1,用来调整PWM占空比* @param : 待定时的时间* @retval : 无*/void ConfigTimer1(unsigned int xms){unsigned long tmp;tmp = 11059200/12;tmp = (tmp * xms) / 1000; //定时xms时间需要的计数值tmp = 65536 - tmp; //需要装载的计数初值thr1 = (unsigned char)(tmp >;>; 8);tlr1 = (unsigned char)tmp;TMOD &= 0x0F; //清零T1控制位TMOD |= 0x10; //T1方式1TH1 = thr1;TL1 = tlr1; //装载初值TR1 = 1;ET1 = 1;}/*** @brief : 调整PWM的占空比 (高电平的脉冲宽度)* @param : 占空比 dc* @retval : 无*/void tiaoZhengPWM(unsigned char dc){unsigned int high = 0, low = 0;high = (tmp * dc) / 100; //高电平计数值low = tmp - high; //低电平计数值high = 65536 - high;low = 65536 - low; //计数装载初值Highthr0 = (unsigned char)(high >;>; 8);Hightlr0 = (unsigned char)high; //取高电平计数装载初值Lowthr0 = (unsigned char)(low >;>; 8);Lowtlr0 = (unsigned char)low; //取低电平计数装载初值}/*** @brief : 定时器T0中断服务改变PWM的状态* @param : 无* @retval : 无*/void Timer0_ISP() interrupt 1{if (PWMOUT) //由高电平切换到低电平{TH0 = Lowthr0;TL0 = Lowtlr0; //装载低电平计数初值PWMOUT = 0; //点亮LED}else{TH0 = Highthr0;TL0 = Hightlr0; //装载高电平计数值PWMOUT = 1; //熄灭LED}}/*** @brief : 定时器T1中断服务调整PWM的占空比* @param : 无* @retval : 无*/void Timer1_ISP() interrupt 3{static unsigned char index = 0;static bit bir = 0; //方向标志 (0 小->;大 1 大->;小)TH1 = thr1;TL1 = tlr1;tiaoZhengPWM(pwmTable[index]); //调整PWM占空比if (bir == 0){index++;//递增if (index >;= 31) //到31立刻改变PWM的控制方向,即占空比由大到小变化(LED 暗->;亮){bir = 1; //改变方向}}else{index--;if (index == 0) //到0时立刻改变PWM的方向,即占空比由小到大变化(LED 亮->;暗){bir = 0; //改变方向}}}/**********************************END OF FILE*************new line****************/。

(完整word版)51单片机实现七彩呼吸灯程序

(完整word版)51单片机实现七彩呼吸灯程序
}
/*--------第七颜色LED灯呼吸----------*/
LED1=1;
LED2=1;
LED3=1;
Delay(500);
for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
{
LED1=0;
LED2=0;
LED3=0;
Delay(PWM_LOW);
LED1=1;
LED2=1;
LED2=1;
Delay(500);
for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
{
LED2=0;
Delay(PWM_LOW);
LED2=1;
Delay(CYCLE-PWM_LOW);
}
LED2=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
{
LED1=0;
LED2=0;
Delay(PWM_LOW);
LED1=1;
LED2=1;
Delay(CYCLE-PWM_LOW);
}
/*--------第五颜色LED灯呼吸----------*/
LED1=1;
LED3=1;
Delay(500);
for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
{
LED2=0;
Delay(PWM_LOW);
LED2=1;
Delay(CYCLE-PWM_LOW);
}
/*--------第三颜色LED灯呼吸----------*/
LED3=1;
Delay(500);

C51单片机实现呼吸灯和花样流水灯程序

C51单片机实现呼吸灯和花样流水灯程序

C51单⽚机实现呼吸灯和花样流⽔灯程序1.⽤C51单⽚机实现花样流⽔灯,代码如下:#include <reg52.h>#define LED_A P1 //led灯所⽤的接⼝,是哪个⼝就写P⼏void delayms(){unsigned char x = 0; unsigned char i;unsigned char y = 0;while(y < 0.001) //定义led灯的切换的延时时间,越⼩越快。

{ //(y < 0.001);(x<100);(i<100)都可以修改x = 0;while(x<100){i = 0;while(i<100){i++;}x++;}y++;}}#define LED_NUM 8 //定义led灯的数量,可快速实现不同⽤途的修改;void main(){unsigned char k;unsigned char j;unsigned char LED_ALL[] = {0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F}; //led灯亮灭的⼗六进制数组;unsigned char LED_ALL_2[] = {0XFC,0XF3,0XCF,0X3F}; while(1) { for(k=0;k<3;k++) //第⼀个for实现奇偶灯交叉闪烁三次,想闪烁⼏次就修改(K<3)中的数值; { LED_A = 0xAA; delayms(); LED_A = 0x55; delayms(); } for(k=3;k>0;k--) //实现⼀个流⽔灯左右三次(从左到右再从右到左算⼀次); { for(j=0;j<LED_NUM;j++) { LED_A = LED_ALL[j]; delayms(); } for(j=6;j>0;j--) { LED_A = LED_ALL[j]; delayms(); } } for(k=0;k<3;k++) //实现前四个灯亮后四个灯灭,交叉闪烁3次,修改次数同上; { LED_A = 0xf0; delayms(); LED_A = 0xf; delayms(); } for(k=3;k>0;k--) //实现两个灯依次流⽔3次; { for(j=0;j<4;j++) { LED_A = LED_ALL_2[j]; delayms(); } for(j=2;j>0;j--) { LED_A = LED_ALL_2[j]; delayms(); } } }}2.实现第⼀个灯呼吸,由暗变亮,再由亮变暗,程序如下;#include <reg52.h>sbit LED1 = P3^0;void delay(unsigned int a) //定义⼀个延时函数{ while(--a);}void main(){ unsigned int t,circle=800; //定义变量,circle=800为led灯呼吸的间隔长短,数值越⼩,间隔越短。

51呼吸灯原理

51呼吸灯原理

51呼吸灯原理呼吸灯是一种常见的LED灯效之一,它的原理是通过调整LED灯的亮度,使其呈现出呼吸般的渐变效果。

下面将详细介绍呼吸灯的工作原理。

呼吸灯的实现原理是通过PWM(脉宽调制)技术来实现的。

PWM技术通过改变信号的占空比来调节输出信号的平均值,进而控制LED的亮度。

PWM信号通常由一个周期性方波和一个用于产生控制信号的模拟信号相结合而成。

具体来说,呼吸灯的原理可以分为以下几个步骤:1.时钟信号生成:呼吸灯需要一个基准时间信号来控制信号的产生。

这个时钟信号可以通过计时器、晶振或其他时钟源来生成。

2.脉宽调制:通过控制PWM信号的占空比来改变LED灯的亮度。

占空比表示周期中PWM信号高电平的时间与周期的比值。

当PWM信号的高电平时间比较长时,LED灯亮度较高;反之,当PWM信号的高电平时间比较短时,LED 灯亮度较低。

3.亮度调节:为了实现呼吸灯的效果,通过控制PWM信号的占空比来改变LED 灯的亮度。

呼吸灯的亮度变化呈现出一定的规律,通常是先逐渐增加亮度,再逐渐减小亮度,不断循环变化。

4.脉宽调制周期控制:在PWM信号的生成过程中,需要确定一个循环周期。

循环周期内PWM信号的高电平和低电平时间比例决定了LED灯的亮度变化速度。

一般情况下,循环周期较短时,LED灯的亮度变化较快;反之,循环周期较长时,LED灯的亮度变化较慢。

5.控制电路:控制电路将以上的信号产生器、PWM调制器、亮度调节器等组合起来,实现呼吸灯的效果。

控制电路的设计需要考虑到电流的稳定性、保护电路等因素。

综上所述,呼吸灯的原理是通过PWM技术来控制LED灯的亮度变化,以实现呼吸般的渐变效果。

通过调节PWM信号的占空比、循环周期等参数,可以控制LED灯的亮度变化速度和呼吸效果。

呼吸灯广泛应用于室内照明、汽车照明、舞台、装饰等领域,给人们带来了独特而美妙的视觉效果。

定时器呼吸灯

定时器呼吸灯
}
break;
case 1:
pwm_h--; //高电平宽度逐渐减小
if(pwm_h<=0) //高电平宽度为0
#define TimeCnt_50us 1
#define TimeCnt_MS 150 //电平宽度改变时间最大值,led亮度变化快慢由此值决定
#define TimeCnt_cycle 250 //pwm最大周期值,此值决定led变化平滑度,数值越大越平滑
#define led P3 //定义LED
}
}
}
void Initial()
{
pwm_h=0;
d_flag=0;
PWM_WideCnt=0;
flag=0;
TMOD=0x01; //定时器0工作方式1
TH0=0xff; //装初值50us;11.0592MHz
case 1:
led=OFF;
if(PWM_WideCnt>=cycle-high) //低电平产生
{
PWM_WideCnt=0;
SYS_TimeCnt=0;
switch(flag)
{
case 0:
led=ON;
if(PWM_WideCnt>=high) //判断电平宽度是否达到预设宽度值
{
pwm_h=0;
d_flag=0; //切换到上一步骤
}
break;
{
if(SYS_TimeCnt>=TimeCnt_50us) //程序运行时间间隔
{
PWM_WideCnt++; //电平实际宽度加1
PWM_ChangeCnt++; //电平宽度改变延时加1
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机的Timer,运用PWM完成呼吸灯
Pulse Width Modulation脉冲宽度调制,简称PWM。

PWM(脉冲宽度调制)对模拟信号电平进行数字编码的方法,计算机只能输出0或5V的数字电压值而不能输出模拟电压,而我们如果想获得一个模拟电压值,则需通过使用高分辨率计数器,改变方波的占空比来对一个模拟信号的电平进行编码。

仍输出数字信号,因为满幅值的直流供电只有5V(1)和0V(0)两种。

电压是以一种连接(1)或断开(0)的重复脉冲序列被夹到模拟负载上去的,连接即是直流供电输出,断开即是直流供电断开。

通过对连接和断开时间的控制,只要带宽足够,可以输出任意不大于最大电压值的模拟电压。

输出电压=(接通时间/脉冲时间)*最大电压值
12
二、51单片机的Timer
作者用的单片机是STC89C52,其内部有3个16位Timer,分别为T/C0,T/C1,T/C2,通过配置相关寄存器即可实现Timer的功能控制。

控制PWM需要用到定时器来生成不同占空比的波形,采用定时器中断的方式。

相关寄存器:
1.IE寄存器
2. TCON寄存器
3. TMOD寄存器
控制Timer0/1的工作方式
TL14. Timer0/1计数寄存器
TL0。

相关文档
最新文档