找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3472|回复: 8
打印 上一主题 下一主题
收起左侧

数字钟为什么在实物上会闪烁,应该改哪??

[复制链接]
跳转到指定楼层
楼主
ID:60515 发表于 2016-2-14 14:23 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
/****共阳数码管0--9+全灭段码****/
uchar code led[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xff};
uchar a[6];//数码管显示
uchar b[6]={0xFB,0XF7,0XEF,0XDF,0XBF,0X7F};//数码管位码
/****子函数声明****/
void delay_ms(uint z);//带参数ms级延时子函数
void init();//初始化函数
void timechuli();//时间处理
void key();//按键函数
void display();//显示函数
/****变量定义****/
uint num;  // 记录毫秒为秒的变量
uchar hour=23;
uchar minite=59;
uchar second=56;
uchar hour1=0;
uchar minite1=1;
uchar second1=0;
uchar k;
uchar flag;//更新时间的4种模式加上正常模式
uchar S_flag;//闪烁标志位
/****位定义****/
sbit beep=P3^6; //蜂鸣器
sbit led0=P1^0; //整点报时显示
sbit led1=P1^7; //闹钟报时显示
sbit key1=P3^2;//模式切换键1正常模式 2时钟时调整 3时钟分调整 4闹钟时调整 5闹时钟分调整
sbit key2=P3^3;//加1
sbit key3=P3^4;//减1
sbit key4=P3^5; //复位键
void main()
{
    init();
while(1)
{
key();
     display();
}
}
void display()
{
switch(flag)
{
case 0:  //时钟显示模式
{
a[5]=led[hour/10];
a[4]=led[hour%10];
a[3]=led[minite/10];
a[2]=led[minite%10];
a[1]=led[second/10];
a[0]=led[second%10];
}
break;
   case 1:  // 时钟 时调整模式
{
if(S_flag==1)  //标志位为1
{
a[5]=led[hour/10];//调整时钟的时
a[4]=led[hour%10];
}
else
{
a[5]=led[11];//关闭显示
a[4]=led[11];
}
a[3]=led[minite/10];
a[2]=led[minite%10];
a[1]=led[second/10];
a[0]=led[second%10];
}
break;
case 2:  //时钟 分调整模式
{
a[5]=led[hour/10];
a[4]=led[hour%10];
if(S_flag==1)  
{
a[3]=led[minite/10];
a[2]=led[minite%10];
}
else
{
a[3]=led[11];
a[2]=led[11];
}
a[1]=led[second/10];
a[0]=led[second%10];
}
break;
   case 3:  // 闹钟 时调整模式
{
if(S_flag==1)
{
a[5]=led[hour1/10];
a[4]=led[hour1%10];
}
else
{
a[5]=led[11];
a[4]=led[11];
}
a[3]=led[minite1/10];
a[2]=led[minite1%10];
a[1]=led[11];
a[0]=led[11];
}
break;
case 4:
{
a[5]=led[hour1/10];
a[4]=led[hour1%10];
if(S_flag==1)// 闹钟 分调整模式
{
a[3]=led[minite1/10];
a[2]=led[minite1%10];
}
else
{
a[3]=led[11];
a[2]=led[11];
}
a[1]=led[11];
a[0]=led[11]; ///
}
break;
}
}
void init()
{
    beep=0;//关闭蜂鸣器
    flag=0;//正常时钟显示模式
    S_flag=0;//闪烁标志位
    TMOD=0X01;//定时器T0 方式1
    TH0=(65536-50000)/256;//重装初值
    TL0=(65536-50000)%256;
    EA=1;//开总中断
    ET0=1;//开启定时器T0
    TR0=1;
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;//重装初值
TL0=(65536-50000)%256;
num++;
if(num==20)//1S到
{
num=0;
timechuli();//时间处理函数
}
if(hour1==hour&&minite1==minite&&second<5)//闹钟时间到
{
beep=!beep;
led1=!led1;
}
else//闹钟提醒时间到后 关闭蜂鸣器和指示灯
{
beep=0;
led1=1;
}
if((minite==0)&&(second==0)) //整点到
{
led0=!led0;
}
else  //关闭LED指示
led0=1;
if(num%20==0) //1S取反一次
    S_flag=!S_flag;     //闪烁标志位取反
for(k=0;k<6;k++)
{
P2=b[k];  //送位码
P0=a[k];  //送段码
delay_ms(2);
P2=0xff;//消影
}
}
void key()
{
if(key1==0)//模式切换键按下
{
delay_ms(10);
if(key1==0)
{
  flag++;
  if(flag==5)
  {
flag=0;
  }
}
while(!key1) ; //等待按键释放
}
if(flag!=0)
{
switch(flag)
{
case 1:   //时钟时调整
{
if(key2==0)  //时钟时加1
{
delay_ms(10);
if(key2==0)
{
if(hour<23) hour++;
else hour=0;
}
while(!key2);
}
if(key3==0)  //时钟时减1
{
delay_ms(10);
if(key3==0)
{
       if(hour> 0) hour--;
else hour=23;
}
while(!key3) ;
}
}  
break;
case 2:   //时钟分调整
{
if(key2==0)  //时钟分加1
{
delay_ms(10);
if(key2==0)
{
if(minite<59) minite++;
else minite=0;
}
while(!key2);
}
if(key3==0)  //时钟分减1
{
delay_ms(10);
if(key3==0)
{
       if(minite> 0)minite--;
else minite=59;
}
while(!key3);
}
}  
break;
case 3:   //闹钟时调整
{
if(key2==0)  //闹钟时加1
{
delay_ms(10);
if(key2==0)
{
if(hour1<23) hour1++;
else hour1=0;
}
while(!key2);
}
if(key3==0)  //闹钟时减1
{
delay_ms(10);
if(key3==0)
{
       if(hour1> 0) hour1--;
else hour1=23;
}
while(!key3);
}
}  
break;
case 4:   //闹钟分调整
{
if(key2==0)  //闹钟分加1
{
delay_ms(10);
if(key2==0)
{
if(minite1<59) minite1++;
else minite1=0;
}
while(!key2) ;
}
if(key3==0)  //闹钟分减1
{
delay_ms(10);
if(key3==0)
{
       if(minite1> 0)minite1--;
else minite1=59;
}
while(!key3);
}
}  
break;
}
}
if(key4==0)//复位键
{
delay_ms(10);
if(key4==0)
{
   flag=0;
hour=0;
minite=0;
second=0;
}
while(!key4);
}
}
void delay_ms(uint z)  
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void timechuli()
{
second++;
   if(second==60)
   {
   second=0;
   minite++;
   }
   if( minite==60)
   {
    minite=0;
    hour++;
   }
   if(hour==24)
   hour=0;
}
  
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96682 发表于 2016-2-14 14:49 | 只看该作者
LZ  真幽默。出题考学生们也该换个马甲嘛!这样不是穿帮了嘛!
回复

