c51单片机之外部中断实验(利用外部中断实现按键控制显示数字实现设置、加一、减一功能)

仿真图:

仿真图:

代码段:

#include<reg52.h>
#define uint unsigned int     
#define uchar unsigned char
sbit P10=P1^0;
uchar a=0;//T0中断次数
char c=0; //闪烁次数
uint b=0;  //外部中断(S14问
uint z;    //判断减一执行后是否开启加一按键
void delay(uint z);    
void display(); 
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code wei[]={0x01,0x02};
uchar m[]={0,0};
void delay(uint z){     //延迟函数
	uint j,k;
	for(j=0;j<z;j++)
	for(k=0;k<25;k++);
}
void display(){          //数码管显示函数
	uchar i;
	m[0]=TL1%10;
	m[1]=TL1/10;  
	for(i=0;i<2;i++){
		P2=wei[i];
		P0=table[m[i]];
		delay(10);
}
}
void tini(){             //定时/计数器初始化
	TMOD=0x61; //T0方式1定时,T1方式计数 0110 0001
	TL1=0x00;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	TR0=0;    //T0停止计数
	TR1=0;    //T1停止计数
}
void exini(){                   //外部中断初始化
	EA=1;           //CPU开中断
	EX0=1;          //允许INT0中断
	EX1=1;     //允许INT1中断
	ET0=1;     //允许T0中断
	ET1=1;     //允许T1中断
	PX0=1;
	IT0=1;    //INT0中断下降沿触发
	IT1=1;    //INT1中断下降沿触发
}
void shanshuo(){                        //闪烁程序
	for(c=TL1;c>0;c--){
		P10=1;
		delay(500);
		display();
		P10=0;
		delay(500);
		display();
}                                                      
}
 void main (void)  {
	exini();
	tini();
	while(1){
		display();
}
}
void int3_0() interrupt 0{               //外部中断0服务程序
	b=b+1;                   //中断次数加一
	TR1=1;                   //启动计数器1
	switch(b){
	case 1:TR1=1;break;
  	case 2:TR1=0;b=0;TR0=1;break;
}
}
void int1_0() interrupt 2{         //外部中断1服务程序
	if(TR1==1)
  		z=0;  
  	else
  		z=1;     
  	TR1=0;
	if(TL1>0){
	TL1=TL1-1;                      //计数值减一
}
	else{
	TL1=0;
	TR1=0;
}
	if(z==0)
		TR1=1;
	else if(z==1)
		TR1=0;
}
void int1_3() interrupt 1{         //计时器T0中断服务程序
	TH0=(65536-50000)/256;   //定时50ms时间常数
	TL0=(65536-50000)%256;
	a=a+1;                                  //中断次数加一
	if(a==100){
  		a=0;
		TR0=0;                    //停止计时
  		shanshuo();
  P10=1;                  //LED熄灭
 }
}

解析:

主要涉及外部中断0,外部中断1、定时器T0的中断操作,计数器在中断作为功能键时是一个不错的选择

中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断计数器中断
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值