找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1250|回复: 1
打印 上一主题 下一主题
收起左侧

单片机PWM控制LED同步渐变分控效果程序

[复制链接]
跳转到指定楼层
楼主
ID:1002758 发表于 2022-1-20 11:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //************************************
  2. //***********
  3. //****        2004-06-19        mcu at89c2051 38400BPS  OSC 22.1184MHZ
  4. //************************************
  5. #include <at892051.h>
  6. #include <stdio.h>//一般I/O函数
  7. #include <stdlib.h>//标准函数
  8. #include <absacc.h>//绝对地址
  9. #include <intrins.h>//内部函数       
  10. #include <setjmp.h>
  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. #define Byte unsigned char
  14. #define Word unsigned int
  15. #define ulong unsigned long
  16. #define bool bit
  17. #define true 1
  18. #define false 0
  19. #define V_TH0   0xff  /* 时间常数高8位 (65536-500)/256                        */
  20. #define V_TL0   0x80  /* 时间常数低8位 (65536-500)%256   11.0592*/
  21. #define ADD 1
  22. //******************************
  23. sbit roe=P3^2;
  24. sbit goe=P3^3;
  25. sbit boe=P3^4;
  26. //**************************************************************
  27. uchar        dis_buf_r,dis_buf_g,dis_buf_b;        //显示缓冲
  28. uchar         mode;                               
  29. uchar         pointer;
  30. uchar        send_buf[4];
  31. uchar        pwm,rl;
  32. uchar         setadd;
  33. jmp_buf env;
  34. int retval;
  35. uchar bdata flags;
  36. sbit flag0=flags^0;
  37. sbit flag1=flags^1;
  38. sbit flag2=flags^2;
  39. sbit flag3=flags^3;
  40. sbit frameok=flags^4;
  41. //*********************************
  42. void         delay(uint j);
  43. void        qcgd(uint speed);
  44. //*********************************
  45. void main(void)
  46. {
  47. TMOD=0x21;
  48. SCON=0xd0;
  49. TH1=0xfd;
  50. TL1=0xfd;        //256-(22.1184*10~6/32/12/3/38400*2)
  51. //PCON=0X80;//倍频
  52. SM2=1;
  53. TL0=V_TL0;
  54. TH0=V_TH0;
  55. TR0=1;
  56. ET0=1;
  57. TR1=1;
  58. ET1=0;
  59. ES=1;
  60. EA=1;
  61. PS=1;
  62. frameok=0;
  63. pointer=0;
  64. dis_buf_b=dis_buf_g=dis_buf_r=15;
  65. setadd=(~P1)&0xff;
  66. while(1)
  67.         {
  68.         if(mode==0x55)
  69.                 {delay(4);}
  70.         else
  71.                 {
  72.                 retval=setjmp(env);
  73.                 if(retval==0)
  74.                         {
  75.                         qcgd(20);
  76.                         }
  77.                 }
  78.         }
  79. }
  80. //*********************************
  81. //   接收数据
  82. //*********************************
  83. void        receive(void)
  84. {
  85. dis_buf_r=send_buf[1];
  86. dis_buf_g=send_buf[2];
  87. dis_buf_b=send_buf[3];
  88. }
  89. //*****************************************
  90. //         延时
  91. //**************************************
  92. void delay(uint tim)
  93. {
  94. uint i;
  95. while(tim!=0)
  96.         {
  97.         for(i=0;i<50;i++)
  98.                 {
  99.                 if(frameok)
  100.                         {receive();
  101.                         mode=0x55;
  102.                         frameok=0;
  103.                         SM2=1;
  104.                         pointer=0;
  105.                         retval=1;
  106.                         longjmp(env,retval);
  107.                         }
  108.                 }  
  109.         tim--;
  110.         }
  111. }
  112. //************************************
  113. //七彩过渡roe=(dis_buf_r<pwm)?0:1;
  114. //**********************************
  115. void        qcgd(uint speed)
  116. {

  117. //for(i=0;i<255;i++){dis_buf_r=i;dis_buf_g=0;dis_buf_b=0;delay(speed);}//red
  118. /*
  119. for(i=0;i<16;i++){dis_buf_r=15;dis_buf_g=i;dis_buf_b=0;delay(speed);}//yeloww
  120. for(i=0;i<16;i++){dis_buf_r=~i;dis_buf_g=15;dis_buf_b=0;delay(speed);}//grn
  121. for(i=0;i<16;i++){dis_buf_r=0;dis_buf_g=15;dis_buf_b=i;delay(speed);}//qi
  122. for(i=0;i<16;i++){dis_buf_r=0;dis_buf_g=~i;dis_buf_b=15;delay(speed);}//blu
  123. for(i=0;i<16;i++){dis_buf_r=i;dis_buf_g=0;dis_buf_b=15;delay(speed);}//zhi
  124. for(i=0;i<16;i++){dis_buf_r=15;dis_buf_g=i;dis_buf_b=15;delay(speed);}//w
  125. for(i=0;i<16;i++){dis_buf_r=15;dis_buf_g=~i;dis_buf_b=~i;delay(speed);}//r
  126. */
  127. for(dis_buf_g=63;dis_buf_g<64;dis_buf_g--)
  128.         {dis_buf_b=dis_buf_g;delay(speed);}//r
  129.         dis_buf_r=63;dis_buf_g=0;dis_buf_b=0;

  130. for(dis_buf_g=1;dis_buf_g<64;dis_buf_g++)
  131.         {delay(speed);}//y
  132.         dis_buf_g=63;
  133. for(dis_buf_r=63;dis_buf_r<64;dis_buf_r--)
  134.         {delay(speed);}//g
  135.         dis_buf_r=0;
  136. for(dis_buf_b=1;dis_buf_b<64;dis_buf_b++)
  137.         {delay(speed);}//q
  138.         dis_buf_b=63;
  139. for(dis_buf_g=63;dis_buf_g<64;dis_buf_g--)
  140.         {delay(speed);}//b
  141.         dis_buf_g=0;
  142. for(dis_buf_r=1;dis_buf_r<64;dis_buf_r++)
  143.         {delay(speed);}//z
  144.         dis_buf_r=63;
  145. for(dis_buf_g=1;dis_buf_g<64;dis_buf_g++)
  146.         {delay(speed);}//w
  147.         dis_buf_g=63;
  148. }

  149. //****************************************
  150. //                 通讯子程序
  151. //**************************************
  152. void send(void) interrupt  4
  153. {
  154. if(!TI && RI && !frameok)
  155.         {RI=0;
  156.         if(pointer==0)
  157.                 {
  158.                 if(SBUF==setadd||SBUF==0)
  159.                         {
  160.                         SM2=0;pointer++;
  161.                         }
  162.                 }
  163.         else
  164.                 {
  165.                   if(pointer<3)
  166.                     {send_buf[pointer]=SBUF;pointer++;}
  167.                   else
  168.                      {
  169.                         send_buf[pointer]=SBUF;
  170.                         frameok=1;
  171.                         }
  172.                 }
  173.         }//end if
  174. }//end sub
  175. //*******************************************
  176. void timer1() interrupt  1  
  177. {
  178. TL0=V_TL0;
  179. TH0=V_TH0;
  180. pwm++;
  181. if(pwm>63)pwm=0;
  182. //for(pwm=0;pwm<64;pwm++)
  183. //        {
  184.         roe=(dis_buf_r<=pwm)?1:0;
  185.         goe=(dis_buf_g<=pwm)?1:0;
  186.         boe=(dis_buf_b<=pwm)?1:0;
  187. //        }
  188. }//end sub
复制代码


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:262 发表于 2022-1-20 17:52 | 只看该作者
缺少头文件啊 楼主能分享一下吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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