佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

楼主: pic

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

  [复制链接]
发表于 7-9-2010 11:23 PM | 显示全部楼层
本帖最后由 qweeer 于 7-9-2010 11:24 PM 编辑

我第3题的方法:                                                                        
                Device 16F877A
                XTAL = 4
                ALL_DIGITAL = TRUE                                
                TRISB = %00000000                        

Start:        Gosub LEDB1A
                Gosub LEDB1B
                Goto Start

'============ SUB PROGRAM ========================               
'============ LED B2 (High Speed Flashing)========
'============ on  10ms    ========================
'============ off 90ms    ========================
LEDB2A:    PortB.2 = 1                'LED B2 1st Part 50ms
                Delayms 10                'LED B2 on 10ms
                PortB.2 = 0                'LED B2 off 40ms
                Delayms 40                 
                Return               
LEDB2B:    PortB.2 = 0                'LED B2 2nd part 50ms
                Delayms 50                'LED B2 off 50ms
                Return

LEDB2:      Gosub LEDB2A        'LED B2 1st Part 50ms
                Gosub LEDB2B        'LED B2 2nd Part 50ms
                Return                'LED B2 Total 100ms               


'============ LED B0 (Medium speed)  ===============
'============ on   50ms   ========================
'============ off 950ms   ========================
LEDB0A:     PortB.0 = 1             'LED B0 1st Part 100ms                                
                Gosub LEDB2A             'LED B0 on  50ms
                PortB.0 = 0
                Gosub LEDB2B             'LED B0 off 50ms
                Return
LEDB0C:    PortB.0 = 0                'LED B0 3rd Part 700ms
                Gosub LEDB2                'LED B0 2nd 100ms
                Gosub LEDB2                'LED B0 3nd 100ms                        '
                Gosub LEDB2                'LED B0 2nd 100ms
                Gosub LEDB2                'LED B0 3nd 100ms        
                Gosub LEDB2                'LED B0 2nd 100ms               
LEDB0B:    PortB.0 = 0                'LED Bo 2nd Part 200ms
                Gosub LEDB2                'LED B0 3nd 100ms        
                Gosub LEDB2                'LED B0 3nd 100ms
                Return        

LEDB0:      Gosub LEDB0A        '100ms
                Gosub LEDB0B        '200ms
                Gosub LEDB0C        '700ms
                Return                'LED B0 Total 1000ms        

               
'============ LED B0 (LOW speed) =================
'============ on   300ms   =======================
'============ off 1700ms   =======================
LEDB1A:    PortB.1 = 1                'LED B0 1st Part 1000ms
                Gosub LEDB0A        'LED B0 on 100ms
                Gosub LEDB0B        'LED B0 on 200ms
                PortB.1 = 0
                Gosub LEDB0c        'LED B0 off 700ms
                Return

LEDB1B:    PortB.1 = 0                'LED B0 2nd Part 1000ms
                Gosub LEDB0
                Return

评分

参与人数 1积分 +100 收起 理由
fritlizt + 100 不错不错加油

查看全部评分

回复

使用道具 举报


ADVERTISEMENT

发表于 10-9-2010 12:04 PM | 显示全部楼层
回复 181# qweeer



做得不错。 论坛开始比较多人了。呵呵  
你simulate了,看起还应该没问题。
basic我就不是很懂, 不过看起来你一直call sub,在sub call sub.这样的话program 不会很复杂吗?
回复

使用道具 举报

发表于 13-9-2010 11:22 PM | 显示全部楼层
谢谢你的分数
只要有logic,是不会复杂的
我也只是跟着logic 走,从最快变化的led开始做起,然后才在最小变化的led call 回最快变化的sub led , 时间算得刚刚好,是没问题的。

在 pic 和 basic,我还是小学生,还不懂如何使用 interrupt, 所以我觉得,一直call sub,在sub call sub是最容易,最简单的。