使用道具 举报

板凳
ID:60515 发表于 2016-2-14 16:04 来自手机 | 只看该作者
wc86110 发表于 2016-2-14 14:49
LZ  真幽默。出题考学生们也该换个马甲嘛!这样不是穿帮了嘛!

做出来的实物就出现这个情况,时间有点准,几个籹
回复

使用道具 举报

地板
ID:60515 发表于 2016-2-14 16:06 来自手机 | 只看该作者
wc86110 发表于 2016-2-14 14:49
LZ  真幽默。出题考学生们也该换个马甲嘛!这样不是穿帮了嘛!

几个数码管同时都在闪。学的不精才求你助。
回复

使用道具 举报

5#
ID:80352 发表于 2016-2-15 11:50 | 只看该作者
给你一个提示,数码管动态扫描时间
回复

使用道具 举报

6#
ID:60515 发表于 2016-2-15 14:13 来自手机 | 只看该作者
情绪空123 发表于 2016-2-15 11:50
给你一个提示,数码管动态扫描时间

知道是动态问题,就是没改成功。
P2=b[k];  //送位码
P0=a[k];  //送段码
delay_ms(2);     改了这个都没成功
P2=0xff;//消影
回复

使用道具 举报

7#
ID:96682 发表于 2016-2-15 21:43 | 只看该作者
就算完全修改正常了,还是有一点不好的是掉电后,时间又得要重新设置。
回复

使用道具 举报

8#
ID:19198 发表于 2016-2-16 01:46 | 只看该作者
你可以试试把消影放到前面
回复

使用道具 举报

9#
ID:60515 发表于 2016-2-16 13:58 来自手机 | 只看该作者
wc86110 发表于 2016-2-15 21:43
就算完全修改正常了,还是有一点不好的是掉电后,时间又得要重新设置。

调是没事的,关健是解决不了我提的问题闪烁,仿真是不闪烁,到了实物就出现这问题。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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