第六章 中断与数码管动态显示 练习题

习题:

 练习题1和练习题2:

        对于C语言数组以及if语句switch语句这些语法知识,我在浙大版《C语言程序设计(第三版)》配套的PTA习题中,有相应的理解与应用,可以参考相关的习题进行复习与参考。

练习题3:

      中断对于单片机而言十分重要,中断的产生为单片机实现多功能的协调工作起到了重要的作用。单片机的中断由中断控制寄存器控制,可以通过设置单片机的该寄存器实现中断的打开或者关闭功能。

练习题4:

        详细的代码以及注释如下图:

         

#include <reg52.h> //包含特殊功能寄存器的头文件

sbit ADDR0=P1^0;   //特殊位定义
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
unsigned char number=0;                  //用来判断时间的位数
unsigned char code LedChar[]={			 //数码管显示0~9的真值表
0xC0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90                 
};
unsigned char LedBuff[6]={
0xff,0xff,0xff,0xff,0xff,0xff			 //六位数码管的缓存区
};
bit sign=0;	                             //1S的时间间隔标志位
unsigned long int time=0;				 //时间计数器
unsigned int cnt=0;                      //中断次数计数变量
unsigned long int time_1;                //用来计算时间位数的变量
unsigned char i=0;                       //数码管动态显示遍历变量
unsigned char j=0;                       
void main()
{
  		EA=1;	                        //打开总中断
		ENLED=0;						//使能3-8译码器
		ADDR3=1;						//使能3-8译码器
		TMOD=0X01; 						//调整定时器模式寄存器
		TH0=0xfc;						//初始化定时器的高八位
		TL0=0x67;						//初始化定时器的第八位
		ET0=1;							//打开定时器0的中断
		TR0=1;							//启动定时器
		while(1){
		    if(sign){
			   sign=~sign;
			   time++;
			   time_1=time;number=0;
			   while(time_1){                    //计算时间的位数循环
			    number++;time_1/=10;
			   }
			   for(j=0;j<number;j++){            //对于N位数,前N位数码管正常显示
				if(j==0){
				   LedBuff[0]=LedChar[time%10];
				}else{
				   LedBuff[j]=LedChar[time/(10*j)%10];
				}
			   }
			   for(j;j<6;j++){                  //后N位数码管不显示,即灯全不点亮
			     LedBuff[j]=0xff;
			   }
			}
		}
}
void DSQ() interrupt 1
{
 	TH0=0XFC;
	TL0=0x67;
	cnt++;
	if(cnt==1000){
	  cnt=0;
	  sign=1;
	}
	P0=0xff;
	switch(i){
		 case 0:ADDR2=0;ADDR1=0;ADDR0=0;P0=LedBuff[0];break;
		 case 1:ADDR2=0;ADDR1=0;ADDR0=1;P0=LedBuff[1];break;
		 case 2:ADDR2=0;ADDR1=1;ADDR0=0;P0=LedBuff[2];break;
		 case 3:ADDR2=0;ADDR1=1;ADDR0=1;P0=LedBuff[3];break;
		 case 4:ADDR2=1;ADDR1=0;ADDR0=0;P0=LedBuff[4];break;
		 case 5:ADDR2=1;ADDR1=0;ADDR0=1;P0=LedBuff[5];break;
	}
	i++;
	if(i==6)i=0;
}

效果:

定时器中断_数码管动态显示

练习题5:

具体的代码如下:

#include <reg52.h> //包含特殊功能寄存器的头文件

sbit ADDR0=P1^0;   //特殊位定义
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;

unsigned char code LedChar[]={			 //数码管显示0~9的真值表
0xC0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90                 
};
unsigned char LedBuff[6]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF			 //六位数码管的缓存区
};
unsigned char sign=0;	                             //1S的时间间隔标志位
			 //时间计数器
unsigned long int cnt=0;                      //中断次数计数变量
unsigned char i=0;


void main()
{
		 unsigned char buf[6];		//定义中间缓存区
		 char j;unsigned long  time=1000000;
  		EA=1;	                        //打开总中断
		ENLED=0;						//使能3-8译码器
		ADDR3=1;						//使能3-8译码器
		TMOD=0X10; 						//调整定时器模式寄存器
		TH1=0xfc;						//初始化定时器的高八位
		TL1=0x67;						//初始化定时器的第八位
		ET1=1;							//打开定时器0的中断
		TR1=1;							//启动定时器
		
		while(1){
		    if(sign==1){
			   sign=0;
			   time--;
			   buf[0]=time%10;	
			   buf[1]=time/10%10;
			   buf[2]=time/100%10;
			   buf[3]=time/1000%10;
			   buf[4]=time/10000%10;
			   buf[5]=time/100000%10;
			   for(j=5;j>=0;j--){
			        if(buf[j]==0){
						LedBuff[j]=0xff;
					}else{
						break; 
					}
			   }
			   for(;j>=0;j--){
			       LedBuff[j]=LedChar[buf[j]];
			   }
			}
}
}
void DSQ() interrupt 3
{
 	TH1=0XFC;
	TL1=0x67;
	cnt++;
	if(cnt>=1000){
	  cnt=0;
	  sign=1;
	}
	P0=0xff;
	switch(i){
		 case 0:ADDR2=0;ADDR1=0;ADDR0=0;P0=LedBuff[0];i++;break;
		 case 1:ADDR2=0;ADDR1=0;ADDR0=1;P0=LedBuff[1];i++;break;
		 case 2:ADDR2=0;ADDR1=1;ADDR0=0;P0=LedBuff[2];i++;break;
		 case 3:ADDR2=0;ADDR1=1;ADDR0=1;P0=LedBuff[3];i++;break;
		 case 4:ADDR2=1;ADDR1=0;ADDR0=0;P0=LedBuff[4];i++;break;
		 case 5:ADDR2=1;ADDR1=0;ADDR0=1;P0=LedBuff[5];i=0;break;
	}
}

效果:

定时器数码管倒计时

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值