51单片机花样呼吸灯程序

合集下载

单片机流水灯与呼吸灯结合-滴水灯程序及详细教程(转载)

单片机流水灯与呼吸灯结合-滴水灯程序及详细教程(转载)

单片机流水灯与呼吸灯结合-滴水灯程序及详细教程(转载)TWAS手把手教你做呼吸灯-基于51单片机学习板内容比较简单,发这个贴主要是针对新手!什么是呼吸灯?顾名思义,灯光在微电脑控制之下完成由亮到暗的逐渐变化,感觉像是在呼吸。

用专业的话来说是通过控制PWM的占空比来完成对LED亮度的控制什么是PWM和占空比?脉冲宽度调制(Pulse Width Modulation,简称PWM),是利用微处理器的数字输出来对模拟电路进行控制的一种技术。

占空比:高电平在一个周期之内所占的时间比率。

呼吸灯原理当一颗LED在高速闪烁,闪烁的频率已经超过了人眼的感知的范围,那么我们看到这颗LED就是一直亮的,也就是视觉暂留现象(余晖效应)。

如果我们控制一次闪烁中亮和灭的时间(修改占空比),就可以控制亮度。

代码实现:/******************************************************** 程序名称:main.c* 程序功能:实现呼吸灯的主程序文件* 程序作者:TWAS* 创建时间:2015-1-22* 修改时间:* 程序版本:V0.1*******************************************************//* 包含的头文件 */#include <reg52.h>/* 寻址变量定义 */sbit LED_Drive = P3^5; /* 定义驱动LED的IO口,LED为共阳 *//******************************************************* 函数名称:main* 函数功能:主函数* 入口参数:NULL* 出口参数:NULL*******************************************************/int main(){unsigned char i;/* 初始化 */LED_Drive = 1;/* 主循环 */while(1){for(i = 0; i < 200; i++){/* 外边的for循环共循环200次,前面10次点亮LED,后面180次熄灭LED* 通过修改if后面的值,就可以改变占空比*/if(i < 10){LED_Drive = 0;}else{LED_Drive = 1;}}}return 0;}/******************************************* 程序结束*****************************************/可以明显看出我们所控制的LED比电源灯暗许多,既然我们会控制亮度,想实现呼吸灯也就变的简单了代码实现:(为了节约空间和界面简洁,只贴出主要实现的部分)int main(){unsigned char i;unsigned char ucNum = 0; /* 新增两个变量,ucNum 控制占空比*/bit bAdd = 1; /* bAdd选择是增大占空比还是减小占空比 *//* 初始化 */LED_Drive = 1;/* 主循环 */while(1){for(i = 0; i < 200; i++){/* 外边的for循环共循环200次,前面10次点亮LED,后面180次熄灭LED* 通过修改if后面的值,就可以改变占空比*/if(i < ucNum){LED_Drive = 0;}else{LED_Drive = 1;}}/* 选择是增大占空比还是减小占空比 */if (1 == bAdd){ucNum++;}else{ucNum--;}/* 当Num等于200也就是最大值时,bAdd置0,Num开始减小*/if (200 == ucNum){bAdd = 0;}/* 当Num等于200也就是最大值时,bAdd置1,Num开始增大*/else if (0 == ucNum){bAdd = 1;}}return 0;}由于图片看不到效果,这个地方就不贴图了,根据测试,我们的所需要的功能实现了!但是这时候有的人就有疑问了,这是很普通的LED,那如果是特殊一点的呢?比如我所用的学习板上面,16颗LED是用595驱动的,那呼吸灯又该如何实现呢?其实很简单,我们把驱动LED的函数封装一下,直接替换,其它不变就行了!代码实现:(为了节约空间和界面简洁,只贴出主要实现的部分)for(i = 0; i < 200; i++){/* 外边的for循环共循环200次,前面10次点亮LED,后面180次熄灭LED* 通过修改if后面的值,就可以改变占空比*/if(i < ucNum){DriveLED(0x0003); /* LED驱动,点亮D1和D2 */}else{DriveLED(0x0002); /* LED驱动,熄灭D1点亮D2 */}}当我把程序改成这样的时候,出了一点问题,不能呼吸,变成闪烁了!等等,先把LED驱动部分发一下:/******************************************************* 函数名称:SendData* 函数功能:74HC595数据的发送* 入口参数:unsigned int uiDataOne, unsigned int uiDataTwo * 出口参数:void*******************************************************/void SendData(unsigned char ucDataOne, unsigned char ucDataTwo){unsigned int i = 0;/* 将片选信号置为低电平 */HC595RCK = 0;/* 输入第一个数据:uiDataOne */for (i = 0; i < 8; i++){/* 给出脉冲信号,首先将CLK置为0 */HC595CLK = 0;if (0 != (ucDataOne & 0x80)){HC595DATA = 1;}else{HC595DATA = 0;}/* 给出脉冲信号,首先将CLK置为1 */HC595CLK = 1;/* 准备第二个数据 */ucDataOne = ucDataOne << 1;}/* 输入第二个数据:uiDataTwo */for (i = 0; i < 8; i++)/* 给出脉冲信号,首先将CLK置为0 */HC595CLK = 0;if (0 != (ucDataTwo & 0x80)){HC595DATA = 1;}else{HC595DATA = 0;}/* 给出脉冲信号,首先将CLK置为1 */HC595CLK = 1;/* 准备第二个数据 */ucDataTwo = ucDataTwo << 1;}/* 将片选信号置为高电平 */HC595RCK = 1;}/******************************************************** * 函数名称:DriveLED* 函数功能:595驱动程序是分两个数据发的,* 本函数把它合并成一个数据* 入口参数:uiData:16颗LED需要显示的数据* 出口参数:NULL*******************************************************/ void DriveLED(unsigned int uiData)SendData(uiData >> 8,uiData);}继续刚刚的问题,呼吸灯变成闪烁了,怎么回事呢?在程序逻辑上是没有问题的,我们只是更改了LED的驱动部分,看来就是LED驱动的问题了!先来Debug看一下,执行DriveLED这个函数,时间是接近400微妙,循环200次,就是差不多80毫秒,那么LED的闪烁频率为12.5HZ(都是大概的值,没有精确计算),还不足以形成视觉暂留现象。

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个机器周期,定时中断子程序中的数据入栈和重装定时/计数器的初值还需要占用数个机器周期,还有从中断入口转到中断子程序也要占用一定的机器周期。

