学习日志
今日学习任务 | 基于单片机的电子秒表设计(开始,暂停,继续,清空) |
今日任务完成情况 (详细说明本日任务是否按 计划完成,开发的代码量) | 按照计划和要求,完成当天的学习任务。 对代码进行进一步的修改和完善。 |
今日开发中出现的问题汇总 | 思考如何在基本代码的基础上进行举一反三以及进一步的拓展,使其能够实现更多的功能。 1、一开始的代码只能进行暂停和复位,无法手动进行开始。 2、初步修改之后,用两个按键进行控制,一个按键进行启动和暂停两项功能,另一个按键进行复位。但是控制开始和暂停的那个按键容易出现抖动现象,不等随心的控制开始和暂停。 3、进一步修改之后,可以想停就停了,但是需要一直保持按键处于按下去的状态才行。 4、为了进一步减少抖动的情况,将两个按键修改为三个按键,情况有所改善。 5、加上延时函数进行进一步消抖。 |
今日未解决问题 | 暂无。 |
今日开发收获 | 通过今天的学习,我对单片机的一些基础知识有了进一步的了解和认识。将理论知识应用于实际操作,通过实践来让自己的知识更加活起来。 |
其他 | 生活赋予我们一种巨大的和无限高贵的礼品,这就是青春:充满着力量,充满着期待志愿,充满着求知和斗争的志向,充满着希望信心和青春。 |
附:
//1、只能暂停和复位,无法开始
/*
#include<reg51.h>
sbit key1=P3^0; //开始、暂停计时
sbit key2=P3^1; //复位清零
int flag=0,display_flag=0,miao,num;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //不带小数点的共阴极数码管段码0-9
//延迟函数
void Delay_ms( )
{
int x=100,i;
while(x--)
{
for(i=0;i<2;i++);
}
}
void display(m,n) //显示函数
{
if(display_flag%4==0)
{
P2=0xfe;
P1=table[m/10];
}
else if(display_flag%4==1)
{
P2=0xfd;
P1=table[m%10];
}
else if(display_flag%4==2)
{
P2=0xfb;
P1=table[n/10];
}
else if(display_flag%4==3)
{
P2=0xf7;
P1=table[n%10];
}
}
int main()
{
int miao=0,num=0;
//定时器初始化
TMOD=0X01; // 用定时计数器0工作方式1
TH0=(65535-5000)/256; //高8 位
TL0=(65535-5000)%256; //低八位
EA=1; // 打开总开关
ET0=1; //打开定时计数器0中断
TR0=1;// 先不要启动定时器
while(1) //进入死循环
{
if(!key1) //开始计时,检查启动/暂停按键是否按下
{
Delay_ms( ); //延时消抖
if(!key1) //消抖之后再次进行检测
{
TR0=!TR0; //定时器的控制位取反
while(!key1); //等待按键释放
}
}
if(!key2) //复位清零,检查复位键是否按下
{
Delay_ms(); //延时消抖
if(!key2) //消抖之后再次进行检测
{
miao=0,num=0;
while(!key2); //等待按键释放
}
}
if(flag==2)
{
num++;
if(num==100)
{
miao++;
num=0;
if(miao==100)
{
miao=0;
}
}
flag=0;
}
display(miao,num);
}
return 0;
}
void timer_0() interrupt 1
{
//
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
flag++;
display_flag++;
} */
//2、停与不停看心情
/*#include<reg51.h>
sbit key1=P3^0; //开始、暂停计时
sbit key2=P3^1; //复位清零
int flag=0,display_flag=0;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //不带小数点的共阴极数码管段码0-9
//延迟函数
void Delay_ms( )
{
int x=100,i;
while(x--)
{
for(i=0;i<5;i++);
}
}
void display(m,n) //显示函数
{
if(display_flag%4==0)
{
P2=0xfe;
P1=table[m/10];
}
else if(display_flag%4==1)
{
P2=0xfd;
P1=table[m%10];
}
else if(display_flag%4==2)
{
P2=0xfb;
P1=table[n/10];
}
else if(display_flag%4==3)
{
P2=0xf7;
P1=table[n%10];
}
}
int main()
{
int miao=0,num=0;
//定时器初始化
TMOD=0X01; // 用定时计数器0工作方式1
TH0=(65535-5000)/256; //高8 位
TL0=(65535-5000)%256; //低八位
EA=1; // 打开总开关
ET0=1; //打开定时计数器0中断
Delay_ms( );
while(1) //进入死循环
{
if(flag==2)
{
num++;
if(num==100)
{
miao++;
num=0;
if(miao==100)
{
miao=0;
}
}
flag=0;
}
if(key1==0) //开始计时,检查启动/暂停按键是否按下
{
if(key1==0)
{
TR0=1;
display(miao,num);
}
if(key1!=0)
{
TR0=TR0!; //定时器的控制位取反
display(miao,num);
}
}
if(!key2) //复位清零,检查复位键是否按下
{
miao=0,num=0;
TR0=0;
}
display(miao,num);
}
return 0;
}
void timer_0() interrupt 1
{
//
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
flag++;
display_flag++;
} */
//3、想停就停
/*#include<reg51.h>
sbit key1=P3^0; //开始、暂停计时
sbit key2=P3^1; //复位清零
int flag=0,display_flag=0;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //不带小数点的共阴极数码管段码0-9
//延迟函数
void Delay_ms( )
{
int x=100,i;
while(x--)
{
for(i=0;i<5;i++);
}
}
void display(m,n) //显示函数
{
if(display_flag%4==0)
{
P2=0xfe;
P1=table[m/10];
}
else if(display_flag%4==1)
{
P2=0xfd;
P1=table[m%10];
}
else if(display_flag%4==2)
{
P2=0xfb;
P1=table[n/10];
}
else if(display_flag%4==3)
{
P2=0xf7;
P1=table[n%10];
}
}
int main()
{
int miao=0,num=0;
//定时器初始化
TMOD=0X01; // 用定时计数器0工作方式1
TH0=(65535-5000)/256; //高8 位
TL0=(65535-5000)%256; //低八位
EA=1; // 打开总开关
ET0=1; //打开定时计数器0中断
Delay_ms( );
while(1) //进入死循环
{
if(flag==2)
{
num++;
if(num==100)
{
miao++;
num=0;
if(miao==100)
{
miao=0;
}
}
flag=0;
}
if(key1==0) //开始计时,检查启动/暂停按键是否按下
{
if(key1==0)
{
TR0=1;
display(miao,num);
}
if(key1!=0)
{
TR0=!TR0; //定时器的控制位取反
display(miao,num);
}
}
if(!key2) //复位清零,检查复位键是否按下
{
miao=0,num=0;
TR0=0;
}
}
return 0;
}
void timer_0() interrupt 1
{
//
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
flag++;
display_flag++;
} */
//4、三个按键想停就停
/*#include<reg51.h>
sbit key1=P3^0; //开始
sbit key2=P3^1; //暂停计时
sbit key3=P3^2; //复位清零
int flag=0,display_flag=0;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //不带小数点的共阴极数码管段码0-9
//延迟函数
void Delay_ms( )
{
int x=100,i;
while(x--)
{
for(i=0;i<5;i++);
}
}
void display(m,n) //显示函数
{
if(display_flag%4==0)
{
P2=0xfe;
P1=table[m/10];
}
else if(display_flag%4==1)
{
P2=0xfd;
P1=table[m%10];
}
else if(display_flag%4==2)
{
P2=0xfb;
P1=table[n/10];
}
else if(display_flag%4==3)
{
P2=0xf7;
P1=table[n%10];
}
}
int main()
{
int miao=0,num=0;
//定时器初始化
TMOD=0X01; // 用定时计数器0工作方式1
TH0=(65535-5000)/256; //高8 位
TL0=(65535-5000)%256; //低八位
EA=1; // 打开总开关
ET0=1; //打开定时计数器0中断
Delay_ms( );
while(1) //进入死循环
{
if(flag==2)
{
num++;
if(num==100)
{
miao++;
num=0;
if(miao==100)
{
miao=0;
}
}
flag=0;
}
if(key1==0) //开始计时,检查启动/暂停按键是否按下
{
TR0=1;
display(miao,num);
}
if(key2==0)
{
TR0=0; //定时器的控制位取反
display_flag++;
display(miao,num);
}
if(key3==0) //复位清零,检查复位键是否按下
{
miao=0,num=0;
TR0=0;
}
display(miao,num);
}
return 0;
}
void timer_0() interrupt 1
{
//
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
flag++;
display_flag++;
} */
//5、加了延时的程序
#include<reg51.h>
sbit key1=P3^0; //开始
sbit key2=P3^1; //暂停计时
sbit key3=P3^2; //复位清零
int flag=0,display_flag=0;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //不带小数点的共阴极数码管段码0-9
//延迟函数
void Delay_ms( )
{
int x=18,i;
while(x--)
{
for(i=0;i<2;i++);
}
}
void display(m,n) //显示函数
{
if(display_flag%4==0)
{
P2=0xfe;
P1=table[m/10];
}
else if(display_flag%4==1)
{
P2=0xfd;
P1=table[m%10];
}
else if(display_flag%4==2)
{
P2=0xfb;
P1=table[n/10];
}
else if(display_flag%4==3)
{
P2=0xf7;
P1=table[n%10];
}
}
int main()
{
int miao=0,num=0;
//定时器初始化
TMOD=0X01; // 用定时计数器0工作方式1
TH0=(65535-5000)/256; //高8 位
TL0=(65535-5000)%256; //低八位
EA=1; // 打开总开关
ET0=1; //打开定时计数器0中断
while(1) //进入死循环
{
if(flag==2)
{
num++;
if(num==100)
{
miao++;
num=0;
if(miao==100)
{
miao=0;
}
}
flag=0;
}
if(key1==0) //开始计时,检查开始按键是否按下
{
Delay_ms( ); //加入延时函数进行消抖
if(key1==0) //再次进行检测确认按键是否按下
{
TR0=1; //打开定时器
display(miao,num); //显示计数
}
}
if(key2==0) //暂停计时,检查暂停按键是否按下
{
Delay_ms( ); //加入延时函数进行消抖
if(key2==0) //再次进行检测确认按键是否按下
{
TR0=0; //关闭定时器使其暂停
display(miao,num);
display_flag++;
}
}
if(key3==0) //复位清零,检查复位键是否按下
{
Delay_ms( ); //加入延时函数进行消抖
if(key3==0) //再次进行检测确认按键是否按下
{
miao=0,num=0;
TR0=0; //关闭定时器
}
}
display(miao,num);
}
return 0;
}
void timer_0() interrupt 1 //中断
{
TH0=(65535-5000)/256;
TL0=(65535-5000)%256;
flag++;
display_flag++;
}