找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15单片机的5050PCA流水灯程序

[复制链接]
ID:466381 发表于 2021-2-13 02:08 | 显示全部楼层 |阅读模式
通过74HC595控制8位流水灯,PCA的三路PWM控制颜色
引脚定义(仅供参考)
sbit DQ=P1^2;
sbit RCK=P1^3;
sbit SCLK=P1^4;
sbit Blue=P1^0;
sbit Red=P1^1;
sbit Green=P3^7;

单片机源程序如下:
  1. #include<stc15f2k60s2.h>
  2. #include<intrins.h>

  3. sbit DQ=P1^2;
  4. sbit RCK=P1^3;
  5. sbit SCLK=P1^4;
  6. /*
  7. sbit Blue=P1^0;
  8. sbit Red=P1^1;
  9. sbit Green=P3^7;
  10. */

  11. unsigned int bianliang;
  12. unsigned char red,green,blue;

  13. #define CCP_S0 0x10
  14. #define CCP_S1 0x20
  15. void delay(void)   //误差 0us
  16. {
  17.     unsigned char a,b;
  18.     for(b=173;b>0;b--)
  19.         for(a=143;a>0;a--);
  20. }

  21. void Timer0Init(void)                //7500微秒@11.0592MHz
  22. {
  23.         AUXR &= 0x7F;                //定时器时钟12T模式
  24.         TMOD &= 0xF0;                //设置定时器模式
  25.     TH0 = 0x0F1;
  26.     TL0 = 0x9A;
  27.         TF0 = 0;                //清除TF0标志
  28.         TR0 = 1;                //定时器0开始计时
  29.         EA=1;
  30.         ET0=1;
  31. }


  32. void Write595(unsigned char dat)
  33. {
  34. unsigned char i;
  35. RCK=0;
  36. for(i=0;i<8;i++)
  37. {
  38. SCLK=0;
  39. dat<<=1;
  40. _nop_();
  41. DQ=CY;
  42. _nop_();
  43. _nop_();
  44. SCLK=1;
  45. }
  46. RCK=1;
  47. }

  48. void PWMInit()
  49. {
  50. ACC=P_SW1;
  51. ACC&=~(CCP_S0|CCP_S1);
  52. P_SW1=ACC;
  53.        
  54. CCON=0X00;
  55. CL=0;
  56. CH=0;
  57. CMOD=0x08;
  58. /*红*/
  59. PCA_PWM0=0x00;
  60. CCAP0H=CCAP0L=0X00;
  61. CCAPM0=0X42;
  62. /*蓝*/       
  63. PCA_PWM1=0x00;
  64. CCAP1H=CCAP1L=0X00;
  65. CCAPM1=0X42;
  66. /*绿*/       
  67. PCA_PWM2=0x00;
  68. CCAP2H=CCAP2L=0Xff;
  69. CCAPM2=0X42;
  70. }

  71. void PWMSet(unsigned char re,blu,gree)
  72. {
  73. CCAP0H=CCAP0L=re;
  74. CCAP1H=CCAP1L=blu;
  75. CCAP2H=CCAP2L=gree;
  76. }
  77. void main()
  78. {
  79. bianliang=0;blue=255;green=0;red=0;
  80. PWMInit();
  81. Timer0Init();
  82. while(1)
  83. {
  84. unsigned char ams,i,j,sma;

  85. for(j=0;j<12;j++)
  86. {
  87. ams=0x80;
  88. for(i=0;i<8;i++)
  89. {
  90. Write595(~ams);       
  91. ams>>=1;
  92. delay();
  93. }
  94. }

  95. for(j=0;j<12;j++)
  96. {
  97. ams=0x01;
  98. for(i=0;i<8;i++)
  99. {
  100. Write595(~ams);       
  101. ams<<=1;
  102. delay();
  103. }
  104. }



  105. for(j=0;j<8;j++)
  106. {
  107. ams=0x80;
  108. for(i=0;i<8;i++)
  109. {
  110. Write595(~ams);       
  111. ams>>=1;
  112. delay();
  113. }
  114. ams=0x01;
  115. for(i=0;i<8;i++)
  116. {
  117. Write595(~ams);       
  118. ams<<=1;
  119. delay();
  120. }
  121. }

  122. for(j=0;j<16;j++)
  123. {
  124. ams=0x80;sma=0x01;
  125. for(i=0;i<8;i++)
  126. {
  127. Write595(~(ams|sma));       
  128. ams>>=1;
  129. sma<<=1;
  130. delay();
  131. }
  132. }

  133. for(j=0;j<8;j++)
  134. {
  135. ams=0x7f;
  136. for(i=0;i<8;i++)
  137. {
  138. Write595(ams);       
  139. ams>>=1;
  140. delay();
  141. }
  142. }

  143. for(j=0;j<8;j++)
  144. {
  145. ams=0xfe;
  146. for(i=0;i<8;i++)
  147. {
  148. Write595(ams);       
  149. ams<<=1;
  150. delay();
  151. }
  152. }

  153. for(j=0;j<12;j++)
  154. {
  155. ams=0xf0;
  156. for(i=0;i<2;i++)
  157. {
  158. Write595(~ams);
  159. delay();
  160. delay();       
  161. delay();
  162. ams>>=4;
  163. Write595(~ams);
  164. delay();
  165. delay();
  166. delay();
  167. }
  168. }

  169. for(j=0;j<12;j++)
  170. {
  171. ams=0xaa;
  172. for(i=0;i<2;i++)
  173. {
  174. Write595(~ams);
  175. delay();
  176. delay();       
  177. delay();
  178. Write595(ams);
  179. delay();
  180. delay();
  181. delay();
  182. }
  183. }

  184. for(j=0;j<12;j++)
  185. {
  186. ams=0x88;
  187. for(i=0;i<4;i++)
  188. {
  189. Write595(~ams);
  190. ams>>=1;
  191. delay();
  192. delay();
  193. }
  194. }


  195. for(j=0;j<12;j++)
  196. {
  197. ams=0x11;
  198. for(i=0;i<4;i++)
  199. {
  200. Write595(~ams);
  201. ams<<=1;
  202. delay();
  203. delay();
  204. }
  205. }



  206. }
  207. }


  208. void Timer() interrupt 1
  209. {
  210. if(bianliang==0)
  211. {blue=255;green=0;red=0;}

  212. if(bianliang>0&&bianliang<255)
  213. {blue--;red++;}

  214. if(bianliang==255)
  215. {blue=0;green=0;red=255;}

  216. if(bianliang>255&&bianliang<510)
  217. {red--;green++;}

  218. if(bianliang==510)
  219. {blue=0;green=255;red=0;}

  220. if(bianliang>510&&bianliang<765)
  221. {blue++;}

  222. if(bianliang==765)
  223. {blue=255;green=255;red=0;}

  224. if(bianliang>765&&bianliang<1020)
  225. {red++;green--;}

  226. if(bianliang==1020)
  227. {blue=255;green=0;red=255;}

  228. if(bianliang>1020&&bianliang<1275)
  229. {blue--;green++;}

  230. if(bianliang==1275)
  231. {blue=0;green=255;red=255;}

  232. if(bianliang>1275&&bianliang<1530)
  233. {blue++;}

  234. if(bianliang==1530)
  235. {blue=255;}

  236. if(bianliang>1530&&bianliang<1785)
  237. {red--;}

  238. if(bianliang==1785)
  239. {red=0;}

  240. if(bianliang>1785&&bianliang<2040)
  241. {red++;blue--;}

  242. if(bianliang==2040)
  243. {blue=0;red=255;}

  244. if(bianliang>2040&&bianliang<2295)
  245. {blue++;green--;}

  246. if(bianliang==2295)
  247. {blue=255;green=0;red=255;}

  248. if(bianliang>2295&&bianliang<2550)
  249. {red--;green++;}

  250. if(bianliang==2550)
  251. {blue=255;green=255;red=0;}

  252. if(bianliang>2550&&bianliang<2805)
  253. {blue--;}

  254. if(bianliang==2805)
  255. {blue=0;green=255;red=0;}

  256. if(bianliang>2805&&bianliang<3060)
  257. {red++;green--;}

  258. if(bianliang==3060)
  259. {blue=0;green=0;red=255;}

  260. if(bianliang>3060&&bianliang<3315)
  261. {red--;blue++;}

  262. bianliang++;
  263. PWMSet(red,blue,green);
  264. if(bianliang==3315)
  265. {bianliang=0;}

  266. }
复制代码

所有程序51hei提供下载:
5050全彩流水灯PCA.zip (34.5 KB, 下载次数: 11)



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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