51单片机 流水灯 ~ 花样灯 程序

51单片机 流水灯 ~ 花样灯 程序

单片机为89c52 晶振为11.0592,/***此程序为流水灯*** /#include<reg52.h>#include<intrins.h>#define uchar unsigned char //宏定义#define uint unsigned intuchar led;void delay(uint z) //延时子函数体{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){led=0xfe; //赋初值while(1){P1=led; //点亮第一个小灯delay(100); //延时100毫秒led=_crol_(led,1); 将led的变量左移给下一位}}/*8个发光管间隔200ms由上至下,返回再由上至下,一个个往下亮,后全亮由下至上,返回再由下至上,一个个往下亮,后全亮再重复2次,然后全部熄灭再以500ms间隔全部闪烁3次。

重复此过程*/#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar led;uint i,j;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){while(1){for(j=0;j<2;j++){led=0xfe; //赋初值for(i=0;i<8;i++){P1=led; //点亮第一个小灯delay(200); //延时200毫秒led=_crol_(led,1); //将led变量循环左移给下一位}led=0xfe; //赋初值for(i=0;i<8;i++){P1=led; //点亮第一个小灯delay(200); //延时200毫秒led<<=1; //左移给下一位}led=0x7f; //赋初值for(i=0;i<8;i++){P1=led; //点亮第一个小灯delay(200); //延时200毫秒led=_cror_(led,1); //将led变量循环右移给下一位}led=0x7f; //赋初值for(i=0;i<8;i++){P1=led; //点亮第一个小灯delay(200); //延时200毫秒led>>=1; //右移给下一位}}for(j=0;j<6;j++){P1=~P1; //全部取反6次,即闪烁5次delay(500); //延时500毫秒}}}。

呼吸灯代码

呼吸灯代码

写一段程序,使单片机上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****************/。

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:感谢大家的阅读,本文由我司收集整编。

