Harvey-Huang 2019-10-29 11:02 采纳率: 0%
浏览 630

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

//初始化
#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条回答 默认 最新

  • 美好生活丶 2019-10-29 12:54
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名