[通用8051核FLASH系列]

【HC89S003P套件试用】4、外部中断INT1测试

[复制链接]
755|1
手机看帖
扫描二维码
随时随地手机跟帖
tlled|  楼主 | 2019-3-17 16:12 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-24 15:04 编辑

    HC89S003P芯片外部中断1测试。在P01引脚上外接按键,驱动P00端口输出LED,可以实现上升沿、下降沿、低电平和高电平中断测试。

    一、手册有关外部中断1寄存器

    1.1、手册中有关外部中断的介绍。
    HC89S003F4有4个外部中断向量入口,外部中断0~1分别有一个独立的中断向量入口,外部中断2~7共用一个中断向量入口,外部中断8~15共用一个中断向量入口,因而共有16个外部中断端口输入,所有
的中断都可以设定4种触发方式,分别为上升沿、下降沿、双沿及低电平。当调用中断服务程序后,外部中断0~15标志必须软件清除。如果中断服务完成后而外部中断仍旧维持,则会产生下一次中断
    上面红色的字体注意,进入中断后必须清楚中断标志位,否则下次不能再进入中断。

    1.2、有关的寄存器
        和通用单片机相同的IP中断优先级这里不关注,主要看和其他不同的寄存器设置
    1.2.1、外部中断电平选择寄存器
         我这里使用的外部中断1,设置时关注下面框内的数据。来选择外部中断电平。
    0317-6.png
    1.2.2、外部中断标志寄存器,主要注意下面的位,进入中断后要把此位清零
    0317-7.png

    1.2.3、外部中断1引脚选择寄存器,这里选择P0.1口
    0317-8.png
    二、程序部分

    2.1、main.c
//main.c
#define ALLOCATE_EXTERN

#include "config.h"

//系统初始化
void SystemInit(void)
{
        /************************************系统初始化****************************************/
        WDTCCR = 0x00;                                                //关闭看门狗
        while((CLKCON&0x20)!=0x20);                        //等待内部高频RC起振
        CLKSWR = 0x51;                                                //选择内部高频时钟为主时钟,内部高频RC2分频,Fosc=16MHz
        while((CLKSWR&0xC0)!=0x40);                        //等待内部高频切换完成
        CLKDIV = 0x01;                                                //Fosc1分频得到Fcpu,Fcpu=16MHz
}

void main(void)
{
        uint i;
        SystemInit();                //系统初始化
        Init_Port();                //端口初始化
<b>        EintInit();                        //外部中断初始化</b>
        //CCO_Init();                //CCO输出
        
        while(1)
        {
        }
}
       2.2、外部中断初始化
 #include "config.h"
bit ei0=0;

//外部中断初始化
void EintInit(void)
{
        //外部中断0设置
        PITS0 =PITS0&0xf3;                                
        PITS0 |=0x04;                                                //INT1下将沿中断
        INT01_PINS = 0x00;                        //INT1选择P01端口                                
        EX1=1;                                                                        //打开INT1中断
        EA = 1;                                                                        //打开总中断
}

//外部中断1入口
void Eint1()interrupt INT1_VECTOR
{
        PINTF0 &= ~0x02;                        //清除INT1中断标志位
        P0_0 =~P0_0;
}
   2.3、端口设置
//port.c
#include "config.h"
void Init_Port(void)
{
        //P0xM[3:0]
        //0000 -- 输入(非施密特)
        //0001 -- 带下拉输入(非施密特)
        //0010 -- 带上拉输入(非施密特)
        //0011 -- 模拟输入
        //0100 -- 输入(施密特)
        //0101 -- 带下拉输入(施密特)
        //0110 -- 带上拉输入(施密特)
  //0111 -- 保留(模拟输入)
        
        
        //1x00 -- 推挽输出
        //1x01 -- 开漏输出
        //1x10 -- 开漏带上拉输出
        
//        P0M1 = P0M1&0xF0|0x00;                                //P02设置为输入(无SMT)
        
        P0M0 = P0M0&0xF0|0x08;                                        //P00设置为推挽输出
        P0M0 = P0M0&0x0F|0x60;                                        //P01设置为带上拉输入(施密特)
        P0M1 = P0M1&0xF0|0x02;                                        //P02设置为带上拉输入(非施密特)
        P1M0 = P1M0&0x0F|0x80;                                        //P11设置为推挽输出        
}


    三、执行结果

    通过PITS0 |=0x04;        //INT1下将沿中断 这个设置来改变中断触发方式。
    我设置的是下降沿中断,每次按下按键瞬间,LED输出电平发生反转。进入中断后一定要清除相应的中断标志位,否则,就再也进不去中断了。

零三翟邢止胃| | 2019-3-18 09:45 | 显示全部楼层
很好的啊! 不错的啊!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

125

主题

689

帖子

6

粉丝