简单的51单片机花样流水灯C语言源代码

简单的51单片机花样流水灯C语言源代码

简单的51单片机花样流水灯C语言源代码#include<reg51.h> //51系列单片机定义文件#define uchar unsigned char //定义无符号字符#define uint unsigned int //定义无符号整数void Delayms(uint x){ //定义延时函数uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}void main(){uint i;uchar temp;while(1){temp=0x01; //8个流水灯逐个闪动for(i=0;i<8;i++){P0=~temp;Delayms(50);temp<<=1;}temp=0x80; //8个流水灯反向逐个闪动for(i=0;i<8;i++){P0=~temp;Delayms(50);temp>>=1;}temp=0xfe; //8个流水灯依次全部点亮for(i=0;i<8;i++){P0=temp;Delayms(50);temp<<=1;}temp=0x7f; //8个流水灯依次反向全部点亮for(i=0;i<8;i++){P1=temp;Delayms(50);temp>>=1;}}}//此程序的作者向往未来#include<reg52.h>#include<intrins.h>#define uint unsigned int #define uchar unsigned char uchar z=50,e=0x00,f=0xff; uchar code table1[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};uchar code table2[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; uchar code table3[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};uchar code table4[]={0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff}; uchar code table5[]={0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff};uchar code table6[]={0x7e,0x3c,0x18,0x00, 0x18,0x3c,0x7e,0xff}; void delay(uchar); void lsd1();void lsd2();void lsd3();void lsd4();void lsd5();void lsd6();void lsd7();void lsd8();void lsd9();void lsd10();void lsd11();void lsd12();main(){while(1){lsd1();lsd2();lsd3();lsd4();lsd5();lsd6();lsd7();lsd8();lsd9();lsd10();lsd11();lsd12();}}void delay(uchar x) //延时函数{uint i,j;for(i=x;i>0;i--)for(j=250;j>0;j--);}void lsd1() //lsd1 单个流水灯双程模式1 {uchar a,i,j,k,l,l1,k1,j1,i1;a=0xfe;P0=a;delay(z);for(i=0;i<7;i++) //仅单个灯亮从上往下流{a=_crol_(a,1);P0=a;delay(z);}P0=0xff;a=0xfe;P2=a;delay(z);for(j=0;j<7;j++){a=_crol_(a,1);P2=a;delay(z);}P2=0xff;a=0xfe;P3=a;delay(z);for(k=0;k<7;k++){a=_crol_(a,1);P3=a;delay(z);}P3=0xff;a=0xfe;P1=a;delay(z);for(l=0;l<7;l++){a=_crol_(a,1);P1=a;delay(z);}a=0xbf;P1=a;delay(z);for(l1=0;l1<6;l1++) //l1==6 仅单个灯亮从下往上流{a=_cror_(a,1);P1=a;delay(z);}P1=0xff;a=0x7f;P3=a;delay(z);for(k1=0;k1<7;k1++) {a=_cror_(a,1);P3=a;delay(z);}P3=0xff;a=0x7f;P2=a;delay(z);for(j1=0;j1<7;j1++) {a=_cror_(a,1);P2=a;delay(z);}P2=0xff;a=0x7f;P0=a;delay(z);for(i1=0;i1<7;i1++) {a=_cror_(a,1);P0=a;delay(z);P0=0xff;}void lsd2() //lsd2 两个灯流水双程模式1 {uchar a,i,j,k,l,l1,k1,j1,i1;a=0xfe;P0=a;delay(z);a=a<<1;P0=a;delay(z);for(i=0;i<6;i++){a=_crol_(a,1);P0=a;delay(z);}P0=0x7f;P2=0xfe;delay(z);P0=0xff;a=0xfc;P2=a;delay(z);for(j=0;j<6;j++){a=_crol_(a,1);P2=a;delay(z);P2=0x7f;P3=0xfe;delay(z);P2=0xff;a=0xfc;P3=a;delay(z);for(k=0;k<6;k++) {a=_crol_(a,1);P3=a;delay(z);}P3=0x7f;P1=0xfe;delay(z);P3=0xff;a=0xfc;P1=a;delay(z);for(l=0;l<6;l++) {a=_crol_(a,1);P1=a;delay(z);}P1=0x7f;delay(z);P1=0xff;delay(z);a=0x7f;P1=a;delay(z);a=a>>1;P1=a;delay(z);for(l1=0;l1<6;l1++) {a=_cror_(a,1);P1=a;delay(z);}P1=0xfe;P3=0x7f;delay(z);P1=0xff;a=0x3f;P3=a;delay(z);for(k1=0;k1<6;k1++) {a=_cror_(a,1);P3=a;delay(z);}P3=0xfe;P2=0x7f;delay(z);P3=0xff;P2=a;delay(z);for(j1=0;j1<6;j1++){a=_cror_(a,1);P2=a;delay(z);}P2=0xfe;P0=0x7f;delay(z);P2=0xff;a=0x3f;P0=a;delay(z);for(i1=0;i1<6;i1++){a=_cror_(a,1);P0=a;delay(z);}P0=0xfe;delay(z);P0=0xff;delay(z);}void lsd3() //lsd3 两个灯流水双程模式2 {uchar a,i,j,k,l,l1,k1,j1,i1;P0=a;delay(z);a=a<<1;P0=a;delay(z);for(i=0;i<6;i++) //_crol_与_cror_混合使用{a=_crol_(a,1);P0=a;delay(z);}P0=0x7f;a=0x7f;P2=a;delay(z);P0=f;a=a>>1;P2=a;delay(z);for(j=0;j<6;j++){a=_cror_(a,1);P2=a;delay(z);}P2=0xfe;a=0xfe;P3=a;delay(z);a=a<<1;P3=a;delay(z);for(k=0;k<6;k++) {a=_crol_(a,1);P3=a;delay(z);}P3=0x7f;a=0x7f;P1=a;delay(z);P3=f;a=a>>1;P1=a;delay(z);for(l=0;l<6;l++) {a=_cror_(a,1);P1=a;delay(z);}P1=0xfe;delay(z);P1=f;delay(z);a=0xfe;P1=a;a=a<<1;P1=a;delay(z);for(l1=0;l1<6;l1++) //l1==6 {a=_crol_(a,1);P1=a;delay(z);}P1=0x7f;a=0x7f;P3=a;delay(z);P1=f;a=a>>1;P3=a;for(k1=0;k1<6;k1++){a=_cror_(a,1);P3=a;delay(z);}P3=0xfe;a=0xfe;P2=a;delay(z);P3=f;a=a<<1;P2=a;for(j1=0;j1<6;j1++) {a=_crol_(a,1);P2=a;delay(z);}P2=0x7f;a=0x7f;P0=a;delay(z);P2=f;a=a>>1;P0=a;delay(z);for(i1=0;i1<6;i1++) {a=_cror_(a,1);P0=a;delay(z);}P0=0xfe;delay(z);P0=f;delay(z);}void lsd4() //lsd4{uchar a,i,j,k,l,l1,k1,j1,i1; a=0xfe;delay(z);for(i=0;i<7;i++){a=a<<1; //单个灯依次点亮所有灯,从上往下P0=a;delay(z);}a=0xfe;P2=a;delay(z);for(j=0;j<7;j++){a=a<<1;P2=a;delay(z);}a=0xfe;P3=a;delay(z);for(k=0;k<7;k++){a=a<<1;P3=a;delay(z);}a=0xfe;P1=a;delafor(l=0;l<7;l++){a=a<<1;P1=a;delay(z);}for(l1=0;l1<8;l1++) //l1==8{P1=table1[l1]; //单个灯依次熄灭所有灯,从下往上delay(z);}for(k1=0;k1<8;k1++){P3=table1[k1];delay(z);}for(j1=0;j1<8;j1++){P2=table1[j1];delay(z);}for(i1=0;i1<8;i1++){P0=table1[i1];delay(z);}}void lsd5() //lsd5{uchar a,i,j,k,l,l1,k1,j1,i1;a=0xfe;P0=a;delay(z);for(i=0;i<7;i++){a=a<<1;P0=a;delay(z);}for(j=0;j<8;j++) //单个灯依次点亮所有灯,从下往上{P2=table2[j];delay(z);}a=0xfe;P3=a;delay(z);for(k=0;k<7;k++){a=a<<1;P3=a;delay(z);}for(l=0;l<8;l++){P1=table2[l];delay(z);}for(l1=0;l1<8;l1++) //单个灯依次熄灭所有灯,从上往下{P1=table3[l1];delay(z);}for(k1=0;k1<8;k1++){P3=table1[k1];delay(z);}for(j1=0;j1<8;j1++) //单个灯依次熄灭所有灯,从上往下{P2=table3[j1];delay(z);}for(i1=0;i1<8;i1++){P0=table1[i1];delay(z);}}void lsd6() //每组为单位同亮同灭从左向右再向左{P0=0x00;delay(z);P0=0xff;P2=0x00;delay(z);P2=0xff;P3=0x00;delay(z);P3=0xff;P1=0x00;delay(z);P3=0x00;P1=0xff;delay(z);P2=0x00;P3=0xff;delay(z);P0=0x00;P2=0xff;delay(z);P0=0xff;delay(z);}void lsd7() //lsd7 全亮全灭{uchar i;for(i=0;i<2;i++){P0=0x00;P1=0x00;P2=0x00;P3=0x00;delay(z);P0=0xff;P1=0xff;P2=0xff;P3=0xff;delay(z);}}void lsd8() //每组仅两个灯,从中间往两边再往中间{uchar i;for(i=0;i<8;i++){P0=table4[i];P1=table4[i];P2=table4[i];P3=table4[i];delay(z);}}void lsd9() //每组两个灯引亮所有灯再引灭,从中间带两边再到中间{uchar i;for(i=0;i<8;i++){P0=table5[i];P1=table5[i];P2=table5[i];P3=table5[i];delay(z);}}void lsd10(){uchar a,i,j;a=0xfe;P0=a;P1=a;P2=a;P3=a;delay(z);for(i=0;i<7;i++) //仅单个灯亮从上往下流{a=_crol_(a,1);P0=a;P1=a;P2=a;P3=a;delay(z);}for(j=0;j<7;j++) //仅单个灯亮从上往下流{a=_cror_(a,1);P0=a;P1=a;P2=a;P3=a;delay(z);}P0=f;P1=f;P2=f;P3=f;delay(z);void lsd11() {uchar a,i,j;a=0xfe;P0=a;P1=a;P2=a;P3=a;delay(z);for(i=0;i<7;i++) {a=a<<1;P0=a;P1=a;P2=a;P3=a;delay(z);}for(j=0;j<8;j++) {P0=table1[j];P1=table1[j];P2=table1[j];P3=table1[j]; delay(z);}}void lsd12()uchar a,i,j,k,l;a=0xfe;P0=a;P1=a;delay(z);for(i=0;i<7;i++) {a=a<<1;P0=a;P1=a;delay(z);}a=0x7f;P2=a;P3=a;delay(z);for(j=0;j<7;j++) {a=a>>1;P2=a;P3=a;delay(z);}for(k=0;k&lt;8;k++){P2=table3[k]; P3=table3[k]; delay(z);for(l=0;l<8;l++) {P0=table1[l];P1=table1[l]; delay(z);}while(1);}。

单片机PWM技术实现呼吸灯和KTV等娱乐场所的灯光闪烁效果

单片机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单片机呼吸灯实验报告

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的控制(呼吸灯)

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

任务单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);}。

LED呼吸灯C51源程序

LED呼吸灯C51源程序

*【使用说明】:晶振为利用准时器控制产生占空比可变的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++) ;}}/*********************************************************/。

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);}。

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

#include<reg52.h>
/*-----------定义单片机引脚--*/
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; //点亮LED
Delay(PWM_LOW);
P1=0xff; //熄灭LED
Delay(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;
Delay(CYCLE-PWM_LOW);
}
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;
Delay(CYCLE-PWM_LOW);
}
/*--------第四颗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);
}
(注:专业文档是经验性极强的领域,无法思考和涵盖全面,素材和资料部分来自网络,供参考。

可复制、编制,期待你的好评与关注)。

相关文档
最新文档