c51单片机外部中断实验,需要编写程序,,,急急急!!!

你好!我想主程序跑一遍后,人为按键(外部中断0)暂停,待一些时间(时间不定)后再触发开始从头重跑程序,请各位大侠指导,万分感谢!

第1个回答  2014-09-14
具体的I/O口你根据你的电路设置,数码管编码也是根据你自己的电路编码,我的学习板测试通过。
希望可以给你做个参考
#include
#define uint unsigned int
#define uchar unsigned char
uchar num1,num2,qian,bai,shi,ge;//定义数据类型
uint num;
sbit k1=P3^2;//外部中断按键
sbit k2=P3^3;

sbit LED1=P2^7;//数码管第一位
sbit LED2=P2^6;
sbit LED3=P2^5;
sbit LED4=P2^4;
// 共阳数码管编码显示段码值0123456789ABCDEF- 这个根据电路实际情况编码
uchar code lednum[]={0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,
0xA0,0x60,0x25,0x3C,0x23,0x34,0x74,0xF7,0xFF};
void delay(uint);
void display(uchar,uchar,uchar,uchar);
void main()
{
EA=1; //开总中断
EX0 = 1;
EX1 = 1;
IT0 = 1;
IT1 = 1;
display(qian,bai,shi,ge);
while(1) //程序在这里不停的对数码管动态扫描同时等待中断发生
{

display(qian,bai,shi,ge);//调用数码管显示子函数
}
}
void display(uchar qian,uchar bai,uchar shi,uchar ge)//显示子函数
{
qian=num/1000;//千位分离
bai=num%1000/100; //百位分离
shi=num%100/10;//十位分离
ge=num%10;//个位分离

P0 =lednum[qian]; //取显示数据,段码十位
LED1=0; //点亮LED1(第一位)
delay(5); //延时
LED1=1; //熄灭LED1
P0=lednum[bai]; //取显示数据,段码个位
LED2=0; //点亮LED2(第二位)
delay(5); //延时
LED2=1; //熄灭LED2

P0 =lednum[shi]; //取显示数据,段码十位
LED3=0; //点亮LED3(第三位)
delay(5); //延时
LED3=1; //熄灭LED3
P0=lednum[ge]; //取显示数据,段码个位
LED4=0; //点亮LED4(第四位)
delay(5); //延时
LED4=1; //熄灭LED4

}
void delay(uint z) //带参数延时子函数
{
uint x,y;
for(x=z;x>0;x--) //z=200ms,即延时约200ms
for(y=110;y>0;y--);
}

void X0_INT() interrupt 0//外部中断0
{
num++; //按键key1按下时数码管计数器加1
}
//------------------------------------------
void X1_INT() interrupt 2//外部中断1
{
num--; //按键key2按下时数码管计数器减1

}
第2个回答  2014-09-13
这个很好处理一,复位处加一个按键,可以触发从头开始运行程序,外部中断0接一个按键,暂停程序就可以了。
#include<reg51.h>
void ext0() interrupt 0
{
while(1);
}
main()
{
EX0=1;
EA=1;
IT0=1;
while(1)
{
.....你的主程序.....
}
}
第3个回答  2014-09-13
简单的很呢追问

也可以这么说:要在主程序中指定位置,自动停止,人工按按键又重新工作。请指导,谢谢!

追答

加入标志变量flag,初始化为0,在指定位置加入while(flag==0);
在中断中加入 flag = 1;

本回答被提问者采纳
第4个回答  2014-09-13
简单啊,你确定你学过单片机,这是最基本的了
相似回答