51单片机彩灯控制(包括功能说明、原理及C程序)

发布者:纸扇轻摇最新更新时间:2015-07-16 来源: 51hei关键字:51单片机  彩灯控制 手机看文章 扫描二维码
随时随地手机看文章
/*一、功能说明:

此程序是一款普通的彩灯,它通过电源
开关控制四种模式,即关掉电源然后打开电源就可以改变
一种模式,它的功能主要有四种模式分别如下:第一种模式
:开机四种颜色以0.5秒速度循环1次,然后在白颜色上停止
循环,即显示白光第二种模式:按下功能键后,它以1秒
速度四种颜色不停的循环第三种模式:当按键按下后它会
记住第二种模式的颜色,比如第二种模式现在亮得是绿色,
你按下按键时,它会先闪一下,然后在绿颜色上停下来第
四模式:当你再按下开关时,它自动回到模式一下,在模式
三下,当它断电时,可以记住模式三  些产品特点:利用
电源开关切换功能,断电数据保存,起到减小EEPROM擦除
次数.程序部分转自51单片机www.51hei.com已测试ok*/

/*二、电路原理图:

/*三、完整的参考程序:点击下载  */

#include

#include

#define uint unsigned int

#define uchar unsigned char

sfr          DATA=0xE2;//数据寄存器

sfr          ADDRH=0xE3;//地址寄存器高八位

sfr          ADDRL=0xE4;//地址寄存器低八位

sfr          CMD=0xE5;//命令模式寄存器

sfr          TRIG=0xE6;//命令触发寄存器

sfr          CONTR=0xE7;//控制寄存器

sbit RJ=P2^5;//红灯IO口

sbit GJ=P2^6;//绿灯IO口

sbit BJ=P2^7;//兰灯IO口

uchar ding3,yin,x,m;//分别为定时器变量,标志位变量,以及颜色标志位变量

bit a=1,b,c;//分别为模式1.2.3标志位

/*******************************/

/***********延时子程序***********/

/*******************************/

void delay(uint z)

{

       uint x,y;

       for(x=100;x>0;x--)

       for(y=z;y>0;y--);

}

/*******************************/

/*********读EEPROM子程序*********/

/*******************************/

uchar read(uint add)

{

 

       CONTR=0x81;//控制寄存器打开,12MHZ晶体,所以将时间设为01

       CMD=0x01;//设置EEPROM为读的方式(1)

       ADDRH=(add>>=8);//给高位数

       ADDRL=add&(0x00ff);//给低位数

       TRIG=0x46;//激活

       TRIG=0xb9;//激活

        _nop_();//延时

       CONTR=0x00;//保护起来

       TRIG=0X00;//保护起来

       return DATA;//将读出来的值返回

}

[page]

/*******************************/

/*********写EEPROM子程序*********/

/*******************************/

void program(uint add,uchar vale)//add为写数地址 vale为要存得数

{

 

       CONTR=0x81;//控制寄存器打开,12MHZ晶体,所以将时间设为01

       CMD=0X02;//设置EEPROM为写的方式(2)

       ADDRH=(add>>=8);

       ADDRL=add&(0x00ff);

       DATA=vale;//将要存的数放到寄存器内

       TRIG=0x46;

       TRIG=0xb9;

        _nop_();

       CONTR=0x00;

       TRIG=0X00;

}

/*******************************/

/*****擦除EEPROM子程序*******/

/*******************************/

void sector(uint add)

{

       CONTR=0x81;//控制寄存器打开,12MHZ晶体,所以将时间设为01

       CMD=0x03;//设置EEPROM为擦除的方式(3)

       ADDRH=(add>>=8);//给高位数

       ADDRL=add&(0x00ff);//给低位数

       TRIG=0x46;

       TRIG=0xb9;

        _nop_();

       CONTR=0x00;

       TRIG=0X00;

}

/*******************************/

/*******三种模式显示子程序******/

/*******************************/

void xian()

