RGB爱心灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下(代码注释很详细):
- #include<reg52.h>//52头文件
- #include<intrins.h>//循环左右移 函数头文件
- #define uint unsigned int
- #define uchar unsigned char
- sbit wei1=P3^4;
- sbit wei2=P3^5;
- sbit wei3=P3^6;
- sbit wei4=P3^7;
- uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//从低位往高位移一个灯
- uchar code table1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//从高位往低位移一个灯
- uchar code table2[]={0xfe,0xfa,0xf8,0xf0,0xe0,0xa0,0x80,0x00};//从低位到高位逐步全部点亮
- uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//从高位到低位逐步全部点亮
- uchar code table4[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//从低位到高位逐步全部熄灭
- uchar code table5[]={0x80,0xa0,0xe0,0xf0,0xf8,0xfa,0xfe,0xff};//从高位到低位逐步全部熄灭
- uchar code table6[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//从低位到高位,灭一个灯移动
- uchar code table7[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//从高位到低位,灭一个灯移动
- uchar i;
- uint t;
- /**********************************/
- void delay(uint z) //延时函数
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=314;y>0;y--);
- }
- /************************************/
- void delay1ms(uchar a)//延时1ms
- {
- uchar x;
- while(a--)
- {
- for(x=0;x<150;x++);
- }
- }
- /**********************************/
- void delay0ms(uint z) //延时函数
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=10;y>0;y--);
- }
- /*************************************************
- //////////////////////////////////////////////////
- *************************************************/
- void deng0()//四组绿灯顺时针逐步点亮
- { P0=0xff;P1=0xff;
- wei1=0;wei2=0;wei3=0;wei4=0;//打开所有位
- for(i=0;i<8;i++)
- {
- P2=table3[i];
- delay(40);
- }
- wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
- P2=0xff;
- }
- /////////////////////////////////////////
- void deng0_1()//四组红灯顺时针逐步点亮
- { P1=0xff;P2=0xff;
- wei1=0;wei2=0;wei3=0;wei4=0;//打开所有位
- for(i=0;i<8;i++)
- {
- P0=table3[i];
- delay(40);
- }
- wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
- P0=0xff;
- }
- /////////////////////////////////////////////
- void deng0_2()//四组蓝灯顺时针逐步点亮
- { P0=0xff;P2=0xff;
- wei1=0;wei2=0;wei3=0;wei4=0;//打开所有位
- for(i=0;i<8;i++)
- {
- P1=table3[i];
- delay(40);
- }
- wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
- P1=0xff;
- }
- ///////////////////////////////////////
- void deng1()//四组洋红灯顺时针逐步熄灭
- {
-
- wei1=0;wei2=0;wei3=0;wei4=0;//打开所有位
- P2=0xff;
- for(i=0;i<8;i++)
- {
- P0=table5[i];
- P1=table5[i];
- delay(40);
- }
- wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
- P0=0xff;P1=0xff;
-
- }
- /*****************************************************************************/
- void deng3()//红、黄、绿、青、蓝、洋红、白、红,顺时针流动(循环左移,即高位向低位移)
- {
- uchar a,b,c;//绿、红、蓝
- a=0x8d;
- b=0x38;
- c=0xe1;
- /////////////
- wei1=0;wei2=0;wei3=0;wei4=0;//打开位
- P2=a;
- P0=b;
- P1=c;
- for(i=0;i<8;i++)
- {
- a=_cror_(a,1);//循环左移
- b=_cror_(b,1);//循环左移
- c=_cror_(c,1);//循环左移
- delay(100);//延时
- P2=a;
- P0=b;
- P1=c;
- }
- P0=0xff;P1=0xff;P2=0xff;
- wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
- }
- //////////////////////////////////////////
- void deng3_1()//蓝灯亮的时候,四个洋红灯转一下
- {
- wei1=0;wei2=0;wei3=0;wei4=0;//打开位
- P1=0x00;P0=0xff;//蓝灯全部亮
- for(i=0;i<8;i++)
- {
- P0=table1[i];
- delay(50);
- }
-
- P0=0xff;P2=0xff;
- wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
- }
- ///////////////////////////////////////////////
- void deng3_2()//绿灯亮的时候,四个红灯转一下
- {
- wei1=0;wei2=0;wei3=0;wei4=0;//打开位
- P1=0xff;P2=0x00;//绿灯全部亮
- for(i=0;i<8;i++)
- {
- P0=table0[i];
- delay(50);
- }
- P0=0xff;P2=0xff;
- wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
- }
- //////////////////////////////////////////////
- void deng3_3()//红灯亮的时候,四个洋红灯转一下
- {
- wei1=0;wei2=0;wei3=0;wei4=0;//打开位
- P0=0x00;P2=0xff;//红灯全部亮
- for(i=0;i<8;i++)
- {
- P1=table1[i];
- delay(50);
- }
- P0=0xff;P2=0xff;
- wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
- }
- ///////////////////////////////////////////////
- void deng3_4()//紫灯亮的时候,四个红灯转一下
- {
- wei1=0;wei2=0;wei3=0;wei4=0;//打开位
- P0=0x00;P1=0x00;P0=0xff;//紫灯全部亮
- for(i=0;i<8;i++)
- {
- P0=table6[i];
- delay(50);
- }
- P0=0xff;P1=0xff;
- wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
- }
- void deng3_5()//白灯亮的时候,四个青灯转一下
- {
- wei1=0;wei2=0;wei3=0;wei4=0;//打开位
- P1=0x00;P0=0x00;P2=0x00;//白灯全部亮
- for(i=0;i<8;i++)
- {
- P0=table7[i];
- delay(50);
- }
- P0=0xff;P1=0xff;P2=0xff;
- wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
- }
- /************************************************************
- *************************************************************/
- void rled6_1()//红,下面模块的小函数
- {
- for(i=0;i<8;i++)
- {
- P0=table1[i];
- delay(25);
- }
- P0=0xff;
- }
- /*******************************************/
- void rled7_1()//绿,下面模块的小函数
- {
- for(i=0;i<8;i++)
- {
- P2=table1[i];
- delay(25);
- }
- P2=0xff;
- }
- /***********************************/
- void rled8_1()//蓝,下面模块的小函数
- {
- for(i=0;i<8;i++)
- {
- P1=table0[i];
- delay(25);
- }
- P1=0xff;
- }
- /****************************************
- *****************************************/
- void deng6()//一个红灯,顺时针转动
- {
- wei3=1;wei2=1;wei1=1;
- wei4=0;//打开左上位
- rled6_1();//一个红灯顺时针转
- wei4=1;
- /////////////////////////////
- wei3=0;//打开右上位
- rled6_1();//一个红灯顺时针转
- wei3=1;
- /////////////////////////////
- wei2=0;//打开右下位
- rled6_1();//一个红灯顺时针转
- wei2=1;
- ////////////////////////////
- wei1=0;//打开左下位
- rled6_1();//一个红灯顺时针转
- wei1=1;
- }
- /************************************/
- void deng7()//一个绿灯,顺时针转动
- {
- wei4=0;//打开左上位
- rled7_1();//一个红灯顺时针转
- wei4=1;
- /////////////////////////////
- wei3=0;//打开右上位
- rled7_1();//一个红灯顺时针转
- wei3=1;
- /////////////////////////////
- wei2=0;//打开右下位
- rled7_1();//一个红灯顺时针转
- wei2=1;
- ////////////////////////////
- wei1=0;//打开左下位
- rled7_1();//一个红灯顺时针转
- wei1=1;
- }
- /*************************************/
- void deng8()//一个蓝灯,顺时针转动
- {
- /////////////////////////////
- wei2=0;//打开右下位
- rled8_1();//一个红灯顺时针转
- wei2=1;
- /////////////////////////////
- wei3=0;//打开右上位
- rled8_1();//一个红灯顺时针转
- wei3=1;
- /////////////////////
- wei4=0;//打开左上位
- rled8_1();//一个红灯顺时针转
- wei4=1;
- ////////////////////////////
- wei1=0;//打开左下位
- rled8_1();//一个红灯顺时针转
- wei1=1;
- }
- /********************************************/
- void deng9()//一位显示黄、绿、青、蓝、洋红、红、白,多彩流水,然后再显示下一位
- {
- wei3=0;//打开右上位选
- wei1=0;//打开左下位选
- /****************/ //黄色流水(红色全亮,绿色逐步点亮)
- P1=0xff;P2=0xff;
- P0=0x00;//红色全亮
- for(i=0;i<8;i++)
- {
-
- P2=table3[i];
- delay(30);
- }
-
- /****************/ //绿色流水(绿色全亮,红色逐步熄灭)
- P2=0x00;//绿色全亮
- for(i=0;i<8;i++ )
- {
- P0=table5[i];
- delay(30);
- }
- P0=0xff;//红色全灭
- /****************/ //青色流水(绿色全亮,蓝色逐步点亮)
- P2=0x00;//绿色全亮
- for(i=0;i<8;i++)
- {
- P1=table3[i];
- delay(30);
- }
- /**************/ //蓝色流水(蓝色全亮,绿色逐步熄灭)
- P1=0x00;//蓝色全亮,
- for(i=0;i<8;i++)
- {
- P2=table5[i];
- delay(30);
- }
- P2=0xff;//绿色灭
- /**************/ //洋红色流水(蓝色全亮,红色逐步点亮)
- P1=0x00;//蓝色全亮
- for(i=0;i<8;i++)
- {
- P0=table3[i];
- delay(30);
- }
- wei3=1;
- wei1=1;
- //P0=0xff;P1=0xff;P2=0xff;
- wei4=0;//打开右上位选
- wei2=0;//打开左下位选
- /****************/ //黄色流水(红色全亮,绿色逐步点亮)
- P1=0xff;P2=0xff;
- P0=0x00;//红色全亮
- for(i=0;i<8;i++)
- {
-
- P2=table3[i];
- delay(30);
- }
-
- /****************/ //绿色流水(绿色全亮,红色逐步熄灭)
- P2=0x00;//绿色全亮
- for(i=0;i<8;i++ )
- {
- P0=table5[i];
- delay(30);
- }
- P0=0xff;//红色全灭
- /****************/ //青色流水(绿色全亮,蓝色逐步点亮)
- P2=0x00;//绿色全亮
- for(i=0;i<8;i++)
- {
- P1=table3[i];
- delay(30);
- }
- /**************/ //蓝色流水(蓝色全亮,绿色逐步熄灭)
- P1=0x00;//蓝色全亮,
- for(i=0;i<8;i++)
- {
- P2=table5[i];
- delay(30);
- }
- P2=0xff;//绿色灭
- /**************/ //洋红色流水(蓝色全亮,红色逐步点亮)
- P1=0x00;//蓝色全亮
- for(i=0;i<8;i++)
- {
- P0=table3[i];
- delay(30);
- }
- wei4=1;
- wei2=1;
- P0=0xff;P1=0xff;P2=0xff;
- }
- /********************************************/
- void huxideng()//呼吸灯
- {
- wei4=0;wei3=0;wei2=0;wei1=0;
- for(i=0;i<150;i++)//红灯缓灭,绿灯缓亮
- {
- P0=0xff;
- P2=0x00;
- delay0ms(i);
- P0=0x00;
- P2=0xff;
- delay0ms(150-i);
- }
- P0=0xff;
- for(i=0;i<150;i++)//绿灯绶灭,蓝灯缓亮
- {
- P2=0xff;
- P1=0x00;
- delay0ms(i);
- P2=0x00;
- P1=0xff;
- delay0ms(150-i);
- }
- P2=0xff;
- for(i=0;i<150;i++)//蓝灯缓灭,红灯缓亮
- {
- P1=0xff;
- P0=0x00;
- delay0ms(i);
- P1=0x00;
- P0=0xff;
- delay0ms(150-i);
- }
- P1=0xff;P2=0xff;P0=0xff;
- wei4=1;wei3=1;wei2=1;wei1=1;
- }
- /**************************************************
- * 主函数在此 *
- ***************************************************/
- void main()
- {
-
- while(1)
- {
-
-
- deng6();//一个红灯顺时针转动
- deng0_1();//四组红灯顺时针逐步点亮
- deng0_2();//四组蓝灯顺时针逐步点亮
- deng9();//一位显示黄、绿、青、蓝、洋红、红、白,多彩流水,然后再显示下一位
- deng3_2();//绿灯亮的时候,四个红灯转一下
- deng0_2();//四组蓝灯顺时针逐步点亮
- deng1();//四组绿灯顺时针逐步熄灭
- deng8();//一个蓝灯,顺时针转动
- deng3_4();//洋红灯亮的时候,四个红灯转一下
- deng9();//一位显示黄、绿、青、蓝、洋红、红、白,多彩流水,然后再显示下一位
- deng7();//一个绿灯,顺时针转动
- deng0_2();//四组蓝灯顺时针逐步点亮
- deng3(); //红、黄、绿、青、蓝、洋红、白、红,顺时针流动(循环左移,即高位向低位移)
- deng0();//四组绿灯顺时针逐步点亮
- deng3_1();//蓝灯亮的时候,四个洋红灯转一下
-
- deng3_3();//红灯亮的时候,四个洋红灯转一下
-
- deng3_5();//白灯亮的时候,四个青灯转一下
- huxideng();//呼吸灯
- deng1();//四组绿灯顺时针逐步熄灭
-
- }
- }
复制代码
全部资料51hei下载地址:
rgb爱心灯.zip
(35.58 KB, 下载次数: 66)
|