佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2185|回复: 3

如何让 PIC16F877A 从 sleep() 功能醒来

[复制链接]
发表于 26-8-2009 11:59 PM | 显示全部楼层 |阅读模式
各位大大好,  我用的是 PIC16F877A & CCS Compiler. 程序一开始时 LED OFF, 然后 PIC 进入 sleep() 功能. 当有 data 传送进 RS232 时,  如果收到 data = 0x01, PIC 就会从 sleep() 功能醒来, 如果收到其他 data, PIC 就会返回 sleep() 功能 .  这里有一些疑问想请问各位大大:

1. 我用 Proteus simulate 时, 当 PIC 收到其他 data 返回 sleep() 功能时为什么 LED 没有自动 OFF 呢? 是不是因为它停在 sleep 之前的程序, 醒来时才继续接下来的程序?
2.  sleep() 功能到底有什么用? 不是用来省电吗?

我的程序如下:

#include <16F877A.h>
#fuses HS, NOWDT
#use delay(clock = 20000000)
#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7)
#define LED PIN_B7

char data;
int1 protocol_correct;              // Protocal received status.
short sleep_mode;

#INT_RDA                             // RS232 Interrupt Service Routine.
void isr_rs232()
{
   data=getc();
   protocol_correct = TRUE;
}

void main ()
{
   protocol_correct = FALSE;
   sleep_mode = TRUE;
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RDA);
   output_low(LED);

   while(1)
   {
      if(protocol_correct == TRUE)
      {
         if(data == 0x01)
         {
            output_high(LED);          //led on;
            protocol_correct = FALSE;
            sleep_mode=FALSE;
         }

         else
         {
             protocol_correct = FALSE;
            sleep_mode=TRUE;
         }
      }
      if(sleep_mode==TRUE)          // if sleep flag set
        sleep();             // make processor sleep
   }
}

[ 本帖最后由 sky_cs1986 于 27-8-2009 12:03 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 27-8-2009 08:56 AM | 显示全部楼层
原帖由 sky_cs1986 于 26-8-2009 11:59 PM 发表
1. 我用 Proteus simulate 时, 当 PIC 收到其他 data 返回 sleep() 功能时为什么 LED 没有自动 OFF 呢? 是不是因为它停在 sleep 之前的程序, 醒来时才继续接下来的程序?
2.  sleep() 功能到底有什么用? 不是用来省电吗?  


SLEEP 用来省电功能是没错。
当进入睡眠时,MCU 的输出。输入脚是保持在睡眠前的状态的。
所以当睡眠前你点亮 LED,进入睡眠时,是保持点亮的状态。
睡眠是将你的程序停止,可是 MCU 心脏还是跳动的。
回复

使用道具 举报

 楼主| 发表于 27-8-2009 10:21 AM | 显示全部楼层
原帖由 rothmans 于 27-8-2009 08:56 AM 发表

SLEEP 用来省电功能是没错。
当进入睡眠时,MCU 的输出。输入脚是保持在睡眠前的状态的。
所以当睡眠前你点亮 LED,进入睡眠时,是保持点亮的状态。
睡眠是将你的程序停止,可是 MCU 心脏还是跳动的。


谢谢rothmans大大的回复,解答了我的疑问。我想请问当MCU进入睡眠时,LED是保持点亮的状态,那么MCU输出的voltage & current 会减少吗,还是一样?
回复

使用道具 举报

 楼主| 发表于 3-9-2009 03:19 PM | 显示全部楼层
我用了CCS里的例子,用Proteus simulate它是可以work的。

#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

// global flag to send processor into sleep mode
short sleep_mode;

// external interrupt when button pushed and released
#INT_EXT
void ext_isr() {
static short button_pressed=FALSE;

   if(!button_pressed)        // if button action and was not pressed
   {
      button_pressed=TRUE;    // the button is now down
      sleep_mode=TRUE;        // activate sleep
      printf("The processor is now sleeping.\r\n");
      ext_int_edge(L_TO_H);   // change so interrupts on release
   }
   else                       // if button action and was pressed
   {
      button_pressed=FALSE;   // the button is now up
      sleep_mode=FALSE;       // reset sleep flag
      ext_int_edge(H_TO_L);   // change so interrupts on press
   }
   if(!input(PIN_B0))         // keep button action sychronized wth button flag
      button_pressed=TRUE;
   delay_ms(100);             // debounce button
}

// main program that increments counter every second unless sleeping
void main()   {
   long counter;

   sleep_mode=FALSE;          // init sleep flag

   ext_int_edge(H_TO_L);      // init interrupt triggering for button press
   enable_interrupts(INT_EXT);// turn on interrupts
   enable_interrupts(GLOBAL);

   printf("\n\n");

   counter=0;                 // reset the counter
   while(TRUE)
   {
      if(sleep_mode)          // if sleep flag set
         sleep();             // make processor sleep
      printf("The count value is:  %5ld     \r\n",counter);
      counter++;              // display count value and increment
      delay_ms(1000);         // every second
   }
}
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


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

GMT+8, 10-1-2025 02:47 PM , Processed in 0.431414 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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