
初级技术员

- 积分
- 45
- 在线时间
- 26 小时
- 精华
- 0
- 注册时间
- 2019-8-8
- 最后登录
- 2019-12-11
- 专家等级
 - 结帖率
- 0%
- 打赏
- 0.00
- 受赏
- 10.00
|
本帖最后由 水深蓝 于 2019-10-30 13:51 编辑
- //初始化
- #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
- }
- }
复制代码
目前我在做一个低功耗的项目,所以采用单片机的休眠模式,想知道如何通过电平变化中断唤醒单片机,以上是我编写的程序,请问这样可以实现么? |
|