呼吸灯单片机程序

合集下载

51单片机(呼吸灯)汇编语言版

51单片机(呼吸灯)汇编语言版

单片机实训课程之:呼吸灯一.设计要求二.相关原理三.论证分析四.硬件原理五.软件程序设计六.测试方法与结果七.使用说明(附录)一.设计要求呼吸灯顾名思义就是让LED灯的闪烁像呼吸一样,时呼时吸,时亮时暗。

二.相关原理呼吸灯的原理:呼吸灯,是用LED模拟呼吸的过程,即渐亮再渐暗再渐亮再渐暗……如此往复,再利用LED的余辉和人眼的暂留效应,看上去就和人的呼吸一样了。

三.论证分析程序流程图(1)80C511.单片机定义“单片机”就是将计算机的基本部件集成到一块芯片上,包括CPU、ROM、RAM、并行口、串行口、定时器/计数器、中断系统、系统时钟等。

MCS-51的微处理器是由运算器和控制器构成所的。

运算器:主要用来对操作数进行算术、逻辑运算和位操作。

主要包括算术逻辑运算单元ALU、累加器A、寄存器B、位处理器、程序状态字寄存器PSW以及BCD码修正电路等。

控制器:单片机的指挥控制部件,控制器的主要任务是识别指令,并根据指令的性质控制单片机各功能部件,从而保证单片机各部分能自动而协调地工作。

(2)时钟电路外部时钟方式是使用外部振荡脉冲信号,常用于多片MCS-51单片机同时工作,以便于同步。

外部时钟电路,是由一个12MHz晶振和两个瓷片电容组成,为单片机提供标准时钟,其中两个瓷片电容起微调作用,外接晶振频率精确度直接影响电子钟计时的准确性。

(外部时钟方式是把外部已经有的时钟信号引入到单片机内部。

时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。

在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间。

)2.单片机电子钟利用内部定时/计数器溢出产生中断(12M晶振一般为50ms)再乘以相应的倍率来实现秒、分、时的转换。

从定时/计数器产生中断请求到响应中断需要3-8个机器周期,定时中断子程序中的数据入栈和重装定时/计数器的初值还需要占用数个机器周期,还有从中断入口转到中断子程序也要占用一定的机器周期。

stm32单片机设计实现呼吸灯效果知识应用

stm32单片机设计实现呼吸灯效果知识应用

我们来探讨一下“STM32单片机设计实现呼吸灯效果”这一主题。

呼吸灯效果是指LED灯逐渐由暗到亮再由亮到暗的渐变效果,仿佛在呼吸一样,因此得名“呼吸灯”。

在嵌入式系统和物联网设备中,呼吸灯是一种常见的人机交互界面,其设计实现涉及到PWM调光技术和定时器中断控制等内容。

在STM32单片机中,实现呼吸灯效果最常用的方法是利用定时器和PWM模块。

我们需要配置定时器的计数周期和预分频系数,以确定呼吸灯的周期和频率。

利用PWM模块控制LED的亮度,根据呼吸灯的状态变化不断更新PWM占空比,从而实现呼吸灯的效果。

在具体的程序设计中,我们可以使用STM32提供的HAL库函数或者直接操作寄存器的方法来实现呼吸灯效果。

在HAL库函数的调用中,需要先初始化定时器和PWM模块,然后在定时器中断中更新PWM的占空比,从而实现呼吸灯效果。

而如果选择直接操作寄存器的方法,需要对寄存器进行设置和操作,相对更加灵活和高效。

除了硬件设计和软件编程,实现呼吸灯效果还需要考虑功耗和灯光效果的优化。

在实际应用中,我们可以通过调节呼吸灯的周期和频率,以及优化PWM输出的方式来达到节能和良好的视觉效果。

还可以考虑使用多个LED灯和不同颜色的混合,设计出更加丰富多彩的呼吸灯效果。

STM32单片机设计实现呼吸灯效果是一个涉及硬件设计和软件编程的综合应用,需要结合定时器、PWM模块和中断控制等知识,并注重功耗和灯光效果的优化。

通过深入理解和实践,我们可以设计出满足用户需求的呼吸灯效果,为嵌入式系统和物联网设备增添更加灵动的人机交互界面。

我的个人观点是,在实际应用中,呼吸灯效果是一种简洁而又美观的人机交互设计,能够为产品增添更加智能和生动的氛围。