pic BZ 说还没见过有人用basic,所以我就尝试用 basic 最简单,最容易明白的方法来达成这任务。

希望小学生的作品,大家不会嫌弃。
回复

使用道具 举报

发表于 27-3-2012 08:42 AM | 显示全部楼层
本帖最后由 longcrystal 于 27-3-2012 08:56 AM 编辑

回复 1# pic


   版主请问你给的 第二题  题目 我不是很会做~~~想请教关于 INTERRUPT 和TMR0 的用法~~~~我自己也有尝试做~~~~但是我还不是很会运用~~~我希望能明白 第二题怎么做~~~~我POST我的CODE 给你看看~~~~~请版主能教我~~~怎么在INTERRUPT和TMR0 这个FUNCTION 调整 延时~~~~~很想做到   同时LED  亮~~~但是LED 不同DELAY ~~~然后又不要用FOR 来完成这种情况~~~~~

不知道能在这个贴请教你嘛


#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3B31);
#define BLINK_1 50

unsigned char g_TMR0=0;
unsigned char g_TMR1=0;
unsigned char i=0;
unsigned char b=0;
unsigned char j=0;
void interrupt ISR(void)
{
    if(T0IE  && T0IF )
    {
        T0IF=0;
        g_TMR0++;
        g_TMR1++;
       if(g_TMR0 == 1000)
       {
        RD0=!RD0;
           g_TMR0=0;

       }
        if(g_TMR1 == 8000)
       {
             RD1=!RD1;
           g_TMR1=0;


       }


    }
}
void Init()
{
    OPTION =0X04;
    T0IF=0;
    T0IE=1;
    GIE=1;
    TMR0=0;
    TRISD=0X00;
    PORTD=0X00;
}

void main(void)
{

    Init();

    while(1)
    {
        RD0^=1;
          RD1^=1;

    }




}

这个是我的程式 但是我先大概玩 两粒LED~~~~但是我就不会让他们同时亮的时候 不同DELAY~~~请版主赐教》《

我本身有用MPLAB 来COMPILE  和用 PROTEUS 来测试~~~这个CODE是可以运行的~~~只是我不是很明白怎么样控制 1个以上的LED~~~~~很希望能学会~~~~~~~~
回复

使用道具 举报

 楼主| 发表于 27-3-2012 09:53 AM | 显示全部楼层
回复  pic


   版主请问你给的 第二题  题目 我不是很会做~~~想请教关于 INTERRUPT 和TMR0 的用法~~~~ ...
longcrystal 发表于 27-3-2012 08:42 AM



   你是HitechC, 我不熟悉这种写法。。 可能等其他人帮你看哦~ 呵呵
回复

使用道具 举报

发表于 27-3-2012 10:17 AM | 显示全部楼层
回复 185# pic


   可是~~~~~我看到很多人都是用HITECH来写~~~~~版主你是用什么来写~~~~~

真希望有人可以 指点!!!呵呵~~~~~~~ 卡住很久了~~~~而且也有其他功课要忙
回复

使用道具 举报

Follow Us
发表于 27-3-2012 10:22 AM | 显示全部楼层
回复 83# rothmans


   rothmans 请教你指点 关于 INTERRUPT 和 TIMER0 的用法~~~在 第二题的题目~~~~~~因为我看你也是用MPLAB来写的~~~~我有尝试拿你CODE来COMPILE 和MODIFIED 但是还是没办法成功COMPILE~~~~~~然后我自己也有写一个自己的~~~

用INTERRUPT 和TIMER0 来写~~~同时亮起来了~~~~但是就是没办法 调整 2个 不一样的DELAY ~~~~所以想请你赐教~~~几招~~~~~我对INTERRUPT 和TIMER0~~~完全很新手~~~~~~~~以前都是靠DELAY FUNCTION 来弄这些 或者FOR之类的~~~~没去尝试过这种写法~~~真的希望能得到你的指点呵呵!!!~~
回复

