请问单片机如何通过电平变化中断唤醒单片机?

//初始化
#include "holychip_define.h"
#include "inital.h"
void inital(void)
{
PORTA=0X00;
PORTB=0X00; //PORT口输出高低电平设置 1=高电平,0=低电平
TRISA=0X00; //输入输出设置 1=输入,0=输出
TRISB=0XE0; //输入输出设置 1=输入,0=输出 0X11100000 PB7,PB6,PB5设置为输入

PHCON1=0XFF;        //上拉设置 1=DISABLED PULL-UP  ;0=PULL-UP
PHCON =0XFF;        //上拉设置 1=DISABLED PULL-UP  ;0=PULL-UP  

PDCON1=0XFF;        //下拉设置 1=DISABLED PULL-UP  ;0=PULL-UP
PDCON =0XFF;        //下拉设置 1=DISABLED PULL-UP  ;0=PULL-UP  

ODCON1=0X00;        //开漏设置 0=DISABLED PULL-UP  ;1=PULL-UP
ODCON =0X00;        //开漏设置 0=DISABLED PULL-UP  ;1=PULL-UP
}

//系统初始化                                          
void sysinitial(void)
{
INTECON=0x00;
OSCCON=0X80;
OPTION=0X80;            //Ftimer0 1/2
PCON=0X40;              //更改  上下电复位 禁止看门狗
}

//模式转换
#include "holychip_define.h"
#include "model.h"
void high_frequence_change_to_sleep(void) //高低频切睡眠
{
// SBIT(OSCCON, 7, LOW);
T0OSCEN=0;
}
void high_frequence_change_to_low_frequence(void) //高频切低频
{
// SBIT(OSCCON, 0, HIGH);
SCS=1;
}
void low_frequence_change_to_high_frequence(void) //低频切高频
{
// SBIT(OSCCON, 0, LOW);
SCS=0;
}
void low_or_high_frequence_change_to_green(void) //高低频切绿色模式 T0定时唤醒
{
OPTION=0X05;

SBIT(OPTION, 5, HIGH); //T0CS=1

// T0CS =1;
T0IF=0; //清T0中断标志
T0IE=1; //使能T0定时器
T0=0X00; //T0赋初值
asm(sleep)
}

//PB电平变化中断初始化
#include "holychip_define.h"
#include "PORTB_interrupt_inital.h"
void PORTB_interrupt_inital()
{
TRISB=0XE0; //PORTB端口设置 0X11100000 PB7,PB6,PB5设置为输入
IOCB=0XE0; //使能PORTB端口为电平变化中断

PBIF=0;         // PROTB中断请求标志清零
PBIE=1;         //使能PROTB中断
GIE=1;          //使能GIE
}   

//脉冲显示函数
#include "holychip_define.h"
#include "Pulse_display.h
uS延时函数
void DelayUs(unsigned char t)
{

while(--t);
}
mS延时函数
void DelayMs(unsigned int t)
{
unsigned char count = 200;

while(t--)
{
while(count--);
}
}
//脉冲显示子程序
void Pulse_display(void)

{
if(PORTB7==1)
PORTA1=1;
DelayMs(20);
PORTA1=0;
if(PORTB7==0)
PORTA2=1;
DelayMs(20);
PORTA2=0;

if(PORTB6==1)
PORTA3=1;
DelayMs(20);
PORTA3=0;
if(PORTB6==0)
PORTB0=1;
DelayMs(20);
PORTB0=0;

if(PORTB5==1)
PORTB1=1;
DelayMs(20);
PORTB1=0;
if(PORTB5==0)
PORTB2=1;
DelayMs(20);
PORTB2=0;
}

//主函数
#include "holychip_define.h"
#include "inital.h"
#include "Pulse_display.h"
#include "PORTB_interrupt_inital.h"
#include "model.h"
void main(void)
{
inital(); //端口初始化
DelayMs(100); //延时等待系统稳定
sysinitial(); //系统初始化
PORTB_interrupt_inital();//PB电平中断初始化,设置PB7,PB6,PB5电平中断
while(1)
{
high_frequence_change_to_sleep(); //高频转换为睡眠模式
Pulse_display(); //脉冲显示

}
}
//PORTB中断服务程序
void Intr(void) __interrupt 0
{
if(PBIF)                    //Judge PBIF
{
    PBIF=0;                 //Clear PBIF
}
}

我目前在做一个低功耗的项目,所以采用单片机的休眠模式,想知道如何使用单片机电平变化中断唤醒单片机?

2个回答

要看你用什么单片机,然后查一下他的唤醒源,一般IO都是通过中断唤醒的。

qq_36750998
qq_960718064 回复impressively: 你这个代码有点多,自己测试一下静态功耗就行了 ,看看有没有唤醒就可以了,没用过OTP的单片机
5 个月之前 回复
impressively
impressively 回复qq_36750998: 以上就是我目前根据数据手册写的代码,请问这样可以么
5 个月之前 回复
qq_36750998
qq_960718064 回复impressively: 从你发的来看,汇编写的就是PB1口设置成输入,使能电平中断,SLPEEP再去读IO口,你可以试试,没有数据手册我也不好看
5 个月之前 回复
impressively
impressively 上图是他的汇编例程,我不懂汇编,不知道如何改为C语言
5 个月之前 回复
impressively
impressively 我使用的是一款芯圣的OTP单片机,外设很少,只有一个外部中断唤醒引脚,可是这个引脚由于功能要求,我设置输出,他的PDF显示可以用电平变化中断唤醒单片机 不知道如何实现
5 个月之前 回复

电平中断时exti中断吗?

impressively
impressively 没有 芯片内置电平变化中断唤醒功能
5 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问