2056|4

1510

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

【任性DIY】有趣的色彩时钟DIY 续 [复制链接]

在色彩时钟的DIY过程中,主要涉及几个关键问题:
    1RGB_LED的使用方法与电路搭建
    2)单片机的RGB_LED驱动与色彩配置
    3)串行通讯的实现与数据收发
1. RGB_LED的使用方法与电路搭建
    RGB_LED是一种6个引脚的贴片式器件,焊接起来稍有些困难,需格外的小心,
以防引脚间的短路。
在辨识管脚时,可发现在器件上切除一个小角,它便是识读引脚的标记。将标记朝向左下角,
则从左向右依次是蓝、红、绿色。其中上部的引脚为负极,下部的引脚为正极。
在搭建好电路后,应逐个引脚进行测试,以确保线路的正确。
3  引脚测试图
2. 单片机对RGB_LED的驱动与色彩配置
RGB_LED电路正常的情况下,需要确定单片机I/O口的驱动能力,经测试
使用单片机的P1口完全可以驱动RGB_LED
为了配置色彩及进行计时处理,可按一下的程序来进行测试。正常运行时,就
是按照计时值转换为相应的色彩来指示时间的。
  1. /******************************************************
  2. *  程序名称:main.c
  3. *  程序功能:主控制程序,实现色彩切换显示,每按一下K1键就换一种色彩。
  4. *  设计:JINGLIXIXI
  5. *  编写时间:2016-7-26
  6. *  程序版本:V1.0
  7. *****************************************************/
  8. /* 头文件 */
  9. #include "reg51.h"
  10. #include "delay.h"
  11. /* 模拟PWM调节色彩 */
  12. sbit RC = P1^0;
  13. sbit GC = P1^1;
  14. sbit BC = P1^2;
  15. sbit K1 = P3^2;
  16. sbit K2 = P3^3;
  17. unsigned int j=0;
  18. unsigned int rtc=0;   //秒计数器

  19. /******************************************************
  20. *  函数名称:main()
  21. *  函数功能:主函数
  22. *  入口参数:
  23. *  出口参数:
  24. *****************************************************/
  25. int main()
  26. {
  27. unsigned int k=0;
  28. unsigned char hh=0;    //  时
  29. unsigned char mm=0;   //  分

  30. //     时钟计时处理
  31. //     if(rtc>59)
  32. //     {
  33. //     rtc=0;
  34. //     mm++;
  35. //     if(mm>59) hh++;
  36. //     if(hh>23) hh=0;
  37. //     }

  38.       K1 = 1;
  39.       K2 = 1;
  40.           TimeInit();
  41.           RC = 0;
  42.           GC = 0;
  43.           BC = 0;
  44.       // 中间色彩配置
  45.           while(K1)
  46.       {
  47.       /* 高电平占50% */
  48.                         RC = 1;
  49.                         GC = 1;
  50.                     Delay5ms(1);
  51.           /* 低电平占50%  */
  52.                     RC = 0;
  53.                         GC = 0;
  54.                     Delay5ms(1);
  55.           }
  56.                 //  白色测试
  57.                 RC = 1;
  58.             GC = 1;
  59.             BC = 1;
  60.                 Delay5ms(200);
  61.                 while(K1);
  62.                 RC = 0;
  63.             GC = 0;
  64.             BC = 0;
  65.      k=0;
  66.          while(1)
  67.      {       
  68.                 if(k==0)
  69.                 {
  70.                 RC = 1;
  71.             GC = 0;
  72.             BC = 0;
  73.         }
  74.                 if(k==1)
  75.                 {
  76.                 RC = 1;
  77.             GC = 1;
  78.             BC = 0;
  79.         }
  80.                 if(k==2)
  81.                 {
  82.                 RC = 0;
  83.             GC = 1;
  84.             BC = 0;
  85.         }       
  86.                 if(k==3)
  87.                 {
  88.                 RC = 0;
  89.             GC = 1;
  90.             BC = 1;
  91.         }               
  92.                 if(k==4)
  93.                 {
  94.                 RC = 0;
  95.             GC = 0;
  96.             BC = 1;
  97.         }       
  98.                 if(k==5)
  99.                 {
  100.                 RC = 1;
  101.             GC = 0;
  102.             BC = 1;
  103.         }       
  104.                 Delay5ms(200);
  105.                 while(K1);
  106.             k++;
  107.                 if(k==6) k=0;
  108.         }
  109.     return 0;
  110. }
  111. /*************************************************
  112. *  文件名称:delay.c
  113. *  文件功能:延时函数
  114. *************************************************/
  115. #include "delay.h"
  116. #include "reg51.h"
  117. unsigned int i;
  118. /***********************************************
  119. *  函数功能:定时器中断
  120. ***********************************************/
  121. void Time0() interrupt 1
  122. {
  123.     /* 重新加载初值 */
  124.           TH0 = 0xee;
  125.           TL0 = 0x00;
  126. /* 中断处理 */
  127.     if (0 != i)
  128.     {
  129.         i--;
  130. }       
  131. j=j+1;
  132. If(j>200)       
  133. {
  134. j=0;
  135. rtc++;
  136. }       
  137. }
  138. /***********************************************
  139. *  函数名称:TimeInit()
  140. *  函数功能:定时器初始化
  141. ***********************************************/
  142. void TimeInit(void)
  143. {
  144.           /* 模式设置 */
  145.      TMOD = (TMOD & 0xf0) | 0x01;
  146.           /* 赋初值 */
  147.           TH0 = 0xee;
  148.           TL0 = 0x00;
  149.           /* 下载定时器中断和全局使能 */
  150.           IE = 0x82;
  151.           TR0 = 1;
  152. }
  153. /***********************************************
  154. * 函数名称:Delay5ms
  155. * 函数功能:定时器延时
  156. * 入口参数:Dly
  157. ***********************************************/
  158. void Delay5ms(unsigned int Dly)
  159. {
  160.     i =Dly;
  161.         while (0 != i)
  162.         {
  163.     }
  164. }