使用道具 举报

 楼主| 发表于 27-3-2012 11:45 AM | 显示全部楼层
回复  pic


   可是~~~~~我看到很多人都是用HITECH来写~~~~~版主你是用什么来写~~~~~

真希望有人可 ...
longcrystal 发表于 27-3-2012 10:17 AM

首先, 你的回复很多~~~~~~~~~~~~~~~~~~~~ 我感觉~~~好像在看~~~情色文学~~~ 我承认我有看~~~~

如果你有爬帖, 应该知道我只是会用用PIC MCU, 只是会CCS C, 我不会其他的MCU, 也不会ASM 编写。。因为我没有经历过8051 , 直接入门时是16F84A 开始, CCS C, PCM  V2.x DOS版本的。。。
回复

使用道具 举报


ADVERTISEMENT

发表于 27-3-2012 02:01 PM | 显示全部楼层
回复 184# longcrystal

不好意思,看不明白所要求的效果!不过我可以解释一下

83#
rothmans
网友提供的代码操作模式。希望对你有帮助。

呵呵呵。。。我先声明,我本人没用过Hitech,和PIC版主一样只是用过CCS写过简易的PIC16功能而已!

  1. void hardware_initialize(void)
  2. {
  3.     PCON    = 0x0B;     /* OSCF = 4MHz, Not PWR ON @ BOD Reset. */
  4.     PORTA   = 0xFF;
  5.     PORTB   = 0x00;
  6.     CMCON   = 0x07;
  7.     INTCON  = 0x20;     /* Enable Timer 0 Interrupt */启动
  8.     PIE1    = 0x00;     /* Interrupt Enable Bit */启动
  9.     OPTION  = 0x05;     /* Disable PORTA Pull-up */
  10.     TRISA   = 0xFF;
  11.     TRISB   = 0x00;
  12.     TMR0  = 0x63;/* 10ms*/
  13. }
复制代码


IO,Timer0和Interrupt的设置。

  1. static void interrupt isr(void)
  2. {
  3.     if(T0IE && T0IF) /*属于 timer0 的中断(Interrupt)*/
  4.     {
  5.      TMR0 = 0x63;/*重新设置10ms中断一次*/
  6.         temp0++;
  7.         temp1++;
  8.         temp2++;
  9.         T0IF=0;
  10.     }
  11. }
复制代码


记得进入intterrupt mode后,要重新设置过下次的中断时间。
temp0++; /* 控制LED1显示时间*/
        temp1++;/* 控制LED2显示时间*/
        temp2++;/* 控制LED3显示时间*/

  1. #include <pic.h>
  2. #include "ledFlash.h"
  3. #define BLINK_0 50      /* 500mS --- 与temp比较值是否相等*/
  4. #define BLINK_1 100     /* 1000mS */
  5. #define BLINK_2 5       /* 50mS */
  6. unsigned char temp0=0;
  7. unsigned char temp1=0;
  8. unsigned char temp2=0;
复制代码

   
  1. if(temp0==BLINK_0)/* --- 与BLINK_0(500ms)比较值是否相等*/
  2.   {
  3.    PORTB_0 ^= 1;/*反向 这个IObit-如果现在状况是1,反向为0,以达到闪烁效果*/
  4.    temp0=0;
  5.   }
  6.   
  7.   if(temp1==BLINK_1)/* --- 与BLINK_1(1000ms)比较值是否相等*/
  8.   {
  9.    PORTB_1 ^= 1;;/*反向 这个IObit-如果现在状况是1,反向为0,以达到闪烁效果*/
  10.    temp1=0;
  11.   }
  12.   
  13.   if(temp2==BLINK_2))/* --- 与BLINK_2(50ms)比较值是否相等*/
  14.   {
  15.    PORTB_2 ^= 1;/*反向 这个IObit-如果现在状况是1,反向为0,以达到闪烁效果*/
  16.    temp2=0;
  17.   }
复制代码


