中断系统和外部中断
实现一个C51单片机中断需要在中断请求标志位、中断允许标志位和
中断优先级控制位进行组合的实现。
下面举一个例子:
1)学会增加中断1并且能够设定优先级对于中断0的打断。
2)加入一个按键查询方式。
3)实现各自的花样流水灯。
头文件和定义引脚:
主程序中 TCON = 0x00 or TCON = 0x01 or 不填,其实跟整个运行没关系,IE已经确定电平触发方式。
IP = 0x04 高级中断外部中断1(中断号2)对低级中断外部中断(中断号0)的控制。
中断函数1
中断函数2
延时函数
整个程序由几个部分组成:
头文件、主函数、中断函数、延时函数。
其实单片机中断可以很快入门,在学习TCON、IE、IP寄存器过程中,需要进行必要性的记忆,而且应该在每次设计C语言时必须设计程序框图,这样更好去编写程序和发现程序中的问题和编写技巧。
以下的是较为简单的程序图,但是过程较为复杂。注意每一个过程对应每一块模块程序。
#include "msp430x54xh"
//
void main()
{
WDTCTL = WDTPW + WDTHOLD; //关看门狗
P2DIR &= ~( BIT6 + BIT7); //P26 P27 设置为输入
P1DIR |= BIT0; //P10 设置为输出
P7DIR |= BIT7; //P77 设置为输出
P2REN |= BIT6 + BIT7; //上拉下拉电阻使能
P2OUT |= BIT6 + BIT7; //P26 P27 为上拉
P2IES |= BIT6 + BIT7; //P26 P27下降触发
P2IE |= BIT6 + BIT7; //P26 P27中断使能
P2IFG =0; //中断标志清除,防止配置过程中出现中断标志为1
_EINT(); //开总中断
LPM4; //进低功耗4
}
/端口中断程序/
#pragma vector = PORT2_VECTOR
__interrupt void port2(void)
{
switch(P2IV)
{
case 0x0e: P1OUT ^= BIT0;break; //LED1 亮灭
case 0x10: P7OUT ^= BIT7;break; //LED2 亮灭
default :break;
}
}
联调时在中断里设置断点(定时/计数器中断),然后全速执行可以到中断服务程序中。但对于外部中断和串口中断用纯软件模拟应该是无法进入服务程序的。因为需要硬件触发。
个人认为没有必要使用联调功能。直接在Proteus中加载Hex文件就足够用了。仿真时一步一步来,不要一次加入太多程序,一边写程序一边就仿真了。
你这是在自问自答啊,还来这里提问什么呀!可最后还是解决不了吧。
类似的用按钮作外部中断信号的,一定要用下降沿有效申请中断才行的,这样才保证按下按钮只中断一次。而你用电平中断,只要按钮不释放就会不断地中断,这样在主程序和中断程序之间不停的转换,当然主程序速度就要慢了。
而在中断程序中加无限循环是削足适履的作法,肯定是不行的,这样会只执行一次中断,但也跳不出中断了吧。
设置用下降沿中断,在
EA=1;
EX0=1;
后面加一条就可以了,IT0=1。
interrupt 后面的数字简单的说就是中断服务函数的代号
0代表外中断0
1代表定时计数器0中断
2代表外中断1
3代表定时计数器1中断
4代表串行口中断
所以interrupt 1代表定时计数器产生中断后就转到这个函数里面执行
using 后面的数字是个工作寄存器的代号,也就是R0—R7。如果不写的话由系统自动分配,一般不用去理会
STC单片机官方提供的工具软件里面有例程可以查看。
打开软件后,右边栏有“范例程序”选项,点击后打开窗口,在“单片机系列”选项里选择系列,然后选择需要的范例。
选好后就会看到范例程序:
如果需要更详细的内容,可以下载官方的器件手册。
以上就是关于Keil方法类_中断实验全部的内容,包括:Keil方法类_中断实验、用外部中断,按一次键,两个LED灯点亮,再按一次,两个LED灯熄灭,循环。用Keil(C语言)编译、用keil和proteus *** 作时,感觉中断子程序都没有起到作用(没有在主程序中出现),请问是不用调用吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)