5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
楼主: DreamonII
打印 上一主题 下一主题

带坏女友[2]—让她帮我做了个KITT扫描灯(8页串口视频及源码,喜欢单片机的模友进)

[复制链接]
61
发表于 2009-12-28 12:18 | 只看该作者
好女友

欢迎继续阅读楼主其他信息

62
发表于 2009-12-28 12:21 | 只看该作者
:em17: 强啊,你老婆真是人才,没去当科学家太可惜了
63
发表于 2009-12-28 12:45 | 只看该作者
真是高手,连女友都帮忙了,在教一教即可入魔了。:em00:
64
发表于 2009-12-28 12:54 | 只看该作者
嘿嘿   这女人 真不错
65
发表于 2009-12-28 13:01 | 只看该作者
LZ要当心女友被抢了,赶快生一个小模友。:em07: :em07:
66
发表于 2009-12-28 13:04 | 只看该作者
看楼主的女友做事非常认真,现在这样的不多了,满脑子都是吃喝穿戴玩玩乐乐。
67
 楼主| 发表于 2009-12-28 13:05 | 只看该作者
原帖由 zhang56 于 2009-12-28 13:01 发表
LZ要当心女友被抢了,赶快生一个小模友。:em07: :em07:


嗯啦嗯啦。。。
从她大二开始追到研究生毕业。。。
算算整整五年啦。。。
春节后给她转正。。。
嘎嘎。。。:em15:
68
 楼主| 发表于 2009-12-28 13:06 | 只看该作者
原帖由 MAWGUO 于 2009-12-28 13:04 发表
看楼主的女友做事非常认真,现在这样的不多了,满脑子都是吃喝穿戴玩玩乐乐。


刚认识的时候也是个娇生惯养的富家女咯。。。
是偶调教有方的说。。。

PS:悄悄的告诉你一个秘密。。。 偶是从网上追到地。。。
69
发表于 2009-12-28 13:07 | 只看该作者
佩服你们两口子。:em26:
70
发表于 2009-12-28 13:07 | 只看该作者
原帖由 DreamonII 于 2009-12-28 11:30 发表


女友写了好多笔记,
整理完发你一套。。。


那就太感谢了:em00:

我邮箱:  l10658f@163.com
71
发表于 2009-12-28 13:11 | 只看该作者
女朋友出吗? 高价收了(玩笑)
72
 楼主| 发表于 2009-12-28 13:23 | 只看该作者

瞒着女友发一下她写的制作过程。。。(也算她的学习笔记了)。。。

这丫头学软件工程学出后遗症了。。。
再简单的东西都忘不了画个流程图。。。
嘿嘿。。。
===============================================

【单片机实例】改进动感闪灯
今天做的单片机实例,是在上文《动感闪灯》基础上进行改进的。改进后的单片机动感闪灯可使单灯轮流循环点亮,两灯对流循环点亮,灯从中心向两边点亮和向渐亮渐灭效果,而且这个控制器的设计可以用于广告彩灯控制器、舞台灯控制器,还可以用于汽车等领域中。
1)硬件电路



改进动感闪灯电路是在原动感闪灯的基础上进行改进的,原来3个按键增加为6个,分别由P2.0~P2.5作为按键控制。
2)程序设计
a.主程序
前面说到改进动感闪灯是在原动感闪灯进行改进,(具体参见《动感闪灯》一文),只在电路中新增3个键,总共就有6个按键,其中S0~S3用来控制闪灯模式,后两个键用来控制闪灯速度,增强效果。



其中fun_KeyScan()为扫描按键子程序,它的流程可以参过前文《动感闪灯》,这里uKey是用来记录存在按键的四种状态:
uKey值为0时,表示单灯循环轮流点亮方式,可以参考一下《动感闪灯》效果,即跳转到fun_LEDTurn()
uKey值为1时,表示双灯对流循环点亮方式,跳转fun_LEDTurn2();
uKey值为2时,表示灯从中心向两边逐个点亮方式,跳转fun_LEDShine()
默认情况下和存在按键S4时,uKey3,其效果为灯从中心向一边渐亮再渐来灭,再向另一边渐亮渐灭的方式。在非常经典的科幻电视剧《霹雳游侠》中经常可以看到,帅气主角Michael和那酷酷的宝贝坐驾Kitt,总能在极度恶劣的环境下出其制胜。每当kitt前面产生炫目光茫时,预示着又会是一声精彩。。。留心观察,uKey=3时的效果与其是不是有些相似呢?
b. fun_LEDTurn()
首先来看看《动感闪灯》实例中灯轮流点亮方式效果,灯从第1位向第8位轮流点亮,到达第8位时,直接返回第1位,重新来过,整个过程不免让人觉得有些生硬,fun_LEDTurn()对它作了改进,当到第8位后,让灯再逆向轮流点亮,这样的效果会自然很多。
P1输出值变化为0111 1111 -> 延时 –> 1011 1111
->
延时 –> 1101 1111
->
延时 –> 1110 1111 -> 延时 –> 1111 0111
->
延时 –> 1111 1011 -> 延时 –> 1111 1101
->
延时 –> 1111 1110 -> 延时 –> 1111 1101 -> 延时 –> 1111 1011 -> 延时 –>1111 0111 -> 延时 –>1110 1111
->
延时 –> 1101 1111
->
延时 –> 1011 1111 -> 延时 –> 0111 111 -> 延时 –>……




