3264|11

10

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

一个可调时间的时钟 搞了一个星期了 没找出哪有问题 [复制链接]

#include"reg51.h"

#define smg P1
#define sj P0

sbit sheding=P1^3;
sbit jiashi=P1^4;


code unsigned char shumaguan[6]={0x07,0x06,0x05,0x04,0x03,0x02};
code unsigned char shijian[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char m,s,h,saomiao,a=0;
unsigned long t;

/***************************************
延时函数
***************************************/

void delay(unsigned int yanshi)
{
unsigned char i;
while(--yanshi)
{for(i=0;i>120;i++);
}
}



/*********************************

调时函数

*********************************/




void tiaoshi(void)
{


switch(a)

{case 1:
  if(!jiashi)
  {
  delay(20);
   if(!jiashi)
   m++;
  }
  break;

case 2:

  if(!jiashi)
  {delay(20);
   if(jiashi==0)
   s++;
  }
  break;

case 3:

  if(!jiashi)
  {delay(20);
   if(!jiashi)
   h++;
  }
  break;
  case 0:
  break;

}
if(m>60)
m=0;
if(s>60)
s=0;
if(h>24)
h=0;

}



void shijianjinwei(void)
{
if(t>120)
{t=0;
m++;

}
if(m>59)
{m=0;
s++;
}
if(s>59)
{s=0;
h++;
}
if(h>23)
h=0;
if(t>249)
t=0;
if(m>59)
m=0;
if(s>59)
s=0;
if(h>23)
h=0;
}




void xianshi(void)
{


switch(saomiao)
{
case 0:                                //秒个位
sj=shijian[m%10];  
smg=shumaguan[0];

break;
case 1:                                //秒十位
sj=shijian[m%100/10];
smg=shumaguan[1];

break;
case 2:                                 //分个位
sj=shijian[s%10]|0x80;
smg=shumaguan[2];
;
break;
case 3:                                 //分十位
sj=shijian[s%100/10];
smg=shumaguan[3];

break;
case 4:                                 //小时个位
sj=shijian[h%10]|0x80;
smg=shumaguan[4];

break;
case 5:                                 //小时十位
sj=shijian[h%100/10];
smg=shumaguan[5];

break;
}

saomiao++;
t++;

if(saomiao>5)
saomiao=0;



}



void miaoxianshi(void)
{
unsigned char miaosaomiao;
switch(miaosaomiao)
{case 0:
sj=shijian[m%10];  
smg=shumaguan[0];
break;
case 1:
sj=shijian[m%100/10];
smg=shumaguan[1];
break;
}
miaosaomiao++;
if(miaosaomiao>1)
miaosaomiao=0;
}


void fenxianshi(void)
{
unsigned char fensaomiao;
switch(fensaomiao)
{
case 0:
sj=shijian[s%10]|0x80;
smg=shumaguan[2];
break;
case 1:
sj=shijian[s%100/10];
smg=shumaguan[3];
break;
}
fensaomiao++;
if(fensaomiao>1)
fensaomiao=0;
}

void shixianshi(void)
{
unsigned char shisaomiao;
switch(shisaomiao)
{case 0:
sj=shijian[h%10]|0x80;
smg=shumaguan[4];
break;
case 1:
sj=shijian[h%100/10];
smg=shumaguan[5];
}
shisaomiao++;
if(shisaomiao>1)
shisaomiao=0;
}


void main(void)
{  
  jiashi=1;


P3=0xff;
IT1=0;
EX1=1;
EA=1;
a=2;


while(1)
{


switch(a)
{
case 1:

miaoxianshi();

tiaoshi();




case 2:


fenxianshi();

tiaoshi();




case 3:


shixianshi();

tiaoshi();




case 0:

xianshi();
shijianjinwei();



}
}
}


void ExInt1IRQ(void) interrupt 1
{
a++;

}



以前是直接用按键给a++的,完全没用,现在用外部中断a++还是没用。我直接给a赋值也不能进入调时显示时,分,秒;而且设置的显示那个+1的速度会变快,求大神赐教;

此帖出自单片机论坛

最新回复

大概看了下,觉得有两个地方不妥: 1.switch语句最后要加上default:break;,不然程序可能会进入死循环。 2.把if(m>60)m=0;放在 if(!jiashi)   {   delay(20);    if(!jiashi)    m++; 后,即 if(!jiashi)   {   delay(20);    if(!jiashi)    m++; if(m>60)m=0; } h和s同理。这是比较正规的编程规范。   详情 回复 发表于 2014-3-21 08:54
点赞 关注
 

回复
举报

1297

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
写的有点乱,用了好几个开关语句,建议:用定时器中断设置1S来实现数码管时钟,可调时分秒的程序很简单,不需要写这么复杂……
此帖出自单片机论坛
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
最开始就用的定时器,试了半天不行才改成这样的 ,等下我再试试
此帖出自单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

4
 
本帖最后由 呜哈哈 于 2014-3-20 00:14 编辑
gh131413 发表于 2014-3-19 14:13
写的有点乱,用了好几个开关语句,建议:用定时器中断设置1S来实现数码管时钟,可调时分秒的程序很简单,不 ...

最开始就用的定时器,有弄 个定时器+外部中断的,还是没摸到门儿

此帖出自单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

5
 
本帖最后由 呜哈哈 于 2014-3-20 00:35 编辑

#include"reg51.h"

sbit P1_4=P1^4;//调整时间 +1



code unsigned char ledbyte[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};        //0。。。。。9
code unsigned char led[7]={0x07,0x06,0x05,0x04,0x03,0x02,0x01};//第一个数码管......第7个数码管

unsigned char m; //秒
unsigned char s; //分
unsigned char h; //小时
unsigned char sm;//扫描数码管的时间
unsigned char w; //星期
unsigned char t; //250t=1s
unsigned char a; //选择 秒 分 或小时
/***************
延时
****************/

void delay(unsigned char b)
{unsigned char c;
while(--b)
for(c=0;c>120;c++);
}

/********************
正常显示时间
***************/



void xianshi(void)
{

switch(sm)
{case 0:

P0=ledbyte[m%10];
P1=led[0];
case 1:
P0=ledbyte[m%100/10];
P1=led[1];

case 2:
P0=ledbyte[s%10]|0x80;
P1=led[2];
case 3:
P0=ledbyte[s%100/10];
P1=led[3];

case 4:
P0=ledbyte[h%10]|0x80;
P1=led[4];
case 5:
P0=ledbyte[h%100/10];
P1=led[5];

case 6:
P0=ledbyte[w]|0x80;
P1=led[6];

}
}

/*******************
调时
**********************/

void ts(unsigned char k,p,q)
{
switch(sm)
{case 1,2,3:
P0=ledbyte[k%10]|0x80;
P1=led[p];

  case 4,5,6:
P0=ledbyte[k%100/10];
P1=led[q];
}
if(P1_4==0)
{delay(20);
if(P1_4==0)
k++;
}
}
/*****
主函数
******/


void main(void)
{
TMOD=0x01;
EA=1;
TR0=1;
ET0=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;

P1_4=1;
P3=0xff;
IT1=1;
EX1=1;

while(1)
{
switch(a)
{case 0:

{xianshi();
if(t>255)
{t=0;
m++;
}
if(m>60)
{m=0;
s++;
}
if(s>24)
{s=0;
w++;
}
if(w>7)
w=1;
}

case 1:
  {
  ts(m,0,1);
  if(m>59)
  m=0;
  }

case 2:
{
ts(s,2,3);
if(s>59)
s=0;
}

case 3:
{
ts(h,4,5);
if(h>23)
h=0;
}

case 4:
{
if(P1_4==0)
{delay(20);
if(P1_4==0)
w++;}
P0=ledbyte[w];
P1=led[6]|0x80;
if(w>7)
w=0;
}

}
}
}

/**************
定时器0中断
*****/

void timer0(void) interrupt 1
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
sm++;
t++;
if(sm>6)
sm=0;
if(t>249)
{t=0;
s++;
}
}


/*******
外部中断   按键中断a+1
*******/

void ExInt1IRQ(void) interrupt 2
{delay(50);
a++;
if(a>4)
a=0;
}
此帖出自单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

6
 
本帖最后由 呜哈哈 于 2014-3-20 00:29 编辑

上面这个新写的 用定时器和外部中断的   还是......没正常的

下面是原理图
此帖出自单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

7
 
查看本帖全部讨论,请登录或者注册
此帖出自单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

8
 
查看本帖全部讨论,请登录或者注册
此帖出自单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

9
 
查看本帖全部讨论,请登录或者注册
此帖出自单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

10
 
查看本帖全部讨论,请登录或者注册
此帖出自单片机论坛
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

11
 
查看本帖全部讨论,请登录或者注册
此帖出自单片机论坛
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

12
 
查看本帖全部讨论,请登录或者注册
此帖出自单片机论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
福禄克有奖直播:高精度测温赋能电子制造 报名中!
直播时间:2025年2月28日(周五)上午10:00
直播主题:高精度测温赋能电子制造
小伙伴们儿快来报名直播吧~好礼等你拿!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表