{

       if(a!=0)//第一种模式以0.5秒速度循环闪烁一次,然后在白光处停下来

       {

              if(ding3>=10)//定时器到了0.5秒吗?

              {

                     ding3=0;

                     x++;//将标志位加1,以便进入下一种颜色

                     switch(x)

                     {

                            case 1:RJ=1;GJ=0;BJ=0;//亮红光      

                            break;

                            case 2:RJ=0;GJ=1;BJ=0;//亮绿光      

                            break;

                            case 3:RJ=0;GJ=0;BJ=1;//亮兰光      

                            break;

                            case 4:RJ=1;GJ=1;BJ=1;a=0;//亮白光,//将标志位a清0,以便再次循环          

                            break;

                     }

              }

       }

       if(b!=0)//第二种模式以1秒速度一直循环闪烁。

       {

              if(ding3>=20)

              {

                     ding3=0;

                     x++;

                     switch(x)

                     {

                            case 1:RJ=1;GJ=0;BJ=0;m=x;//将x变量内给m保存起来,以便进入模式三时能准确的锁定一种状态

                            break;

                            case 2:RJ=0;GJ=1;BJ=0;m=x;

                            break;

                            case 3:RJ=0;GJ=0;BJ=1;m=x;

                            break;

                            case 4:RJ=1;GJ=1;BJ=1;m=x;x=0;

                            break;

                     }

 

              }

       }

       if(c!=0)//第三种模式记住模式二时按键按下的颜色,然后锁定。

       {

              RJ=0;GJ=0;BJ=0;

              delay(550);

              switch(m)//判断上一次模式三的状态,然后确定显示哪种颜色

              {

                     case 1:RJ=1;GJ=0;BJ=0;

                     break;

                     case 2:RJ=0;GJ=1;BJ=0;

                     break;

                     case 3:RJ=0;GJ=0;BJ=1;

                     break;

                     case 4:RJ=1;GJ=1;BJ=1;

                     break;

              }

 

              c=0;//将标志位清0,以便再次循环

       }

}

/*******************************/

/*************主程序************/

/*******************************/

void main()

{

       RJ=0;//将R LED关闭

       GJ=0;//将G LED关闭

       BJ=0;//将B LED关闭

       TMOD=0X01;//寄存器工作方式

       EA=1;//开总中断

       TR0=1;//开定时器

       ET0=1;//开定时器中断

       IT0=1;

       EX0=1;

       TH0=(65536-50000)/256;//赋值给高位

       TL0=(65536-50000)%256;//赋值给低位

       if(read(0x2200)==0x03)//开机检测是否是在第三种模式下,如果下则读出断电时的数据(即颜色)

       {   

              m=read(0x2000);//读出断电时的颜色

              a=0;//将模式1关闭

              b=0;//将模式2关闭

              c=1;//将模式3打开

       }

       else

       {

              a=1;//将模式1打开

              b=0;//将模式2关闭

              c=0;//将模式3关闭

       }

       while(1)

       xian();//调用显示子程序                  

}[page]

void zhong() interrupt 1//T1中断服务程序

{

       TH0=(65536-50000)/256;//赋值给高位

       TL0=(65536-50000)%256;//赋值给低位

       ding3++;//将按键计数器加1

}

void zhongk() interrupt 0

{

 

/*******************************/

/****按键处理及数据保存子程序***/

/*******************************/

       EX0=0;

       switch(yin)//执行一键多功能程序

       {

              case 0://如果0与yin比较相等,则执行break前的所有内容

              delay(100);

              sector(0x2200);//擦除

              program(0x2200,0x02);//在0x2200地址处写入数0x02

              delay(100);

              yin++;//将变量加1,此句很重要,作用是以使下次按下时好执行下一开关语句

              a=0;//将a变为0

              c=0;

              b=1;//将b变为1,即打开按键程序中的第二段程序

              x=0;//清掉颜色计数变量,以便它从红色开始循环

              break;//退出开关语句

              case 1:

              delay(100);

              sector(0x2200);//擦除

              program(0x2200,0x03);//在0x2200地址处写入数0x03

              sector(0x2000);////擦除

              program(0x2000,m);//在0x2000地址处写入变量m,以便在模式三下形成断电保护

              delay(100);

              yin++;//将变量加1,此句很重要,作用是以使下次按下时好执行下一开关语句

              b=0;

              c=1;//打开第三种模式标志位,即锁定状态

              a=0;

              x=0;//清掉颜色计数变量,以便它从红色开始循环

              break;//退出开关语句

              case 2:

              delay(100);

              sector(0x2200);//擦除

              program(0x2200,0x01);//在0x2200地址处写入数0x01

              delay(100);

              b=0;//将b变为0,即关闭上一次功能

              c=0;//关闭上前面的功能

              a=1;//打开第1次功能,即0.5秒循环闪烁

              yin=0;

              x=0;//清掉颜色计数变量,以便它从红色开始循环

              break;//退出开关语句

       }

       delay(255);

       EX0=1;

}

关键字:51单片机  彩灯控制 引用地址:51单片机彩灯控制(包括功能说明、原理及C程序)

上一篇:用单片机+DAC0832来解码wav音乐C51程序
下一篇:51单片机ADC0804模数转换学习

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

