[通用8051核FLASH系列] 【HC89S003P套件试用】4、外部中断INT1测试

[复制链接]
1244|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
  1. //main.c
  2. #define ALLOCATE_EXTERN

  3. #include "config.h"

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

  14. void main(void)
  15. {
  16.         uint i;
  17.         SystemInit();                //系统初始化
  18.         Init_Port();                //端口初始化
  19. <b>        EintInit();                        //外部中断初始化</b>
  20.         //CCO_Init();                //CCO输出
  21.         
  22.         while(1)
  23.         {
  24.         }
  25. }
       2.2、外部中断初始化
  1. #include "config.h"
  2. bit ei0=0;

  3. //外部中断初始化
  4. void EintInit(void)
  5. {
  6.         //外部中断0设置
  7.         PITS0 =PITS0&0xf3;                                
  8.         PITS0 |=0x04;                                                //INT1下将沿中断
  9.         INT01_PINS = 0x00;                        //INT1选择P01端口                                
  10.         EX1=1;                                                                        //打开INT1中断
  11.         EA = 1;                                                                        //打开总中断
  12. }

  13. //外部中断1入口
  14. void Eint1()interrupt INT1_VECTOR
  15. {
  16.         PINTF0 &= ~0x02;                        //清除INT1中断标志位
  17.         P0_0 =~P0_0;
  18. }
   2.3、端口设置
  1. //port.c
  2. #include "config.h"
  3. void Init_Port(void)
  4. {
  5.         //P0xM[3:0]
  6.         //0000 -- 输入(非施密特)
  7.         //0001 -- 带下拉输入(非施密特)
  8.         //0010 -- 带上拉输入(非施密特)
  9.         //0011 -- 模拟输入
  10.         //0100 -- 输入(施密特)
  11.         //0101 -- 带下拉输入(施密特)
  12.         //0110 -- 带上拉输入(施密特)
  13.   //0111 -- 保留(模拟输入)
  14.         
  15.         
  16.         //1x00 -- 推挽输出
  17.         //1x01 -- 开漏输出
  18.         //1x10 -- 开漏带上拉输出
  19.         
  20. //        P0M1 = P0M1&0xF0|0x00;                                //P02设置为输入(无SMT)
  21.         
  22.         P0M0 = P0M0&0xF0|0x08;                                        //P00设置为推挽输出
  23.         P0M0 = P0M0&0x0F|0x60;                                        //P01设置为带上拉输入(施密特)
  24.         P0M1 = P0M1&0xF0|0x02;                                        //P02设置为带上拉输入(非施密特)
  25.         P1M0 = P1M0&0x0F|0x80;                                        //P11设置为推挽输出        
  26. }


    三、执行结果

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

零三翟邢止胃 发表于 2019-3-18 09:45 | 显示全部楼层
很好的啊! 不错的啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

701

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部