找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3622|回复: 3
收起左侧

自学15天的初级菜鸟用if和while语句写了可以用按键设置时间的倒计时程序

[复制链接]
ID:194752 发表于 2017-5-19 13:28 | 显示全部楼层 |阅读模式
本帖最后由 elise 于 2017-5-23 10:19 编辑

或许接触电子器件比较早,对电子器件十分的热爱,但一直都是定位在兴趣爱好里。和工作一点关系都没有。自己从事的是汽车的装潢改装工作。
为了增加自己的改装能力,我发现我有必要去学习单片机,但是年纪已经不小了,30多岁了又是0基础。又没有时间去专业的机构学习。于是就此开始自学。买了2手的51单片机学习板,开始一边看视频一边琢磨研究。
前些天写了一个在软件中设置时间的倒计时程序,写完之后一直在研究如何用按键来设置定时时间。
今天早上终于写出来测试通过啦。
来跟大家分享喜悦的心情,同时帖上程序。忘高手指点一二。
因为是初学者,很多语句都不会用,所以就硬生生的用if和while语句把程序写下来了。
程序可能写的有点乱。我加点注释让大家看明白点。

/*这个程序对我来说已经很不容易了,写写改改,可能对高手来说实在是太简单,程序运行中有以下问题:第一,当设置时间的按键暗下去的同时,原先显示的0000中前3位数会灭掉,按键松掉之后才会显示。第二,设置秒的时候,我只写了秒的十位数的设置,个位数没有设置,一是觉得必要性不大,但是在特殊的情况下需要用到的话还是可以加语句来实现的。第三,进入到声光提示的时候,如果需要退出提示恢复初始值,按键需要长按*/


今天花了点时间修改了下程序,现在按键的时候不会有闪烁了,声光提示的时候也不需要长按了,按一下就能退出。
而且在设置的时候,短按一下S2是时间加一,按住的话数字会快速增加。S3和S4也是一样的效果。提高设定时间的效率。

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit dx=P2^6;
sbit wx=P2^7;
sbit beep=P2^3;
sbit s2=P3^4;
sbit s3=P3^5;
sbit s4=P3^6;
sbit s5=P3^7;
uchar c,d,e,f,g,h,i,tt;
uint x,y,num;
void delay(x);
void init();
void display(num);
void main()
{
init();
while(h)
  {
  if(s2==0)
  {
   for(y=15;y>0;y--)
   {
    display(num);
   }   
   if(s2==0)
   d++;
   display(num);
  }
  if(d==10)
  {
   d=0;
   c++;
   if(c==10)
   c=0;
  }
  if(s3==0)
  {
   for(y=15;y>0;y--)
   {
    display(num);
   }   
   if(s3==0)
   d--;
   display(num);
  }
  if(d==255)
  {
   d=9;
   c--;
   if(c==255)
   c=9;
  }
  if(s4==0)
  {
   for(y=15;y>0;y--)
   {
    display(num);
   }   
   if(s4==0)
   e++;
   display(num);
  }
  if(e==6)
  {
   e=0;
  }
  if((s5==0)&&(c+d+e+f!=0))
  {
   for(y=7;y>0;y--)
   {
    display(num);
   }   
   if((s5==0)&&(c+d+e+f!=0))
   g=1;
   h=0;  
   while(!s5)
   {
    display(num);
   }
  }
  display(num);
}
while(g)
{
  if(s5==0)
  {
   for(y=15;y>0;y--)
   {
    display(num);
   }   
   if(s5==0)
   g=0;
   h=1;   
  }
  TR0=g;
  display(num);
  if(tt==20)
  {
   tt=0;
   f--;
   if(f==255)
   {
    f=9;
    e--;
   }
   if(e==255)
   {
    e=5;
   }
   if((e==5)&&(f==9))
   {
    d--;
   }
   if(d==255)
   {
    d=9;
    c--;
   }
   if((c==0)&&(d==0)&&(e==0)&&(f==0))
   {
    g=0;
    i=1;
   }
  }
}
while(i)
{  
  P0=0xc3;
  wx=1;
  wx=0;
  P0=0x3f;
  dx=1;
  beep=0;
  for(y=7000;y>0;y--)
  {
   if(s5==0)
   {
    delay(8000);
    if(s5==0)
    g=0;
    h=1;
    i=0;
    while(!s5);
   }
  }
  beep=1;
  for(y=7000;y>0;y--)
  {
   if(s5==0)
   {
    delay(8000);
    if(s5==0)
    g=0;
    h=1;
    i=0;
    while(!s5);
   }
  }
  beep=0;
  for(y=7000;y>0;y--)
  {
   if(s5==0)
   {
    delay(8000);
    if(s5==0)
    g=0;
    h=1;
    i=0;
    while(!s5);
   }
  }
  beep=1;
  P0=0x00;
  dx=0;
  for(y=40000;y>0;y--)
  {
   if(s5==0)
   {
    delay(8000);
    if(s5==0)
    g=0;
    h=1;
    i=0;
    while(!s5);
   }
  }
}
}
void delay(x)
{
while(x--);
}
void init()
{
TMOD=0X01;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
EA=1;
ET0=1;
c=0;
d=0;
e=0;
f=0;
i=0;
num=1000*c+100*d+10*e+d;
g=0;
h=1;
}
void display(num)
{
P0=0xfb;
wx=1;
wx=0;
P0=table[c];
dx=1;
dx=0;
delay(100);
P0=0xf7;
wx=1;
wx=0;
P0=table[d];
dx=1;
dx=0;
delay(100);
P0=0xef;
wx=1;
wx=0;
P0=table[e];
dx=1;
dx=0;
delay(100);
P0=0xdf;
wx=1;
wx=0;
P0=table[f];
dx=1;
dx=0;
delay(100);
}
void timer() interrupt 1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
tt++;
}

评分

参与人数 2黑币 +105 收起 理由
LQL-LQL + 5 赞一个!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:194752 发表于 2017-5-19 13:46 | 显示全部楼层
哦,,忘了说明一下,我的学习板晶振是11.0592M的,如果晶振是12M的,那么程序里TH0和TL0里面的46080就需要改为50000.
回复

使用道具 举报

ID:194752 发表于 2017-5-19 21:13 | 显示全部楼层
后来我又做了一次测试,用手机计时和软件计时,计时时间为99分钟,到最后结束的时候,误差为1秒左右,软件计时慢了一秒左右。这个是不是可以理解为每一次中断循环中产生的时间差的累计?
回复

使用道具 举报

ID:1 发表于 2017-5-21 01:51 | 显示全部楼层
elise 发表于 2017-5-19 21:13
后来我又做了一次测试,用手机计时和软件计时,计时时间为99分钟,到最后结束的时候,误差为1秒左右,软件 ...

楼主如果是每一次都是慢了一秒,肯定是由于晶振不准等问题导致的,可以考虑在代码中将此误差修正,参考资料:http://www.51hei.com/bbs/dpj-56167-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表