复制代码
3. 串行通讯的实现与数据收发
在色彩时钟设计中,为了简化时间设置的问题,引入了数据下载的处理方式。
此外,还可以通过数据发送来检验单片机的计时状况。为此提供如下的串行通讯程序以便测试。
  1. #include <reg51.h>
  2. #include <string.h>
  3. #define INBUF_LEN 4 //数据长度
  4. unsigned char ch;
  5. bit read_flag= 0 ;
  6.    
  7. void init_serialcom( void )
  8. {
  9.        SCON = 0x50 ;     //SCON: serail mode 1, 8-bit UART, enable ucvr
  10.            TMOD |= 0x20 ;   //TMOD: timer 1, mode 2, 8-bit reload
  11.            PCON |= 0x80 ;    //SMOD=1;
  12.            TH1 = 0xFA ;      //Baud:9600 fosc=11.0592MHz
  13.            IE |= 0x90 ;       //Enable Serial Interrupt
  14.            TR1 = 1 ;         // timer 1 run
  15.            TI=1;
  16. }
  17. //向串口发送一个字符
  18. void send_char_com( unsigned char ch)
  19. {
  20.              SBUF=ch;
  21.              while (TI== 0);
  22.                  TI= 0 ;
  23. }
  24. //向串口发送一个字符串,strlen为该字符串长度
  25. void send_string_com( unsigned char *str, unsigned int strlen)
  26. {
  27.      unsigned int k= 0 ;
  28.          do { send_char_com(*(str + k)); k++; }
  29.          while (k < strlen);
  30. }
  31. //串口接收中断函数
  32. void serial () interrupt 4 using 3
  33. {
  34.     if (RI)
  35.            {  
  36.                    RI = 0 ;
  37.                    ch=SBUF;                   
  38.                    read_flag= 1 ; //就置位取数标志
  39.                 }
  40. }
  41. main()
  42. {
  43.             init_serialcom(); //初始化串口
  44.                     while ( 1 )
  45.                            {
  46.                                if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
  47.                                         {
  48.                                                     read_flag= 0 ; //取数标志清0
  49.                                                         send_char_com(ch);
  50.                                                 }
  51.                                 }
  52. }
复制代码
通过上面所提供的资源,就可以进行基本的制作和测试了。

最新回复

有功夫做个玩玩也不错!做成呼吸灯可以催眠  详情 回复 发表于 2016-7-27 12:07

赞赏

2

查看全部赞赏

点赞 关注
 

回复
举报

510

帖子

2

TA的资源

一粒金砂(高级)

沙发
 
不错!

点评

多谢了!  详情 回复 发表于 2016-7-27 11:37
回复

1510

帖子

1

TA的资源

五彩晶圆(初级)

板凳
 
 
 

回复

2774

帖子

8

TA的资源

版主

4
 
有功夫做个玩玩也不错!做成呼吸灯可以催眠

点评

期待呀,到时共享呀!  详情 回复 发表于 2016-7-28 09:00
 
 
 

回复

1510

帖子

1

TA的资源

五彩晶圆(初级)

5
 
strong161 发表于 2016-7-27 12:07
有功夫做个玩玩也不错!做成呼吸灯可以催眠

期待呀,到时共享呀!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表