习题:
练习题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;
}
}
效果:
定时器数码管倒计时