8051单片机特殊功能寄存器SFR基础详解
8051单片机共有21个专用寄存器,现把其中部分寄存器简单介绍如下: 程序计数器(PC—Program Counter)。在实训中,我们已经知道PC是一个16位的计数器,它的作用是控制程序的执行顺序。其内容为将要执行指令的地址,寻址范围达64KB。PC有自动加1功能,从而实现程序的顺序执行。PC没有地址,是不可寻址的,因此用户无法对它进行读写,但可以通过转移、调用、返回等指令改变其内容,以实现程序的转移。因地址不在SFR(专用寄存器)之内,一般不计作专用寄存器。 累加器(ACC—Accumulator)。累加器为8位寄存器,是最常用的专用寄存器,功能较多,地位重要。它既可用于存放操作数,也可用来存放运算的中间结果。MCS-
[单片机]
80<font color='red'>51单片机</font>特殊功能寄存器SFR基础详解
Keil C51单片机变量的使用方法详细介绍
引言 8051内核单片机是一种通用单片机,在国内占有较大的市场份额。在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功。由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用与标准C有所不同。正确地使用变量,有利于获得高效的目标代码。下面详细介绍Keil C51中变量的使用方法。 1 CPU存储结构与变量的关系 变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同。 标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CPU内部有寄存器,外部有存储器,寄存器的访问速度大大高于存储器的访问速度。在标准C中,不加特别定义的变量是放在存储器中的,使用register可以强制变量
[单片机]
Keil C<font color='red'>51单片机</font>变量的使用方法详细介绍
单片机教程-MCS-51单片机简述
MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031的名称。INTEL公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,当然,功能或多或少有些改变,以满足不同的需求,其中89C51就是这几年在我国非常流行的单片机,它是由美国ATMEL公司开发生
[单片机]
DS2450转换器与51单片机接口设计
在普通方式下其串行通信速率为16.3kbps,而超速工作模式时的速率可达 142kbps,片内16位循环冗余校验码生成器可用于检测通信的正确性。DS2450是DALLAS公司生产的单总线四通道逐次逼近式A/D转换器芯片,它的输入电压范围、转换精度位数和报警门限电压均可编程;每个通道均可用各自的存储器来存储电压范围设置、转换结果和门限电压等参数。DS2450采用8脚SOIC小体积封装。它既可用单5V电源供电,也可采用寄生电源方式供电,芯片正常工作时的功耗仅2.5mW,空闲时的功耗为25μW。多个DS2450或其它功能的具有MicroLAN接口的单总线芯片可以并联,CPU只需一根端口线就能与诸多单总线芯片通信,而且占用微处理器的端
[单片机]
DS2450转换器与<font color='red'>51单片机</font>接口设计
51单片机-定时中断与LED闪烁
这次说定时与中断,有人说,掌握了定时与中断,就掌握了一个单片机80%的功能;也有人说,中断是一个单片机的灵魂。这两句话无一不在强调中断的重要性,就让我们认识一下,中断到底是什么。 根据百度百科的定义:指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。 举个例子,我正在吃饭呢,忽然老婆大人发话了,说在网上看上一个包,挺好的,让我帮着付款,于是我停下吃饭说好,去帮着付款,付完款,继续吃饭。 这个过程中,我是CPU;吃饭是主程序;老婆大人说话,触发了中断;我说好,安慰
[单片机]
51单片机串口收发字符串源程序
想要通过串口控制led,但是串口每次中断只能发送一个字符,这样在控制的时候不太容易清楚各个命令是控制哪一部分,所以参考网上的资料,写了个简单的字符串收发函数。本程序的功能是:电脑串口助手发送数据给单片机,单片机接收后返回给电脑,在发送的时候,需要空两格再输入想要传送的内容,不然的话传输的数据会丢失,因为这个情况不影响串口控制LED,所以就没管了。 单片机源程序如下: #include reg52.h typedef unsigned char uchar; typedef unsigned int uint; sbit led=P2^0; void Usart_Init() { TMOD=0X20; PCON=0X80; S
[单片机]
<font color='red'>51单片机</font>串口收发字符串源程序
51单片机8乘8点阵LED显示原理及程序
在8X8点阵LED上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。 1. 程序设计内容 8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述: 一根竖柱:对应的列置1,而行则采用扫描的方法来实现。 一根横柱:对应的行置0,而列则采用扫描的方法来实现。 2. 硬件电路 3.汇编源程序 ORG 00
[单片机]
<font color='red'>51单片机</font>8乘8点阵LED显示原理及程序
基于51单片机-C语言之预处理总结
简介:编译预处理器是C语言编译器的一个重要组成部分。很好的利用C语言的预处理命令可以增强代码的可读性,灵活性,和易于修改等特点,便于程序的结构化。 预处理命令由符号“#”开头,包括宏定义,文件包含,条件处理三个部分。 其中条件编译我还没有用过,所以就详细介绍一下宏定义和文件包含。 一.宏定义 宏定义命令为#define,它的作用就是实现用一个简单易读的字符串来代替 另一个字符串。增加程序的可读性,和维护性。 宏定义分为不带参数的宏定义,和带参数的宏定义。 不带参的宏定义: 一般格式:#define 标识符 常量表达式 例如用一个字符代替一个常数 #define PI 3.1415926
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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