#include<reg51.h> #include<intrins.h> unsigned char temp; void exint0() interrupt 0 { temp=P2; P2=P2==0x01?0x03:P2<<1; } void exint1() interrupt 2 { temp=P2; P2=P2==0x80?0xC0:P2>>1; } void delay() { unsigned int time=30000; while(time--); } unsigned n; void blink1(n) { while(n--) {P2=0xf0; delay(); P2=0x00; delay();} P2=0x18; temp=P2; } void blink2(n) { while(n--) {P2=0x0f; delay(); P2=0x00; delay();} P2=0x18; temp=P2; } void main() { P2=0x18; temp=P2; IT0=1; IT1=1; IP=0x01; IE=0x85; while(1) { if(P2==0x00) { switch(temp) { case 0x80:{EA=0;blink1(5);EA=1;} break; case 0x01:{EA=0;blink2(5);EA=1;} break; } } }
时间: 2023-10-23 12:14:22 浏览: 65
这是一个基于8051单片机的中断实验代码,其中包括了外部中断0和1的处理函数,以及两个LED灯的闪烁函数和主程序。
在这个程序中,外部中断0和1分别连接了两个按钮,当按钮按下时会触发相应的中断事件。中断处理函数中实现了LED灯的状态改变,即按下按钮后,LED灯会从左往右或者从右往左闪烁。主程序中不断检测LED灯的状态,当LED灯为全灭状态时,会根据上一个LED灯的状态来选择是调用blink1函数还是blink2函数,从而实现了LED灯的交替闪烁。
需要注意的是,这个程序中使用了延时函数来控制LED灯的闪烁,但是延时函数的精度较低,可能会对程序的稳定性和可靠性造成影响。如果需要更高的精度,可以考虑使用定时器中断来控制LED灯的闪烁。
相关问题
代码改错#include <reg51.h> #include <intrins.h> sbit K1=P3^2; sbit K2=P3^3; void delay(unsigned int xms) { while (xms--) } void LED_flash() { int i; for(i=0;i<10;i++) { P2=0x00; delay(500); P2=0xff; delau(500); } } void LED_flow() { int i; for(i=0;i<8;i++) { P2=~(0x01<<i); delay(500); } } void K1init() { IT0=1; EX0=1; EA=1; } void K2init() { IT1=1; EX1=1; EA=1; PX1=1; } void main() { K1init(); K2init9); P2=0xff; while(1) { } } void int0() interrupt 0 { LED_flash(); } void int1() interrupt 2 { LED_flow(); }
在代码中,有以下错误:
1. 在LED_flash()函数中,有一个拼写错误。`delau(500);`应该改为`delay(500);`。
2. 在K2init()函数中,`K2init9)`应该改为`K2init();`。
修改后的代码如下:
```
#include <reg51.h>
#include <intrins.h>
sbit K1=P3^2;
sbit K2=P3^3;
void delay(unsigned int xms) {
while (xms--);
}
void LED_flash() {
int i;
for (i=0; i<10; i++) {
P2 = 0x00;
delay(500);
P2 = 0xff;
delay(500);
}
}
void LED_flow() {
int i;
for (i=0; i<8; i++) {
P2 = ~(0x01 << i);
delay(500);
}
}
void K1init() {
IT0 = 1;
EX0 = 1;
EA = 1;
}
void K2init() {
IT1 = 1;
EX1 = 1;
EA = 1;
PX1 = 1;
}
void main() {
K1init();
K2init();
P2 = 0xff;
while (1) {
}
}
void int0() interrupt 0 {
LED_flash();
}
void int1() interrupt 2 {
LED_flow();
}
```
#include<reg51.h> #include<intrins.h> unsigned char temp; void exint0() interrupt 0 { temp=P2; P2=P2==0x01?0x03:P2<<1; } void exint1() interrupt 2 { temp=P2; P2=P2==0x80?0xC0:P2>>1; } void delay() { unsigned int time=30000; while(time--); } unsigned n; void blink1(n) { while(n--) {P2=0xf0; delay(); P2=0x00; delay();} P2=0x18; temp=P2; } void blink2(n) { while(n--) {P2=0x0f; delay(); P2=0x00; delay();} P2=0x18; temp=P2; } void main() { P2=0x18; temp=P2; IT0=1; IT1=1; IP=0x01; IE=0x85; while(1) { if(P2==0x00) { switch(temp) { case 0x80:{EA=0;blink1(5);EA=1;} break; case 0x01:{EA=0;blink2(5);EA=1;} break; } } }为这段代码写注释
以下是一段 8051 单片机的汇编代码,注释已经添加:
```assembly
#include<reg51.h> // 引入 8051 单片机的头文件
#include<intrins.h> // 引入 8051 单片机的中断函数库
unsigned char temp; // 定义一个无符号字符变量 temp,用于保存 P2 的状态
void exint0() interrupt 0 // 定义外部中断 0 的中断处理函数
{
temp=P2; // 将 P2 的状态保存到 temp 中
P2=P2==0x01?0x03:P2<<1; // 根据 P2 的状态将其左移一位或者变为 0x03
}
void exint1() interrupt 2 // 定义外部中断 1 的中断处理函数
{
temp=P2; // 将 P2 的状态保存到 temp 中
P2=P2==0x80?0xC0:P2>>1; // 根据 P2 的状态将其右移一位或者变为 0xC0
}
void delay() // 定义一个延时函数
{
unsigned int time=30000; // 定义一个无符号整型变量 time,用于计时
while(time--); // 循环计时,实现延时效果
}
unsigned n; // 定义一个无符号整型变量 n
void blink1(n) // 定义一个闪烁函数 blink1,接收一个整型参数 n
{
while(n--) // 循环 n 次
{
P2=0xf0; // 将 P2 的高四位设置为 1
delay(); // 延时一段时间
P2=0x00; // 将 P2 的所有位清零
delay(); // 延时一段时间
}
P2=0x18; // 将 P2 的状态设置为 0x18(二进制 0001 1000)
temp=P2; // 将 P2 的状态保存到 temp 中
}
void blink2(n) // 定义一个闪烁函数 blink2,接收一个整型参数 n
{
while(n--) // 循环 n 次
{
P2=0x0f; // 将 P2 的低四位设置为 1
delay(); // 延时一段时间
P2=0x00; // 将 P2 的所有位清零
delay(); // 延时一段时间
}
P2=0x18; // 将 P2 的状态设置为 0x18(二进制 0001 1000)
temp=P2; // 将 P2 的状态保存到 temp 中
}
void main() // 主函数
{
P2=0x18; // 将 P2 的状态设置为 0x18(二进制 0001 1000)
temp=P2; // 将 P2 的状态保存到 temp 中
IT0=1; // 开启外部中断 0
IT1=1; // 开启外部中断 1
IP=0x01; // 将中断优先级设置为高优先级
IE=0x85; // 开启外部中断 0 和 1
while(1) // 无限循环
{
if(P2==0x00) // 如果 P2 的状态为 0x00(二进制 0000 0000)
{
switch(temp) // 根据 temp 的值进行判断
{
case 0x80: // 如果 temp 的值为 0x80(二进制 1000 0000)
{
EA=0; // 关闭全部中断
blink1(5); // 调用 blink1 函数,闪烁 5 次
EA=1; // 开启全部中断
}
break;
case 0x01: // 如果 temp 的值为 0x01(二进制 0000 0001)
{
EA=0; // 关闭全部中断
blink2(5); // 调用 blink2 函数,闪烁 5 次
EA=1; // 开启全部中断
}
break;
}
}
}
}
```
这段代码是一段基于 8051 单片机的汇编代码,主要实现了外部中断和 LED 闪烁的功能。其中,外部中断 0 和 1 分别对应 P3.2 和 P3.3 两个引脚,用于控制 P2 的状态(LED 灯的亮灭)。具体来说,当 P3.2 引脚被触发时,P2 的状态会向左移一位或者变为 0x03;当 P3.3 引脚被触发时,P2 的状态会向右移一位或者变为 0xC0。同时,当 P2 的状态为 0x00(LED 灯全部熄灭)时,根据 temp 的值进行判断,调用不同的闪烁函数 blink1 或 blink2,实现 LED 灯的闪烁效果。
阅读全文