Malay
颜色选择
阳光橙
深夜黑
天空蓝
葡萄紫
薄荷绿
深海蓝
首页
论坛
佳礼报道
新闻
搜索
26185
查看
208
回复

【练习】PIC 编程 - LED闪灯 (功力挑战)

[复制链接]

楼主: pic       显示全部楼层   阅读模式

发表于 12-11-2007 05:38 PM | 显示全部楼层

回复 #39 rothmans 的帖子

我不太会用,但它真的很好用,但我只能在lab用罢了,不能在家用。把你的circuit output拉拉下线去那个接去usb port的东西,然后在LABVIEW做个display和setting就能用了。
回复

使用道具 举报

发表于 12-11-2007 06:12 PM | 显示全部楼层
我的concept 不能吗??
如果要synchonize output , 那么就不直接out port , set 成某些condition , 然后
到end loop 时, 在check condition , 3 个output , 那么就有8个statement .....
回复

使用道具 举报

楼主
 楼主| 发表于 12-11-2007 06:32 PM | 显示全部楼层
原帖由 chan1314 于 12-11-2007 06:12 PM 发表
我的concept 不能吗??
如果要synchonize output , 那么就不直接out port , set 成某些condition , 然后
到end loop 时, 在check condition , 3 个output , 那么就有8个statement .....


你不能写PIC MCU的code, 或你可以写pseudo code , 或flowchat?不过不能给满分,不然别人可能不服哦!可以吗?  

第一题的太容易, 我要求你直接作第2和第3题?直接挑战好吗?
其实,programming 最重要的是Concept , programming只是把它实现出来, language 只是工具。
回复

使用道具 举报

发表于 12-11-2007 06:50 PM | 显示全部楼层
原帖由 pic 于 12-11-2007 03:31 PM 发表

过关。

还有第二,第三题, 努力。。。


为什么只有Jason, Rothmans, 有情, 和乱水的Chan1314 参与?
其他人呢?为什么没有C 和PICBasic的范例?

也为什么没有人讨论怎样做第2,3题?
还有很 ...


Basic尝试过用Bascom,可是我倒觉得伸缩性不强,不好用,而且也很少人用
写MCU还是用ASM和C比较好
回复

使用道具 举报

发表于 12-11-2007 07:23 PM | 显示全部楼层
原帖由 pic 于 12-11-2007 07:49 AM 发表
你是用什么版本的Protus? 是 Lite 吗?


我也不很清楚叻,就是照着你给的link 下载咯
第二和第三我在努力着。。。。
我没有用过timer interrupt, 所以对我来说有点难度
快好了。。。
回复

使用道具 举报

楼主
 楼主| 发表于 12-11-2007 07:28 PM | 显示全部楼层
原帖由 PenBrush 于 12-11-2007 05:34 PM 发表
我是用 PIC 16F84A CCSC Compiler 的

不晓得为什么用16F628A 能 Compiler 没 error 但是却在Simulate时没有Output。。

以下是题目一。。。。题目2 & 3 。。。。先等等。。

http://rapidshare.com/fi ...

如你是用MPLAB simulate,记得要用正确的Device.
回复

使用道具 举报

发表于 12-11-2007 07:29 PM | 显示全部楼层
原帖由 若有情 于 12-11-2007 06:50 PM 发表


Basic尝试过用Bascom,可是我倒觉得伸缩性不强,不好用,而且也很少人用
写MCU还是用ASM和C比较好


胡说 !用 C 方便多咯!用 ASM 还需要知道好多东西。我之前是用 ASM 的,非常乱水。还是 C 好。除非你受到价钱,时间,空间或是编译器的束缚。不然建议别用 ASM.
回复

使用道具 举报

发表于 12-11-2007 07:40 PM | 显示全部楼层
我也想参加, 不过懒惰。。。。。。
回复

使用道具 举报

发表于 12-11-2007 07:57 PM | 显示全部楼层
原帖由 pic 于 12-11-2007 06:32 PM 发表


你不能写PIC MCU的code, 或你可以写pseudo code , 或flowchat?不过不能给满分,不然别人可能不服哦!可以吗?  

第一题的太容易, 我要求你直接作第2和第3题?直接挑战好吗?
其实,programmin ...



