找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3442|回复: 0
打印 上一主题 下一主题
收起左侧

单片机掉电唤醒程序求解

[复制链接]
跳转到指定楼层
楼主
ID:63752 发表于 2018-12-3 17:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序功能是按键一次,A灯亮,B灯灭,再按键第二次,A灯灭,B灯亮,第三按,A,B灯都不亮,进入掉电模式,三档循环。但是按键很不灵活,时行时不行,求大侠指点,以下是程序
#include<reg51.h>        //  包含51单片机寄存器定义的头文件
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char ID;    //储存流水灯的流动速度

sfr P3M1=0xb1;
sfr P3M0=0xb2;
sfr AUXR=0x8e;
sfr CLK_DIV= 0x97;         //时钟分频寄存器
sfr INT_CLKO = 0x8F;            //外部中断与时钟输出控制寄存器
//sfr IP=0xB8;
sbit INT3 = P3^5;               //INT3引脚定义
bit FLAG;
sbit S1=P3^5;          //位定义S1为P3.5
sbit LED1=P3^2;
sbit LED2=P3^3;
sbit LED3=P3^4;

/**************************************************************
函数功能:延时子程序
**************************************************************/

void Delay20ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 1;
        j = 216;
        k = 35;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


/**************************************************************
函数功能:主函数
**************************************************************/
void main(void)
{
   CLK_DIV = 0x00;             //系统时钟为内部R/C振荡时钟
  // PT0=0;
   LED1=0;   
   LED2=0;
   LED3=0;
   P3M0 = 0x00;
   P3M1 = 0x00;
   INT_CLKO |= 0x20;           //(EX3 = 1)使能INT3下降沿中断
   AUXR|=0x80;         //定时器时钟1T模式
   //AUXR &= 0x7f;         //定时器时钟12T模式
   //TMOD=0x00;     //使用定时器T0的模式0
   TMOD &= 0xF0;   
   TH0=0xF7;   //定时器T0赋初值,每200微妙来1次中断请求
   TL0=0x5C;
        TR0=1;         //定时器T0开始运行
        TF0 = 0;     //清除TF0标志
          EA=1;          //开总中断
        ET0=1;         //定时器T0中断允许        
    ID=0;
   while(1)
   {
                              
           switch(ID)
            {
                 
                                  case 0:          INT_CLKO |= 0x20;
                                            ET0=0;
                                            PCON |= 0x02;           //将STOP(PCON.1)置1,MCU将进入掉电模式
                            _nop_();                //此时CPU无时钟,不执行指令,且所欲外设停止工作
                            _nop_();                //外部中断信号和外部复位信号可以终止掉电模式
                            _nop_();
                            _nop_();
                                          LED1=0;        //0010 0100         P32
                                                  LED2=0;
                                                  LED3=0;
                      break;
                                  case 1: INT_CLKO &= 0xDF;
                                          LED1=0;    //0010 1000         P33
                                                  LED2=0;
                                                  LED3=0;
                                                  break;
                                  case 2: INT_CLKO &= 0xDF;
                                          LED1=1;    //0010 1000         P33
                                                  LED2=0;
                                                  LED3=0;
                      break;
                                  case 3: INT_CLKO &= 0xDF;
                                                  LED1=0;                                                                                                                                                                                 
                                                  LED2=1;
                                                  LED3=0;
                      break;

                        }               
   }
         
   }
/**************************************************************
函数功能:定时器T0的中断服务子程序,进行键盘扫描
**************************************************************/
void intersev(void) interrupt 1 using 1
{
  TR0=0;  //关闭定时器T0
  S1=1;
  if(S1==0)       //如果是按键S1按下
    {
           Delay20ms();       //延时20ms,软件消抖
            if(S1==0)       //如果是按键S1按下
                   ID=ID+1;
                   while(!S1);                  
          }   
        if(ID==4)
           ID=0;                                      
          TR0=1;               //启动定时器T0

}

//中断服务程序
void exint3() interrupt 11
{            
         PCON=0x00;         
         ET0=1;
         ID=1;
         S1=1;
         LED1=0;  
         LED2=0;
         LED3=0;
   
// INT_CLKO &= 0xDF;           //若需要手动清除中断标志,可先关闭中断,此时系统会自动清除内部的中断标志
// INT_CLKO |= 0x20;           //然后再开中断即可
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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