51单片机的七彩LED灯渐变调光调色程序

发布者:火星最新更新时间:2015-05-25 来源: 51hei关键字:51单片  七彩LED灯  渐变调光调色 手机看文章 扫描二维码
随时随地手机看文章
//------------------------------------------------------------------------------------
// Main.c
//------------------------------------------------------------------------------------
// Copyright (C) 2013 Shenyang JYXD.
//  WEN BO RUI
// Tool chain: KEIL Full  'c'
//
//#pragma CD OE DB SB       // Compilation directives
#include
#include
#define uchar unsigned char
#define uint  unsigned int
uint  Period;                 //Period刷新周期
uint  PWM;
uint  Pulse;         //脉冲个数
uchar Speed;         //速度变量
uchar count;
uint excount;
bit Gra;          //渐变/跳变总控制位
bit Gra7;          //七彩渐亮渐灭控制位
bit Gra3;          //红绿蓝渐亮渐灭控制位
bit BP;           //亮到暗,暗到亮转换位
bit LEDdelay ;                                //LED定时到标志位 
sbit key1 = P3^1;           //花样组合键1  
sbit key2 = P3^0;             //花样组合键2 
sbit key3 = P3^5;             //速度组合键1
sbit key4 = P3^4;        //速度组合键2
uchar led1[12]={0x10,0x030,0x20,0x60,0x40,0x50,0x70,0x50,0x40,0x60,0x20,0x30};//红、黄、绿、青、蓝、粉、白、粉、蓝、青、绿、黄
uchar led2[24]={0x10,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0x40,0x00,0x50,0x00,
    0x70,0x00,0x50,0x00,0x40,0x00,0x60,0x00,0x20,0x00,0x30,0x00};
