㈠ 单片机 C语言 中断
主程序和中断没关系的,主程序是个死循环,一直执行。中断是打断主程序进入中断子程序,中断完成后继续执行主程序。中断标志要在进入中断后清除,如果不清除,下次不会再触发。主程序继续执行无影响。
TR0是启动定时器,启动以后不要再改写就好每到定时时间进入中断。进入中断后要清除中断使能标志,不是叫你关闭定时器。这两种不是一个概念。定时器控制寄存器里面有一个中断标志A,为1的时候代表进入中断,进入中断后A要清零,之后才会继续查看A是否再次为1,为1即进中断,在中断写零,如此循环进行。
关闭或者重新开启TR0,标志A都是硬件自动重新装载(初始化)0,以使中断执行。所以也能达到效果,但是每次执行都重新设置定时器会比较耗费资源,其实只需要清零标志位就ok了。
㈡ c语言怎么编写单片机的中断
标准c语言没有中断调用机制,但是不同编译器都有相应的中断处理方式,可以使用户实现中断功能。
解决方案:
1、采取轮询的方式解决,就是每10毫秒检查一下是否有键盘请求,总的来说,这样基本上可以解决问题,而且简单易行,但每10毫秒都要检查,系统消耗太大。
2、采取中断的方式:
(1)用高级语言调用中断来处理问题。中断是cpu响应一个中断外围设备8259A的一个过程,当键盘敲击,cpu保存断点暂停执行并且跳到相应的中断处理程序继续执行,结束后根据断点再跳回来。通过这种方式可以轻松+愉快地解决这个问题。但是需要用到高级语言调用汇编,根据编译器的不同而有所差别。
(2)自己模拟中断。可以另外建立一个线程专门响应键盘的敲击,如果有敲击则打断主线程。这样做实现起来很复杂,而且涉及到不少复杂的关键技术,比如信号量之类的东西。
3、强大的vc
vc采取了消息映射的机制来处理外部设备的请求,比如时钟中断、键盘中断等等。通过此可以灰常灰常容易的处理外部中断。
㈢ 单片机c语言写两个中断,两个中断怎么写
//任务6 显示按键按下的次数(中断方式)
//任务6 显示按键按下的次数(中断方式)
#include <reg51.h> //1 包含特殊功能寄存器定义头文件reg51.h
#define ledport P2 //2 宏定义:ledport代表P2(发光二极管接P2口)
#define uchar unsigned char //3 宏定义:uchar代表unsigned char
#define ulong unsigned int //3 宏定义:ulong代表unsigned long
#define unsigned int j;
uchar m=0xef; //5 定雀和义变量m:m用来保存显示控制数据,初值为0xfe
ulong i;
sfr p1=0x90;
sbit led1=P1^0; //led引脚定义
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
void fun1_int() interrupt 0 using 1//5 定义中断服务函数:中断号为0,用第1组寄存器组
{
while(1) //while循环(永远为真,死循环)
{ //循环睁凳体开始
led1=~led1; //发光二级管的显示状态取反
led2=~led2;
led3=~led3;
led4=~led4;
for(j=0;j<12500;j++); //for循环,循环体为空,耗时 //延时500ms
}
} //循环体结束
void fun2_int() interrupt 1 using 2//5 定义中断服务函数:中断号为0,用第1组寄存器组
{
while(1) //7 while循环,条件表达式为1,永远为真,死循环
{ //8 while循环体开始
P1=m; //9 P1口输出当前显示控制数据
m=(m<<1)|(m>>7); //10 显示数据m向左循环移1位,为下次显示输出作准备
for(i=0;i<60000;i++); //11 for循环实现1s延时,循环体为空语句
} //12 while循环体结束
}
//8 中断服务函数结束
void main(void) //9 main函数
{
EA=1;
EX0=0; //12 开外部中断0
EX1=0;
IT1=1;
IT0=1; //11 设置外部中断0的触发方式:下降沿触发。见代码说明
while(1)
; //14 死循环,循环体为空顷早盯语句
} //15 main函数结束
//任务1 控制1只发光二极管闪烁显示上面的注释可以省略不看,
这个需要设置不同的寄存器,注意依稀俺这里就可以了的,然后查一下数据手册。
㈣ 单片机中断C语言
#include<reg51.h>
#defineucharunsignedchar
ucharcodeledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//0-9
ucharscanled;
ucharflag=0;
uchardisdat[6];
voiddelay(unsignedintx)
{
unsignedinti,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
voiddischg()
{
uchari;
for(i=0;i<6;i++)
disdat[i]=10;
}
voidext0()interrupt0
{
flag=1;
}
voidext1()interrupt2
{
flag=2;
}
voidt1isr()interrupt3 //显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case0:
P2=0x01;
P0=~ledtab[disdat[5]];
break;
case1:
P2=0x02;
P0=~ledtab[disdat[4]];
break;
case2:
P2=0x04;
P0=~ledtab[disdat[3]];
break;
case3:
P2=0x08;
P0=~ledtab[disdat[2]];
break;
case4:
P2=0x10;
P0=~ledtab[disdat[1]];
break;
case5:
P2=0x20;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
uchari,j;
TMOD=0x10;
TH1=0xec;
TL1=0x78;
TR1=1;
ET1=1;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
scanled=0;
dischg();
while(1)
{
i=0;
switch(flag)
{
case1:
for(j=0;j<3;j++)
for(i=0;i<10;i++)
{
disdat[5]=disdat[4];
disdat[4]=disdat[3];
disdat[3]=disdat[2];
disdat[2]=disdat[1];
disdat[1]=disdat[0];
disdat[0]=i;
delay(200);
}
dischg();
flag=0;
break;
case2:
for(j=0;j<3;j++)
for(i=0;i<10;i++)
{
disdat[0]=disdat[1];
disdat[1]=disdat[2];
disdat[2]=disdat[3];
disdat[3]=disdat[4];
disdat[4]=disdat[5];
disdat[5]=i;
delay(200);
}
dischg();
flag=0;
break;
default:break;
}
}
}
㈤ 求单片机(c51)外部中断实验的c语言代码或者思路,要求在补充
#include<reg51.h>
#defineucharunsignedchar
voiddelay(void)
{
uchari,j;
for(i=0;i<200;i++)
for(j=0;j<120;j++);
}
voidext0()interrupt0
{
uchari;
for(i=0;i<8;i++)
{
P2=0x00;
delay();
P2=0xff;
delay();
}
}
main()
{
uchari;
EX0=1;
IT0=1;
EA=1;
while(1)
{
P2=~(1<<i);
delay();
i++;
i%=8;
}
}