单片机中断问题30例
序被忽略问题,找不到原因。
avr studio 4 软件仿真时,编译通过了,单在编译信息栏却看到中断程序被忽略。在软件仿真时也发现中断程序没有执行。不知道问题出在哪里,我用的是avr studio 4 ATmage 128 单片机.
程序如下
#include
#include
void main() //用的是TC0 溢出中断,来控制八位LED 一秒闪烁
{
PORTE = 0xFF; //LED 关 端口高电平位关
DDRE = 0xFF;
MCUCR |=(1
sei(); //开启全局中断
TIMSK|=(1
TCNT0 =155; //定时器赋初值
TCCR0 |= (1 CS01); //8分频
while (1);
}
volatile unsigned int j =0;
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
TCNT0 = 156; //设初值
j++;
if(j = 5000) //中断5000次后 执行LED 电平翻转
PORTE ^= 0xFF; //LED 电平翻转
}
../lesson2.c:18: warning: ignoring #pragma interrupt_handler timer0_ovf_isr
上面是写的程序。还有编译信息栏里的话。
答:
不是,你那句#pragma interrupt_handler timer0_ovf_isr:17是ICCAVR编译软件中写中断的方式,而看你的头文件#include 和#include 应该是用avr studio装GCCavr编译软件的写法,你加上把中断成
SIGNAL(SIG_OVERFLOW0)
{
TCNT0 = 156; //设初值
j++;
if(j = 5000) //中断5000次后 执行LED 电平翻转
PORTE ^= 0xFF; //LED 电平翻转
}
看看,记住,这是GCCAVR 编译软件的写法
8新学的C51单片机,编了个电平触发式中断程序,不知道为什么和跳变沿的一样了,诸位帮忙看看.
#include
#define uchar unsigned char
#define uint unsigned int
sbit d1=P1^0;
sbit dula=P2^6;
sbit wela=P2^7;
void delay(uint z);
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void main()
{
EA=1;
EX0=1;
IT0=0;
while(1)
{ d1=1;
dula=1;
P0=table[1];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(500);
dula=1;
P0=table[2];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(500);
dula=1;
P0=table[3];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(500);
dula=1;
P0=table[4];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(500);
dula=1;
P0=table[5];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay(500);
dula=1;
P0=table[6];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delay(500);
}
}
void delay(uint z)
{
uint x,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}
void enter() interrupt 0
{
d1=0;
}
答: 你这个程序中设置IT0=0,说明是低电平触发,所以只要P3^2口一直是低电平那么主程序停止,所以发光二极管点亮,如果P3^2口变为高电平,主程序继续,发光二极管熄灭。另一种情况是当IT0=1的时候是负跳变触发,就是当P3^2口检测到一个又高电平到低电平的跳变后,触发中断,在中断函数中点亮灯,立即出中断,执行到d1=1时熄灯。看到的现象就是灯闪一下,直到又检测到一个负跳变,灯又闪一下。两种触发方式的现象是不一样的,如果你硬件没问题的话。你可以把中断函数写成d1=!d1试试。
9、在C51单片机中,中断服务程序怎么撤销中断引脚上的低电平?
我用的是,第一个单片机输出低电平到第二个单片机的P3^2,第二个单片机是电平触发方式中断
低电平触发方式:要求低电平保持到CPU实际响应为止,为了避勉CPU再次响应中断,在中断服务程序中应该撤除中断引脚上的低电平。请问,怎么撤销?在中断服务程序中怎么写? 直接写P3^2=1;行吗?
答:
第一个单片机的程序,是谁来编写? 如果也是楼主,那就好办了。
第二个单片机完成了中断的功能,在退出之前,可以向第一个单片机回送一个脉冲;
第一个单片机收到这个脉冲,就应该撤消送到第二个单片机的中断申请信号。
----
另外,如果能算出来完成中断的时间,第一个单片机送来的申请信号,就不要超过这个时间,应该及时、自动的撤消申请信号。
第一个单片机送来的申请信号,也不可过短,应该能让对方检测到。
10、程序如下,我想要得到的效果是1秒左边的电动机转动,同时黄灯亮,1秒右边转动,蓝灯亮,以此循环下去,但是这个程序用上去后,左边转》右边转》左边转》之后就一直是左边了,不切换了,谁能帮我解决下问题,感激不尽!!
#include
sbit m=P2^0;
sbit b=P2^6;
sbit y=P2^7;
unsigned char count;
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
count=0;
m=!0;
b=!1;
y=!0;
while(1)
{
if(TF0==1)
{
count++;
if(count==20)
{
m=0;
b=1;
y=0;
}
if(count==40)
{
m=!0;
b=!1;
y=!0;
}
TF0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
}
}
答案
- FPGA的DSP性能揭秘(06-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- 分时操作系统思想在单片机中的具体应用 (10-30)
- 基于AT89C51+DSP的双CPU伺服运动控制器的研究(05-26)
- 关于RTX51 TINY的分析与探讨(05-30)
- 基于MC9S12DGl28单片机的智能寻迹车设计(04-03)