新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)彩燈控制(包括功能說(shuō)明、原理及C程序)

51單片機(jī)彩燈控制(包括功能說(shuō)明、原理及C程序)

作者: 時(shí)間:2012-08-02 來(lái)源:網(wǎng)絡(luò) 收藏

/*一、功能說(shuō)明:
此程序是一款普通的彩燈,它通過(guò)電源開(kāi)關(guān)控制四種模式,即關(guān)掉電源然后打開(kāi)電源就可以改變一種模式,它的功能主要有四種模式分別如下:

第一種模式:開(kāi)機(jī)四種顏色以0.5秒速度循環(huán)1次,然后在白顏色上停止循環(huán),即顯示白光

第二種模式:按下功能鍵后,它以1秒速度四種顏色不停的循環(huán)

第三種模式:當(dāng)按鍵按下后它會(huì)記住第二種模式的顏色,比如第二種模式現(xiàn)在亮得是綠色,你按下按鍵時(shí),它會(huì)先閃一下,然后在綠顏色上停下來(lái)

第四模式:當(dāng)你再按下開(kāi)關(guān)時(shí),它自動(dòng)回到模式一下,在模式
三下,當(dāng)它斷電時(shí),可以記住模式三 些產(chǎn)品特點(diǎn):利用
電源開(kāi)關(guān)切換功能,斷電數(shù)據(jù)保存,起到減小EEPROM擦除
次數(shù).程序部分轉(zhuǎn)自www.51hei.com已測(cè)試ok*/

/*二、電路原理圖:

點(diǎn)擊瀏覽下一頁(yè)

/*三、完整的參考程序:點(diǎn)擊下載 */

#includereg52.h>

#include intrins.h>

#define uint unsigned int

#define uchar unsigned char

sfr DATA=0xE2;//數(shù)據(jù)寄存器

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

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

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

sfr TRIG=0xE6;//命令觸發(fā)寄存器

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

sbit RJ=P2^5;//紅燈IO口

sbit GJ=P2^6;//綠燈IO口

sbit BJ=P2^7;//蘭燈IO口

uchar ding3,yin,x,m;//分別為定時(shí)器變量,標(biāo)志位變量,以及顏色標(biāo)志位變量

bit a=1,b,c;//分別為模式1.2.3標(biāo)志位

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

/***********延時(shí)子程序***********/

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

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;//控制寄存器打開(kāi),12MHZ晶體,所以將時(shí)間設(shè)為01

CMD=0x01;//設(shè)置EEPROM為讀的方式(1)

ADDRH=(add>>=8);//給高位數(shù)

ADDRL=add(0x00ff);//給低位數(shù)

TRIG=0x46;//激活

TRIG=0xb9;//激活

_nop_();//延時(shí)

CONTR=0x00;//保護(hù)起來(lái)

TRIG=0X00;//保護(hù)起來(lái)

return DATA;//將讀出來(lái)的值返回

}

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

/*********寫(xiě)EEPROM子程序*********/

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

void program(uint add,uchar vale)//add為寫(xiě)數(shù)地址 vale為要存得數(shù)

{

CONTR=0x81;//控制寄存器打開(kāi),12MHZ晶體,所以將時(shí)間設(shè)為01

CMD=0X02;//設(shè)置EEPROM為寫(xiě)的方式(2)

ADDRH=(add>>=8);

ADDRL=add(0x00ff);

DATA=vale;//將要存的數(shù)放到寄存器內(nèi)

TRIG=0x46;

TRIG=0xb9;

_nop_();

CONTR=0x00;

TRIG=0X00;

}

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

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

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

void sector(uint add)

{

CONTR=0x81;//控制寄存器打開(kāi),12MHZ晶體,所以將時(shí)間設(shè)為01

CMD=0x03;//設(shè)置EEPROM為擦除的方式(3)

ADDRH=(add>>=8);//給高位數(shù)

ADDRL=add(0x00ff);//給低位數(shù)

TRIG=0x46;

TRIG=0xb9;

_nop_();

CONTR=0x00;

TRIG=0X00;

}

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

/*******三種模式顯示子程序******/

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

void xian()

{

if(a!=0)//第一種模式以0.5秒速度循環(huán)閃爍一次,然后在白光處停下來(lái)

{

if(ding3>=10)//定時(shí)器到了0.5秒嗎?

{

ding3=0;

x++;//將標(biāo)志位加1,以便進(jìn)入下一種顏色

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;//亮白光,//將標(biāo)志位a清0,以便再次循環(huán)

break;

}

}

}

