#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熄灭 } } 对此代码进行完善处理
时间: 2023-11-28 21:48:17 浏览: 43
以下是对代码的完善处理:
1. 在代码开始处添加注释,说明代码的功能和使用说明。
```
// 该代码实现了一个计数器和定时器的功能,同时可以控制LED灯的闪烁
// 使用前需要连接外部按键和数码管显示器,并将LED灯连接到P1.0口
```
2. 将变量的命名改为更加有意义的名称。
```
uchar count_t0 = 0; // T0中断次数
char blink_count = 0; // 闪烁次数
uint count_t1 = 0; // 外部中断(S1)次数
uint z; // 判断减一执行后是否开启加一按键
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // 7段数码管显示的码表
uchar code wei[]={0x01,0x02}; // 数码管显示的位选码
uchar m[]={0,0}; // 数码管显示的数值
```
3. 将延迟函数的参数名称改为更有意义的名称,并在函数内部添加注释。
```
void delay(uint ms){ // 延迟函数,ms为延迟的毫秒数
uint i,j;
for(i=0;i<ms;i++){
for(j=0;j<25;j++);
}
}
```
4. 在数码管显示函数中添加注释,并将循环变量的名称改为更有意义的名称。
```
void display(){ // 数码管显示函数
uchar i;
m[0]=count_t1%10; // 个位数
m[1]=count_t1/10; // 十位数
for(i=0;i<2;i++){
P2=wei[i]; // 选中第i位
P0=table[m[i]]; // 显示第i位的数值
delay(10); // 稍作延迟
}
}
```
5. 在定时器/计数器初始化函数中添加注释,将定时器/计数器的功能描述清晰明了。
```
void tini(){ // 定时/计数器初始化
TMOD=0x61; // T0方式1定时,T1方式计数 0110 0001
TL1=0x00; // 计数器1的初值为0
TH0=(65536-50000)/256; // 定时器0的时间常数,每50ms中断一次
TL0=(65536-50000)%256;
TR0=0; // T0停止计时
TR1=0; // T1停止计数
}
```
6. 在外部中断初始化函数中添加注释,将外部中断的功能描述清晰明了。
```
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中断下降沿触发
}
```
7. 在闪烁程序函数中添加注释,将闪烁的功能描述清晰明了。
```
void shanshuo(){ // 闪烁程序,LED灯闪烁count_t1次
for(blink_count=count_t1;blink_count>0;blink_count--){
P10=1; // LED亮起
delay(500); // 延迟500ms
display(); // 显示数值
P10=0; // LED熄灭
delay(500);
display();
}
}
```
8. 将主函数中的循环体添加注释,并在最后添加一个无限循环。
```
void main (void) {
exini(); // 外部中断初始化
tini(); // 定时/计数器初始化
while(1){
display(); // 显示数值
}
}
```
9. 在中断服务函数中添加注释,将中断的功能描述清晰明了。
```
void int3_0() interrupt 0{ // 外部中断0服务程序,S1按键
count_t1++; // 中断次数加一
TR1=1; // 启动计数器1
switch(count_t1){
case 1: TR1=1; break; // 第一次按键,启动计数器1
case 2: TR1=0; count_t1=0; TR0=1; break; // 第二次按键,停止计数器1,启动定时器0
}
}
void int1_0() interrupt 2{ // 外部中断1服务程序,S2按键
if(TR1==1) z=0; // 如果计数器1正在计数,则z=0
else z=1; // 否则z=1
TR1=0; // 停止计数器1
if(count_t1>0){
count_t1--; // 计数值减一
} else {
count_t1=0;
TR1=0;
}
if(z==0) TR1=1; // 如果执行了减一操作,则开启计数器1
else if(z==1) TR1=0; // 如果执行了加一操作,则关闭计数器1
}
void int1_3() interrupt 1{ // 计时器T0中断服务程序
TH0=(65536-50000)/256; // 重新加载时间常数,每50ms中断一次
TL0=(65536-50000)%256;
count_t0++; // 中断次数加一
if(count_t0==100){ // 每隔1s执行一次
count_t0=0; // 计数器清零
TR0=0; // 停止计时
shanshuo(); // LED灯闪烁count_t1次
P10=1; // LED灯熄灭
}
}
```