uchar led3[3]={0x10,0x20,0x40};     //红、绿、蓝
uchar ledcount,ledcount1;
//***********************************************************
//以下定义函数
// 1毫秒延时函数delayms();花样及速度扫描函数keyscan();
//***********************************************************
/*void delayms(unsigned int ms)
{
    unsigned char i ;
    while(ms--)
     {
        for(i = 0 ; i < 120 ; i++) ;
     }
}*/
void Pattern1();             //花样1函数--------->跳变无灭灯过程
void Pattern2();             //花样2函数--------->跳变有灭灯过程
void Pattern34();
void keyscan()
{
 if((key4==1)&&(key3==1))  {Speed   = 20;Period = 25;}   //预设4种速度200MS
 if((key4==0)&&(key3==1))  {Speed   = 50;Period = 50;}    //500MS
 if((key4==1)&&(key3==0))  {Speed   = 100;Period = 100;}    //1S 
 if((key4==0)&&(key3==0))  {Speed   = 150;Period = 200;}    //1.5S
 if((key2==1)&&(key1==1))  {ledcount1 = 0;Pattern1();}   //预设4种花样
    if((key2==0)&&(key1==1))  {ledcount1 = 0;Pattern2();}
 if((key2==1)&&(key1==0))  {ledcount = 0;Gra3 = 1;Pattern34();}
 if((key2==0)&&(key1==0))  {ledcount = 0;Gra7 = 1;Pattern34();}
}
void value()
{
 if(Speed == 20) PWM = Pulse*8;
 if(Speed == 50) PWM = Pulse*4;         //脉冲个数
 if(Speed == 100)PWM = Pulse*2;
 if(Speed == 150)PWM = Pulse;
}
void Reset(void)

 unsigned char code rst[ ]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};
 (*((void (*)(void))(rst)))();
}
void main()
{
 _nop_ ();
 _nop_ ();
 _nop_ ();
 P1 = 0;
 TMOD = 0x11;             //11.0592M晶振的10ms定时初值(100分之一秒) 
 TH0  = 0x0db;
 TL0  = 0x0ff;
 TH1  = 0x0ff;             //0.05ms(20000分之一秒)
 TL1  = 0x0D1;
 EA = 1;                       //开启总中断允许
 ET0 = 1;                     //允许T0定时器中断
 ET1 = 1;                     //允许T1定时器中断
 TR0 = 1;                    //开启T0定时器
 EX0=1;               //开外部中断0
  IT0=1;               //下降沿触发
 while(1)
 {
  
  keyscan();
 }
}
//*************************************************************************
//Pattern1() 花样函数1-------------跳变无灭灯过程
//*************************************************************************
void Pattern1()
{
 //keyscan();
 Gra = 0;              //跳变位=0
 if(LEDdelay)
  {
   LEDdelay = 0;
   P1 = led1[ledcount];
   ledcount++;
   if(ledcount>11)
    {
     ledcount = 0;
    }
  }
}
//***********************************************************************
//Pattern2() 花样函数2-------------跳变有灭灯过程
//***********************************************************************
void Pattern2()
{
 //keyscan();
 Gra = 0;
 if(LEDdelay)
  {
   LEDdelay = 0;
   P1 = led2[ledcount];
   ledcount++;
   if(ledcount>23)
    {
     ledcount = 0;
    }
  }   
}
//***********************************************************************
//Pattern3() 花样函数3-------------3彩渐变
//***********************************************************************
/*void Pattern3()
{
 keyscan();
 if(Speed == 20) Period = 25;
 if(Speed == 50) Period = 50;
 if(Speed == 100)Period = 100;   
 if(Speed == 150)Period = 200;
 Gra = 1;
 Gra3 = 1;
}*/[page]
//***********************************************************************
//Pattern4() 花样函数4-------------7彩渐变
//***********************************************************************
void Pattern34()
{
 Gra = 1;             //渐变位 = 1
}
/*********************************************************/
// 定时器0中断服务程序
/*********************************************************/
void time0(void) interrupt 1
{
 TR1 =0;
 TF0 =0;
 TH0=0xdb;           //重新写入初值
 TL0=0xff;  
    if(!Gra)           //执行跳变程序
  {
   count ++;
   if(count > Speed)
    {
     LEDdelay = 1;
     count = 0;
    }
  }
 if(Gra)
  {
   TR1 = 1;         //开启TR1;
   if(!BP)             //       
    {
      if(Gra7)
      {
       P1 = led1[ledcount1];  //10ms到,亮相应的LED
      }
     if(Gra3)
      {
       P1 = led3[ledcount1];  //10ms到,亮相应的LED
      }
     Pulse++;
     value();
     if(Pulse >= Period)
      {
       Pulse = Period;
       BP = 1;      //一个周期完成转换模式
      }
    }
   if(BP)
    {
     if(Gra7)
      {
       P1 = led1[ledcount1];  //10ms到,亮相应的LED
      }
     if(Gra3)
      {
       P1 = led3[ledcount1];  //10ms到,亮相应的LED
      }
     value();     
     Pulse--;       //脉冲个数
     if(Pulse == 0)
      {
       Pulse = 0;
       BP = 0;      //一个周期完成转换模式
       ledcount1++;
       if(Gra7)
       {
        if(ledcount1 > 11)
         {
          ledcount1 = 0;
         }
         Gra7 = 0;
          }
       if(Gra3)
       {
        if(ledcount1 > 2)
         {
          ledcount1 = 0;
         }
         Gra3 = 0;
          }
      }
    }
  }
}
/*********************************************************/
// 定时器1中断服务程序
/*********************************************************/
void timer1() interrupt 3
{
 PWM --;
 TH1  = 0xff;         //0.05ms(20000分之一秒)
 TL1  = 0xD1;
 if(PWM == 0)
  {
   P1 = 0;
   TR1 = 0;
  }
}
/*********************************************************/
// 外部中断0中断服务程序 下降沿触发
/*********************************************************/
void extern0(void) interrupt 0
{
 IE0 = 0;    // 清标志位 
 excount++;
 if(excount>50)      // 50大约3秒 
  {
   EA = 0;
   //P1_5 = 1;
   excount = 0;
   Reset();
  }
}
关键字:51单片  七彩LED灯  渐变调光调色 引用地址:51单片机的七彩LED灯渐变调光调色程序

上一篇:试验数码管上显示数字( 单片机直接实现位选 共阴极)
下一篇:基于单片机的电梯控制程序

推荐阅读最新更新时间:2024-03-16 14:03

