51单片机c语言中断矢量,51单片机内核的中断及中断向量基础知识

51内核的最基础的中断源请求有外部中断、定时器中断和串口中断,这也是学习和开发者最长用的。当然还有其他的中断源,比如ADC、SPI、PWM等。以外部中断0为例,在编程中常使用的方式为:

void INT0()interrupt 0 using 1

{

……

}

在这里特别做上笔记:其中前面的void INT0() 只是代表一个普通没有形参的函数而已,函数名写成什么都是可以的,这个到不重要。那么后面的就一个一个词的扣把:(2-1-i-c-中国-电子网,防抓取)

其中 interrupt n 组成一组,n用来指明中断号,在函数后使用了interrupt关键字后,就会自动的生成中断向量,51内核中断号如下图,这是我今天查的正在使用的MCU:

c73cae3f2694bd04ab69562ea472b16c.png

例如:

12

interrupt 1 指明是定时器中断0;

interrupt 2 指明是外部中断1;

interrupt 3 指明是定时器中断1

。。。

对于51内核的MCU,不同厂家及不同型号的内部资源会有所不同,上图是我正在开发的一款中颖SH88F516单片机,由上图可见内部资源还算可以,能够满足一般的产品。后面的using n 指的是使用第n组寄存器。这个之前我在使用的过程中往往忽略了这个,也没有出现什么问题。但是今天注意到这个问题,查完资料后用上发现效果还不如不用,很有肯能是没有把这个知识用好的原因把。对比之后给我的感觉是在使用C语言写程序时,能不用就不用吧。查资料解释说假如在中断函数中使用了using n,中断不再保存R0-R7的值,这也就意味着假如一个高优先级的中断及一个低优先级的中断同时使用了using n,而这个n恰恰相等,那就等着哭把,因为这个BUG还真不是那么好找出来的(今天我就遇到了这个问题)。21ic整理

其次就是中断优先级的问题了,如图上面的中断表,在右侧第二栏标的很清楚,除了复位之外,就数外部中断0优先级最高了,依次往下排列,那么问题来了,今天刚好就碰到了需要串口0的优先级比定时器0的优先级高。没办法,只好接着啃数据手册,还好这寄存器不多,一会就查到了下表和相关的描述:

88d5cf0f83b45916893ac7e06024e9ab.png

所以按照描述修改下优先级就可以达到目的了。

总结:用到回过头来用到51的中断,发现有些东西在之前学习的时候并没有太在意,导致现在在开发产品上使用的时候不清楚用途。因为工作跟学习性质是不一样的,作为开发者的角度来说,质量往往是第一要求。同时会接触到很多新鲜的事物和技术,但是话又说回来了,最基本的知识还是需要打牢。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要通过外部中断来控制舵机,需要先配置好外部中断和舵机的引脚。 具体步骤如下: 1. 配置外部中断51单片机,有两个外部中断,即INT0和INT1,它们分别对应P3.2和P3.3两个引脚。首先需要设置中断触发方式和中断优先级等参数,然后开启中断功能。 例如,如果要使用INT0控制舵机,可以使用以下代码进行配置: ```c void InitExtInt0(void) { IT0 = 1; // 设置中断触发方式为下降沿触发 EX0 = 1; // 开启INT0中断 EA = 1; // 开启总中断 } ``` 2. 配置舵机 舵机通常使用PWM信号来控制,可以通过定时器来产生PWM波形。需要设置定时器的计数器初值和重载值,以及PWM的占空比等参数。 例如,如果要使用P1.0引脚控制舵机,可以使用以下代码进行配置: ```c void InitPWM(void) { TMOD |= 0x01; // 设置定时器0为16位定时器模式 TH0 = 0xFF; // 定时器初值 TL0 = 0xFF; // 定时器重载值 ET0 = 1; // 开启定时器0中断 TR0 = 1; // 启动定时器0 P1 = 0x00; // 初始化P1口输出为0 } ``` 在定时器中断服务程序,可以根据需要调整PWM的占空比来控制舵机的位置。 例如,以下代码实现了每隔20ms将舵机向左转90度和向右转90度的功能: ```c void Timer0Interrupt(void) interrupt 1 { static unsigned char count = 0; static unsigned char direction = 0; count++; if (count == 50) // 20ms { count = 0; if (direction == 0) { P1 = 0x04; // 10%占空比,向左转90度 direction = 1; } else { P1 = 0x1B; // 90%占空比,向右转90度 direction = 0; } } } ``` 在外部中断服务程序,可以根据需要改变舵机的控制方式。 例如,以下代码实现了按下按钮时将舵机向左转90度,并在松开按钮后恢复到初始位置的功能: ```c void ExtInt0Interrupt(void) interrupt 0 { P1 = 0x04; // 10%占空比,向左转90度 while (INT0 == 0); // 等待按键松开 P1 = 0x00; // 恢复到初始位置 } ``` 综上所述,通过以上操作,就可以实现通过外部中断控制舵机的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值