c. fun_LEDTurn2()
这里先取两个fun_LEDTurn()方式产生灯效果,并将其中一个进行反相,再把当前两种效果重叠到一起,就是fun_LEDTurn2()所要实现的。这里就需要增加两个全局变量,不防设为LEDT1LEDT2,分别记录的时左移和右移时灯状态。

d. fun_LEDShine() fun_LEDShineC()
这两种方式都采用简单数组来实现。


fun_LEDShine():
P1输出口变化为:1110 0111 -> 延时 –>1100 0011 -> 延时 –> 1000 0001 -> 延时 –> 0000 0000 -> 延时 –>1110 0111 -> 延时 –> ……
分析得出设一个数据LEDShine[4] = {0xe7,0xc3,0x81,0x00}进行简单循环即可实现。
fun_LEDShineC()P1输出口变化为:1110 1111 -> 延时 –>1100 1111 -> 延时 –>1000 1111 -> 延时 –>0000 1111 -> 延时 –>1000 1111 -> 延时 –>1100 1111 -> 延时–>1110 1111 -> 延时 –>1111 0111 -> 延时 –>1111 0011 -> 延时 –>1111 0001 -> 延时 –>1111 0000 -> 延时 –>1111 0001 -> 延时 –>1111 0011 -> 延时 –>1111 0111 -> 延时 –>1110 1111 -> 延时 –>……
总结得数组LEDShineC[14] = {0xef,0xcf,0x8f,0x0f,0x8f,0xcf,0xef,0xf7,0xf3,0xf1,0xf0,0xf1,0xf3,0xf7},简单循环即可实现。



[ 本帖最后由 DreamonII 于 2009-12-28 14:23 编辑 ]
73
 楼主| 发表于 2009-12-28 13:28 | 只看该作者
