久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學習與研究
當前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

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

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2012年07月17日   【字體:

/*一、功能說明:
此程序是一款普通的彩燈,它通過電源
開關(guān)控制四種模式即關(guān)掉電源然后打開電源就可以改變
一種模式,它的功能主要有四種模式分別如下:第一種模式
開機四種顏色以0.5秒速度循環(huán)1次,然后在白顏色上停止
循環(huán),即顯示白光第二種模式:按下功能鍵后,它以1秒
速度四種顏色不停的循環(huán)第三種模式:當按鍵按下后它會
記住第二種模式的顏色,比如第二種模式現(xiàn)在亮得是綠色,
你按下按鍵時,它會先閃一下,然后在綠顏色上停下來
四模式:當你再按下開關(guān)時,它自動回到模式一下,在模式
三下,當它斷電時,可以記住模式三  些產(chǎn)品特點:利
電源開關(guān)
切換功能,斷電數(shù)據(jù)保存,起到減小EEPROM擦除
次數(shù).程序部分轉(zhuǎn)自51單片機m.zg4o1577.cn
已測試ok*/

/*二、電路原理圖:

/*三、完整的參考程序:點擊下載  */

#include<reg52.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;//分別為定時器變量,標志位變量,以及顏色標志位變量

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晶體,所以將時間設(shè)為01

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

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

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

       TRIG=0x46;//激活

       TRIG=0xb9;//激活

        _nop_();//延時

       CONTR=0x00;//保護起來

       TRIG=0X00;//保護起來

       return DATA;//將讀出來的值返回

}

 

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

/*********寫EEPROM子程序*********/

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

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

{

 

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

       CMD=0X02;//設(shè)置EEPROM為寫的方式(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;//控制寄存器打開,12MHZ晶體,所以將時間設(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)閃爍一次,然后在白光處停下來

       {

              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,以便再次循環(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變量內(nèi)給m保存起來,以便進入模式三時能準確的鎖定一種狀態(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)//第三種模式記住模式二時按鍵按下的顏色,然后鎖定。

       {

              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;//將標志位清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;//開總中斷

       TR0=1;//開定時器

       ET0=1;//開定時器中斷

       IT0=1;

       EX0=1;

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

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

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

       {   

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

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

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

              c=1;//將模式3打開

       }

       else

       {

              a=1;//將模式1打開

              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++;//將按鍵計數(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地址處寫入數(shù)0x02

              delay(100);

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

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

              c=0;

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

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

              break;//退出開關(guān)語句

              case 1:

              delay(100);

              sector(0x2200);//擦除

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

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

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

              delay(100);

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

              b=0;

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

              a=0;

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

              break;//退出開關(guān)語句

              case 2:

              delay(100);

              sector(0x2200);//擦除

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

              delay(100);

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

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

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

              yin=0;

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

              break;//退出開關(guān)語句

       }

       delay(255);

       EX0=1;

}

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 日韩三级在线 | 国产精品自拍av | 欧美日本一区二区 | 久久久一区二区三区四区 | 国产精品久久久久久久久久久新郎 | 久久大陆| 欧美激情久久久久久 | 国产精品99 | 一级毛片视频 | 久久久精品一区二区三区 | 91麻豆精品国产91久久久久久 | 久久逼逼| 中文字幕在线观看一区二区 | 久久久久久99 | 久久男人 | 区一区二区三在线观看 | 久久九九影视 | 岛国毛片在线观看 | 一区二区三区免费看 | 亚洲一区二区av在线 | 久久久.com| 色黄网站 | 欧美自拍一区 | 成人在线观看免费 | 91久色 | 色av一区二区 | 亚洲欧美日韩在线不卡 | 日本成人三级电影 | 81精品国产乱码久久久久久 | 久久久一| 国产欧美日韩综合精品一 | av网站在线看 | 精品久久久一区 | 九九热精品在线 | 中文字幕第90页 | 一级欧美 | 国产乱码精品1区2区3区 | 国产免国产免费 | 免费一级片 | 国产伦一区二区三区四区 | 91精品国产91久久久久久不卞 |