找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6017|回复: 8
收起左侧

制作分享:stc11F04单片机制作RGB渐变彩灯 附源程序

  [复制链接]
ID:577329 发表于 2020-2-27 16:15 | 显示全部楼层 |阅读模式
闲着无聊也用单片机做一个RGB渐变彩灯玩一玩。                                                                                                                                                                                           源程序和heⅹ文件放在2楼,有需要的自己下载。

电池供电

电池供电
IMG20200227155313.jpg

自己用覆铜板做的stc11F04最小系统

自己用覆铜板做的stc11F04最小系统

下面是实验效果图

下面是实验效果图
IMG20200227155519.jpg
IMG20200227155308.jpg
IMG20200227155235_1.jpg
IMG20200227155235.jpg
IMG20200227155232.jpg
IMG20200227155231.jpg
IMG20200227155229.jpg
IMG20200227155219.jpg

评分

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

查看全部评分

回复

使用道具 举报

ID:577329 发表于 2020-2-27 16:26 | 显示全部楼层
单片机源程序
  1. /*原理:先亮红灯(保持一会儿)----红绿过度(绿加1、红减1循环240次)------
  2. 绿灯亮起(保持一会儿)----绿兰过度(兰加1、绿减1循环240次)-----兰灯亮起
  3. (保持)-----兰白过度(绿加1、红加1循环240次、兰不变?---白红过度*/
  4. #include<reg52.h>//MCU头文件
  5. #define uchar unsigned char//字浮型宏定义
  6. #define uint unsigned int//整型宏定义
  7. #define shudu 30//LED渐变速度调整
  8. #define dengji 1//LED变化等级调整
  9. sbit B1=P1^0;//红色灯控制IO口
  10. sbit G1=P1^1;//绿色灯控制IO口
  11. sbit R1=P1^2;//兰色灯控制IO口
  12. uchar Rout,Bout,Gout;//红绿兰3个变量
  13. /***************************************************/
  14. /**********************延时子程序*******************/
  15. /***************************************************/
  16. void delay(uint z)
  17. {
  18. uint x,y;//局部变量定义
  19. for(x=0;x<5;x++)//延时外循环
  20. for(y=0;y<z;y++);//延时内循环
  21. }
  22. /**********************************************/
  23. /**********PWM控制红绿兰3种灯亮灭时间**********/
  24. /**********************************************/
  25. void RGBpwm(uchar Rou,uchar Gou,uchar Bou)//3个局部变量,些部分为带参数函数
  26. {
  27. if(Rou!=0)//如果红灯变量不等于0就亮红灯
  28. {
  29.   R1=1;//红灯亮
  30.   delay(Rou);//红灯亮起时间
  31.   R1=0;//红灯灭
  32. }
  33. if(Gou!=0)//如果红灯变量不等于0就亮红灯
  34. {
  35.   G1=1;//绿灯亮
  36.   delay(Gou);//绿灯亮起的时间 
  37.   G1=0;//绿灯灭
  38. }
  39. if(Bou!=0)//如果红灯变量不等于0就亮红灯
  40. {
  41.   B1=1;//兰灯亮
  42.   delay(Bou);//兰灯亮起的时间
  43.   B1=0;//兰灯灭
  44. }
  45. }
  46.   
  47. /***********************************************/
  48. /********************主程序*********************/
  49. /***********************************************/
  50. void main()
  51. {
  52. TMOD=0x01;//选择定时器在方式1下工作
  53. EA=1;//打开总中断
  54. ET0=1;//打开定时器中断
  55. TR0=1;//打开定时器
  56. R1=0;//开机将红灯关闭
  57. G1=0;//开机将绿灯关闭
  58. B1=0;//开机将兰灯关闭
  59. TH0=(65536-256)/256;//给定时器高8位赋值
  60. TL0=(65536-256)%256;//给定时器低8位赋值
  61. while(1)//程序主循环
  62. {
  63.   RGBpwm(Rout,Gout,Bout);//调用RGBpwm子程序
  64. }
  65. }
  66. /*************************************************/
  67. /*中断服务子程序(控制LED红绿兰亮灭时间占空比例)*/
  68. /*************************************************/
  69. void zhong() interrupt 1//中断向量位为1
  70. {
  71. uint num;//定时器计数变量
  72. uint ji;//亮度等级控制变量
  73. TH0=(65536-256)/256;//给定时器高8位赋值
  74. TL0=(65536-256)%256;//给定时器低8位赋值
  75. num++;//将定时计数变自动增加1
  76. if(num==shudu)//如果速度变量等于定时计数器变量就执行下面大括号语句
  77. {
  78.   num=0;//将计数器清0
  79.   ji++;//将亮度等级控制变量加1
  80.   if((ji>0)&&(ji<100))//如果亮度等级控制变量ji小于100,红灯亮起时间变量为240
  81.   {
  82.    Rout=240;//红灯亮起变量为240
  83.    Gout=0;//绿灯亮起变量为0
  84.    Bout=0;//兰灯亮起变量为0
  85.   }
  86.   if((ji>100)&&(ji<340))/*如果亮度等级控制变量ji大于100小于340(刚好240个等级),
  87.   红灯亮起时间变量由原来的240,慢慢减小到0,同时绿灯由原来的0慢慢增到240,形成
  88.   红灯到绿灯的渐变过程*/
  89.   {
  90.    Rout-=dengji;//将红灯变量减1。因为dengji为亮度变化等级(本程序变化等级为1),
  91.    Gout+=dengji;//将绿灯变量加1
  92.    Bout=0;//兰灯不变
  93.   }
  94.   if((ji>340)&&(ji<440))/*亮度等级控制变量ji大于340小于440时,让绿灯变量停一段时间
  95.   这样就形成了当红灯过度到绿灯时,绿灯会停一会儿的效果。*/
  96.   {
  97.    Rout=0;//红灯灭
  98.    Gout=240;//绿灯亮
  99.    Bout=0;//兰灯灭
  100.   }
  101.   if((ji>440)&&(ji<680))//同理:亮度等级控制变量ji大于440小于680时,由绿灯到兰灯过度
  102.   {
  103.    Rout=0;//红灯变量不变
  104.    Gout-=dengji;//将绿灯变量减1
  105.    Bout+=dengji;//将兰灯变量加1
  106.   }
  107.   if((ji>680)&&(ji<780))//亮度等级控制变量ji大于680小于780时,让兰灯变量停一段时间
  108.   {
  109.    Rout=0;//红灯灭
  110.    Gout=0;//绿灯灭
  111.    Bout=240;//兰灯亮一会儿
  112.   }
  113.   if((ji>780)&&(ji<1020))//亮度等级控制变量ji大于780小于1020时,由兰灯到白灯过度
  114.   {
  115.    Rout+=dengji;//将红灯变量加1
  116.    Gout+=dengji;//绿灯变量加1
  117.    Bout=240;//兰灯不变
  118.   }
  119.   if((ji>1020)&&(ji<1025))//亮度等级控制变量ji大于1020小于1025时,由兰灯到白灯过度
  120.   {
  121.    Rout=240;//将红灯变量加1
  122.    Gout=240;//绿灯变量加1
  123.    Bout=240;//兰灯不变
  124.   }
  125.   if((ji>1025)&&(ji<1265))//亮度等级控制变量ji大于1025小于1265时,由白光到红光过度
  126.   {
  127.    Rout=240;//红灯变量不变
  128.    Gout-=dengji;//绿灯变量自动减1
  129.    Bout-=dengji;//兰灯变量自动减1
  130.   }
  131.   if(ji>1265)//当亮度等级控制变量ji大于1210时,就将它清0
  132.   ji=0;//将亮度控制等级清0
  133. }
  134. }
复制代码


全部资料51hei下载地址:
rgb彩灯 stc11fxx.rar (20.13 KB, 下载次数: 127)
回复

使用道具 举报

ID:46065 发表于 2020-2-27 22:16 | 显示全部楼层
再玩一段时间你会发现这个程序可以非常简单,加油!!
回复

使用道具 举报

ID:243394 发表于 2020-4-4 20:23 | 显示全部楼层
楼主,为什么亮白灯的时候,灯闪烁的很厉害?我把for(x=0;x<5;x++)中的x<5,改为x<2,就不会闪烁,但是白灯的颜色就不是很白了
回复

使用道具 举报

ID:377382 发表于 2020-4-22 10:44 | 显示全部楼层
非常不错
回复

使用道具 举报

ID:704585 发表于 2020-4-23 14:20 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:1001248 发表于 2022-1-11 09:51 | 显示全部楼层
程序寫的有些複雜
回复

使用道具 举报

ID:628588 发表于 2023-10-6 19:26 | 显示全部楼层
主程序使用延时函数差评
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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