掌握STM32单片机设计实现呼吸灯效果的知识和应用技巧对于嵌入式系统工程师和物联网设备开发者来说是非常重要的。

希望通过本文的介绍,读者能对这一主题有更加全面、深刻和灵活的理解。

我们来探讨一下“STM32单片机设计实现呼吸灯效果”这一主题。

呼吸灯代码

呼吸灯代码

写一段程序,使单片机上LED红·蓝·绿三种颜色的灯呼吸#include"STC89C5xRC.h"void delay100Us(unsigned int cnt){unsigned int i;while(cnt--){i=6;while(i--);}}void delayMs(unsigned int cnt){unsigned int i;while(cnt--){i=82;while(i--);}}void delay(unsigned int t){while(t--);}void main(void){unsigned int CYCLE=600,PWM_LOW=0;P2=0;while(1){delay(40000);for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){P20=1;P21=1;P22=0;delay(PWM_LOW);P20=1;P21=1;P22=1;delay(CYCLE-PWM_LOW);}for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--) {P20=1;P21=1;P22=0;delay(PWM_LOW);P20=1;P21=1;P22=1;delay(CYCLE-PWM_LOW);}delay(40000);for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++) {P20=1;P21=0;P22=1;delay(PWM_LOW);P20=1;P21=1;P22=1;delay(CYCLE-PWM_LOW);}for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--) {P20=1;P21=0;P22=1;delay(PWM_LOW);P20=1;P21=1;P22=1;delay(CYCLE-PWM_LOW);}delay(40000);for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++) {P20=0;P21=1;P22=1;delay(PWM_LOW);P20=1;P21=1;P22=1;delay(CYCLE-PWM_LOW);}for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){P20=0;P21=1;P22=1;delay(PWM_LOW);P20=1;P21=1;P22=1;delay(CYCLE-PWM_LOW);}}}代码中,P20,P21,P22,分别表示红蓝绿三种颜色,P20=1,表示红灯灭,P20=0,表示红灯亮原理:主要是利用占空比,初始化一个值CYCLE,令PWM_LOW由1开始,每一个循环,先令其中一个灯亮,保持时间为delay(PWM_LOW),然后熄灭,时间为delay(CYCLE-PWM_LOW),随着循环次数增多,delay(PWM_LOW)越来越长,而delay(CYCLE-PWM_LOW)不变。

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****************/。

led呼吸灯源程序

led呼吸灯源程序

#include<reg52.h> #include<intrins.h> #define uchar unsigned char #define ቤተ መጻሕፍቲ ባይዱint unsigned int sbit LED = P2^5; uchar top = 0; //一个周期里面高电平占的比重(一个周期分成200份, top从0~200) uchar flag = 0; //增减标志位,0标志渐亮,1表示渐暗 uchar count = 0; //定时器计数,100us记一次 void Init_T0()//以计数器T0工作方式2为例 { TMOD &= 0xf0; //设置工作方式 TMOD |= 0x02; TH0 = (256-100)%256; //装入初值 TL0 = (256-100)%256; EA = 1; //打开中断总开关 ET0 = 1; //打开TO中断开关 TR0 = 1; //启动T0开始工作 } void delay(uint x) { uint i; for(;x>0;x--) { for(i=120;i>0;i--) { _nop_();_nop_();_nop_();_nop_(); } } } void Timer0() interrupt 1 { ET0 = 0; //关中断 switch(LED==1)
{ case 0:if(count==(200-top)) { count = 0; LED = 1; if(flag==0)//增减标志位,0表示加,1表示减 { top++; if(top==200) { flag = 1; LED = 1;//LED灯满周期高电平 delay(200);//延长LED灯暗时的时间 } } else { top--; if(top==0) { flag = 0; LED = 0;//LED灯满周期低电平 } } };break; case 1:if(count==top) { count = 0; LED = 0; if(flag==0)//增减标志位,0表示加,1表示减 { top++; if(top==200) { flag = 1; LED = 1;//LED灯满周期低电平

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单片机制作呼吸灯//晶振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:感谢大家的阅读,本文由我司收集整编。

自制“心形”单片机呼吸灯

自制“心形”单片机呼吸灯
自制“心形”单片机呼吸灯
所谓的“呼吸灯”,就是通过程序控制 led 灯的闪烁过程,像呼吸一样 有节奏。有亮度渐变的过程。 先来张效果 这这是未加修饰的样子,不过进行了简单的装饰后,就 变身超级有爱的东西了 制作过程: 1//****************************** 2//51 单片机模拟呼吸灯 3//2012.9.23 4//menglei 5//p0.0 接一个 LED 灯,状态 0 为亮 6//****************************** 7 8 9#include 10#defineN2//亮暗的速率 11#defineT800//PWM 的周期 12#defineT11400 13#defineT2900 14//sbitled0=P0; 15//====================== 16voidpwm(intx) 17{
43{ 44flash1(); 45} 46} 程序不多,但是电路的制作的确很费时间和脑子,因为要考虑每条线的 走线,还不能让线太过于繁琐 这是中间的一部分,像那个显像管电视的样子哈哈哈 正面: 调试时的走线:(不堪入目啊) 最后的制作: tips:感谢大家的阅读,本文由我司收集整编。仅} 20//====================== 21 22voidflash1(void){ 23intt=0; 24charf=0; 25intcount=5;//5 次,每个函数执行的次数 26while(1){ 27P0=0x00; 28pwm(t);//Toff,亮的时间 29//led0=1; 30P0=0xff; 31pwm(T-t+100);//Ton,暗的时间 32if(!f)t+=N+1;//亮速率较快,模拟呼吸 33elset-=N;//暗速率较慢 34if(tT){f=1;t=T;}//超过最大值时,返回最大值,标志为暗 35if(t 小于 0){f=0;t=0;}//超过最小值时,返回最小值,标志为亮 36//count--; 37} 38} 39voidmain() 40{ 41 42while(1)

