找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机呼吸灯 霹雳游侠摩托车尾灯 仿真+程序代码

[复制链接]
跳转到指定楼层
楼主
ID:63472 发表于 2014-7-1 10:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
摩托车尾灯

  1. /*实例:
  2. 实例中部分与上述讲解有所不同
  3. 因为实际中我们控制的是16个灯,而在上述讲解中只是控制8个灯,所以实例中有所不同
  4. 由于单片机速度限制,我最后将一个周期设定为循环50次。
  5. 所以当数组中存50既代表全亮。*/
  6. //预处理
  7. #include <reg52.h>
  8. #define uchar unsigned char
  9. #define uint unsigned int
  10. //全局变量设定
  11. uchar dismem[16];
  12. uchar code tab[16]={0,1,2,3,4,5,6,7,8,9,11,13,16,22,35,50};
  13. uchar code ann[]={1,1,1,1,1,1,1,1,2,3,6,10,14,20,35,50,35,20,14,10,6,3,2,1,1,1,1,1,1,1,1,1};
  14. uchar code ann2[]={0,0,0,0,0,0,0,0,1,2,6,14,35,50,35,14,6,2,1,1,1,0,0,0,0,0,0,0,0};
  15. //延时函数
  16. void delay(uint i)
  17. {
  18. while(i--);
  19. }
  20. //取绝对值函数
  21. char abs(char i)
  22. {
  23. if (i<0)
  24. i=-i;
  25. return i;
  26. }
  27. //定时器设置函数
  28. void sinter()
  29. {
  30. IE=0x82;
  31. TCON=0x01;
  32. TH0=0xc0;
  33. TL0=0xFD;
  34. TR0=0x66;
  35. }
  36. //p0口位处理函数
  37. uchar bitcountp0(uchar n)
  38. {
  39. uchar i,p=0;
  40. for (i=0;i<8;i++)
  41. {
  42. if (dismem[i]<n)
  43. p=p|(1<<i);
  44. }
  45. return p;
  46. }
  47. //p2口位处理函数
  48. //在这里需要注意的是,p2口得顺序和我们led连接顺序是反的。详情可以观察电路图可了解到。
  49. uchar bitcountp2(uchar n)
  50. {
  51. uchar i,p=0;
  52. for (i=0;i<8;i++)
  53. {
  54. if (dismem[i+8]<n)
  55. p=p|(0x80>>i);
  56. }
  57. return p;
  58. }
  59. //清屏函数
  60. void clean(uchar n)
  61. {
  62. uchar i;
  63. for (i=0;i<16;i++)
  64. {
  65. dismem[i]=n;
  66. }
  67. }
  68. //呼吸灯函数
  69. //其中被控制灯在第a个和第b个之间。speed是呼吸速度。
  70. void roll10(uchar a,uchar b,uint speed)
  71. {
  72. uchar i,j;
  73. for (i=1;i<30;i++)
  74. {
  75. for (j=a;j<b;j++)

  76. {
  77. dismem[j]=i;
  78. }
  79. delay (speed);
  80. }
  81. for(i=30;i>0;i--)
  82. {
  83. for (j=a;j<b;j++)
  84. {
  85. dismem[j]=i-1;
  86. }
  87. delay (speed);
  88. }
  89. }
  90. //动画区域

  91. void flash_1()        ///////////////////////////////////////////
  92. {
  93. uchar i,j,mem[32]={0,0,0,0,0,0,0,0x00,0,0,0,0,0,0,0,0x01,15,13,11,9,7,5,3,0x02,1,1,1,1,1,1,1,1};
  94. for (i=0;i<36;i++)
  95. {
  96. for (j=0;j<16;j++)
  97. {
  98. dismem[j]=tab[mem[j]];
  99. }
  100. for (j=0;j<31;j++)
  101. {
  102. mem[j]=mem[j+1];
  103. }
  104. mem[31]=1;
  105. delay(750);
  106. }
  107. }
  108. void flash_2()                 /////////////////////////////////////////
  109. {
  110. roll10(0,16,300);
  111. roll10(0,16,300);
  112. }
  113. void flash_3()                 ////////////////////////////////////////////
  114. {
  115. uchar i,j;
  116. for (i=0;i<16;i++)
  117. {
  118. for (j=0;j<16;j++)
  119. {
  120. dismem[j]=ann[i+j];
  121. }
  122. delay(800+abs(i-8)*50);
  123. }
  124. delay(2500);
  125. for (i=16;i>0;i--)
  126. {
  127. for (j=0;j<16;j++)
  128. {
  129. dismem[j]=ann[i+j];
  130. }
  131. delay(800+abs(i-8)*50);
  132. }
  133. delay(2500);
  134. }
  135. void flash_4()                 /////////////////////////////////////////////
  136. {
  137. uchar i,j,k;
  138. for (i=0;i<16;i++)
  139. {
  140. k=(i%2)*50;
  141. for(j=0;j<8;j++)
  142. {
  143. dismem[j]=k;
  144. }
  145. k=((i+1)%2)*50;
  146. for (j=8;j<16;j++)
  147. {
  148. dismem[j]=k;
  149. }
  150. delay(3000);
  151. }
  152. for (j=0;j<8;j++)
  153. {
  154. dismem[j]=50;
  155. }
  156. for (i=50;i>0;i--)
  157. {
  158. for (j=0;j<16;j++)
  159. {
  160. dismem[j]=i-1;
  161. }
  162. delay (300);
  163. }
  164. }
  165. void flash_5()                 ////////////////////////////////////////////////
  166. {
  167. roll10(0,4,50);
  168. roll10(4,8,50);
  169. roll10(8,12,50);
  170. roll10(12,16,50);
  171. roll10(12,16,50);
  172. roll10(8,12,50);
  173. roll10(4,8,50);
  174. roll10(0,4,50);

  175. roll10(0,1,10);
  176. roll10(1,2,10);
  177. roll10(2,3,10);
  178. roll10(3,4,10);
  179. roll10(4,5,10);
  180. roll10(5,6,10);
  181. roll10(6,7,10);
  182. roll10(7,8,10);
  183. roll10(8,9,10);
  184. roll10(9,10,10);
  185. roll10(10,11,10);
  186. roll10(11,12,10);
  187. roll10(12,13,10);
  188. roll10(13,14,10);
  189. roll10(14,15,10);
  190. roll10(15,16,10);

  191. roll10(15,16,10);
  192. roll10(14,16,10);
  193. roll10(13,16,10);
  194. roll10(12,16,10);
  195. roll10(11,16,10);
  196. roll10(10,16,10);
  197. roll10(9,16,10);
  198. roll10(8,16,10);
  199. roll10(7,16,10);
  200. roll10(6,16,10);
  201. roll10(5,16,10);
  202. roll10(4,16,10);
  203. roll10(3,16,10);
  204. roll10(2,16,10);
  205. roll10(1,16,10);
  206. roll10(0,16,10);
  207. roll10(0,16,10);

  208. roll10(15,16,10);
  209. roll10(14,15,10);
  210. roll10(13,14,10);
  211. roll10(12,13,10);
  212. roll10(11,12,10);
  213. roll10(10,11,10);
  214. roll10(9,10,10);
  215. roll10(8,9,10);
  216. roll10(7,8,10);
  217. roll10(6,7,10);
  218. roll10(5,6,10);
  219. roll10(4,5,10);
  220. roll10(3,4,10);
  221. roll10(2,3,10);
  222. roll10(1,2,10);
  223. roll10(0,1,10);

  224. roll10(0,16,10);
  225. roll10(1,16,10);
  226. roll10(2,16,10);
  227. roll10(3,16,10);
  228. roll10(4,16,10);
  229. roll10(5,16,10);
  230. roll10(6,16,10);
  231. roll10(7,16,10);
  232. roll10(8,16,10);
  233. roll10(9,16,10);       
  234. roll10(10,16,10);
  235. roll10(11,16,10);
  236. roll10(12,16,10);
  237. roll10(13,16,10);
  238. roll10(14,16,10);
  239. roll10(15,16,10);

  240. }
  241. void flash_6_1(uint speed)          /////////////////////////////////////////
  242. {
  243. uchar i,j;
  244. for (i=1;i<50;i++)
  245. {
  246. for (j=0;j<16;j+=2)
  247. {
  248. dismem[j]=i;
  249. }
  250. for (j=1;j<16;j+=2)
  251. {
  252. dismem[j]=49-i;
  253. }
  254. delay (speed);
  255. }
  256. for (i=49;i>0;i--)
  257. {
  258. for (j=0;j<16;j+=2)
  259. {
  260. dismem[j]=i;
  261. }
  262. for (j=1;j<16;j+=2)
  263. {
  264. dismem[j]=49-i;
  265. }
  266. delay (speed);
  267. }
  268. }
  269. void flash_6_2(uint speed)          /////////////////////////////////////////
  270. {
  271. uchar i,j;
  272. for (i=1;i<50;i++)
  273. {
  274. for (j=0;j<4;j++)
  275. {
  276. dismem[j]=i;
  277. dismem[j+8]=i;
  278. }
  279. for (j=4;j<8;j++)
  280. {
  281. dismem[j]=49-i;
  282. dismem[j+8]=49-i;
  283. }
  284. delay (speed);
  285. }
  286. for (i=49;i>0;i--)
  287. {
  288. for (j=0;j<4;j++)
  289. {
  290. dismem[j]=i;
  291. dismem[j+8]=i;
  292. }
  293. for (j=4;j<8;j++)
  294. {
  295. dismem[j]=49-i;
  296. dismem[j+8]=49-i;
  297. }
  298. delay (speed);
  299. }
  300. }
  301. void flash_6()                                  //////////////////////////////////////////////
  302. {
  303. uchar i,j;
  304. for (i=1;i<50;i++)
  305. {
  306. for (j=1;j<16;j+=2)
  307. {
  308. dismem[j]=i;
  309. }
  310. delay (100);
  311. }
  312. flash_6_1(100);
  313. flash_6_1(100);
  314. flash_6_1(100);
  315. flash_6_1(100);
  316. for (i=49;i>0;i--)
  317. {
  318. for (j=1;j<16;j+=2)
  319. {
  320. dismem[j]=i;
  321. }
  322. delay (100);
  323. }
  324. for (i=1;i<50;i++)
  325. {
  326. for (j=4;j<8;j++)
  327. {
  328. dismem[j]=i;
  329. dismem[j+8]=i;
  330. }
  331. delay (100);
  332. }
  333. flash_6_2(100);
  334. flash_6_2(100);
  335. flash_6_2(100);
  336. for (i=49;i>0;i--)
  337. {
  338. for (j=4;j<8;j++)
  339. {
  340. dismem[j]=i;
  341. dismem[j+8]=i;
  342. }
  343. delay (100);
  344. }
  345. }
  346. void flash_7()                                  //////////////////////////////////////////////
  347. {
  348. uchar i,j,k;
  349. for (i=0;i<15;i++)
  350. {
  351. k=(i%2)*50;
  352. for (j=0;j<8;j++)
  353. {
  354. dismem[j]=k;
  355. }
  356. delay(1500);
  357. }
  358. for (i=0;i<15;i++)
  359. {
  360. k=(i%2)*50;
  361. for (j=8;j<16;j++)
  362. {
  363. dismem[j]=k;
  364. }
  365. delay(1500);
  366. }
  367. }
  368. void flash_8()                                ////////////////////////////////////////////////
  369. {
  370. uchar i,j;
  371. for (i=0;i<22;i++)
  372. {
  373. for (j=0;j<8;j++)
  374. {
  375. dismem[j]=ann2[i+j];
  376. dismem[15-j]=ann2[i+j];
  377. }
  378. delay(1500);
  379. }
  380. }
  381. void flash_9_l()                 /////////////////////////////////////////////////////////
  382. {
  383. uchar i,j;
  384. for (i=0;i<4;i++)
  385. dismem[i]=50;
  386. for (i=4;i<8;i++)
  387. dismem[i]=1;
  388. for (i=0;i<12;i++)
  389. {
  390. for (j=15;j>4;j--)
  391. dismem[j]=dismem[j-1];
  392. dismem[4]=0;
  393. delay(1000);
  394. }
  395. }
  396. void flash_9_r()                //////////////////////////////////////////////////
  397. {
  398. uchar i,j;
  399. for (i=12;i<16;i++)
  400. dismem[i]=50;
  401. for (i=8;i<12;i++)
  402. dismem[i]=1;
  403. for (i=0;i<12;i++)
  404. {
  405. for (j=0;j<11;j++)
  406. dismem[j]=dismem[j+1];
  407. dismem[11]=0;
  408. delay(1000);
  409. }
  410. }
  411. void flash_9()                        //////////////////////////////////////////////////////
  412. {
  413. flash_9_l();
  414. flash_9_r();
  415. flash_9_l();
  416. flash_9_r();
  417. flash_9_l();
  418. flash_9_r();

  419. }
  420. //主函数
  421. //主函数调用动画区域的函数,这里可以理解一个播放列表。
  422. void main()
  423. {
  424. sinter();
  425. clean(0);
  426. //play list;
  427. while(1)
  428. {
  429. flash_1();
  430. flash_2();
  431. flash_3();
  432. flash_4();
  433. flash_2();
  434. flash_5();
  435. flash_6();
  436. flash_7();
  437. flash_7();
  438. flash_9();
  439. flash_8();
  440. flash_8();
  441. flash_2();
  442. flash_6();
  443. flash_9();
  444. flash_3();
  445. flash_1();
  446. flash_8();
  447. flash_8();
  448. flash_6();
  449. flash_5();
  450. flash_4();

  451. }
  452. }
  453. //中断服务函数
  454. void print() interrupt 1
  455. {
  456. static uchar i=1;
  457. P0=bitcountp0(i);
  458. P2=bitcountp2(i);
  459. if (i<50)
  460. i++;
  461. else
  462. i=1;
  463. TH0=0xFd;
  464. TL0=0x66;
  465. }
复制代码


霹雳游侠灯.rar

620.85 KB, 下载次数: 162, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:44262 发表于 2014-7-17 16:55 来自手机 | 只看该作者
很牛的作品
回复

使用道具 举报

板凳
ID:68630 发表于 2014-11-10 20:25 | 只看该作者
真的是么
回复

使用道具 举报

地板
ID:68630 发表于 2014-11-10 20:25 | 只看该作者
弄下来看看就知道咋样了
回复

使用道具 举报

5#
ID:104289 发表于 2016-1-24 14:34 | 只看该作者
很强。。。。。。。。。。。。
回复

使用道具 举报

6#
ID:168949 发表于 2017-3-7 20:49 | 只看该作者
电路不一样,程序也不一样对吗
回复

使用道具 举报

7#
ID:169063 发表于 2017-3-8 11:20 | 只看该作者
学习借鉴了,谢谢楼主
回复

使用道具 举报

8#
ID:653749 发表于 2019-12-1 20:28 | 只看该作者
楼主怎么不对, 能给我对的吗,谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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