新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 51单片机彩灯控制(包括功能说明、原理及C程序)

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

作者:时间:2012-08-02来源:网络收藏

/*一、功能说明:
此程序是一款普通的彩灯,它通过电源开关控制四种模式,即关掉电源然后打开电源就可以改变一种模式,它的功能主要有四种模式分别如下:

第一种模式:开机四种颜色以0.5秒速度循环1次,然后在白颜色上停止循环,即显示白光

第二种模式:按下功能键后,它以1秒速度四种颜色不停的循环

第三种模式:当按键按下后它会记住第二种模式的颜色,比如第二种模式现在亮得是绿色,你按下按键时,它会先闪一下,然后在绿颜色上停下来

第四模式:当你再按下开关时,它自动回到模式一下,在模式
三下,当它断电时,可以记住模式三 些产品特点:利用
电源开关切换功能,断电数据保存,起到减小EEPROM擦除
次数.程序部分转自www.51hei.com已测试ok*/

/*二、电路原理图:

点击浏览下一页

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

#includereg52.h>

#include intrins.h>

#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;//将读出来的值返回

}

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

/*********写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();//调用显示子程序

}

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;

}



评论


相关推荐

技术专区

关闭