哦哦, 我不是要分数的, 不能吃, 拿来做什么?/
我那个是第三题的答案。因为反正作, 当然直接跳啦。。

我count 从1 开始到2000 , (一个加delay 1 ms), 开始三个灯都亮

然后每十, B.2 都会off ( 就是亮10ms) 《条件一, 因为关了, 在条件3 前, 都不会亮
然后每50, B.0 会off  《条件二
每100 , B.2 就亮  (暗90ms) 《条件三
如此推算。

如果要同一个时间亮, 那么code 就要长一点, 把B.0 1 2 都换成 ABC ,
然后就 check , if ( a == 1 && b == 1 && c ==1)
B= 0x07 (不知道能不能这样set , 就把port B set 成 00000111)就能亮了
这个之后呢, counter 就加一 , 加到2000 , 就 reset , B012 都亮回。
回复

使用道具 举报

楼主
 楼主| 发表于 12-11-2007 09:23 PM | 显示全部楼层
原帖由 chan1314 于 12-11-2007 07:57 PM 发表

我count 从1 开始到2000 , (一个加delay 1 ms), 开始三个灯都亮

然后每十 ...


也可以的。
回复

使用道具 举报

发表于 12-11-2007 10:19 PM | 显示全部楼层
原帖由 rothmans 于 12-11-2007 07:29 PM 发表


胡说 !用 C 方便多咯!用 ASM 还需要知道好多东西。我之前是用 ASM 的,非常乱水。还是 C 好。除非你受到价钱,时间,空间或是编译器的束缚。不然建议别用 ASM.


呵呵,说得也是,不过本身C语言基础不好,在努力练住
回复

使用道具 举报

发表于 12-11-2007 10:23 PM | 显示全部楼层
第2题的答案,不知对不对
http://rapidshare.com/files/69197172/INT1.HEX

        ORG        0000H
        MOV        P1,#7       
        LJMP        MAIN
;TIMER0        INTERUPT
;
        ORG        000BH
        MOV        TH0,#D8H
        MOV        TL0,#F0H
        DJNZ        R0,CONT
        MOV        R0,#5
        CPL        P1.2
        INC        R1
        MOV        A,R1
        CJNE        A,#10,CONT ;500ms
        MOV        R1,#0       
        CPL        P1.0
        INC        R2
        MOV        A,R2
        CJNE        A,#2,CONT ;1000ms
        MOV        R2,#0
        CPL        P1.1
;
CONT:
        RETI
MAIN:
        MOV        TMOD,#00000001B        ;TIMER        MODE        1
        MOV        TH0,#D8H        ;DELAY        10ms        R4(5)*10ms=50ms
        MOV        TL0,#0F0H        ;10ms/1us=10000 65536-10000=55536 (D8F0)
        MOV        R0,#5
        SETB        EA
        SETB        ET0
        SETB        TR0
;
WAIT:
        JMP        WAIT
;
        END

评分

参与人数 1积分 +50 收起 理由
pic + 50 第二题的奖励。

查看全部评分

回复

使用道具 举报

发表于 12-11-2007 11:10 PM | 显示全部楼层
这是第二题的。。。
版主帮我simulate看看对不对咯。。。
谢谢

http://www.sendspace.com/file/6f2uhg

对的话我才把源码帖上。。。
对了,我是用20MHz crystal, 16F877a

[ 本帖最后由 jason86 于 12-11-2007 11:33 PM 编辑 ]

评分

参与人数 1积分 +50 收起 理由
pic + 50 第二题的奖励。

查看全部评分

回复

使用道具 举报

发表于 12-11-2007 11:23 PM | 显示全部楼层
原帖由 若有情 于 12-11-2007 10:19 PM 发表


呵呵,说得也是,不过本身C语言基础不好,在努力练住


老实说,我的 C 语言基础也不好,每次只会那些 printf("Hello World\n" ); 的东西  。

[ 本帖最后由 rothmans 于 28-7-2008 06:53 PM 编辑 ]
回复

使用道具 举报

发表于 12-11-2007 11:26 PM | 显示全部楼层
我才想到我的logic 有问题, 需要分多几个loop 才不会有问题,
因为其他的也能 %10 ==0 ....
算了。。。。
回复

