51单片机彩灯控制(包括功能说明、原理及C程序)
/*一、功能说明:
此程序是一款普通的彩灯,它通过电源开关控制四种模式,即关掉电源然后打开电源就可以改变一种模式,它的功能主要有四种模式分别如下:
第一种模式:开机四种颜色以0.5秒速度循环1次,然后在白颜色上停止循环,即显示白光
第二种模式:按下功能键后,它以1秒速度四种颜色不停的循环
第三种模式:当按键按下后它会记住第二种模式的颜色,比如第二种模式现在亮得是绿色,你按下按键时,它会先闪一下,然后在绿颜色上停下来
第四模式:当你再按下开关时,它自动回到模式一下,在模式
三下,当它断电时,可以记住模式三 些产品特点:利用
电源开关切换功能,断电数据保存,起到减小EEPROM擦除
次数.程序部分转自51单片机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
- 关于RTX51 TINY的分析与探讨(05-30)
- 浅析8051模块化编程技巧(05-28)
- 基于DSP和单片机通信的液晶显示设计方案(07-20)
- 锁相环控制及初始化简析(08-27)
- 基于MSP430自动胀管控制器的研究(09-07)
- 嵌入式C实现延时程序的不同变量的区别(03-01)