基于51单片机控温程序及电路原理图
/*-------------------------------------------------------------------------------------------------------------------------------------------- * * * 该程序为一个完整的温度控制器程序 * * 最小系统温控板(后附图) * * 实现功能: * * 1 、 2X2 的矩阵按键:分别实现 ( 温度 +, 温度 - ,温度 * * 确认, 回 到初始化状态) * * 2 、先按键设定你要的温度值,然后按下确认键, * * 此时,水泥电阻开始加热,数码管动态显示电阻 * * 此
[单片机]
基于<font color='red'>51</font><font color='red'>单片</font>机控温程序及电路原理图
89c51单片机32个心形流水灯
#include reg52.h #include intrins.h //库函数 #define uint unsigned int #define uchar unsigned char//宏定义 void delay(uint xms)//延时函数 { uint i,j; for(i=xms;i 0;i--) for(j=110;j 0;j--); } void zys(uint t)//左右闪烁 { while(t--) { P3=P2=0x00; delay(500); P3=P2=0xff; P1=P0=0x00; delay(500);
[单片机]
89c<font color='red'>51</font><font color='red'>单片</font>机32个心形流水灯
基于51单片机的智能营养秤系统设计与实现
一、项目背景 随着人们生活水平和健康意识的提高,越来越多的人开始注重自己的饮食健康。在此背景下,智能营养秤系统应运而生,成为了一种非常实用的工具。本项目基于51单片机设计和实现一种智能营养秤系统,通过该系统可准确地测量食物的重量并计算其热量、蛋白质、脂肪、碳水化合物等营养成分含量。 当前系统采用了STC89C52单片机作为主控芯片,预置了多种食材的营养成分数据。用户只需要使用矩阵键盘输入食材编号,将需要称重的食材放置在重力传感器上进行依次称重,系统就可以自动计算出所有食材的各类营养含量总值,并通过液晶屏显示出来。同时,系统根据预设的营养指标,对不达标或超标的食材进行对应的声光提示,提醒用户注意饮食健康。 当前系统还配备了无
[单片机]
基于<font color='red'>51</font><font color='red'>单片</font>机的智能营养秤系统设计与实现
AT89C2051单片机双路路灯照明控制器
  通常我们常见的路灯、通道灯、广告灯箱等公共场所用照明灯具往往彻夜通明,或者说在白天不应照明时工作了,造成了电能的浪费。还有些因为采用了定时控制方式,随着季节的变化未能及时设置好控制器,造成了控制不适时,如天已暗灯未明等现象,影响了照明效果。本文介绍采用AT89C2O5l 单片机 制作的双路路灯照明控制器,仍然采用光控式,但与一般的光控开关相比由于采用了单片机,具有较强  的抗干扰性能,一路为夜间全明,另一路可设置晚上照明时间,到时自动关闭。 iframe id="iframeu2163852_0" src="http://pos.baidu.com/ycmm?conwid=250&conhei=250&rdid=216
[单片机]
AT89C20<font color='red'>51</font><font color='red'>单片</font>机双路路灯照明控制器
51单片机——外部中断
一、外部中断 1.1 中断 关于中断的概念在上一篇博客中已经提到了。(传送门:51单片机入门教程(5)——定时器中断) 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 51单片机的中断源优先级与向量号如下表: 1.2 外部中断 除了定时器中断外,51单片机还有两个外部中断源——外部中断0、外部中断1。分别由单片机的12号引脚(INT0/P3.2)、13号(INT1/P3.3)引脚的低电平/负跳变触发。 和定时器中断一样,要使用这两个外部中断,首先要进行初始化操作,即写入相关的寄存器。初始化外部中断需要写入下面两
[单片机]
<font color='red'>51</font><font color='red'>单片</font>机——外部中断
51单片机-IIC&EEPROM合成文件
1.浅释E2Write函数 宋老师的例程lesson14_3和lesson14_4里的“E2Write(unsigned char *buf, unsigned char addr, unsigned char len)”书写内容是不一样的,lesson14_4的E2Write函数比lesson14_3的E2Write函数运行高效,lesson14_3的E2Write函数是每写入一个字节就要经历起始信号,停止信号,写入下一个字节又要把这些步骤经历一遍。而lesson14_4的E2Write函数支持EEPROM页写入(参考《手把手教你学51单片机》文档14.3.3节),所以在建立起文件时我们选用lesson14_4的E2Writ
[单片机]
<font color='red'>51</font><font color='red'>单片</font>机-IIC&EEPROM合成文件
跟我学51单片机(六):单片机外部中断及红外遥控器解码
  一、内容提要   上讲介绍并应用了单片机动态扫描驱动数码管,并给出了实例。这一讲将重点介绍单片机如何通过捕获来实现对红外遥控器解码。通过该讲,读者可以掌握红外遥控器的编码原理以及如何通过单片机对遥控器进行解码。   二、原理简介   随着家用电器、视听产品的普及,红外线遥控器已被广泛使用在各种类型的家电产品上(如遥控开关、智能开关等)。其具有体积小、抗干扰能力强、功耗低、功能强、成本低等特点,在工业设备中也得到广泛应用。   一般而言,一个通用的红外遥控系统由发射和接收两大部分组成,如图1 所示: 图1 红外遥控系统框图   其中发射部分主要包括键盘矩阵、编码调制、红外发射管;接收部分包括光、电信号的转换以及放大
[单片机]
跟我学<font color='red'>51</font><font color='red'>单片</font>机(六):<font color='red'>单片</font>机外部中断及红外遥控器解码
AT89C51单片机在无线数据传输中的应用
一般的数字采集系统,是 通过 传感 器将捕捉的现场 信号 转换为电信号,经模/数转换器ADC采样、量化、编码后,为成数字信号,存入数据 存储器 ,或送给微处理器,或通过无线方式将数据发送给接收端进行处理。无线数据传输系统就是 样一套利用无线手段,将采集的数据由测量站发送到主控站的设备。 1 系统组成 系统组成如图1、图2所示。   系统由测量站和主控站两部分组成。测量站主要完成对现场信号的采集、存储,接收遥控 指令并 发送数据。主控站的主要工作是发送遥控指令、接收数据信息、进行数据处理和数据管理、随机显示打印等。 2 AT89C51与数字电台的串行通信 Atmel公司的AT89C51单片机,是一种低功耗、高 性能 的、片
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved