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

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

[复制链接]

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

发表于 13-12-2007 05:47 PM | 显示全部楼层
原帖由 fritlizt 于 13-12-2007 05:01 PM 发表


我的方法很神奇的。。哈哈。
没有啦。。。
其实main program只是拿来set parameters,简单来讲我在main program 设定led 要怎样闪烁。
然后timer interrupt就会读取parameters和base on那些parameters决定 ...



是的,我明白你是用timer interrupt来令 LED 闪烁的。可是当你的 main program call 以下的 function 时

    LedBlinking (1, 500, 500);
    LedBlinking (2, 1000, 1000);
    LedBlinking (3, 50, 50);
    Delay (10000);  延迟 10 秒。

假如任何一个 function 都不满足状况,就会停留在延迟 10 秒 的程序对吗 ?所以最后一个执行的是 function 3 {LedBlinking (3, 500, 500);。 LedBlinking (3, 50, 50);。LedBlinking (3, 10, 90); }, 因此我想要了解的是 function 1 与 function 2 似乎都不会执行似的, 问题重点是它们(function 1 与 function 2)什么是什么时候才执行的呢??
回复

使用道具 举报

发表于 13-12-2007 06:01 PM | 显示全部楼层
原帖由 fritlizt 于 13-12-2007 05:01 PM 发表


我的方法很神奇的。。哈哈。
没有啦。。。
其实main program只是拿来set parameters,简单来讲我在main program 设定led 要怎样闪烁。
然后timer interrupt就会读取parameters和base on那些parameters决定 ...


呵呵!我明白你的做法了,多谢了。
回复

使用道具 举报

发表于 16-12-2007 07:41 PM | 显示全部楼层
这次用timer interrupt 来从新排过
//12MHz Crystal

#include <AT89X51.H>

sbit L1 =P1^0;                  //LED1
sbit L2 =P1^1;
sbit L3 =P1^2;
unsigned int a,b,c,t1,T2,T3,of1,of2,of3;
float D1,D2,D3,on1,on2,on3;
         

void function (void);


main() {
TMOD =1;

t1= 1000; //time = 1/freq                   (in ms)
T2= 2000;
T3= 100;
D1= 0.05;  //duty cycle
D2= 0.15;
D3= 0.1;
on1= t1* D1;          //on time
on2= T2*D2;
on3= T3*D3;                       
a=0;
b=0;
c=0;
L1=1;
L2=1;
L3=1;       

TH0=0xfc;                                        // set timer 0 to 1ms
TL0=0x18;                                        //        same as above
TR0=1;                                                //         start timer 0

IE=0x82;                 //enable Global & timer 0 interrupt
while (1);                   // keep looping do nothing. every 1ms timer 0
}                                   // interrupt will jump to function


void function (void )interrupt 1                 {        //timer 0 interrupt


if ( a ==on1){
L1=0;}
else if (a==t1){
L1=1;
a=0;}

if ( b==on2){
L2=0;}
else if (b==T2){
L2=1;
b=0;}

if ( c ==on3){
L3=0;}
else if (c==T3){
L3=1;
c=0;}

a++;
b++;
c++;
           }
回复

使用道具 举报

发表于 16-12-2007 10:59 PM | 显示全部楼层
原帖由 chan1314 于 16-12-2007 07:41 PM 发表
这次用timer interrupt 来从新排过

  1. //12MHz Crystal



  2. #include <AT89X51.H>



  3. sbit L1 =P1^0;                  //LED1

  4. sbit L2 =P1^1;

  5. sbit L3 =P1^2;

  6. unsigned int a,b,c,t1,T2,T3,of1,of2,of3;

  7. float D1,D2,D3,on1,on2,on3;

  8.          


  9. //void function (void);





  10. main() {

  11. TMOD =1;
复制代码

interrupt function在keil 里面是特别的, 不用prototyping

  1. void function (void )interrupt 1                 {        //timer 0 interrupt



  2. if ( a ==on1){

  3. L1=0;}

  4. else if (a==t1){

  5. L1=1;

  6. a=0;}



  7. if ( b==on2){

  8. L2=0;}

  9. else if (b==T2){

  10. L2=1;

  11. b=0;}



  12. if ( c ==on3){

  13. L3=0;}

  14. else if (c==T3){

  15. L3=1;

  16. c=0;}



  17. a++;

  18. b++;

  19. c++;

  20. TH0=0xfc;                                        // set timer 0 to 1ms


  21. TL0=0x18;                                        //        same as above


  22. TF0=1;                                                //         clear timer flag

  23.            }
复制代码

timer 0 没有16bits autoreload的功能。 得manual reload. 还有你忘了clear timer flag. TF0.
回复

使用道具 举报

发表于 4-10-2008 09:38 PM | 显示全部楼层
哎哟,我太迟来了,楼主请问什么是MCU?

看到我的答案请不要笑,我会害羞的。

Q1


  1. #include <16f877a.h> //use PIC16F877A
  2. #use delay(clock=20000000) //20MHz
  3. #fuses hs, noprotect, nowdt, nolvp
  4. #byte portb=6 //port B is used, address is  6
  5. void main()
  6. {
  7.   set_tris_b(0b00000000);
  8.   do
  9.   {
  10.      portb=0b00000111;
  11.      delay_ms(500);
  12.      portb=0b00000000;
  13.      delay_ms(500);
  14.   }while(1);
  15. }
复制代码
Q2


  1. #include <16f877a.h> //use PIC16F877A
  2. #use delay(clock=20000000) //20MHz
  3. #fuses hs, noprotect, nowdt, nolvp
  4. #byte portb=6 //port B is used, address is  6
  5. void main()
  6. {
  7.   int k,l,m,n;
  8.   set_tris_b(0b00000000);
  9.   do
  10.   {
  11.      for(k=0; k<6; k++)
  12.      {
  13.       portb=0b00000111;
  14.       delay_ms(50);
  15.       portb=0b00000011;
  16.       delay_ms(50);//100ms-500ms
  17.      }
  18.      

  19.   ///////////////////////////////////////////////
  20.      for(l=0; l<6; l++)
  21.      {
  22.      portb=0b00000110;
  23.      delay_ms(50);
  24.      portb=0b00000010;
  25.      delay_ms(50); //600ms-1000ms
  26.      }

  27.      
  28. /////////////////////////////////////////////////////////

  29.      for(m=0; m<6; m++)
  30.      {
  31.      portb=0b00000101;
  32.      delay_ms(50);
  33.      portb=0b00000001;
  34.      delay_ms(50);//1100ms-1500ms
  35.      }
  36.      
  37. /////////////////////////////////////////////////////////////////

  38.      for(n=0; n<6; n++)
  39.     {
  40.      portb=0b00000100;
  41.      delay_ms(50);
  42.      portb=0b00000000;
  43.      delay_ms(50);//1600ms-2000ms
  44.     }
  45.      
  46.   }while(1);
  47. }
复制代码
Q3
还要我做吗?哈哈。。。我会用回Q1和Q2的方法的,哈哈。。。
我会晕的。

请楼主多多指教。

[ 本帖最后由 东邪西毒 于 5-10-2008 12:55 PM 编辑 ]

评分

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

查看全部评分

回复

使用道具 举报

发表于 5-10-2008 08:32 PM | 显示全部楼层
第三题

  1. #include <16f877a.h> //use PIC16F877A
  2. #use delay(clock=20000000) //20MHz
  3. #fuses hs, noprotect, nowdt, nolvp
  4. #byte portb=6 //port B is used, address is  6
  5. void main()
  6. {
  7.   int a,b,c;
  8.   set_tris_b(0b00000000);
  9.   do
  10.   {
  11.       portb=0b00000111;
  12.       delay_ms(10);
  13.       portb=0b00000011;
  14.       delay_ms(40);
  15.       portb=0b00000010;
  16.       delay_ms(50); //first 100ms
  17.   ////////////////////////////////////////////////////
  18.      for(a=0; a<3; a++)
  19.      {
  20.      portb=0b00000110;
  21.      delay_ms(10);
  22.      portb=0b00000010;
  23.      delay_ms(90); //next 200ms, total 300ms
  24.      }
  25. /////////////////////////////////////////////////////////
  26.      for(b=0; b<8; b++)
  27.      {
  28.      portb=0b00000100;
  29.      delay_ms(10);
  30.      portb=0b00000000;
  31.      delay_ms(90);//next 700ms, total 1000ms
  32.      }
  33. /////////////////////////////////////////////////////////////////
  34.      portb=0b00000101;
  35.      delay_ms(10);
  36.      portb=0b00000001;
  37.      delay_ms(40);
  38.      portb=0b000000000;
  39.      delay_ms(50);//next 100ms, total 1100ms
  40.   /////////////////////////////////////////////////////////////////
  41.      for(c=0; c<10; c++)
  42.     {
  43.      portb=0b00000100;
  44.      delay_ms(10);
  45.      portb=0b00000000;
  46.      delay_ms(90);//next 900ms, total 2000ms
  47.     }
  48.      
  49.   }while(1);
  50. }
复制代码
没人来指教我的?

[ 本帖最后由 东邪西毒 于 5-10-2008 08:36 PM 编辑 ]

评分

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

查看全部评分

回复

使用道具 举报

楼主
 楼主| 发表于 6-10-2008 04:50 PM | 显示全部楼层
原帖由 东邪西毒 于 5-10-2008 08:32 PM 发表
没人来指教我的?

你虽然做到了, 但其实很勉强。
在真正的编程, 这种应该利用Timer 来做。
你可以参考其他人的答案, 尤其是Rothmans , fritlizt的大作。

其实, 用CCS C 可以更简单, 就是用内建的RTOS, 你可以研究看看。
回复

使用道具 举报

发表于 6-10-2008 10:48 PM | 显示全部楼层
谢谢指教,我刚学不久,只好用这basis来做。我会参考他们的。
回复

使用道具 举报

楼主
 楼主| 发表于 7-10-2008 09:43 AM | 显示全部楼层
原帖由 东邪西毒 于 6-10-2008 10:48 PM 发表
谢谢指教,我刚学不久,只好用这basis来做。我会参考他们的。

没有问题, 方法其实有很多种, 都是从简单的开始学, 开始的时候是乱乱搞, (因为有时连自己都不知道要什么), 后来就会改进, 改进了又在改进,逻辑思考(Logical thinking) 才是最重要, 最后找到“方法”。
回复

使用道具 举报

发表于 8-10-2008 12:14 AM | 显示全部楼层
原帖由 东邪西毒 于 6-10-2008 10:48 PM 发表
谢谢指教,我刚学不久,只好用这basis来做。我会参考他们的。


不错。基本上逻辑都对了。美中不足的是你用delay来做。
这类型的可以用interrupt来做。其实delay是浪费资源, 能的话program尽量减少delay.
接下来挑战你。。。。。用interrupt来做。
你试试看用interrupt来做第一题。
hint: 每5ms interrupt一次, 要500ms on 500ms off的话就算进了interrupt几次。从这边下手。
加油加油。
回复

使用道具 举报

发表于 31-3-2009 06:21 PM | 显示全部楼层
Q1:
#include <16f877a.h>
#include <stdio.h>
#use delay(clock=4000000)
#fuses NOWDT,HS,NOPUT, NOPROTECT,NOLVP

struct pin_map
{
   int unused1:8;
   boolean LED1;
   boolean LED2;
   boolean LED3;
   int unused2:5;
};
struct pin_map port;
struct pin_map direction;
#byte port=0x05
#byte direction=0x85

void main()
{
   direction.LED1=0;
   direction.LED2=0;
   direction.LED3=0;
   port.LED1=1;
   port.LED2=1;
   port.LED3=1;
   delay_ms(500);
   while(1)
   {
      port.LED1=!port.LED1;
      port.LED2=!port.LED2;
      port.LED3=!port.LED3;
      delay_ms(500);
   }
}

评分

参与人数 1积分 +20 收起 理由
pic + 20 Q1 奖励。

查看全部评分

回复

使用道具 举报

发表于 31-3-2009 06:22 PM | 显示全部楼层
Q2:
#include <16f877a.h>
#include <stdio.h>
#use delay(clock=4000000)
#fuses NOWDT,HS,NOPUT, NOPROTECT,NOLVP

struct pin_map
{
   int unused1:8;
   boolean LED1;
   boolean LED2;
   boolean LED3;
   int unused2:5;
};
struct pin_map port;
struct pin_map direction;
#byte port=0x05
#byte direction=0x85

int count1=0,count2=0,count3=0;

void main()
{
   setup_timer_0(RTCC_INTERNAL);
   set_timer0(156);
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RTCC);
   direction.LED1=0;
   direction.LED2=0;
   direction.LED3=0;
   port.LED1=1;
   port.LED2=1;
   port.LED3=1;
   while(1)
   {
      ;
   }
}

#INT_RTCC
void rtcc_isr()
{
   count1++;
   count2++;
   count3++;
   if(count1==500)
   {
      count1=0;
      port.LED3=!port.LED3;
   }
   if(count2==5000)
   {
      count2=0;
      port.LED2=!port.LED2;
   }
   if(count3==10000)
   {
      count3=0;
      port.LED3=!port.LED3;
   }

}
回复

使用道具 举报

发表于 1-4-2009 01:12 AM | 显示全部楼层
以上的程序是用ccs c 来编写,我不会用proteus,所以不会simulate,如果有错误请多多指教
回复

使用道具 举报

发表于 2-4-2009 03:52 AM | 显示全部楼层
第三题应该是用PWM来写吧!
回复

使用道具 举报

发表于 2-4-2009 11:37 AM | 显示全部楼层
请问版主,rtos怎么用?有什么写法?可以给example吗?
回复

使用道具 举报

楼主
 楼主| 发表于 3-4-2009 11:01 AM | 显示全部楼层
原帖由 热爱音乐 于 31-3-2009 06:22 PM 发表
Q2:
#include
#include
#use delay(clock=4000000)
#fuses NOWDT,HS,NOPUT, NOPROTECT,NOLVP

struct pin_map
{
   int unused1:8;
   boolean LED1;
   boolean LED2;
   boolean LED3;
   int unuse ...

不行哦。。
回复

使用道具 举报

发表于 3-4-2009 11:20 AM | 显示全部楼层
原帖由 热爱音乐 于 2-4-2009 11:37 AM 发表
请问版主,rtos怎么用?有什么写法?可以给example吗?


rtos很少人自己写
都是用罢了。有很多rtos.个别有自己的用法。得看他们的user manual才懂怎样用
回复

使用道具 举报

发表于 4-4-2009 09:28 PM | 显示全部楼层
请问有什莫书可以介绍像你们可以写program......
回复

使用道具 举报

发表于 5-4-2009 12:56 AM | 显示全部楼层
原帖由 wilson16 于 4-4-2009 09:28 PM 发表
请问有什莫书可以介绍像你们可以写program......


嗯。。。我一开始是从上课接触到。然后自己兴趣在慢慢学。
所以我是从课本开始的。 如果你有兴趣, 你可以google,还是上来这里发问。
只要有心, 很多人愿意和你分享。
回复

使用道具 举报

发表于 5-4-2009 05:35 PM | 显示全部楼层

回复 119# fritlizt 的帖子

谢谢。 其实我之前有学过一点c++ 。可是好像跟你们不一样的。那我要如何开始呢?
我真的很想学叻!

[ 本帖最后由 wilson16 于 5-4-2009 05:36 PM 编辑 ]
回复

使用道具 举报

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

本版积分规则

 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
0.200813s Gzip On
快速回复 返回顶部 返回列表