找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 816|回复: 0
收起左侧

51单片机驱动TM1809源程序

[复制链接]
ID:1077009 发表于 2023-6-3 12:17 | 显示全部楼层 |阅读模式
  1. //========================================================================//
  2. //-----------MCU型号为STC15F104E(程序下载时输入内置30MHz振荡)-----------//
  3. //  程序功能:向TM1809低速模式发送3个像素点数据并检测交流过零信号以实现          //
  4. //  七彩同步渐变循环。          ISP程序下载:P3.0(RXD) P3.1(TXD)      //
  5. //        交流过零检测输入:P3.2(采用外部0中断)      数据输出:P3.3           //
  6. //========================================================================//

  7. #include<reg52.h>                                 //MCU资源头文件
  8. #include<intrins.h>                                 //移位函数
  9. #define nop _nop_();
  10. #define uchar unsigned char                 //宏替换,方便书写
  11. #define uint  unsigned int                 //宏替换,方便书写

  12. sbit DIO=P3^3;                                  //数据输出引脚声明

  13. uchar bdata LED_DAT;                         //可位操作的数据发送暂存变量声明
  14. sbit bit0=LED_DAT^0;                         //被发送的数据各位定义
  15. sbit bit1=LED_DAT^1;
  16. sbit bit2=LED_DAT^2;
  17. sbit bit3=LED_DAT^3;
  18. sbit bit4=LED_DAT^4;
  19. sbit bit5=LED_DAT^5;
  20. sbit bit6=LED_DAT^6;
  21. sbit bit7=LED_DAT^7;


  22. uint j;                                                         //时间控制全局变量声明
  23. uchar RR,GG,BB;                                         //RGB灰度值全局变量声明

  24. void h_dat0();                                         //数码BIT0
  25. void h_dat1();                                         //数码BIT1
  26. void fs_rgbdat();                                 //发送RGB灰度数据

  27. void red_jl();                                         //红色渐亮
  28. void red_jm();                                         //红色渐灭
  29. void green_jl();                                 //绿色渐亮
  30. void green_jm();                                 //绿色渐灭
  31. void blue_jl();                                         //蓝色渐亮
  32. void blue_jm();                                         //蓝色渐灭
  33. void white_jl();                                 //白色渐亮
  34. void white_jm();                                 //白色渐灭
  35. void delay_1ms(uint z);                         //延时函数声明
  36. //*****************************主程序开始*****************************//
  37. void main()
  38. {
  39.     while(1)
  40.     {
  41.         RR=0; GG=0; BB=0;
  42.         fs_rgbdat();                                 //发送RGB灰度数据
  43.         DIO=0;                                                  //数据IO口置0
  44.         delay_1ms(50);                                  //延时100毫秒等待所有MCU复位

  45.         red_jl();                                         //红色渐亮
  46.         red_jm();                                         //红色渐灭
  47.         green_jl();                                         //绿色渐亮
  48.         green_jm();                                          //绿色渐灭
  49.         blue_jl();                                         //蓝色渐亮
  50.         blue_jm();                                         //蓝色渐灭
  51.         white_jl();                                         //白色渐亮
  52.         white_jm();                                         //白色渐灭
  53.     }

  54. }
  55. //*****************************主程序结束*****************************//




  56. //*****************************子程序开始*****************************//
  57. //=======================红色渐亮=======================//
  58. void red_jl()
  59. {
  60.     uint i;
  61.     RR=0; GG=0; BB=0;
  62.     for(i=0; i<256; i++)                 //白色渐灭
  63.     {
  64.         fs_rgbdat();                                 //发送RGB灰度数据
  65.         DIO=0;                                         //数据IO口置0
  66.         delay_1ms(5);
  67.         RR++;
  68.     }
  69.     RR=255; GG=0; BB=0;
  70. }

  71. //=======================红色渐灭=======================//
  72. void red_jm()
  73. {
  74.     uint i;
  75.     RR=255; GG=0; BB=0;
  76.     for(i=0; i<256; i++)                 //白色渐灭
  77.     {
  78.         fs_rgbdat();                                 //发送RGB灰度数据
  79.         DIO=0;                                         //数据IO口置0
  80.         delay_1ms(5);
  81.         RR--;
  82.     }
  83.     RR=0; GG=0; BB=0;
  84. }
  85. //=======================绿色渐亮=======================//
  86. void green_jl()
  87. {
  88.     uint i;
  89.     RR=0; GG=0; BB=0;
  90.     for(i=0; i<256; i++)                 //白色渐灭
  91.     {
  92.         fs_rgbdat();                                 //发送RGB灰度数据
  93.         DIO=0;                                         //数据IO口置0
  94.         delay_1ms(5);
  95.         GG++;
  96.     }
  97.     RR=0; GG=255; BB=0;
  98. }

  99. //=======================绿色渐灭=======================//
  100. void green_jm()
  101. {
  102.     uint i;
  103.     RR=0; GG=255; BB=0;
  104.     for(i=0; i<256; i++)                 //白色渐灭
  105.     {
  106.         fs_rgbdat();                                 //发送RGB灰度数据
  107.         DIO=0;                                         //数据IO口置0
  108.         delay_1ms(5);
  109.         GG--;
  110.     }
  111.     RR=0; GG=0; BB=0;
  112. }
  113. //=======================蓝色渐亮=======================//
  114. void blue_jl()
  115. {
  116.     uint i;
  117.     RR=0; GG=0; BB=0;
  118.     for(i=0; i<256; i++)                 //白色渐灭
  119.     {
  120.         fs_rgbdat();                                 //发送RGB灰度数据
  121.         DIO=0;                                         //数据IO口置0
  122.         delay_1ms(5);
  123.         BB++;
  124.     }
  125.     RR=0; GG=0; BB=255;
  126. }
  127. //=======================蓝色渐灭=======================//
  128. void blue_jm()
  129. {
  130.     uint i;
  131.     RR=0; GG=0; BB=255;
  132.     for(i=0; i<256; i++)                 //白色渐灭
  133.     {
  134.         fs_rgbdat();                                 //发送RGB灰度数据
  135.         DIO=0;                                         //数据IO口置0
  136.         delay_1ms(5);
  137.         BB--;
  138.     }
  139.     RR=0; GG=0; BB=0;
  140. }
  141. //=======================白色渐亮=======================//
  142. void white_jl()
  143. {
  144.     uint i;
  145.     RR=0; GG=0; BB=0;
  146.     for(i=0; i<256; i++)                 //白色渐灭
  147.     {
  148.         fs_rgbdat();                                 //发送RGB灰度数据
  149.         DIO=0;                                         //数据IO口置0
  150.         delay_1ms(5);
  151.         RR++;
  152.         GG++;
  153.         BB++;
  154.     }
  155.     RR=255; GG=255; BB=255;
  156. }
  157. //=======================白色渐灭=======================//
  158. void white_jm()
  159. {
  160.     uint i;
  161.     RR=255; GG=255; BB=255;
  162.     for(i=0; i<256; i++)                 //白色渐灭
  163.     {
  164.         fs_rgbdat();                                 //发送RGB灰度数据
  165.         DIO=0;                                         //数据IO口置0
  166.         delay_1ms(5);
  167.         RR--;
  168.         GG--;
  169.         BB--;
  170.     }
  171.     RR=0; GG=0; BB=0;
  172. }

  173. //=============低速模式数码BIT0(高电平时间:600ns 低电平时间:1940ns 周期T=2.54US)=============//
  174. void h_dat0()
  175. {
  176.   DIO=1;
  177.   nop; nop; nop; nop; nop;
  178.   nop; nop; nop;
  179.   DIO=0;
  180.   nop; nop; nop; nop; nop;
  181.   nop; nop; nop; nop; nop;
  182.   nop; nop; nop; nop; nop;
  183.   nop; nop; nop; nop; nop;
  184.   nop; nop; nop; nop; nop;
  185.   nop; nop;
  186. }
  187. //=============低速模式数码BIT1(高电平时间:1840ns 低电平时间:700ns 周期T=2.54US)=============//
  188. void h_dat1()
  189. {
  190.   DIO=1;
  191.   nop; nop; nop; nop; nop;
  192.   nop; nop; nop; nop; nop;
  193.   nop; nop; nop; nop; nop;
  194.   nop; nop; nop; nop; nop;
  195.   nop; nop; nop; nop; nop;
  196.   nop; nop; nop; nop; nop;
  197.   nop; nop; nop; nop; nop;
  198.   DIO=0;
  199. }

  200. //===================发送RGB灰度数据===================//
  201. void fs_rgbdat()                                          //发送RGB灰度数据
  202. {
  203.     uint k;
  204.     for(k=0; k<1024; k++)                         //发送1024个像素点的数据 (灯的封装与PCB封装不一致,须按RBG的顺序发送数据!!!)
  205.     {
  206.         LED_DAT=RR;                                         //红灯数据赋值给LED_DAT
  207.         if(bit7==1) h_dat1(); else h_dat0();
  208.         if(bit6==1) h_dat1(); else h_dat0();
  209.         if(bit5==1) h_dat1(); else h_dat0();
  210.         if(bit4==1) h_dat1(); else h_dat0();
  211.         if(bit3==1) h_dat1(); else h_dat0();
  212.         if(bit2==1) h_dat1(); else h_dat0();
  213.         if(bit1==1) h_dat1(); else h_dat0();
  214.         if(bit0==1) h_dat1(); else h_dat0();
  215.         LED_DAT=BB;                                         //蓝灯数据赋值给LED_DAT
  216.         if(bit7==1) h_dat1(); else h_dat0();
  217.         if(bit6==1) h_dat1(); else h_dat0();
  218.         if(bit5==1) h_dat1(); else h_dat0();
  219.         if(bit4==1) h_dat1(); else h_dat0();
  220.         if(bit3==1) h_dat1(); else h_dat0();
  221.         if(bit2==1) h_dat1(); else h_dat0();
  222.         if(bit1==1) h_dat1(); else h_dat0();
  223.         if(bit0==1) h_dat1(); else h_dat0();
  224.         LED_DAT=GG;                                         //绿灯数据赋值给LED_DAT
  225.         if(bit7==1) h_dat1(); else h_dat0();
  226.         if(bit6==1) h_dat1(); else h_dat0();
  227.         if(bit5==1) h_dat1(); else h_dat0();
  228.         if(bit4==1) h_dat1(); else h_dat0();
  229.         if(bit3==1) h_dat1(); else h_dat0();
  230.         if(bit2==1) h_dat1(); else h_dat0();
  231.         if(bit1==1) h_dat1(); else h_dat0();
  232.         if(bit0==1) h_dat1(); else h_dat0();
  233.     }
  234. }

  235. //========================延时1MS======================//
  236. void delay_1ms(uint z)
  237. {
  238.     uint x,y;
  239.     for(x=z; x>0; x--)
  240.         for(y=2800; y>0; y--);
  241. }
  242. //*****************************程序结束*****************************//
复制代码


评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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