使用道具 举报

发表于 12-11-2007 11:30 PM | 显示全部楼层
原帖由 <i>rothmans</i> 于 12-11-2007 11:23 PM 发表 <a href="http://chinese.cari.com.my/myforum/redirect.php?goto=findpost&pid=35394911&ptid=1030872" target="_blank"><img src="http://chinese.cari.com.my/myforum/images/common/back.gif" border="0" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" /></a><br />

<br />

<br />
<img src="images/smilies/titter.gif" smilieid="31" border="0" alt="" /> 老实说,我的 C 语言基础也不好,而且也学了十多年<img src="images/smilies/shy.gif" smilieid="30" border="0" alt="" /> 。每次只会那些 printf("Hello World\n" ); 的东西<img src="images/smilies/tongue.gif" smilieid="8" border="0" alt="" />  。
<br />



1+ 年? 介意透露都少岁了吗???
回复

使用道具 举报

发表于 12-11-2007 11:58 PM | 显示全部楼层
原帖由 pic 于 10-11-2007 10:07 AM 发表
这是给有心学PIC MCU的练习功课, 有兴趣的网友可以挑战或试试看... (写成的有加分奖励。)


条件:
1. MCU: PIC 16F628A / 16F877A
2. Clock: 4MHz~20Mhz
3. LED1,LED2,LED3, 分别接在Port B.0, B ...
  1. #include <DS89C4xx.h>
  2. #define ON 0
  3. #define OFF 1
  4. // LED
  5. sbit LED1 = P2^0;
  6. sbit LED2 = P2^1;
  7. sbit LED3 = P2^2;
  8. void SysInit (void);
  9. void Delay (unsigned int milisec);
  10. void LedBlinking (unsigned char led, unsigned int onTime, unsigned int offTime);
  11. unsigned int led1Counter = 0;
  12. unsigned int led2Counter = 0;
  13. unsigned int led3Counter = 0;
  14. unsigned int led1Temp = 0;
  15. unsigned int led2Temp = 0;
  16. unsigned int led3Temp = 0;
  17. unsigned int led1OnTime = 0;
  18. unsigned int led1OffTime = 0;
  19. unsigned int led2OnTime = 0;
  20. unsigned int led2OffTime = 0;
  21. unsigned int led3OnTime = 0;
  22. unsigned int led3OffTime = 0;
  23. void main (void)
  24. {
  25. TA = 0xAA;
  26. TA = 0x55;
  27. EWT = 0;
  28. SysInit ();
  29. LedBlinking (1, 500, 500);
  30. LedBlinking (2, 500, 500);
  31. LedBlinking (3, 500, 500);
  32. Delay (10000);
  33. LedBlinking (1, 500, 500);
  34. LedBlinking (2, 1000, 1000);
  35. LedBlinking (3, 50, 50);
  36. Delay (10000);
  37. LedBlinking (1, 50, 950);
  38. LedBlinking (2, 300, 1700);
  39. LedBlinking (3, 10, 90);
  40. Delay (10000);
  41. while (1);
  42. }
  43. void SysInit (void)
  44. {
  45. P0 = 0xFF;   //port initialization
  46. P1 = 0xFF;
  47. P2 = 0xFF;
  48. P3 = 0xFF;
  49.   PMR = 0x83;  //use on chip XRAM
  50. CKMOD = 0x38; //timer run at x 1 mode

  51. TMOD = 0x21; //timer 1 8 bits auto reload, timer 0 16 bits manual reload
  52. T2CON = 0x00; //timer 2 16bits auto reload
  53. RCAP2H = 0xA9; //timer 2 high byte
  54. RCAP2L = 0x9A; //timer 2 low byte   : total = 1 ms
  55. TR2 = 1;  //start timer 2
  56. IE = 0xA0;  //enable global interrupt, timer 2 interrupt
  57. }
  58. void Delay (unsigned int milisec)
  59. {  
  60.    unsigned int i;
  61.    for (i = 1; i <= milisec; i++)
  62.    {
  63.       TH0 = 0xA9;
  64.       TL0 = 0x9A;
  65.       TR0 = 1;
  66.       while (!TF0);
  67.       TF0 = 0;
  68.       TR0 = 0;
  69.    }
  70. }
  71. void T2ISR (void) interrupt 5 using 1
  72. {
  73. led1Counter ++;
  74. led2Counter ++;
  75. led3Counter ++;
  76. if (led1Counter >= led1Temp)
  77. {
  78.    led1Counter = 0;
  79.   LED1 = !LED1;
  80.   if (LED1 == ON)
  81.    led1Temp = led1OnTime;
  82.   else
  83.    led1Temp = led1OffTime;
  84. }
  85. if (led2Counter >= led2Temp)
  86. {
  87.    led2Counter = 0;
  88.   LED2 = !LED2;
  89.   if (LED2 == ON)
  90.    led2Temp = led2OnTime;
  91.   else
  92.    led2Temp = led2OffTime;
  93. }
  94. if (led3Counter >= led3Temp)
  95. {
  96.    led3Counter = 0;
  97.   LED3 = !LED3;
  98.   if (LED3 == ON)
  99.    led3Temp = led3OnTime;
  100.   else
  101.    led3Temp = led3OffTime;
  102. }
  103.   TF2 = 0;
  104. }
  105. void LedBlinking (unsigned char led, unsigned int onTime, unsigned int offTime)
  106. {
  107. if (led == 1)
  108. {
  109.    led1OnTime = onTime;
  110.   led1OffTime = offTime;
  111.   led1Counter = 0;
  112.   LED1 = OFF;
  113.   led1Temp = offTime;
  114. }
  115. else if (led == 2)
  116. {
  117.   led2OnTime = onTime;
  118.   led2OffTime = offTime;
  119.   led2Counter = 0;
  120.   LED2 = OFF;
  121.   led2Temp = offTime;
  122. }
  123. else if (led == 3)
  124. {
  125.    led3OnTime = onTime;
  126.   led3OffTime = offTime;
  127.   led3Counter = 0;
  128.   LED3 = OFF;
  129.   led3Temp = offTime;
  130. }
  131. else{}   
  132. }