51单片机PWM的控制(呼吸灯)

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被触发,正在请求单片机处理中断事件。

呼吸灯程序

呼吸灯程序

呼吸灯(简单易懂)如题呼吸灯就是让 LED 灯的闪烁像呼吸一样,时呼时吸,时亮时暗,利用LED 的余辉和人眼的暂留效应,看上去和人的呼吸一样。

二、设计原理:用 C 语言编程实现PWM( 脉宽调制 )输出驱动 LED ,逐渐增加 PWM 的占空比从而实现LED 模拟呼吸的过程,即渐亮再渐暗再渐亮再渐暗⋯⋯如此往复,再利用 LED 的余辉和人眼的暂留效应,看上去就和人的呼吸一样。

三、整体方案设计8 个 LED 按照顺序逐个实现呼吸效果。

加以其他闪烁花样增加更炫彩的效果。

四、实验元件及器材( 1 )元件:LED (发光二极管)8 个1KΩ电阻8 个1nf 电容 2 个晶振 1 个AT89C51芯片 1 个( 2)器件: Atmega128 开发板 1 块计算机 1 台五、硬件原理( 1)主电路 :8 个 LED 分别连接 AT89C51 的 P1口,使用共阳方式,并加以1kΩ的电阻接入电源。

#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义/*-------------------------IOsbit LED0=P0^0;//用sbit口定义 ----------------------------*/关键字定义 LED 到 P0.0 端口, LED是自己任意定义且容易记忆的符号sbit wei=P1^1;sbit duan=P1^0;sbit lcden=P1^7;sbit dianzhen=P1^3;sbit leden=P1^2;void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned int CYCLE=600,PWM_LOW=0;//定义周期并赋值lcden=0;P0=0x00;dianzhen=0;P0=0xff;wei=0;duan=0;while (1) //主循环{LED0=1;Delay(150000); //特意加延时,可以看到熄灭的过程for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)//PWM表示低LOW电平时间{//,这个循环中低电平时长从 1 累加到 CYCLE(周期)的值,即 600 次LED0=0; // 点亮 LEDDelay(PWM_LOW);// 延时长度, 600 次循环中从 1 加至 599LED0=1; // 熄灭 LEDDelay(CYCLE-PWM_LOW);// 延时长度, 600 次循环中从 599 减至 1}//LED0=0;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW与--逐){//渐变亮相反的过程LED0=0;Delay(PWM_LOW);LED0=1;Delay(CYCLE-PWM_LOW);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数 unsigned int t ,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(t--);}原理:用定时器模拟PWM,改变其占空比,用以控制LED的亮度。

任务单5(呼吸灯)程序流程编排

任务单5(呼吸灯)程序流程编排

