51单片机的Timer,运用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-呼吸灯源程序/*************************************************** **************** @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单片机实现七彩呼吸灯程序
/*--------第七颜色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单⽚机实现呼吸灯和花样流⽔灯程序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呼吸灯原理呼吸灯是一种常见的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
用51单片机制作呼吸灯
用51单片机制作呼吸灯//晶振11.0592//灯光在单片机控制之下完成由亮到暗的逐渐变化,感觉像是在呼吸//本例在51hei-5型开发板上实现了一个数码管和一个led灯一起实现呼吸效果//文件下载:51hei/f/fxd.rar#includereg52.h#define uint unsigned int#define uchar unsigned char sbit D1=P0 ; uchar sr;uchar jf; uchar code table[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,2 8,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49}; void light(uchar num);void delay(uint z); void main(){//设置计数器//选取计数方式1TMOD = 0x11;//给计数器写初值TH0 = 0;TL0 = 0;//////////////////////操作单片机//开启CPU中断EA = 1;/////////////////////开启定时器T0位中断ET0 = 1;//开启计数器TR0 = 1;//操作二极管P1=0;while(1){ if(sr50) light(sr); else sr=0;}}//子函数void light(uchar num) {uchar tme;D1 = 0;tme = table[num];delay(tme);D1 = 1;delay(49-tme);}//中断函数void time () interrupt 1{//自变量自加if (jf2) { jf++; TH0 =0; TL0 = 0; }if (jf==2) {//写初值jf=0; TH0 = 254; TL0 = 254; sr++; } }void delay(uint z){uint x,y;for(x=10;x0;x--) for(y=z;y0;y--);} tips:感谢大家的阅读,本文由我司收集整编。
51单片机pwm呼吸灯原理
PWM呼吸灯原理概述PWM(Pulse Width Modulation,脉宽调制)是一种通过改变信号的脉冲宽度来控制信号的平均功率的技术。
在51单片机中,通过使用PWM技术可以实现呼吸灯效果,即灯光逐渐变亮再逐渐变暗的效果。
本文将详细解释与51单片机PWM呼吸灯原理相关的基本原理。
基本原理PWM呼吸灯的基本原理是通过不断改变LED的亮度来产生呼吸灯效果。
具体步骤如下:1. 设置定时器首先需要设置一个定时器,用于产生固定频率的脉冲信号。
定时器的工作模式为自动重装载模式,即当定时器计数达到设定值后,会自动重新加载初始值,并产生一个中断信号。
2. 设置占空比占空比(Duty Cycle)是指PWM信号中高电平的时间占整个周期的比例。
在呼吸灯效果中,占空比会不断变化,从而产生灯光逐渐变亮再逐渐变暗的效果。
占空比的大小决定了LED的亮度。
3. 改变占空比为了实现呼吸灯效果,需要不断改变占空比的大小。
可以通过改变定时器的初始值来改变占空比。
初始值越小,高电平时间越短,占空比越小,LED的亮度越低;初始值越大,高电平时间越长,占空比越大,LED的亮度越高。
4. 周期性改变占空比为了实现呼吸灯效果,需要周期性地改变占空比。
可以通过定时器中断来触发改变占空比的操作。
当定时器产生中断时,改变定时器的初始值,从而改变占空比。
为了实现呼吸灯效果,可以设定一个周期,在周期内逐渐增加或减小占空比。
5. 控制LED亮度最后一步是根据占空比的大小来控制LED的亮度。
当占空比为100%时,LED处于最亮状态;当占空比为0%时,LED处于最暗状态。
通过改变占空比的大小,可以实现灯光逐渐变亮再逐渐变暗的效果。
实现步骤根据上述基本原理,可以按照以下步骤来实现51单片机的PWM呼吸灯效果:1.初始化定时器,设置定时器的工作模式为自动重装载模式。
2.设置定时器的初始值,即占空比的大小。
3.设置定时器的中断,当定时器计数达到设定值后,触发中断。
单片机PWM技术实现呼吸灯和KTV等娱乐场所的灯光闪烁效果
单片机PWM技术实现呼吸灯和KTV等娱乐场所的灯光闪烁效果程序是在51hei单片机开发板上面做的,电路很简单,最小系统+P0的八个led即可.ADDR0和ENLED那是开发板上的led使能电路控制端,如果是你自己做的电路可以删掉这几个语句.或者不用管他,不会影响程序的运行./*************************************************** ************************************************* *********** @file:main.c* @author :xr* @date:2014年4月15日20:34:05 - 2014年4月15日22:28:08* @version: V1.2.3* @brief :PWM技术实现呼吸灯和KTV等娱乐场所的灯光闪烁效果单片机STC89C52RC MCU 晶振 11.0592MHZ************************************************* ************************************************* ***********/#include ;//74HC138sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;sbit ADDR3 = P1^3;sbit ENLED = P1^4;//sbit PWMOUT = P0^0;//PWM输出#define PWMOUT P0//8个LED小灯同时呼吸//灯光控制编码(调整PWM的占空比)unsigned char code PWM_Table[] = {1, 3, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50,53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98, 99}; //34个占空比unsigned char heighHR0, heighLR0;//PWM高电平计数初值的高字节和低字节unsigned char lowHR0, lowLR0;//PWM低电平计数初值的高字节和低字节unsigned char thr1, tlr1;//T1计数初值高字节和低字节unsigned long PWMCounter = 0;//PWM设定频率后的对应的所需计数值 UL型void Initial();void ConfigPWM(unsigned int fr, unsigned char dc); void ConfigTimer1(unsigned int xms);void main(void){Initial();/**********呼吸灯效果***************/ ConfigPWM(100, 5);//设定PWM的脉冲宽度为100hz,即10ms,占空比为5%,当PWM的脉冲宽度小于100HZ时,形成的是闪烁的灯光效果ConfigTimer1(50); //定时50ms调整PWM占空比/*PWM技术实现KTV等娱乐场所的灯光闪烁效果*/ /***************灯光闪烁****************//*ConfigPWM(10, 5); //PWM脉冲宽度为10HZ,即1ms, 占空比5%ConfigTimer1(50); //定时20ms调整PWM占空比*/while (1);}/*初始化*/void Initial(){ADDR3 = 1;ENLED = 0;//选择LEDADDR2 = 1;ADDR1 = 1;ADDR0 = 0;//选择LEDS6,即流水灯}/*使用定时器T0配置PWM*/void ConfigPWM(unsigned int fr, unsigned char dc) //参数:fr PWM配置的频率,当是100时,即是100HZ,周期是10ms,dc为占空比{unsigned long tmp;unsigned int heigh, low;//分别存放高电平计数值和低电平计数值tmp = 11059200/12;//一个机器周期的计数频率PWMCounter = tmp / fr;//一个机器周期计数频率是多少个fr计数频率,即fr频率需要的计数值heigh = (PWMCounter * dc) / 100;//高电平所需计数值1/fr周期内高电平计数值low= PWMCounter - heigh;//低电平所需计数值 1/fr 周期内低电平计数值heigh = 65536-heigh;//高电平时定时器需要装入的初值low= 65536-low;//低电平时定时器需要装入的初值heighHR0 = (unsigned char)(heigh >;>; 8); heighLR0 = (unsigned char)heigh;lowHR0= (unsigned char)(low >;>; 8);lowLR0= (unsigned char)low;TMOD &= 0xF0;//清零T0控制位TMOD |= 0x01;//Timer0方式1,16位可设定定时模式TH0 = heighHR0;TL0 = heighLR0;//装入高电平时的初值PWMOUT = 0xFF;//开始PWM输出高电平TR0 = 1;//启动定时器T0ET0 = 1;//开启T0中断EA = 1;//开总中断}/*配置定时器Timer1,用于定时xms调整PWM的占空比*/void ConfigTimer1(unsigned int xms){unsigned long tmp;tmp = 11059200/12;//一个机器周期的计数频率tmp = (tmp * xms) /1000;//定时xms需要的计数频率(即计数次数)tmp = 65536-tmp;//定时xms需要装入的计数初值thr1 = (unsigned char)(tmp >;>; 8);//取高八位tlr1 = (unsigned char)tmp;TMOD &= 0x0F;//清零T1控制位TMOD |= 0x10;//定时器T1方式1,16位可设定时器TH1 = thr1;TL1 = tlr1;TR1 = 1;//启动timer1ET1 = 1;//开启定时器T1中断EA = 1;//开启总中断}/*调整PWM占空比*/void AdjustPWMdc(unsigned char dc){unsigned int heigh, low;heigh = (PWMCounter * dc) / 100; //PWM脉冲中高脉冲所需计数值low= PWMCounter - heigh;//PWM脉冲中低脉冲所需的计数值heigh = 65536-heigh;//高脉冲装入计数的初值low= 65536-low; //低脉冲装入计数的初值/*调整PWM高低脉冲计数初值,来调整PWM的占空比*/heighHR0 = (unsigned char)(heigh >;>; 8); heighLR0 = (unsigned char)heigh;lowHR0= (unsigned char)(low >;>; 8);lowLR0= (unsigned char)low;}/*定时器Timer0中断服务*/void Timer0_ISP() interrupt 1{//在中断中对PWM的输出电平进行判断,若当前输出是高电平,则开始装入低电平的计数初值,PWM输出低电平if (PWMOUT){//Timer0装入PWM一个周期中低脉冲的计数初值TH0 = lowHR0;TL0 = lowLR0;PWMOUT = 0x00;//PWM输出低电平}else //否则装入高电平的计数初值,输出高电平{//Timer0装入PWM一个周期中高脉冲的计数初值TH0 = heighHR0;TL0 = heighLR0;PWMOUT = 0xFF;//PWM输出高脉冲}}/*定时器Timer1中断服务*/void Timer1_ISP() interrupt 3{//注意:index和dir在每次进入中断后都要使用上一次的值,因此必须定义为静态类型static unsigned char index = 0;//占空比索引static bit dir = 0;//方向位,0灯光由亮->;暗 1灯光由暗->;亮TH1 = thr1;TL1 = tlr1;AdjustPWMdc(PWM_Table[index]);//调用调整PWM占空比函数,调整PWM占空比 if (dir == 0){index++;//索引++if (index >;= 33)//34个占空比{index = 33;dir = 1;//改变方向}}else{index--; //索引--if (index == 0){index = 0;dir = 0;//改变方向}}}。
51单片机呼吸灯实验报告
呼吸灯1 功能与技术分析呼吸灯就是让LED灯的闪烁像呼吸一样,时呼时吸,时亮时暗,利用LED的余辉和人眼的暂留效应,看上去和人的呼吸一样。
可以展示出各种酷炫的图像。
1.1 呼吸灯的实现效果使用调制的方法,灯在高速闪烁时人眼是看不出来的,每个循环给闪烁的熄灭时间加1,灯就会慢慢变暗,在设置熄灭时间加到一定程度就开始减一,就会渐渐变亮了。
使得LED灯按照顺序逐渐改变亮度。
1.2 功能分析灯光在微电脑控制之下完成由亮到暗的绝剑变化,感觉就像是在呼吸。
广泛应用与数码产品,起到装饰和指示工作效果。
目前被广泛用于手机之上,并成为各大品牌新款手机的卖点之一。
1.3 技术分析用C语言编程实现PWM(脉宽调制)输出驱动LED,逐渐增加PWM的占空比从而实现LED模拟呼吸的过程,即渐亮再渐暗再渐亮再渐暗……如此往复,再利用LED的余辉和人眼的暂留效应,看上去就和人的呼吸一样。
2 硬件基础与设计整个系统的搭建,由以下元器件组成:1、12MHz晶振一个;2、stc89c51单片机一个;3、30pf无极性电容2个;4,、按钮一个;5、10K电阻一个;6、10uf有极性电容一个;7、洞洞板一个;8、LED灯若干。
2.1 基于51单片机的最小系统的设计STC89C51RC是采用8051核的ISP(In System Programming)在系统可编程芯片,最高工作时钟频率为80MHz,片内含8K Bytes 的可反复擦写1000次的Flash只读程序存储器,器件兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,具有在系统可编程(ISP)特性,配合PC端的控制程序即可将用户的程序代码下载进单片机内部,省去了购买通用编程器,而且速度更快。
STC89C51RC系列单片机是单时钟/机器周期(1T)的兼容8051 内核单片机,是高速/ 低功耗的新一代8051 单片机,全新的流水线/精简指令集结构,内部集成MAX810 专用复位电路。
51单片机PWM的控制(呼吸灯)
51单片机PWM的控制(呼吸灯)一、PWMPulse Width Modulation脉冲宽度调制,简称PWM。
PWM(脉冲宽度调制)对模拟信号电平进行数字编码的方法,计算机只能输出0或5V的数字电压值而不能输出模拟电压,而我们如果想获得一个模拟电压值,则需通过使用高分辨率计数器,改变方波的占空比来对一个模拟信号的电平进行编码。
仍输出数字信号,因为满幅值的直流供电只有5V(1)和0V(0)两种。
电压是以一种连接(1)或断开(0)的重复脉冲序列被夹到模拟负载上去的,连接即是直流供电输出,断开即是直流供电断开。
通过对连接和断开时间的控制,只要带宽足够,可以输出任意不大于最大电压值的模拟电压。
输出电压=(接通时间/脉冲时间)*最大电压值•1•2二、51单片机的Timer作者用的单片机是STC89C52,其内部有3个16位Timer,分别为T/C0,T/C1,T/C2,通过配置相关寄存器即可实现Timer的功能控制。
控制PWM需要用到定时器来生成不同占空比的波形,采用定时器中断的方式。
相关寄存器:1.IE寄存器位名称功能0 EX0 外部中断0的中断允许位1 ET0 Timer0的溢出中断允许位2 EX1 外部中断1的中断允许位3 ET1 Timer1的溢出中断允许位位 名称功能 4 ES 串行口中断允许位5 ET2 Timer6 - -7 EA 中断允许总控制位2. TCON 寄存器位 名称 功能0 IT0 外部中断0的触发方式选择位。
功能和IE1类似1 IE0 外部中断0的中断请求标志位。
功能和IE1类似2 IT1 外部中断1的触发方式选择位。
当IT1=1时,为下降沿触发方式,也就是从高到低的跳变会触发外部中断1。
当IT1=0时,为低电平触发,也就是单片机检测到该引脚电平为低时,会触发外部中断13 IE1 外部中断1的中断请求标志位。
当IE1=1的时候,表示外部中断1被触发,正在请求单片机处理中断事件。
利用PWM技术控制RGB灯变色和呼吸
/******************************************************************函数功能:利用pwm技术控制RGB全彩灯变色和呼吸的实验说明:可以设置全彩灯在1600万色之间进行变化,也可以选择一些特定颜色进行呼吸,本程序为个人原创,转载请注明出处设计者:空心菜联系QQ:190719416日期:2016/8/5*******************************************************************/#include<reg52.h>#define uint unsigned int#define uchar signed char#define LEDs P2sbit R_LED=LEDs^0;sbit G_LED=LEDs^1;sbit B_LED=LEDs^2;#define R_ON()R_LED=0#define R_OFF()R_LED=1#define G_ON()G_LED=0#define G_OFF()G_LED=1#define B_ON()B_LED=0#define B_OFF()B_LED=1uchar R_ZKB=1,G_ZKB=1,B_ZKB=1;uint num=100,i; //num的值最大可设置为255,当设置成255,且在变色模式下能达到1600万色uchar FLAG;main(){EA=1;TMOD=0x02;//T0工作于自动重装模式TH0=246; //定时时间10USTR0=1;ET0=1;while(1){if(FLAG){FLAG=0;/*R_ZKB+=1;if(R_ZKB>=num){R_ZKB=1;G_ZKB+=1;if(G_ZKB>=num){G_ZKB=1;B_ZKB+=1;if(B_ZKB>=num){B_ZKB=1;}}}*/ //以上为全彩变色模式/***********************************************************************************///以下为单色呼吸模式for(i=0;i<num;i++)R_ZKB=i; //红色渐渐变亮for(i=num;i>0;i--)R_ZKB=i; //红色渐渐变暗for(i=0;i<num;i++) //橙色渐渐变亮,红255,绿156{R_ZKB=i;G_ZKB=i/2;}for(i=num;i>0;i--) //橙色渐渐变暗,红255,绿156{R_ZKB=i;G_ZKB=i/2;}for(i=0;i<num;i++) //黄色渐渐变亮{R_ZKB=i;G_ZKB=i;}for(i=num;i>0;i--) //黄色渐渐变暗{R_ZKB=i;G_ZKB=i;}for(i=0;i<num;i++)G_ZKB=i; //绿色渐渐变亮for(i=num;i>0;i--)G_ZKB=i; //绿色渐渐变暗for(i=0;i<num;i++) //青色渐渐变亮{G_ZKB=i;B_ZKB=i;}for(i=num;i>0;i--) //青色渐渐变暗{G_ZKB=i;B_ZKB=i;}for(i=0;i<num;i++)B_ZKB=i; //蓝色渐渐变亮for(i=num;i>0;i--)B_ZKB=i; //蓝色渐渐变暗for(i=0;i<num;i++) //紫色渐渐变亮{B_ZKB=i;R_ZKB=i;}for(i=num;i>0;i--) //紫色渐渐变暗{B_ZKB=i;R_ZKB=i;}for(i=0;i<num;i++) //白色渐渐变亮{R_ZKB=i;G_ZKB=i;B_ZKB=i;}for(i=num;i>0;i--) //白色渐渐变暗{R_ZKB=i;G_ZKB=i;B_ZKB=i;}}}}/**************************************************************函数功能:定时器0中断服务函数说明:设置定时溢出时间为10us,频率10khz,当进入中断后,为了避免在程序执行过程中为完又进入下一次中断,先关闭定时器,当此段程序执行完再打开定时器,并设置一个标志位,给主函数去判断***************************************************************/void timer0(void) interrupt 1{uint count;TR0=0;for(count=1;count<num;count++) //分辨率为NUM{if(count<R_ZKB){R_ON();//当红色占空比大于计数值时点亮}else R_OFF(); //否则就关闭红色if(count<G_ZKB){G_ON();}else G_OFF();if(count<B_ZKB){B_ON();}else B_OFF();}FLAG=1;TR0=1;}。
单片机呼吸灯原理
单片机呼吸灯原理单片机呼吸灯原理是一种通过调节电流大小实现灯光渐变效果的技术。
它是利用单片机的PWM(脉宽调制)输出功能和定时器中断等特性来控制LED灯的亮度变化,从而实现呼吸灯的效果。
首先,我们需要了解PWM技术。
PWM波是一种非负脉冲信号,它的特点是占空比可调。
占空比是指高电平状态所占用的时间与一个周期的比值。
在单片机中,我们可以通过设置PWM周期和占空比来控制输出信号的平均电压值,从而控制LED的亮度。
在呼吸灯中,LED的亮度需要逐渐变化,呈现出类似人类呼吸的效果。
为了实现这个效果,我们需要调整PWM的占空比。
具体实现步骤如下:1. 初始化单片机定时器:选择合适的定时器和模式,并设置定时器的计数器初值,用于产生一定的时间间隔。
2. 设置PWM的周期:根据需要呼吸灯的速度来设置PWM的周期,较短的周期可以实现较快的亮灭速度,较长的周期则慢一些。
3. 在定时器中断服务程序中设置PWM的占空比:定时器中断服务程序会定时触发,我们可以在其中编写代码设置PWM的占空比。
占空比的设置需要根据呼吸灯的亮度变化进行调整。
4. 实现呼吸灯效果:呼吸灯的亮暗变化是由PWM信号的占空比变化引起的。
我们可以使用一个变量来控制占空比的变化,并在定时器中断服务程序中更新该变量。
通过逐渐增加或减小占空比的数值,可以实现呼吸灯效果。
5. 循环调用:为了持续地实现呼吸灯效果,我们需要在主程序中使用一个循环不断调用定时器中断服务程序。
总的来说,单片机呼吸灯的实现原理是利用PWM技术,通过调整PWM的占空比来控制LED的亮度变化。
通过合理的设置定时器和中断服务程序,以及通过改变PWM的占空比,可以实现呼吸灯效果。
不同的PWM周期和占空比设置会产生不同的呼吸灯效果,可以根据需要进行调整。
利用PWM脉宽调制实现呼吸灯
利⽤PWM脉宽调制实现呼吸灯1.设计⽬标完成⼀个呼吸灯,从亮到灭的时间为2秒,从灭到亮的时间为2秒,以此不断往复。
2.设计步骤2.1设计分析利⽤PWM(脉冲宽度调制)实现led灯亮度的变化,只需要改变占空⽐就可以实现,具体操作是将2秒分为1000份,每份即2/1000(2ms),也就是说⼀个pwm周期为2ms。
在这样⼀个2ms周期内,改变占空⽐,且随着周期数变化,占空⽐也在变化,就可以显⽰出亮度变化的过程。
⽐如在第⼀个2s内,这个2秒内led灯的亮度是越来越暗的,所以具体操作为:把每个周期(2ms)再分成1000份,即⼀份为2us(这个2us称之为pwm的最⼩分辨率),在第⼀个2ms内⾼电平为1000个2us;在第⼆个2ms内低电平的个数为1个2us,⾼电平的个数为999个2us;第三个2ms内低电平的个数为2个2us,⾼电平的个数为998个2us;以此类推,最后⼀个2ms,低电平的个数为1000个2us。
从⽽实现,每2ms亮度变化⼀次,⼀个2s内亮度变化了⼀千次,在⾁眼看来,这个亮度的变化过程是⾮常平滑的。
反过来,亮度增加过程也是⼀样的,只要按2ms增⼤占空⽐即可实现。
2.2设计波形图由图可知,⼀共需要三个计数器:T20us_count、T2us_count、T2ms_count。
分别⽤于计算20ns,2us,2ms的个数。
当T20us_count等于99时,代表计时2us(20ns*100)已到;当T2us_count等于999、T20us_count等于99时,代表2ms(2us*1000)已到;同理,当T2ms_count等于999、T2us_count等于999、T20us_count等于99时,代表2s(2ms*1000)已到。
观察波形图,在第⼀个2ms内,led_pwm都为⾼电平。
在第⼆个2ms内,led_pwm在T2us_count为0时为低电平,⼤于等于0时为⾼电平。
在第三个2ms,T2ms_count等于2,则在T2us_count等于0、1时,led_pwm为低电平,⼤于1时为⾼电平。
单片机呼吸灯原理
单片机呼吸灯原理单片机呼吸灯原理是利用单片机的PWM输出来控制LED的亮度,通过逐渐增加和减小LED的亮度来产生类似呼吸的效果。
首先,通过I/O口将单片机与LED连接起来,以便通过PWM输出来控制LED 的亮度。
PWM(脉宽调制)是一种调节信号的方式,通过改变信号的脉冲宽度来控制被调节对象的输出。
在单片机中,可以通过设置计时器和计数器的数值来获取不同的脉冲宽度,进而控制LED的亮度。
接下来,设置一个变量来调节增减LED的亮度。
例如,可以使用一个8位的变量brightness来表示亮度的变化,变量的值范围可以是0-255。
初始时,可以将brightness设置为0,表示LED是熄灭的状态。
然后,使用单片机的PWM输出功能,设置一个计数器和一个比较器。
计数器用于产生一个固定频率的脉冲信号,比如说可以设置为100Hz。
比较器用于将计数器和brightness的值进行比较,当计数器的数值小于brightness时,LED 点亮;当计数器的数值大于brightness时,LED熄灭。
接着,通过递增或递减brightness的值来改变LED的亮度。
可以使用一个循环语句,每次循环结束后,根据需要增加或减少brightness的值,使其逐渐加大或减小。
在逐渐增加brightness的过程中,LED的亮度也会逐渐增加,达到最大亮度时,再逐渐减小brightness的值,使LED的亮度逐渐减小。
当brightness的值减小到0时,LED熄灭,然后再从0开始逐渐增加brightness的值,循环往复,从而实现类似呼吸的效果。
需要注意的是,为了使呼吸灯的效果更加平滑,可以通过增加循环次数或者调节递增递减的步长来改变LED的亮度变化速率。
总之,单片机呼吸灯原理利用PWM输出来控制LED的亮度变化,通过逐渐增加和减小LED的亮度来产生呼吸的效果。
通过设置计数器、比较器和循环语句,可以实现LED亮度的逐渐增加和减小,并通过递增或递减brightness的值来改变LED的亮度。
PWM控制呼吸灯
/**@Name: PWM_led*@version 1.0*@Author xiaopan*@Date 2014.8.2*/#include<pic.h>#define uint unsigned int#define uchar unsigned char#define PWM1(x) {CCPR3L = x>>2;DC3B0 = 1;DC3B1 = 1;} // X X>>1#define PWM2(x) {CCPR4L = x>>2;DC4B0 = 1;DC4B1 = 1;} // X X>>1uint Time = 0;uint cnt_1ms = 0;uchar State = 0;void GPIO_INIT();void TIMER2_INIT();void TIMER4_INIT();void PWM_INIT();void Control_Task();/**@function主函数*/void main(){GPIO_INIT();PWM_INIT();TIMER2_INIT(); //PWM利用TIMER2TIMER4_INIT(); //定时1S出发改变一次占空比,调节PWM波形while(1){Control_Task();}}/**@Function IO口初始化RG0 CCP3 RG3 CCP4*/void GPIO_INIT(){TRISG = 0X00; //设置RG口为输出ANSELG = 0; //设置RG口为数字量LATG = 0; //设置RG口为低电平TRISF = 0;ANSELF = 0;LATF = 0;}/**@定时器2初始化*/void TIMER2_INIT(){TMR2 = 0;PR2 = 255; //255TMR2IF = 0;T2CKPS0 = 1; //1T2CKPS1 = 0; //0TMR2ON = 1;}/**@定时器4初始化*/void TIMER4_INIT(){T4CON = 0x0e; //0000 1110TMR4IE = 1;TMR4IF = 0;TMR4 = 0X00;PEIE = 1;GIE = 1;}/**@ PWM初始化*/void PWM_INIT(){CCP3CON = 0X0C;CCP4CON = 0X0C;CCPTMRS0 &= 0X0F;TRISG = 0;}/**@Function 主任务函数*/void Control_Task(){static uint Time ;// static uchar State = 0;static uint Record_Time;uint Delta_Time;if(State == 0){Time = 1000;State = 1;}if(State == 1){PWM1(Time);PWM2(Time);Record_Time = cnt_1ms;State = 2;}if(State == 2){if (cnt_1ms < Record_Time){Delta_Time = 65536 - Record_Time + cnt_1ms;}else{Delta_Time = cnt_1ms - Record_Time;}if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT{Time = Time - 100;State = 1;if(Time == 0){Time = 0;State = 3;}}}if(State == 3){PWM1(Time);PWM2(Time);Record_Time = cnt_1ms;State = 4;}if(State == 4){if (cnt_1ms < Record_Time){Delta_Time = 65536 - Record_Time + cnt_1ms;}else{Delta_Time = cnt_1ms - Record_Time;}if (Delta_Time >= 200) //300MS循环一次执行新的PWM_OUT{Time = Time + 100;State = 3;if(Time == 1000){State = 0;}}}}void interrupt ISR(void){if(TMR4IF == 1){TMR4IF = 0;cnt_1ms++;// LATF0 = !LATF0;}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。