if(b!=0)//第二種模式以1秒速度一直循環(huán)閃爍。

{

if(ding3>=20)

{

ding3=0;

x++;

switch(x)

{

case 1:RJ=1;GJ=0;BJ=0;m=x;//將x變量?jī)?nèi)給m保存起來(lái),以便進(jìn)入模式三時(shí)能準(zhǔn)確的鎖定一種狀態(tài)

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)//第三種模式記住模式二時(shí)按鍵按下的顏色,然后鎖定。

{

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

delay(550);

switch(m)//判斷上一次模式三的狀態(tài),然后確定顯示哪種顏色

{

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;//將標(biāo)志位清0,以便再次循環(huán)

}

}

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

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

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

void main()

{

RJ=0;//將R LED關(guān)閉

GJ=0;//將G LED關(guān)閉

BJ=0;//將B LED關(guān)閉

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

EA=1;//開(kāi)總中斷

TR0=1;//開(kāi)定時(shí)器

ET0=1;//開(kāi)定時(shí)器中斷

IT0=1;

EX0=1;

TH0=(65536-50000)/256;//賦值給高位

TL0=(65536-50000)%256;//賦值給低位

if(read(0x2200)==0x03)//開(kāi)機(jī)檢測(cè)是否是在第三種模式下,如果下則讀出斷電時(shí)的數(shù)據(jù)(即顏色)

{

m=read(0x2000);//讀出斷電時(shí)的顏色

a=0;//將模式1關(guān)閉

b=0;//將模式2關(guān)閉

c=1;//將模式3打開(kāi)

}

else

{

a=1;//將模式1打開(kāi)

b=0;//將模式2關(guān)閉

c=0;//將模式3關(guān)閉

}

while(1)

xian();//調(diào)用顯示子程序

}

void zhong() interrupt 1//T1中斷服務(wù)程序

{

TH0=(65536-50000)/256;//賦值給高位

TL0=(65536-50000)%256;//賦值給低位

ding3++;//將按鍵計(jì)數(shù)器加1

}

void zhongk() interrupt 0

{

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

/****按鍵處理及數(shù)據(jù)保存子程序***/

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

EX0=0;

switch(yin)//執(zhí)行一鍵多功能程序

{

case 0://如果0與yin比較相等,則執(zhí)行break前的所有內(nèi)容

delay(100);

sector(0x2200);//擦除

program(0x2200,0x02);//在0x2200地址處寫(xiě)入數(shù)0x02

delay(100);

yin++;//將變量加1,此句很重要,作用是以使下次按下時(shí)好執(zhí)行下一開(kāi)關(guān)語(yǔ)句

a=0;//將a變?yōu)?

c=0;

b=1;//將b變?yōu)?,即打開(kāi)按鍵程序中的第二段程序

x=0;//清掉顏色計(jì)數(shù)變量,以便它從紅色開(kāi)始循環(huán)

break;//退出開(kāi)關(guān)語(yǔ)句

case 1:

delay(100);

sector(0x2200);//擦除

program(0x2200,0x03);//在0x2200地址處寫(xiě)入數(shù)0x03

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

program(0x2000,m);//在0x2000地址處寫(xiě)入變量m,以便在模式三下形成斷電保護(hù)

delay(100);

yin++;//將變量加1,此句很重要,作用是以使下次按下時(shí)好執(zhí)行下一開(kāi)關(guān)語(yǔ)句

b=0;

c=1;//打開(kāi)第三種模式標(biāo)志位,即鎖定狀態(tài)

a=0;

x=0;//清掉顏色計(jì)數(shù)變量,以便它從紅色開(kāi)始循環(huán)

break;//退出開(kāi)關(guān)語(yǔ)句

case 2:

delay(100);

sector(0x2200);//擦除

program(0x2200,0x01);//在0x2200地址處寫(xiě)入數(shù)0x01

delay(100);

b=0;//將b變?yōu)?,即關(guān)閉上一次功能

c=0;//關(guān)閉上前面的功能

a=1;//打開(kāi)第1次功能,即0.5秒循環(huán)閃爍

yin=0;

x=0;//清掉顏色計(jì)數(shù)變量,以便它從紅色開(kāi)始循環(huán)

break;//退出開(kāi)關(guān)語(yǔ)句

}

delay(255);

EX0=1;

}



關(guān)鍵詞: 51單片機(jī) 彩燈控制

評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