LED呼吸灯C源程序
- 格式:docx
- 大小:208.52 KB
- 文档页数:8
单片机实训课程之:呼吸灯一.设计要求二.相关原理三.论证分析四.硬件原理五.软件程序设计六.测试方法与结果七.使用说明(附录)一.设计要求呼吸灯顾名思义就是让LED灯的闪烁像呼吸一样,时呼时吸,时亮时暗。
二.相关原理呼吸灯的原理:呼吸灯,是用LED模拟呼吸的过程,即渐亮再渐暗再渐亮再渐暗……如此往复,再利用LED的余辉和人眼的暂留效应,看上去就和人的呼吸一样了。
三.论证分析程序流程图(1)80C511.单片机定义“单片机”就是将计算机的基本部件集成到一块芯片上,包括CPU、ROM、RAM、并行口、串行口、定时器/计数器、中断系统、系统时钟等。
MCS-51的微处理器是由运算器和控制器构成所的。
运算器:主要用来对操作数进行算术、逻辑运算和位操作。
主要包括算术逻辑运算单元ALU、累加器A、寄存器B、位处理器、程序状态字寄存器PSW以及BCD码修正电路等。
控制器:单片机的指挥控制部件,控制器的主要任务是识别指令,并根据指令的性质控制单片机各功能部件,从而保证单片机各部分能自动而协调地工作。
(2)时钟电路外部时钟方式是使用外部振荡脉冲信号,常用于多片MCS-51单片机同时工作,以便于同步。
外部时钟电路,是由一个12MHz晶振和两个瓷片电容组成,为单片机提供标准时钟,其中两个瓷片电容起微调作用,外接晶振频率精确度直接影响电子钟计时的准确性。
(外部时钟方式是把外部已经有的时钟信号引入到单片机内部。
时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。
在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间。
)2.单片机电子钟利用内部定时/计数器溢出产生中断(12M晶振一般为50ms)再乘以相应的倍率来实现秒、分、时的转换。
从定时/计数器产生中断请求到响应中断需要3-8个机器周期,定时中断子程序中的数据入栈和重装定时/计数器的初值还需要占用数个机器周期,还有从中断入口转到中断子程序也要占用一定的机器周期。
写一段程序,使单片机上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-呼吸灯源程序/*************************************************** **************** @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****************/。
* 【使用说明】:晶振为11.0592M利用定时器控制产生占空比可变的 PWM 波按K3,PWM值增加,则占空比减小,LED 灯渐亮按K4,PWM值减小,则占空比增加,LED 灯渐暗当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警************************************************************************ **********/#include<reg51.h>#include<intrins.h>sbit K1 =P3^4 ; //PWM值增加键sbit K2 =P3^5; //PWM值减少键sbit BEEP =P0^4; //蜂鸣器unsigned char PWM=0x7f ; //赋初值void Beep();void delayms(unsigned char ms);void delay(unsigned char t);/*********************************************************/void main(){P1=0xff;TMOD=0x21 ;TH0=0xfc ; //1ms延时常数 TL0=0x66 ; //频率调节TH1=PWM ; //脉宽调节TL1=0 ;EA=1;ET0=1;ET1=1;TR0=1 ;while(1){do{if(PWM!=0xff){PWM++ ;delayms(10);}else Beep() ;}while(K1==0);do{if(PWM!=0x02){PWM-- ;delayms(10);}else Beep() ;}while(K2==0);}}/*********************************************************/ // 定时器0中断服务程序(频率)/*********************************************************/ void timer0() interrupt 1{TR1=0 ;TH0=0xfc ;TL0=0x66 ;TH1=PWM ;TR1=1 ;P1=0x00 ; //启动输出}/*********************************************************/ // 定时器1中断服务程序(脉宽)/*********************************************************/ void timer1() interrupt 3{TR1=0 ;P1=0xff ; //结束输出}/*********************************************************/ //蜂鸣器子程序/*********************************************************/ 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){while(t--) ;}/*********************************************************/ // 延时子程序/*********************************************************/ void delayms(unsigned char ms){unsigned char i ;while(ms--){for(i = 0 ; i < 120 ; i++) ;}}/*********************************************************/。
呼吸灯设计c程序呼吸灯设计C程序简介呼吸灯是一种常见的灯光效果,它模拟了人类呼吸的节奏,灯光逐渐从暗到亮再从亮到暗,循环往复。
在嵌入式系统开发中,通过编写C程序来实现呼吸灯效果是一种常见的做法。
本文将介绍如何使用C语言设计一个简单的呼吸灯程序,并通过连接LED灯连接到单片机上进行调试。
准备工作在编写呼吸灯C程序之前,我们需要准备一些硬件设备和开发工具。
首先,我们需要一块单片机开发板,常用的有Arduino、树莓派等。
其次,我们需要一块LED灯,可以是常见的发光二极管或RGB LED等。
最后,我们需要一个编程环境,例如Arduino IDE或gcc编译器。
程序实现下面是一个简单的呼吸灯C程序的实现:cinclude <stdio.h>include <wiringPi.h>int mn(void) {int brightness = 0;int fadeAmount = 5;wiringPiSetup();pinMode(0, PWM_OUTPUT);while (1) {pwmWrite(0, brightness);brightness += fadeAmount;if (brightness == 0 -- brightness == 255) { fadeAmount = -fadeAmount;}delay(30);}return 0;}程序分析以上程序使用了wiringPi库来控制GPIO,并通过PWM输出来控制LED灯的亮度。
在程序的主函数中,我们定义了两个变量`brightness`和`fadeAmount`分别用于控制当前的亮度和变化的步长。
在无限循环中,我们通过`pwmWrite()`函数来输出当前的亮度值,并通过改变`brightness`的值以及根据亮度的变化方向来改变`fadeAmount`的值,从而实现呼吸灯效果。
具体来说,当`brightness`在[0, 255]范围内变化时,LED灯的亮度会逐渐从暗到亮;当`brightness`达到0或255时,我们改变`fadeAmount`的符号,使亮度的变化方向从亮变暗或从暗变亮。
8位led呼吸程序代码前几天从视频上看到一个水滴掉落的程序,看到自己笔记本上的led 呼吸灯,感觉他们的算法要求差不多,于是写下一下程序,我也得瑟一下,算是原创吧。
有不正之处或者是有需要优化之处欢迎大家批评指正,相互学习(代码中有138 译码器的操作,已注释,kingst 的单片机开发板可直接实现)#includereg51.h#define uchar unsigned char#define N 2 //定义的呼吸的速率#define T 700 //定义PWM 的周期sbit ENLED = P1;//138译码器sbit ADDR0 =P1;//138 译码器sbit ADDR1 = P1;//138译码器sbit ADDR2 = P1 ;//138 译码器sbit ADDR3 = P1;//138译码器sbit led0=P0;sbit led1=P0;sb it led2=P0 ;sbit led3=P0;sb it led4=P0;sb it led5=P0 ;sbit led6=P0;sb it led7=P0;vo id pwm(int x){while(x--);//延时函数}void main(){int t=0,i=0;char f=0;ENLED = 0;ADDR3 = 1;译码器的打开ADDR0 = 0;ADDR1 = 1;ADDR2 = 1; 译码器的操作11111011while(1){if(i=800) {i++;led0=0;pwm(t);//Toff,亮的时间led0=1;pwm(T-t); //Ton,暗的时间if(!f) t+=N+1;//亮速率较快,模拟呼吸else t-=N;//暗速率较慢if(tT) {f=1;t=T;}//超过最大值时,返回最大值,此时灯灭if(t0) {f=0;t=0;}//超过最小值时,返回最小值,此时灯亮以后的程序不再注释。
不用pwm做呼吸灯c语言程序呼吸灯是一种常见的LED灯效,它模拟人类呼吸的变化,让LED 灯的亮度逐渐增加和减小,给人一种温柔的感觉。
通常情况下,我们会使用脉冲宽度调制(PWM)来实现呼吸灯效果,但是今天我将介绍一种不使用PWM的方法来实现呼吸灯效果的C语言程序。
首先,我们需要了解呼吸灯的原理。
呼吸灯的亮度变化是通过改变LED灯的电流来实现的。
当电流逐渐增加时,LED灯的亮度也会逐渐增加;当电流逐渐减小时,LED灯的亮度也会逐渐减小。
因此,我们可以通过改变LED灯的电流来实现呼吸灯效果。
在C语言中,我们可以使用延时函数来控制电流的变化。
延时函数可以让程序暂停一段时间,然后再继续执行。
通过不断地调整延时的时间,我们可以实现电流的逐渐增加和减小,从而实现呼吸灯效果。
下面是一个简单的C语言程序,用于实现呼吸灯效果:```c#include <stdio.h>#include <unistd.h>int main() {int brightness = 0; // 亮度变量,范围从0到100int direction = 1; // 方向变量,用于控制电流的增加和减小while (1) {printf("当前亮度:%d\n", brightness);if (brightness == 100) {direction = -1; // 当亮度达到最大值时,改变方向为减小} else if (brightness == 0) {direction = 1; // 当亮度达到最小值时,改变方向为增加}brightness += direction; // 根据方向改变亮度usleep(100000); // 延时100毫秒// 在这里可以控制LED灯的电流,实现亮度的变化}return 0;}```在这个程序中,我们使用了一个while循环来不断地改变亮度变量的值。
L E D呼吸灯C源程序 The latest revision on November 22, 2020
* 【使用说明】:
晶振为
利用定时器控制产生占空比可变的 PWM 波
按K3,PWM值增加,则占空比减小,LED 灯渐亮
按K4,PWM值减小,则占空比增加,LED 灯渐暗
当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警
************************************************************************ **********/
#include<>
#include<>
sbit K1 =P3^4 ; //PWM值增加键
sbit K2 =P3^5; //PWM值减少键
sbit BEEP =P0^4; //蜂鸣器
unsigned char PWM=0x7f ; //赋初值
void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);
/*********************************************************/ void main()
{
P1=0xff;
TMOD=0x21 ;
TH0=0xfc ; //1ms延时常数
TL0=0x66 ; //频率调节
TH1=PWM ; //脉宽调节
TL1=0 ;
EA=1;
ET0=1;
ET1=1;
TR0=1 ;
while(1)
{
do{
if(PWM!=0xff)
{PWM++ ;delayms(10);}
else Beep() ;
}
while(K1==0);
do{
if(PWM!=0x02)
{PWM-- ;delayms(10);}
else Beep() ;
}
while(K2==0);
}
}
/*********************************************************/
// 定时器0中断服务程序(频率)
/*********************************************************/ void timer0() interrupt 1
{
TR1=0 ;
TH0=0xfc ;
TL0=0x66 ;
TH1=PWM ;
TR1=1 ;
P1=0x00 ; //启动输出
}
/*********************************************************/ // 定时器1中断服务程序(脉宽)
/*********************************************************/ void timer1() interrupt 3
{
TR1=0 ;
P1=0xff ; //结束输出
}
/*********************************************************/ //蜂鸣器子程序
/*********************************************************/ 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)
{
while(t--) ;
}
/*********************************************************/ // 延时子程序
/*********************************************************/ void delayms(unsigned char ms)
{
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}
/*********************************************************/。