void int0() interrupt 0 { uchar i; for (i = 0; i < 10; i++) { P0 = tab2[i]; delay(); } }解释这段代码
时间: 2024-06-05 08:07:04 浏览: 133
这段代码是中断0的中断服务函数,当中断0触发时,即外部中断0引脚有信号改变时,该函数会被自动调用。其中,该函数会循环输出数组tab2中的元素到P0口,并通过delay()函数产生一定的延时。
具体而言,该函数会定义一个uchar类型的变量i,初始值为0,然后通过for循环,循环10次,每次循环将i自增1,即i++。在循环中,每次将tab2数组的第i个元素输出到P0口,并通过delay()函数产生一定的延时。因此,该函数的作用是在外部中断0触发时,循环输出tab2数组的元素到P0口。
相关问题
void int0() interrupt 0 { uchar i; for (i = 0; i < 10; i++) { P0 = tab2[i]; delay(); } }
This code defines an interrupt service routine for external interrupt 0 (INT0). When the interrupt is triggered, the code will execute a loop that iterates 10 times. During each iteration, the value of the variable i will be used as an index to access an element of the array tab2, and that value will be written to P0. After each write to P0, there will be a delay before the next iteration of the loop.
However, there is a mistake in the code - the incrementation of i is missing from the for loop's expression. As it stands, the loop will never terminate and will cause the program to hang. The correct expression should be "i++" to increment i by 1 after each iteration.
#include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int uchar a; uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x40}; void delay(uint x); void display(uchar x); void main() { while(1){ P1=0x01;P2=tab[3];delay(10); P1=0x02;P2=tab[7];delay(10); P1=0x04;P2=tab[6];delay(10); P1=0x08;P2=tab[1];delay(10); P1=0x10;P2=tab[2];delay(10); P1=0x20;P2=tab[1];delay(10); delay(500); a=0; EA=1; EX0=1; IT0=1; EA=1; EX1=1; IT1=1; display(0); while(1) { if(a>16) a=0; P1=0X01;P2=tab[17];delay(10); P1=0x02;P2=tab[17];delay(10); P1=0x04;P2=tab[6];delay(10); P1=0x08;P2=tab[1];delay(10); P1=0x10;P2=tab[2];delay(10); display(a); } } } void int0() interrupt 0 { a++; } void int1() interrupt 1 { a=0; } void display(uchar x) { P1=0x20;P2=tab[x];delay(1); } void delay(unsigned int z){ uchar x,y; for(x=z;x>0;x--) for(y=0;y<114;y++); }
这段代码是单片机8051控制LED数码管的显示,使用了中断处理函数来控制数码管的计数和清零。其中tab数组存放了0~F的十六进制数码管显示值,delay函数用来延时控制数码管的显示刷新频率。在主函数中,通过循环控制每个数码管的显示,并在按下外部中断0时计数加一,在按下外部中断1时计数清零。
具体注释见下:
```
#include<reg51.h> // 包含8051单片机的头文件
#include<intrins.h> // 包含延时函数的头文件,_nop_()函数需要
#define uchar unsigned char // 定义uchar为unsigned char的别名
#define uint unsigned int // 定义uint为unsigned int的别名
uchar a; // 定义变量a,用于计数
uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x40}; // 定义一个常量数组tab,用于存放0~F的数码管显示值
void delay(uint x); // 声明延时函数
void display(uchar x); // 声明数码管显示函数
void main() { // 主函数
while(1){ // 进入主循环
P1=0x01;P2=tab[3];delay(10); // 显示数字3
P1=0x02;P2=tab[7];delay(10); // 显示数字7
P1=0x04;P2=tab[6];delay(10); // 显示数字6
P1=0x08;P2=tab[1];delay(10); // 显示数字1
P1=0x10;P2=tab[2];delay(10); // 显示数字2
P1=0x20;P2=tab[1];delay(10); // 显示数字1
delay(500); // 程序延时500ms
a=0; // 将计数器a清零
EA=1; EX0=1; IT0=1; EA=1; EX1=1; IT1=1; // 初始化中断函数
display(0); // 数码管显示0
while(1) { // 进入循环
if(a>16) a=0; // 如果计数器a大于16,则将a重置为0
P1=0X01;P2=tab[17];delay(10); // 显示数字F
P1=0x02;P2=tab[17];delay(10); // 显示数字F
P1=0x04;P2=tab[6];delay(10); // 显示数字6
P1=0x08;P2=tab[1];delay(10); // 显示数字1
P1=0x10;P2=tab[2];delay(10); // 显示数字2
display(a); // 在数码管上显示计数器a的值
}
}
}
void int0() interrupt 0 { // 外部中断0处理函数,计数器a加1
a++;
}
void int1() interrupt 1 { // 外部中断1处理函数,计数器a清零
a=0;
}
void display(uchar x) { // 数码管显示函数
P1=0x20;P2=tab[x];delay(1); // 在P1口上输出对应的数码管显示值
}
void delay(unsigned int z){ // 延时函数
uchar x,y; // 声明两个uchar类型的变量x和y
for(x=z;x>0;x--) // 外层循环,循环z次
for(y=0;y<114;y++); // 内层循环,循环114次,达到延时效果
}
```
阅读全文