找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5139|回复: 4
收起左侧

单片机RGB爱心灯Proteus仿真程序(有详细注释)

  [复制链接]
ID:833013 发表于 2020-11-22 17:03 | 显示全部楼层 |阅读模式
RGB爱心灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
E%WU$AVGEX3%6{OQMHB6D2F.png WL$)H20~M[2M_N7~$B]BGOO.png

单片机源程序如下(代码注释很详细):
  1. #include<reg52.h>//52头文件
  2. #include<intrins.h>//循环左右移 函数头文件
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit wei1=P3^4;
  6. sbit wei2=P3^5;
  7. sbit wei3=P3^6;
  8. sbit wei4=P3^7;
  9. uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//从低位往高位移一个灯
  10. uchar code table1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//从高位往低位移一个灯
  11. uchar code table2[]={0xfe,0xfa,0xf8,0xf0,0xe0,0xa0,0x80,0x00};//从低位到高位逐步全部点亮
  12. uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//从高位到低位逐步全部点亮
  13. uchar code table4[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//从低位到高位逐步全部熄灭
  14. uchar code table5[]={0x80,0xa0,0xe0,0xf0,0xf8,0xfa,0xfe,0xff};//从高位到低位逐步全部熄灭
  15. uchar code table6[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//从低位到高位,灭一个灯移动
  16. uchar code table7[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//从高位到低位,灭一个灯移动
  17. uchar i;
  18. uint t;

  19. /**********************************/
  20. void delay(uint z) //延时函数
  21. {
  22.         uint x,y;
  23.         for(x=z;x>0;x--)
  24.                 for(y=314;y>0;y--);
  25. }
  26. /************************************/
  27. void delay1ms(uchar a)//延时1ms
  28. {
  29.         uchar x;
  30.         while(a--)
  31.         {
  32.           for(x=0;x<150;x++);
  33.         }        
  34. }
  35. /**********************************/
  36. void delay0ms(uint z) //延时函数
  37. {
  38.         uint x,y;
  39.         for(x=z;x>0;x--)
  40.                 for(y=10;y>0;y--);
  41. }
  42. /*************************************************
  43. //////////////////////////////////////////////////
  44. *************************************************/
  45. void deng0()//四组绿灯顺时针逐步点亮
  46. {        P0=0xff;P1=0xff;
  47.         wei1=0;wei2=0;wei3=0;wei4=0;//打开所有位
  48.         for(i=0;i<8;i++)
  49.         {
  50.                 P2=table3[i];
  51.                 delay(40);
  52.         }
  53.         wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
  54.         P2=0xff;
  55. }
  56. /////////////////////////////////////////
  57. void deng0_1()//四组红灯顺时针逐步点亮
  58. {         P1=0xff;P2=0xff;
  59.         wei1=0;wei2=0;wei3=0;wei4=0;//打开所有位
  60.         for(i=0;i<8;i++)
  61.         {
  62.                 P0=table3[i];
  63.                 delay(40);
  64.         }
  65.         wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
  66.         P0=0xff;
  67. }
  68. /////////////////////////////////////////////
  69. void deng0_2()//四组蓝灯顺时针逐步点亮
  70. {        P0=0xff;P2=0xff;
  71.         wei1=0;wei2=0;wei3=0;wei4=0;//打开所有位
  72.         for(i=0;i<8;i++)
  73.         {
  74.                 P1=table3[i];
  75.                 delay(40);
  76.         }
  77.         wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
  78.         P1=0xff;
  79. }
  80.   ///////////////////////////////////////
  81. void deng1()//四组洋红灯顺时针逐步熄灭
  82. {        
  83.         
  84.         wei1=0;wei2=0;wei3=0;wei4=0;//打开所有位
  85.         P2=0xff;
  86.         for(i=0;i<8;i++)
  87.         {
  88.                 P0=table5[i];
  89.                 P1=table5[i];
  90.                 delay(40);

  91.         }
  92.         wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
  93.         P0=0xff;P1=0xff;
  94.         
  95. }
  96. /*****************************************************************************/
  97. void deng3()//红、黄、绿、青、蓝、洋红、白、红,顺时针流动(循环左移,即高位向低位移)
  98. {
  99.         uchar a,b,c;//绿、红、蓝
  100.         a=0x8d;
  101.         b=0x38;
  102.         c=0xe1;
  103. /////////////
  104.         wei1=0;wei2=0;wei3=0;wei4=0;//打开位
  105.         P2=a;
  106.         P0=b;
  107.         P1=c;
  108.         for(i=0;i<8;i++)
  109.         {
  110.                 a=_cror_(a,1);//循环左移
  111.                 b=_cror_(b,1);//循环左移
  112.                 c=_cror_(c,1);//循环左移
  113.                 delay(100);//延时
  114.                 P2=a;
  115.                 P0=b;
  116.                 P1=c;
  117.         }
  118.         P0=0xff;P1=0xff;P2=0xff;
  119.         wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
  120. }

  121. //////////////////////////////////////////
  122. void deng3_1()//蓝灯亮的时候,四个洋红灯转一下
  123. {         
  124.         wei1=0;wei2=0;wei3=0;wei4=0;//打开位
  125.         P1=0x00;P0=0xff;//蓝灯全部亮
  126.         for(i=0;i<8;i++)
  127.         {
  128.                 P0=table1[i];
  129.                 delay(50);
  130.         }
  131.          
  132.         P0=0xff;P2=0xff;
  133.         wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位

  134. }
  135. ///////////////////////////////////////////////
  136. void deng3_2()//绿灯亮的时候,四个红灯转一下
  137. {         
  138.         wei1=0;wei2=0;wei3=0;wei4=0;//打开位
  139.         P1=0xff;P2=0x00;//绿灯全部亮
  140.         for(i=0;i<8;i++)
  141.         {
  142.                 P0=table0[i];
  143.                 delay(50);
  144.         }

  145.         P0=0xff;P2=0xff;
  146.         wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
  147. }
  148. //////////////////////////////////////////////
  149. void deng3_3()//红灯亮的时候,四个洋红灯转一下
  150. {         
  151.         wei1=0;wei2=0;wei3=0;wei4=0;//打开位
  152.         P0=0x00;P2=0xff;//红灯全部亮
  153.         for(i=0;i<8;i++)
  154.         {
  155.                 P1=table1[i];
  156.                 delay(50);
  157.         }
  158.         P0=0xff;P2=0xff;
  159.         wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
  160. }
  161. ///////////////////////////////////////////////
  162. void deng3_4()//紫灯亮的时候,四个红灯转一下
  163. {         
  164.         wei1=0;wei2=0;wei3=0;wei4=0;//打开位
  165.         P0=0x00;P1=0x00;P0=0xff;//紫灯全部亮
  166.         for(i=0;i<8;i++)
  167.         {
  168.                 P0=table6[i];
  169.                 delay(50);
  170.         }

  171.         P0=0xff;P1=0xff;
  172.         wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
  173. }
  174. void deng3_5()//白灯亮的时候,四个青灯转一下
  175. {         
  176.         wei1=0;wei2=0;wei3=0;wei4=0;//打开位
  177.         P1=0x00;P0=0x00;P2=0x00;//白灯全部亮
  178.         for(i=0;i<8;i++)
  179.         {
  180.                 P0=table7[i];
  181.                 delay(50);
  182.         }

  183.         P0=0xff;P1=0xff;P2=0xff;
  184.         wei1=1;wei2=1;wei3=1;wei4=1;//关闭所有位
  185. }
  186. /************************************************************
  187. *************************************************************/
  188. void rled6_1()//红,下面模块的小函数
  189. {
  190.         for(i=0;i<8;i++)
  191.         {
  192.                 P0=table1[i];
  193.                 delay(25);
  194.         }
  195.         P0=0xff;
  196. }
  197. /*******************************************/
  198. void rled7_1()//绿,下面模块的小函数
  199. {
  200.         for(i=0;i<8;i++)
  201.         {
  202.                 P2=table1[i];
  203.                 delay(25);
  204.         }
  205.         P2=0xff;
  206. }
  207. /***********************************/
  208. void rled8_1()//蓝,下面模块的小函数
  209. {
  210.         for(i=0;i<8;i++)
  211.         {
  212.                 P1=table0[i];
  213.                 delay(25);
  214.         }
  215.         P1=0xff;
  216. }

  217. /****************************************
  218. *****************************************/
  219. void deng6()//一个红灯,顺时针转动
  220. {
  221.         wei3=1;wei2=1;wei1=1;
  222.          wei4=0;//打开左上位
  223.         rled6_1();//一个红灯顺时针转
  224.          wei4=1;
  225. /////////////////////////////
  226.          wei3=0;//打开右上位
  227.         rled6_1();//一个红灯顺时针转
  228.          wei3=1;
  229. /////////////////////////////
  230.         wei2=0;//打开右下位
  231.         rled6_1();//一个红灯顺时针转
  232.         wei2=1;
  233. ////////////////////////////
  234.         wei1=0;//打开左下位
  235.         rled6_1();//一个红灯顺时针转
  236.         wei1=1;
  237. }
  238. /************************************/
  239. void deng7()//一个绿灯,顺时针转动
  240. {
  241.          wei4=0;//打开左上位
  242.         rled7_1();//一个红灯顺时针转
  243.          wei4=1;
  244. /////////////////////////////
  245.          wei3=0;//打开右上位
  246.         rled7_1();//一个红灯顺时针转
  247.          wei3=1;
  248. /////////////////////////////
  249.         wei2=0;//打开右下位
  250.         rled7_1();//一个红灯顺时针转
  251.         wei2=1;
  252. ////////////////////////////
  253.         wei1=0;//打开左下位
  254.         rled7_1();//一个红灯顺时针转
  255.         wei1=1;
  256. }
  257. /*************************************/
  258. void deng8()//一个蓝灯,顺时针转动
  259. {
  260. /////////////////////////////
  261.         wei2=0;//打开右下位
  262.         rled8_1();//一个红灯顺时针转
  263.         wei2=1;

  264. /////////////////////////////
  265.          wei3=0;//打开右上位
  266.         rled8_1();//一个红灯顺时针转
  267.          wei3=1;
  268. /////////////////////
  269.           wei4=0;//打开左上位
  270.         rled8_1();//一个红灯顺时针转
  271.          wei4=1;
  272. ////////////////////////////
  273.         wei1=0;//打开左下位
  274.         rled8_1();//一个红灯顺时针转
  275.         wei1=1;

  276. }
  277. /********************************************/
  278. void deng9()//一位显示黄、绿、青、蓝、洋红、红、白,多彩流水,然后再显示下一位
  279. {
  280.         wei3=0;//打开右上位选
  281.         wei1=0;//打开左下位选


  282.          /****************/         //黄色流水(红色全亮,绿色逐步点亮)
  283.          P1=0xff;P2=0xff;
  284.           P0=0x00;//红色全亮
  285.         for(i=0;i<8;i++)        
  286.         {
  287.                
  288.                 P2=table3[i];
  289.                 delay(30);
  290.         }
  291.         
  292.         /****************/         //绿色流水(绿色全亮,红色逐步熄灭)
  293.         P2=0x00;//绿色全亮
  294.         for(i=0;i<8;i++        )        
  295.         {        
  296.                 P0=table5[i];
  297.                 delay(30);
  298.         }
  299.         P0=0xff;//红色全灭
  300.         /****************/         //青色流水(绿色全亮,蓝色逐步点亮)
  301.         P2=0x00;//绿色全亮
  302.         for(i=0;i<8;i++)        
  303.         {
  304.                 P1=table3[i];
  305.                 delay(30);

  306.         }

  307.         /**************/        //蓝色流水(蓝色全亮,绿色逐步熄灭)
  308.         P1=0x00;//蓝色全亮,
  309.         for(i=0;i<8;i++)        
  310.         {
  311.                 P2=table5[i];
  312.                 delay(30);
  313.         }
  314.         P2=0xff;//绿色灭

  315.         /**************/        //洋红色流水(蓝色全亮,红色逐步点亮)
  316.         P1=0x00;//蓝色全亮
  317.         for(i=0;i<8;i++)        
  318.         {
  319.                 P0=table3[i];
  320.                 delay(30);
  321.         }
  322.         wei3=1;
  323.         wei1=1;
  324.         //P0=0xff;P1=0xff;P2=0xff;

  325.         wei4=0;//打开右上位选
  326.         wei2=0;//打开左下位选


  327.          /****************/         //黄色流水(红色全亮,绿色逐步点亮)
  328.          P1=0xff;P2=0xff;
  329.           P0=0x00;//红色全亮
  330.         for(i=0;i<8;i++)        
  331.         {
  332.                
  333.                 P2=table3[i];
  334.                 delay(30);
  335.         }
  336.         
  337.         /****************/         //绿色流水(绿色全亮,红色逐步熄灭)
  338.         P2=0x00;//绿色全亮
  339.         for(i=0;i<8;i++        )        
  340.         {        
  341.                 P0=table5[i];
  342.                 delay(30);
  343.         }
  344.         P0=0xff;//红色全灭
  345.         /****************/         //青色流水(绿色全亮,蓝色逐步点亮)
  346.         P2=0x00;//绿色全亮
  347.         for(i=0;i<8;i++)        
  348.         {
  349.                 P1=table3[i];
  350.                 delay(30);

  351.         }

  352.         /**************/        //蓝色流水(蓝色全亮,绿色逐步熄灭)
  353.         P1=0x00;//蓝色全亮,
  354.         for(i=0;i<8;i++)        
  355.         {
  356.                 P2=table5[i];
  357.                 delay(30);
  358.         }
  359.         P2=0xff;//绿色灭

  360.         /**************/        //洋红色流水(蓝色全亮,红色逐步点亮)
  361.         P1=0x00;//蓝色全亮
  362.         for(i=0;i<8;i++)        
  363.         {
  364.                 P0=table3[i];
  365.                 delay(30);
  366.         }
  367.         wei4=1;
  368.         wei2=1;
  369.         P0=0xff;P1=0xff;P2=0xff;
  370. }
  371. /********************************************/
  372. void huxideng()//呼吸灯
  373. {
  374.         wei4=0;wei3=0;wei2=0;wei1=0;

  375.     for(i=0;i<150;i++)//红灯缓灭,绿灯缓亮
  376.    {
  377.                    P0=0xff;
  378.                 P2=0x00;
  379.                 delay0ms(i);
  380.                 P0=0x00;
  381.                 P2=0xff;
  382.                 delay0ms(150-i);

  383.    }
  384.    P0=0xff;
  385.    for(i=0;i<150;i++)//绿灯绶灭,蓝灯缓亮
  386.    {
  387.                    P2=0xff;
  388.                 P1=0x00;
  389.                 delay0ms(i);
  390.                 P2=0x00;
  391.                 P1=0xff;
  392.                 delay0ms(150-i);

  393.    }
  394.    P2=0xff;
  395.            for(i=0;i<150;i++)//蓝灯缓灭,红灯缓亮
  396.         {
  397.                 P1=0xff;
  398.                 P0=0x00;
  399.                 delay0ms(i);
  400.                 P1=0x00;
  401.                 P0=0xff;
  402.                 delay0ms(150-i);
  403.         }
  404.         P1=0xff;P2=0xff;P0=0xff;
  405.         wei4=1;wei3=1;wei2=1;wei1=1;
  406. }

  407. /**************************************************
  408. *                                  主函数在此                                                     *
  409. ***************************************************/
  410. void main()
  411. {

  412.         
  413.         while(1)
  414.         {
  415.                                           
  416.                
  417.                 deng6();//一个红灯顺时针转动
  418.                 deng0_1();//四组红灯顺时针逐步点亮        
  419.                 deng0_2();//四组蓝灯顺时针逐步点亮
  420.                 deng9();//一位显示黄、绿、青、蓝、洋红、红、白,多彩流水,然后再显示下一位
  421.                 deng3_2();//绿灯亮的时候,四个红灯转一下
  422.                 deng0_2();//四组蓝灯顺时针逐步点亮
  423.                 deng1();//四组绿灯顺时针逐步熄灭
  424.                 deng8();//一个蓝灯,顺时针转动
  425.                 deng3_4();//洋红灯亮的时候,四个红灯转一下
  426.                 deng9();//一位显示黄、绿、青、蓝、洋红、红、白,多彩流水,然后再显示下一位
  427.                 deng7();//一个绿灯,顺时针转动
  428.                 deng0_2();//四组蓝灯顺时针逐步点亮

  429.                 deng3(); //红、黄、绿、青、蓝、洋红、白、红,顺时针流动(循环左移,即高位向低位移)
  430.                 deng0();//四组绿灯顺时针逐步点亮

  431.                 deng3_1();//蓝灯亮的时候,四个洋红灯转一下
  432.                
  433.                 deng3_3();//红灯亮的时候,四个洋红灯转一下
  434.                
  435.                 deng3_5();//白灯亮的时候,四个青灯转一下

  436.                 huxideng();//呼吸灯
  437.                 deng1();//四组绿灯顺时针逐步熄灭

  438.          

  439.         }
  440. }
复制代码

全部资料51hei下载地址:
rgb爱心灯.zip (35.58 KB, 下载次数: 66)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:65956 发表于 2020-11-23 11:03 | 显示全部楼层
这种不加驱动电路的设计会不会导致单片机总电流超出而损坏呢?特别是当同时亮时
回复

使用道具 举报

ID:833013 发表于 2020-11-23 19:47 | 显示全部楼层
aking991 发表于 2020-11-23 11:03
这种不加驱动电路的设计会不会导致单片机总电流超出而损坏呢?特别是当同时亮时

这个只是仿真,验证程序的,实际电路是有限流电阻的
回复

使用道具 举报

ID:1052292 发表于 2022-11-16 17:18 | 显示全部楼层
能不能分享一下原理图谢谢小白
回复

使用道具 举报

ID:473377 发表于 2022-11-17 22:51 | 显示全部楼层
程序注释很清晰,感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表