LED呼吸灯C51源程序
- 格式:doc
- 大小:32.50 KB
- 文档页数:3
C51单片机控制LED灯设计方案详解下面,我将详细介绍C51单片机控制LED灯的设计方案:1.硬件设计:a.选择合适的LED灯模块:根据实际需求选择合适的LED灯模块,包括LED灯的尺寸、亮度、颜色等参数。
b.连接电源和单片机:将LED灯模块与C51单片机进行连接,通常使用一个适当的电阻将LED灯连接到单片机的GPIO引脚,用于限流。
c.设计电源电路:根据LED灯模块的工作电压和电流需求设计合适的电源电路,确保LED灯能够正常工作。
2.软件设计:a.确定控制方式:根据具体需求,确定LED灯的控制方式,例如手动控制、定时控制、网络控制等。
b.编写控制程序:使用C语言或汇编语言编写控制程序,实现LED灯的开关、亮度调节、颜色变换等功能。
C51单片机具有丰富的GPIO引脚和定时器等功能模块,能够轻松实现这些功能。
c.设计电源管理功能:为了提高LED灯的使用寿命和节能性能,可以设计电源管理功能,例如自动关闭LED灯、调节LED灯亮度等。
3.调试与测试:a.硬件调试:利用示波器等设备对硬件电路进行测试和调试,确保LED灯正常工作。
b.软件调试:通过单片机仿真器或调试器对软件程序进行调试,检查程序的逻辑和功能是否正常。
c.系统整体测试:在完成硬件和软件调试后,进行整体系统测试,验证LED灯的各项功能和性能。
4.优化与改进:a.优化程序性能:根据实际需求,对程序进行优化,提高LED灯控制的响应速度和稳定性。
b.改进硬件设计:根据实际测试结果和用户反馈,对硬件电路进行改进,提高LED灯的亮度、稳定性和可靠性。
c.安全性设计:为了保证LED灯的安全性,可以设计过压、过流和过热保护电路,防止LED灯损坏或引发安全事故。
总结起来,C51单片机控制LED灯的设计方案主要包括硬件设计、软件设计、调试与测试以及优化与改进。
通过合理的硬件设计和高效的软件程序,能够实现LED灯的各种控制功能,提高LED灯的亮度、稳定性和可靠性,满足不同应用场景的需求。
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单⽚机实现呼吸灯和花样流⽔灯程序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单片机四路抢答器(LED灯,数码管显示,蜂鸣器提示音)C语言源程序2009-10-31 10:53其实就是在原有的基础上,加入数码管显示及蜂鸣器,当然根据自己的要求,适当使用单片机I/O口接线为:P0 P2 来控制数码管显示,其中P0为数码管显字控制,P2用来选择位(第几个数码管)P1用来控制8个LED灯P3,独立按键(可以根据需要修改)P3^5(找了一个没有用到的I/O口,当然,可以用键盘扫描的方式来实现,这样的话,可以实现4*4=16路的抢答器,了解原理,做相应修改即可。
#include <reg52.h>sbit key1=P3^0; //这里采用独立按键(4路)sbit key2=P3^1;sbit key3=P3^2;sbit key4=P3^3;sbit SPK=P3^5; //蜂鸣器,最好在ISP编程时先不接入,(我用的是杜邦线,可以设置跳线控制)void delay(unsigned int cnt){while(--cnt);}void speak(unsigned int j){unsigned int i;for(i=0;i<j;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短{delay(180);//参数决定发声的频率,估算值,自行修改到不刺耳的声调SPK=!SPK;}SPK=1; //喇叭蜂鸣器停止工作,叫一声即可。
}void main(){bit Flag;while(!Flag){if(!key1){P1=0xFE;Flag=1;speak(300);P2=0;P0=0x06;} //LED1,数码管1显示1,蜂鸣器叫else if(!key2){P1=0xFD;Flag=1;speak(300);P2=1;P0=0x5b;}//LED2,数码管2显示2,蜂鸣器叫else if(!key3){P1=0xFB;Flag=1;speak(300);P2=2;P0=0x4f;}//LED3,数码管3显示3,蜂鸣器叫else if(!key4){P1=0xF7;Flag=1;speak(300);P2=3;P0=0x66;}LED4,数码管4显示4,蜂鸣器叫}while(Flag);}测试完,手动复位即可,当然可设置相应的按键来控制标志:Flag,进行继续抢答。
用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:感谢大家的阅读,本文由我司收集整编。
C51单片机入门实例1.LED篇LED原理图如下:只有当P2口为低电平,LED灯才会亮,根据原理不同适当改变参数变量,以下C语言编程实例基于此原理图实现。
C语言相关知识点(编译软件为keil):1.#include<reg51.h> 文件定义了单片机的一些特殊功能寄存器2. typedef 重新定义一些常用的关键词,增加程序的可移植性,因为在不同的编译软件上,C语言数据类型的关键词的位宽是不一样的3. 以下用到的delay()延时函数并不能准确延时,只能满足大概时间的延时,在没有要求精确的延时情况下可用。
4._crol_(a,b)循环左移函数,a是左移的值,b是左移的位数,包含在intrins.h库函数里面。
_cror_(a,b)为循环右移函数,如上。
5.sbit关键字定义一个变量名到一个位地址,变量名是自己任意定义且便于记忆和表示的符号。
6.点亮LED灯既可以对某一个位进行复值,也可以对整个P2口进行复值(P2=0xfe等价于P2^0=0)。
7.while(1)使函数死循环于此,无法跳出。
程序1.点亮一位LED灯:说明:程序可点亮一位LED灯#include <reg51.h>sbit led =P2^0; //将单片机的P2.0口定义为LEDvoid main(){while(1){led=0; //P2.0端口设置为低电平,即点亮一位LED灯}}拓展:通过改写变量,可同时点亮1至8位LED灯。
点亮LED灯既可以对某一个位进行复值,也可以对整个P2口进行复值(P2=0xfe等价于P2^0=0)程序2.LED灯闪烁:说明:程序可实现一位LED灯亮灭交替(闪烁)#include <reg51.h>typedef unsigned int u16;sbit led=P2^0; //将单片机p2.0口定义为LEDvoid delay(u16 i) //延时函数,不同的i值实现不同的延时时间,i=1,大约延时10us{while(i--) ;}void main(){while(1){led=0; //点亮delay(40000); //延时,i不可以超过65536(i为16位无符号数)led=1;delay(40000);}}拓展:通过改写变量,可对8个位的LED进行各种闪烁控制程序3.LED流水灯:说明:程序可实现LED灯从右到左,再从左到右依次循环点亮。
C51程序设计范文C51程序设计是指使用C语言编程来控制C51单片机的各种功能,包括输入输出、定时器、串口通信、中断等。
C51程序设计的特点之一是语言简洁、易读易写,对程序员来说较为友好。
相比于汇编语言,C51程序设计可以更快速地编写程序,并且具有更好的可读性。
首先,我们需要了解C51单片机的硬件特性。
C51单片机通常有多个GPIO引脚,可以用来控制外部设备。
我们可以通过在程序中设置GPIO引脚的电平来控制外部设备的开关状态。
下面是一个简单的C51程序设计示例,用于控制一个LED灯的亮暗状态:```#include <reg52.h>sbit LED = P1^0; // 定义LED在P1引脚的位置void maiwhile(1)LED=1;//点亮LEDdelay(1000); // 延时1秒LED=0;//熄灭LEDdelay(1000); // 延时1秒}void delay(unsigned int t)unsigned int i, j;for(i = 0; i < t; i++)for(j = 0; j < 1000; j++)}}```在这个示例中,我们首先定义了LED的位置,即P1引脚的第0位。
然后在主函数中,通过循环控制LED灯的亮暗状态。
在每次循环中,我们先将LED引脚设置为高电平,即LED灯点亮,然后延时1秒。
接下来将LED引脚设置为低电平,即LED灯熄灭,再次延时1秒。
通过不断循环这个过程,可以让LED灯以固定的频率闪烁。
这是一个非常简单的例子,但它展示了C51程序设计的基本原理和应用。
实际上,C51程序设计可以实现更为复杂的功能,比如通过按键控制LED的开关,通过串口通信控制外部设备等。
C51程序设计的灵活性使得它成为嵌入式系统开发中的重要工具。
总结一下,C51程序设计是一种基于C语言的嵌入式系统编程语言,用于开发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++) ;}}/*********************************************************/。
#include <reg52.h>//包含头文件#define uchar unsigned char#define uint unsigned intuchar keyscan(void);void delay(uint i);void main(){uchar key;P2=0x0f;//8数码管亮按相应的按键,会显示按键上的字符while(1){key=keyscan();//调用键盘扫描,switch(key){case 0xee:P0=0x3f;break;//0 按下相应的键显示相对应的码值case 0xde:P0=0x06;break;//1case 0xbe:P0=0x5b;break;//2case 0x7e:P0=0x4f;break;//3case 0xed:P0=0x66;break;//4case 0xdd:P0=0x6d;break;//5case 0xbd:P0=0x7d;break;//6case 0x7d:P0=0x07;break;//7case 0xeb:P0=0x7f;break;//8case 0xdb:P0=0x6f;break;//9case 0xbb:P0=0x77;break;//acase 0x7b:P0=0x7c;break;//bcase 0xe7:P0=0x39;break;//ccase 0xd7:P0=0x5e;break;//dcase 0xb7:P0=0x79;break;//ecase 0x77:P0=0x71;break;//f}}}uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法{uchar cord_h,cord_l;//行列值P3=0x0f; //行线输出全为0cord_h=P3&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{delay(100); //去抖cord_h=P3&0x0f; //读入列线值if(cord_h!=0x0f){P3=cord_h|0xf0; //输出当前列线值cord_l=P3&0xf0; //读入行线值return(cord_h+cord_l);//键盘最后组合码值并返回}}return(0xff); //否则返回固定值0xff}void delay(uint i)//延时函数{while(i--);}。
单片机实训课程之:呼吸灯一.设计要求二.相关原理三.论证分析四.硬件原理五.软件程序设计六.测试方法与结果七.使用说明(附录)一.设计要求呼吸灯顾名思义就是让LED灯的闪烁像呼吸一样,时呼时吸,时亮时暗。
二.相关原理呼吸灯的原理:呼吸灯,是用LED模拟呼吸的过程,即渐亮再渐暗再渐亮再渐暗……如此往复,再利用LED的余辉和人眼的暂留效应,看上去就和人的呼吸一样了。
三.论证分析程序流程图(1)80C511.单片机定义“单片机”就是将计算机的基本部件集成到一块芯片上,包括CPU、ROM、RAM、并行口、串行口、定时器/计数器、中断系统、系统时钟等。
MCS-51的微处理器是由运算器和控制器构成所的。
运算器:主要用来对操作数进行算术、逻辑运算和位操作。
主要包括算术逻辑运算单元ALU、累加器A、寄存器B、位处理器、程序状态字寄存器PSW以及BCD码修正电路等。
控制器:单片机的指挥控制部件,控制器的主要任务是识别指令,并根据指令的性质控制单片机各功能部件,从而保证单片机各部分能自动而协调地工作。
(2)时钟电路外部时钟方式是使用外部振荡脉冲信号,常用于多片MCS-51单片机同时工作,以便于同步。
外部时钟电路,是由一个12MHz晶振和两个瓷片电容组成,为单片机提供标准时钟,其中两个瓷片电容起微调作用,外接晶振频率精确度直接影响电子钟计时的准确性。
(外部时钟方式是把外部已经有的时钟信号引入到单片机内部。
时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。
在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间。
)2.单片机电子钟利用内部定时/计数器溢出产生中断(12M晶振一般为50ms)再乘以相应的倍率来实现秒、分、时的转换。
从定时/计数器产生中断请求到响应中断需要3-8个机器周期,定时中断子程序中的数据入栈和重装定时/计数器的初值还需要占用数个机器周期,还有从中断入口转到中断子程序也要占用一定的机器周期。