以下为测试成功的源代码


  1. /****************************************************

  2. * 声明: 此制作为CIKY单片机学习过程,欢迎爱好者

  3. 一起学习和探讨,共同进步。

  4. * Title: 改进动感闪灯

  5. * Description: 通过AT89S51单片机控制LED点亮方式,依次

  6. 为单灯循环轮流点亮、两点循环轮流点亮、

  7. LED从中心向两边逐个点亮和从中心渐亮渐灭

  8. 四种方式,还可以给亮灯速度进行加减速。

  9. * @author CIKY

  10. * Date: Dec. 27, 2009

  11. ****************************************************/

  12. #include



  13. #define uchar unsigned char



  14. sbit P2_0 = P2^0; //循环轮流点亮控制按键

  15. sbit P2_1 = P2^1; //两灯循环轮流点亮控制按键

  16. sbit P2_2 = P2^2; //LED从中心向两边逐个点亮控制按键;

  17. sbit P2_3 = P2^3; //

  18. sbit P2_4 = P2^4; //慢速按键

  19. sbit P2_5 = P2^5; //加速按键



  20. uchar uKeyTemp = 3; //保存按键模式,0为单灯循环轮流点亮,

  21. //1为两灯循环轮流点亮,2为LED从中心

  22. //向两边逐个点亮方式;



  23. uchar LEDT1 = 0x01; //保存循环轮流点亮左移时LED状态;

  24. uchar LEDT2 =0x80; //保存循环轮流点亮右移时LED状态;

  25. uchar m = 0; //控制方向



  26. uchar LEDShine[4] = {0xe7,0xc3,0x81,0x00};

  27. //LED灯从中心向四周逐个点亮;



  28. uchar LEDShineC[14] = {0xef,0xcf,0x8f,0x0f,0x8f,0xcf,0xef,0xf7,0xf3,0xf1,0xf0,0xf1,0xf3,0xf7};

  29. //LED从中心向单边逐个点亮熄灭过程;



  30. uchar n = 50; //延时时间



  31. //////////////////延时函数//////////////////////

  32. void Delay(uchar x)

  33. {

  34. while(x--)

  35. {

  36. uchar j;



  37. for(j=0;j<=125;j++);

  38. }

  39. }



  40. //////////////////扫描按键子程序////////////////////

  41. uchar fun_KeyScan()

  42. {



  43. if(P2_0 == 0) //单灯轮流点亮

  44. {

  45. m=0;

  46. n=50;

  47. LEDT1=0x01;

  48. LEDT2=0x80;

  49. uKeyTemp=0;

  50. }

  51. if(P2_1 == 0) //双灯轮流点亮

  52. {

  53. n=50;

  54. LEDT1=0x01;

  55. LEDT2=0x80;

  56. uKeyTemp=1;

  57. }

  58. if(P2_2 == 0) //中心向两边点亮

  59. {

  60. m=0;

  61. n=50;

  62. LEDShine[0]=0xe7;

  63. uKeyTemp=2;

  64. }

  65. if(P2_3 == 0) //从中心向左边点亮,再逐个熄灭,

  66. //再向右边逐个点亮,再熄灭,进行循环;

  67. {

  68. m=0;

  69. n = 100;

  70. LEDShineC[0]=0xef;

  71. uKeyTemp=3;

  72. }

  73. if(P2_4==0) //减速

  74. {

  75. if(n>=10)

  76. n-=10;

  77. }

  78. if(P2_5==0) //加速

  79. {

  80. if(n<240)

  81. n+=10;

  82. }

  83. return uKeyTemp;

  84. }



  85. //////////////////1灯循环轮流点亮子程序/////////////////////



  86. //循环左移

  87. void fun_LEDTurnL()

  88. {

  89. LEDT1<<=1;

  90. if(LEDT1==0)

  91. LEDT1=1;

  92. }



  93. //循环右移

  94. void fun_LEDTurnR()

  95. {

  96. LEDT2>>=1;

  97. if(LEDT2==0)

  98. LEDT2=0x80;

  99. }



  100. //1灯循环轮流点亮

  101. void fun_LEDTurn()

  102. {

  103. fun_LEDTurnL();

  104. fun_LEDTurnR();



  105. m=++m%16;

  106. if(m<8)

  107. P1=~LEDT2;

  108. else

  109. P1=~LEDT1;

  110. }



  111. //////////////////两灯循环轮流点亮方式子程序////////////////

  112. void fun_LEDTurn2()

  113. {

  114. fun_LEDTurnB();

  115. fun_LEDTurnA();

  116. P1=~(LEDT1|LEDT2);

  117. }



  118. //////////////////LED从中心向两边逐个点亮子程序/////////////////////

  119. void fun_LEDShine()

  120. {

  121. m=++m%4;

  122. P1=LEDShine[m];

  123. }



  124. //////////////////LED从中心逐步单边点亮子程序/////////////////////

  125. void fun_LEDShineC()

  126. {

  127. m=++m%14;

  128. P1=LEDShineC[m];

  129. }



  130. /////////////////主程序入口/////////////////////////

  131. void main(void)

  132. {

  133. uchar uKey; //保存存在按键的端口



  134. P1=0xff;

  135. P2=0xff;

  136. P1=0xfe;



  137. while(1)

  138. {

  139. uKey = fun_KeyScan();

  140. if (uKey == 0)

  141. fun_LEDTurn();

  142. else if(uKey == 1)

  143. fun_LEDTurn2();

  144. else if(uKey == 2)

  145. fun_LEDShine();

  146. else

  147. fun_LEDShineC();



  148. Delay(n);

  149. }

  150. }

复制代码
74
发表于 2009-12-28 14:02 | 只看该作者
帮顶,不错
75
发表于 2009-12-28 14:18 | 只看该作者
你女朋友真不错~~
76
发表于 2009-12-28 14:30 | 只看该作者
:em16: :em16:
有这么聪明的女人?
她都这么聪明了,还要你干嘛??:em15: (开个玩笑)
77
 楼主| 发表于 2009-12-28 14:31 | 只看该作者
原帖由 碗豆粉 于 2009-12-28 14:30 发表
:em16: :em16:
有这么聪明的女人?
她都这么聪明了,还要你干嘛??:em15: (开个玩笑)


没有我她不会这么聪明好不好。。。 :em18:
鲜花再美丽,也离不开XX的滋养。。。
78
发表于 2009-12-28 15:10 | 只看该作者
原帖由 DreamonII 于 2009-12-28 14:31 发表


没有我她不会这么聪明好不好。。。 :em18:
鲜花再美丽,也离不开XX的滋养。。。

这样说当心她跟你急呀。:em15:
79
发表于 2009-12-28 15:51 | 只看该作者
楼主的小姨子是学软件的不?我预定了:em15:
80
 楼主| 发表于 2009-12-28 15:53 | 只看该作者
小姨子学化工的。。。
本科要毕业正准备考研呢。。。
怕没时间谈恋爱吧。。。:em15:

不过已经有主了也说不定。。。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /2 下一条

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