这是我对这个代码的理解,希望对你有所帮助~

评分

参与人数 1积分 +30 收起 理由
pic + 30 谢谢, 努力贡献

查看全部评分

回复

使用道具 举报

发表于 28-3-2012 12:19 AM | 显示全部楼层
回复 189# wkloh


  谢谢你的帮忙~~这个码我看过了~~~但是 LEDFLASH.H 我没有这个FILE~~~也不知道这个HEADER FILE 里面放了什么~~

我的HI-TECH ~~~还是COMPILE 不到~~~~不过谢谢大家好意~~~如果没办法只能靠自己学了~~和明白其他人的CODE~~~
回复

使用道具 举报

发表于 28-3-2012 12:20 AM | 显示全部楼层
回复 188# pic


   呵呵我说话有那么色情吗@@?
回复

使用道具 举报

发表于 28-3-2012 06:49 AM | 显示全部楼层
回复 190# longcrystal

你试看把 LEDFLASH.H这行给删掉,再compile 过。

如果再不行,请把error print screen 贴上来。
回复

使用道具 举报

发表于 28-3-2012 10:11 AM | 显示全部楼层
回复 192# wkloh


    很多ERROR~~应该是HEADER 里面 DEFINE 了其他VARIABLE 吧~所以没有FLASH。H 就要在。C那边弄了~~~~~我不在家里COMPILE不到~~~抱歉  迟点在POST~~~~
回复

使用道具 举报

发表于 30-3-2012 05:12 PM | 显示全部楼层
longcrystal, 你可以post上你的error code出来.

关于INTERUPT的用法就是当你的program需要一个准确的计算时间(如时钟,alarm),如过用delay function就会被其他的function干扰而造成整个program没有个统一的计算时间.这时候你就可以interupt. 简单说就是它自己算时间到了设定的时间或外来干涉而去"干扰"你的program.时间没到或没外在干扰时就让它在角落转圈圈咯.

评分

参与人数 1积分 +50 收起 理由
fritlizt + 50 热心解答。 加分鼓励。

查看全部评分

回复

使用道具 举报

发表于 31-3-2012 06:59 PM | 显示全部楼层
回复 194# whitemilk


謝謝你的解釋~~~等我得空了才繼續寫~~~或我直接 寄去你的信箱問你~~~~謝謝~~~~~~
回复

使用道具 举报

发表于 8-6-2012 05:40 PM | 显示全部楼层
回复 195# longcrystal


    问题出在你的 main function.
while (1){
    RD0 ^=1;
    RD1^=1;
}

这两个pin会不断地自我toggle.看起来好像一直亮着。其实是很快的on->off->on->off.
你现在用interrupt来blink一个led.做到后,再教你怎样blink 两个led.
回复

使用道具 举报


ADVERTISEMENT

发表于 13-6-2013 01:21 AM | 显示全部楼层
pic 发表于 10-11-2007 12:54 PM
不对哦, 3个LED 要同时进行, 并重复, 不是一个一个处理。

在试试看。。。

是所谓的multi tasking吗?
回复

使用道具 举报

 楼主| 发表于 13-6-2013 07:45 AM | 显示全部楼层
修止符 发表于 13-6-2013 01:21 AM
是所谓的multi tasking吗?

类似吧。。
回复

使用道具 举报

发表于 13-6-2013 12:18 PM | 显示全部楼层
pic 发表于 13-6-2013 07:45 AM
类似吧。。

可惜我没学过PIC,哈哈。。
回复

使用道具 举报

 楼主| 发表于 13-6-2013 01:01 PM | 显示全部楼层
修止符 发表于 13-6-2013 12:18 PM
可惜我没学过PIC,哈哈。。

哦。。如果要闲聊或分享心得可以去

【闲聊】心情故事,咖啡座~
http://cforum2.cari.com.my/forum ... page%3D1&page=7
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 29-3-2024 01:35 PM , Processed in 0.060177 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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