本帖最后由 芯圣电子官方QQ 于 2023-7-25 10:37 编辑
//PORTB1 上拉输出 高电平
//PORTB0 上拉输入 高电平(KEY)
一个简单的应用, PORTB0电平发生一次变化,则PORTB1输出一个2S的低电平,其余时刻休眠。
但是发现一个问题:
PORTB0由高然后直接接GND(接触良好),有一定概率触发两次中断,即PORTB1输出4S的低电平。
PORTB0由低然后高,没有问题,即PORTB1输出2S的低电平。
1.现在的方案是中断中增加1S延时,DelayMs(100);//1S @1Mhz 4T ,能够保证两次触发的最小间隔变成1S。但是还是存在一次电平变化,进两次中断的问题,只不过中间会加1S的延时。
2.尝试过进中断关总中断,也不好用。
void Intr(void) __interrupt 0
{
GIE=0;
if(PBIF)
{
PBIF=0;
PORTB1=0;
DelayMs(200);//2S @1Mhz 4T
PORTB1=1;
DelayMs(100);//1S @1Mhz 4T
GIE=1;
}
}
3.PORTB0使能了施密特触发器。
OTP型单片机不方便实际验证,求大神指教指教,谢谢。
以下是程序:
#include <sq013l.h>
#include "holychip_define.h"
#include "inital.h"
#include "subroutine.h"
//15mA@3.3V 32mA@5V仿真的板子
//PORTB1 上拉输出 高电平
//PORTB0 上拉输入 高电平(KEY)
void inital(void)
{
PORTB=0X03; //PORT口输出高低电平设置 1=高电平,0=低电平
TRISB=0X01; //输入输出设置 1=输入,0=输出
PHCON =0XFC; //上拉设置 1=DISABLED PULL-UP ;0=PULL-UP
PDCON =0XFF; //下拉设置 1=DISABLED PULL-DOWN ;0=PULL-DOWN
ODCON =0X00; //开漏设置 0=DISABLED OD ;1=OD
}
void sysinitial(void)
{
INTECON=0x00; //关闭所有中断
OPTION=0X80; //Ftimer0 1/2
PCON=0X00; //关闭WD 外部中断
}
void PORTB_interrupt_inital()
{
IOCB=0X01; //使能PORTB0端口为电平变化中断
PBIF=0; // PROTB中断请求标志清零,PBIF:端口电平变化中断使能位
PBIE=1; //使能PROTB中断,PBIE:端口电平变化中断使能位
GIE=1; //使能总中断
}
void main()
{
inital(); //端口初始化
DelayMs(10); //延时等待系统稳定
sysinitial(); //系统初始化
PORTB_interrupt_inital();
while(1)
{
asm(sleep)
}
}
//*****************************PORTB中断服务程序*****************************
void Intr(void) __interrupt 0
{ DelayMs(10); //发现加了这句后,好用了,是不是因从休眠到中断唤醒,系统不稳定???求官方指导,有关SQ013L休眠方面的资料很少。
PBIE=0;
if(PBIF) //PBIF只要有电平变化中断就会变成1,只不过只有PBIE=1的时候才能进中断。
{
PBIF=0;
PORTB1=0;
DelayMs(200);//2S @1Mhz 4T
PORTB1=1;
DelayMs(100);//1S @1Mhz 4T//此句可以去掉了。
PBIE=1;
}
}
|