#include<reg52.h>bit LED0 = P2^0;void Delay(unsigned int t);void main (void){unsigned int TIME=300,PWM=0; w hile (1){LED0=1;Delay(50000);for(PWM=1; PWM<TIME; WM++){LED0=0;Delay(PWM);LED0=1;Delay(TIME-PWM); } for(PWM=TIME-1; PWM>0; PWM--){LED0=0;Delay(PWM);LED0=1;Delay(TIME - PWM);}// LED0=0;// Delay(10000);}}void Delay(unsigned int t){while(--t);}//带注释版本的源程序如下:#include<reg52.h> //包含头文件,不需要改动,头文件包含特殊功能寄存器的定义sbit LED = P2^0; // 用sbit关键字定义LED 到P2.0端口void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned int TIME=300,PWM=0;//定义周期并赋值while (1) //主循环{LED0=1;Delay(50000); //特意加延时,可以看到熄灭的过程/* 阶段1:这个循环中低电平时长从1累加到TIME(周期)的值,我们可以看到灯逐渐变亮*/for(PWM=1; PWM<TIME;PWM++){LED0=0; //点亮LEDDelay(PWM);//延时长度,300次循环中从1加至299LED0=1; //熄灭LEDDelay(TIME-PWM);//延时长度,300次循环中从299减至1}/* 这个循环中低电平时长从TIME(周期)的值逐减到0,我们可以看到灯逐渐变暗*/for(PWM=TIME-1; PWM>0;PWM--){ //与逐渐变亮相反的过程LED0=0;Delay(PWM);LED0=1;Delay(TIME - PWM);}// LED0=0; /*阶段2:开始全亮*/// Delay(10000);}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}。

51单片机花样呼吸灯程序

51单片机花样呼吸灯程序

