找回密码
 注册

QQ登录

只需一步,快速开始

搜索

STC15F104W单片机TM1803彩灯程序

[复制链接]
eng 发表于 2021-7-6 16:56:34 | 显示全部楼层 |阅读模式

  1. /******************************************************************************/
  2. STC15F104W芯片
  3. 内部晶振18.432M
  4. /*******************************************************************************/

  5. #include <STC15F100W.H>                            //MCU头文件
  6. #include "intrins.h"                            //包含nop指令头文件

  7. #define nop  _nop_();   
  8.                    //宏定义
  9. /********************************定义控制端口***********************************/
  10. sbit DO=P3^4;                                    //定义信号输出DO
  11. sbit led1=P3^1;
  12. sbit led2=P3^2;
  13. sbit led3=P3^3;
  14. /**********************************定义变量*************************************/
  15. unsigned int IC=6;                          //控制TM1804个数
  16. unsigned int LED_PX;                        //像素点数
  17. unsigned char PWM=255;                      //TM1804灰度数据
  18. unsigned char Rda,Gda,Bda;                  //R、G、B灰度数据
  19. unsigned char bdata LED_data;               //可位操作的数据发送暂存变量声明
  20. sbit bit0=LED_data^0;                            //被发送的数据各位定义
  21. sbit bit1=LED_data^1;
  22. sbit bit2=LED_data^2;
  23. sbit bit3=LED_data^3;
  24. sbit bit4=LED_data^4;
  25. sbit bit5=LED_data^5;
  26. sbit bit6=LED_data^6;
  27. sbit bit7=LED_data^7;
  28. bit flag=0;                                 //定义一个标志位

  29. /**********************************延时函数*************************************/
  30. void delay(unsigned int n)                  //n=1,延时500us
  31. {
  32. unsigned int i;
  33. while(n--)
  34. for(i=0;i<860;i++);
  35. }

  36. /********************发送0码函数,高电平400ns,周期1.25us************************/
  37. void send_data_0()   
  38. {
  39. DO=1;
  40. nop;nop;nop;nop;nop;
  41. nop;nop;nop;nop;nop;         
  42. DO=0;
  43. nop;nop;nop;nop;nop;nop;nop;
  44. nop;nop;nop;nop;nop;nop;nop;
  45. }

  46. /*******************发送1码函数,高电平800ns,周期1.25us*************************/
  47. void send_data_1()   
  48. {
  49. DO=1;
  50. nop;nop;nop;nop;nop;nop;
  51. nop;nop;nop;nop;nop;
  52. nop;nop;nop;nop;nop;nop;
  53. nop;nop;nop;nop;nop;
  54. DO=0;   
  55. }

  56. /***********************发送1个字节数据,高位先发*******************************/
  57. void send_data(unsigned char DATA)               
  58. {
  59. LED_data=DATA;                          
  60. if(bit7)        send_data_1();        else send_data_0();
  61. if(bit6)        send_data_1();        else send_data_0();
  62. if(bit5)        send_data_1();        else send_data_0();
  63. if(bit4)        send_data_1();        else send_data_0();
  64. if(bit3)        send_data_1();        else send_data_0();
  65. if(bit2)        send_data_1();        else send_data_0();
  66. if(bit1)        send_data_1();        else send_data_0();
  67. if(bit0)        send_data_1();        else send_data_0();
  68. }
  69. /******************************发送1帧数据*************************************/
  70. void send_px()
  71. {
  72. unsigned int i;
  73. for(i=0;i<LED_PX;i++)
  74.   {
  75.    send_data(Rda);             //发送R灰度数据
  76.    send_data(Gda);             //发送G灰度数据
  77.    send_data(Bda);             //发送B灰度数据
  78.   }
  79. }
  80. /*===============================主函数=======================================*/
  81. void main()
  82. {
  83. unsigned char i;
  84. P3M0=0xFF;
  85. P3M1=0x00;
  86. led1=led2=led3=0;
  87. LED_PX=IC;                          //像素点数等于TM1804个数
  88. Rda=Gda=Bda=0;                      //R、G、B灰度数据复位清零
  89. while(1)
  90.   {
  91.    for(i=0;i<PWM;i++)          //红色渐亮  
  92.     {
  93.      Rda=i;              //灰度计算
  94.      send_px();          //发送灰度数据
  95.      delay(50);          //复位延时
  96.     }
  97.     flag=1;                     //标志位置位
  98.     while(flag)                 //标志位置位后循环函数
  99.     {
  100.      for(i=0;i<PWM;i++)  //红色渐灭,绿色渐亮
  101.       {
  102.        Gda=i;
  103.        Rda=PWM-i;  //灰度计算
  104.        send_px();  //发送灰度数据
  105.        delay(50);  //复位延时
  106.       }
  107.      for(i=0;i<PWM;i++)  //绿色渐灭,蓝色渐亮
  108.       {
  109.        Bda=i;           
  110.        Gda=PWM-i;  //灰度计算
  111.        send_px();  //发送灰度数据
  112.        delay(50);  //复位延时
  113.       }
  114.      for(i=0;i<PWM;i++)  //蓝色渐灭,红色渐亮
  115.       {
  116.        Rda=i;
  117.        Bda=PWM-i;  //灰度计算
  118.        send_px();  //发送灰度数据
  119.        delay(50);  //复位延时
  120.       }
  121.     }
  122.   }
  123. }
  124. /*================================结束==========================================*/
复制代码


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

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-27 07:28

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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