复制代码
我的答案。用c写。compiler = keil c51
一开始解第一题。
10秒过后会跳去第二题。
10 秒过后会在跳去第三题。
忘了讲, 这个是给c51的。
pic也是大同小异。

这个solution应该不是optimum solution. 可能有更好的。

[ 本帖最后由 fritlizt 于 13-11-2007 12:03 AM 编辑 ]

评分

参与人数 1积分 +150 收起 理由
pic + 150 第1,2,3题的奖励。

查看全部评分

回复

使用道具 举报

楼主
 楼主| 发表于 13-11-2007 09:14 AM | 显示全部楼层
原帖由 若有情 于 12-11-2007 10:23 PM 发表
第2题的答案,不知对不对

对,可以。
回复

使用道具 举报

楼主
 楼主| 发表于 13-11-2007 09:17 AM | 显示全部楼层
原帖由 jason86 于 12-11-2007 11:10 PM 发表
这是第二题的。。。
版主帮我simulate看看对不对咯。。。
谢谢

对的话我才把源码帖上。。。
对了,我是用20MHz crystal, 16F877a

也可以啦。。。
不过LED3 那个有missing pulse。

本帖最后由 pic 于 14-10-2012 03:00 PM 编辑

回复

使用道具 举报

楼主
 楼主| 发表于 13-11-2007 09:24 AM | 显示全部楼层
原帖由 fritlizt 于 12-11-2007 11:58 PM 发表
我的答案。用c写。compiler = keil c51
一开始解第一题。
10秒过后会跳去第二题。
10 秒过后会在跳去第三题。
忘了讲, 这个是给c51的。
pic也是大同小异。

这个solution应该不是optimum solution. 可能有更好的。

看样子是可以啦。。。

好,好,好,不错不错,这里果然人才济济!
回复

使用道具 举报

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

本版积分规则

 WeChat
 CARI App
Get it FREE Google play
 Instagram
cari_malaysia
FOLLOW
- 版权所有 © 1996-2019 Cari Internet Sdn Bhd 佳礼网络有限公司 (483575-W) -
Private Cloud provided by IPSERVERONE
2.466315s Gzip On
快速回复 返回顶部 返回列表