51单片机花样呼吸灯程序(总5页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March#include<>/*-----------定义单片机引脚--*/sbit LED0=P1^0;sbit LED1=P1^1;sbit LED2=P1^2;sbit LED3=P1^3;sbit LED4=P1^4;sbit LED5=P1^5;sbit LED6=P1^6;sbit LED7=P1^7;void Delay(unsigned int t); //函数声明unsigned int z,y;void main (void)//主函数{unsigned int CYCLE=1000,PWM_LOW=0;//定义周期并赋值while (1) //主循环{/*--------整排LED灯呼吸---------*/P1=0x00;Delay(1000); //加延时,可以看到熄灭的过程(下面程序同理)for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++) //PWM_LOW表示低{P1=0x00;Delay(PWM_LOW);P1=0xff;Delay(CYCLE-PWM_LOW);}P1=0xff;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--) //与逐渐变亮相反的过程{P1=0x00; //点亮LEDDelay(PWM_LOW);P1=0xff; //熄灭LEDDelay(CYCLE-PWM_LOW); //主循环中添加其他需要一直工作的程序,延时长度,600次循环中从599减至1}/*--------第一颗LED灯呼吸---------*//* LED0=1;Delay(1000);for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){LED0=0;Delay(PWM_LOW);LED0=1;}LED0=0;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--) {LED0=0;Delay(PWM_LOW);LED0=1;Delay(CYCLE-PWM_LOW);}/*--------第二颗LED灯呼吸----------*//* LED1=1;Delay(500);for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){LED1=0;Delay(PWM_LOW);LED1=1;Delay(CYCLE-PWM_LOW);}LED1=0;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){LED1=0;Delay(PWM_LOW);LED1=1;Delay(CYCLE-PWM_LOW);}/*--------第三颗LED灯呼吸----------*//* 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--){LED2=0;Delay(PWM_LOW);LED2=1;}/*--------第四颗LED灯呼吸----------*//* LED3=1;Delay(500);for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){LED3=0;Delay(PWM_LOW);LED3=1;Delay(CYCLE-PWM_LOW);}LED3=0;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){LED3=0;Delay(PWM_LOW);LED3=1;Delay(CYCLE-PWM_LOW);}/*--------第五颗LED灯呼吸----------*//* LED4=1;Delay(500);for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){LED4=0;Delay(PWM_LOW);LED4=1;Delay(CYCLE-PWM_LOW);}LED4=0;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){LED4=0;Delay(PWM_LOW);LED4=1;Delay(CYCLE-PWM_LOW);}/*--------第六颗LED灯呼吸----------*//* LED5=1;Delay(500);for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){LED5=0;Delay(PWM_LOW);LED5=1;Delay(CYCLE-PWM_LOW);}LED5=0;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){LED5=0;Delay(PWM_LOW);LED5=1;Delay(CYCLE-PWM_LOW);}/*--------第七颗LED灯呼吸----------*//* LED6=1;Delay(500);for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){LED6=0;Delay(PWM_LOW);LED6=1;Delay(CYCLE-PWM_LOW);}LED6=0;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){LED6=0;Delay(PWM_LOW);LED6=1;Delay(CYCLE-PWM_LOW);}/*--------第八颗LED灯呼吸----------*//* LED7=1;Delay(500);for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){LED7=0;Delay(PWM_LOW);LED7=1;Delay(CYCLE-PWM_LOW);}LED7=0;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){LED7=0;Delay(PWM_LOW);LED7=1;Delay(CYCLE-PWM_LOW);}/* P1=0x00;for(z=500;z>0;z--)for(y=110;y>0;y--);P1=0xff;for(z=500;z>0;z--)for(y=110;y>0;y--);P1=0x00;for(z=500;z>0;z--)for(y=110;y>0;y--);P1=0xff;for(z=500;z>0;z--)for(y=110;y>0;y--); */}}void Delay(unsigned int t){while(--t);}。

stm32单片机呼吸灯的原理

stm32单片机呼吸灯的原理

stm32单片机呼吸灯的原理1.引言呼吸灯是一种流行的L ED效果,在各种电子产品中得到广泛应用。

本文将介绍使用ST M32单片机实现呼吸灯效果的原理。

2. st m32单片机介绍S T M32是一款由意法半导体(ST Mi cr oe le c tr on ic s)公司推出的32位A RM Co rt ex-M系列单片机。

它具有高性能、低功耗和丰富的外设以及灵活的软件开发环境,被广泛应用于嵌入式系统中。

3.呼吸灯的工作原理呼吸灯效果的实现原理是通过改变LE D的亮度来模拟人类的呼吸过程,以此带来流畅而柔和的灯光变化。

3.1P W M控制S T M32单片机使用脉冲宽度调制(PW M)技术控制LE D的亮度。

PW M是一种周期性的信号,通过改变其占空比(高电平持续时间与周期之比)来调节输出电平。

3.2呼吸灯的算法呼吸灯算法的基本思想是,通过逐渐改变P WM的占空比,使L ED的亮度恢复到初始状态。

具体步骤如下:1.设置一个呼吸周期,将其分成若干小步长。

2.逐步增加PW M的占空比,使L ED逐渐变亮。

3.当P WM的占空比达到最大值时,开始逐步减小占空比,使L ED逐渐变暗。

4.当P WM的占空比减小到最小值时,重新开始呼吸周期。

3.3呼吸灯实现的关键函数在S TM32的开发环境中,可以使用以下关键函数来实现呼吸灯效果:v o id TI M_PW M_Co nfi g ur at io n(vo id){T I M_Ti me Ba se In itT y pe De fT IM_T im eBa s eS tr uc tu re;T I M_OC In it Ty pe Def T IM_O CI ni tS tr uct u re;//配置定时器基本参数T I M_Ti me Ba se St ruc t ur e.TI M_Pr es cal e r=72-1;//设置分频系数,定时器时钟为72MH zT I M_Ti me Ba se St r uc t ur e.TI M_Pe ri od=999;//设置周期为1000个单位T I M_Ti me Ba se St ruc t ur e.TI M_Co un ter M od e=TI M_Co un ter M od e_U p;//向上计数模式T I M_Ti me Ba se St ruc t ur e.TI M_Cl oc kDi v is io n=TI M_CK D_D I V1;T I M_Ti me Ba se St ruc t ur e.TI M_Re pe tit i on Co un te r=0;T I M_Ti me Ba se In it(T IM2,&T IM_T im eBa s eS tr uc tu re);//配置定时器输出比较参数T I M_OC In it St ru ctu r e.TI M_OC Mo de=TI M_O CM od e_PW M1;T I M_OC In it St ru ctu r e.TI M_Ou tp ut Sta t e=TI M_Ou tp ut Sta t e_En ab l e;T I M_OC In it St ru ctu r e.TI M_Ou tp ut NSt a te=T IM_O ut pu tNS t at e_Di s ab le;T I M_OC In it St ru ctu r e.TI M_Pu ls e=0;//初始占空比为0T I M_OC In it St ru ctu r e.TI M_OC Po l a rit y=T IM_O CP ol ar ity_Lo w;T I M_OC In it St ru ctu r e.TI M_OC NP ol ari t y=TI M_OC NP ol ari t y_Hi g h;T I M_OC In it St ru ctu r e.TI M_OC Id le Sta t e=TI M_OC Id le Sta t e_Se t;T I M_OC In it St ru ctu r e.TI M_OC NI dl eSt a te=T IM_O CI dl eSt a te_R e s e t;T I M_OC1I ni t(TI M2,&TI M_OC In it St ruc t ur e);//启动TI M2定时器T I M_Cm d(TI M2,E NAB L E);}4.程序代码实现以下为基于S TM32单片机的呼吸灯程序代码实现示例,使用标准外设库(St dP er ip hL ibr a ry):#i nc lu de"s tm32f10x.h"v o id de la y(ui nt32_t ms){m s*=1000;w h il e(ms--){a s m("n op");}}i n tm ai n(vo id){G P IO_I ni tT yp eD efG P IO_I ni tS tr uc tur e;//启用GP IO C的时钟R C C_AP B2Pe ri ph Clo c kC md(R CC_A PB2Pe r ip h_GP IO C,EN ABL E);//配置GP IO C的Pin13为推挽输出G P IO_I ni tS tr uc tur e.G PI O_Pi n=GP IO_P in_13;G P IO_I ni tS tr uc tur e.G PI O_Mo de=G PIO_Mo de_O ut_P P;G P IO_I ni tS tr uc tur e.G PI O_Sp ee d=GPI O_S pe ed_50M Hz;G P IO_I ni t(GP IO C,&G PI O_In it St ru ctu r e);//配置PW MT I M_PW M_Co nf ig ura t io n();w h il e(1){//呼吸灯效果f o r(in ti=0;i<1000;i++){T I M_Se tC om pa re1(T I M2,i);d e la y(10);}f o r(in ti=1000;i>=0;i--){T I M_Se tC om pa re1(T I M2,i);d e la y(10);}}}5.结论通过PW M技术和呼吸灯算法,我们可以使用ST M32单片机轻松实现呼吸灯效果。

呼吸灯程序

呼吸灯程序

呼吸灯(简单易懂)如题呼吸灯就是让LED灯的闪烁像呼吸一样,时呼时吸,时亮时暗,利用LED的余辉和人眼的暂留效应,看上去和人的呼吸一样。

二、设计原理:用C语言编程实现 PWM(脉宽调制)输出驱动LED,逐渐增加PWM的占空比从而实现LED模拟呼吸的过程,即渐亮再渐暗再渐亮再渐暗……如此往复,再利用LED的余辉和人眼的暂留效应,看上去就和人的呼吸一样。

三、整体方案设计8个LED按照顺序逐个实现呼吸效果。

加以其他闪烁花样增加更炫彩的效果。

四、实验元件及器材(1)元件: LED(发光二极管)8个1KΩ电阻 8个1nf电容 2个晶振1个AT89C51芯片1个(2)器件:Atmega128开发板1块计算机1台五、硬件原理(1)主电路:8个LED分别连接AT89C51的P1口,使用共阳方式,并加以1kΩ的电阻接入电源。

#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义/*-------------------------IO口定义----------------------------*/ sbit LED0=P0^0;// 用sbit 关键字定义 LED到端口,LED是自己任意定义且容易记忆的符号sbit wei=P1^1;sbit duan=P1^0;sbit lcden=P1^7;sbit dianzhen=P1^3;sbit leden=P1^2;void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned int CYCLE=600,PWM_LOW=0;//定义周期并赋值lcden=0;P0=0x00;dianzhen=0;P0=0xff;wei=0;duan=0;while (1) //主循环{LED0=1;Delay(150000); //特意加延时,可以看到熄灭的过程for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)//PWM_LOW表示低电平时间{//,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次LED0=0; //点亮LEDDelay(PWM_LOW);//延时长度,600次循环中从1加至599LED0=1; //熄灭LEDDelay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1}//LED0=0;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){//与逐渐变亮相反的过程LED0=0;Delay(PWM_LOW);LED0=1;Delay(CYCLE-PWM_LOW);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(t--) ;}原理:用定时器模拟PWM,改变其占空比,用以控制LED的亮度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档