• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

51单片机编写的数字时钟程序,总是无法走时,咋办?

hamazy 2015-12-12 浏览量:962
#include   //包含器件配置文件 
#define uchar unsigned char
#define uint unsigned int
char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0~9的数码管段码
uchar hour=0,min=0,sec=0;  //时,分,秒清零 
uchar deta=0;  //5ms计数单元清零
bit d_05s=0;  //0.5s标志
uchar set=0; //模式设定标志
uchar m=0;
uchar flag=0;  //RAM掉电标志
void delay(uint k);  //延时函数
void conv();  //走时单元转换
void disp();  //走时时间显示函数
sbit SB1=P2^4; //按键1引脚定义
sbit SB2=P2^5; //按键2引脚定义
sbit SB3=P2^6; //按键3引脚定义
sbit SB4=P2^7;
sbit SPK=P3^7;  //蜂鸣器引脚定义
sbit SET_2=P2^2;
sbit M_D=P0^7;
//定时器T0初始化
void init_timer()
{
TMOD=0x01;  //设置定时器T0工作模式为1
TH0=-(4800/256);  //高字节计数初值
TL0=-(4800%256);  //低字节计数初值
IE=0x82;  //启用定时器T0中断产生
TR0=1;    //启动定时器T0开始计时
}
//5ms定时中断
void T0_srv(void) interrupt 1
{
TH0=-(4800/256);  //重置定时器计时初始值
TL0=-(4800%256);
deta++;  //计数单元值递增
}
//时分秒单元及走时单元转换
void conv()
{
if(deta<=100)d_05s=0;
else d_05s=1;
if(deta>=200){sec++;deta=0;}
if(sec==60){min++;sec=0;}
if(min==60){hour++;min=0;}
if(hour==24){hour=0;}
}
void disp()
{
  P0=tab[hour/10];P2=0xf7;delay(2);
  P0=tab[hour%10];P2=0xfb;delay(2);
  if(d_05s==1){if(SET_2==0)M_D=0;else M_D=1;}
  delay(2);
  P0=tab[min/10];P2=0xfd;delay(2);
  P0=tab[min%10];P2=0xfe;delay(2);
}
void set_time()
{
uchar m;
//TR0=0;
if(SB2==0)delay(5);
if(SB2==0)hour++;
if(hour=24)hour=0;
for(m=0;m<30;m++)
{
disp();
if(SET_2==0)M_D=0;
else M_D=1;
delay(1);
}
if(SB3==0)delay(5);
if(SB3==0)min++;
if(min==60)min=0;
for(m=0;m<30;m++)
{
disp();
if(SET_2==0)M_D=0;
else M_D=1;
delay(1);
}
}
void time()
{
conv();
disp();
}
void scan_key()
{
delay(10);
if(SB1==0) set++;
if(set>=2) set=0;
if(set==1) flag=0x55;
F0:if(SB1==0) goto F0;
}
void delay(uint k)
{
uint i,j;
for(i=0;i for(j=0;j<121;j++)
{;}}
}
void fs_d()
{
unsigned int q,y;
{
for(y=0;y<1000;y++)
{
SPK=~SPK;
for(q=0;q<50;q++);
}
delay(200);
}
}
void main()
{
init_timer();
while(1)
{
if(SB1==0)
{
scan_key();
fs_d();
}
switch(set)
{
case 0:time();break;
case 1:set_time();break;
default:break;
}
if(flag!=0x55)
{
P0=0xc0;P2=0xc0;delay(200);
P2=0xff;delay(400);
}
}
}

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 大哥,你这仿真电路做的也太……太懒了点吧,单片机的最小系统都没搭建起来……不过问题应该不在与最小系统有没有搭建,首先我想说下,你的定时器初始化你确定没有问题?

    你在那本教科书上看到有这样写的?我记得要么是TH0=(65535-4800)/256,这样简写的话也就是:TH0=-4800/256,你这个括号就括的有点问题了吧?

    其次还有个点我没怎么看明白:

    红色圈内这个写法我真没看懂,要么就会一直死在这里!


    以上愚见,请高手指正!

    • 发布于 2015-12-12
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:7
  • 单片机没有启动,缺少最小系统的吧。
    • 发布于2015-12-12
    • 举报
    • 评论 0
    • 0
    • 0

  • 电路晶振都没接,怎么有时钟信号,怎么可能运转
    • 发布于2015-12-12
    • 举报
    • 评论 0
    • 0
    • 0

  • 最后那个是标号用法,用于goto语句,一般不推荐。不过这里就会变为死循环。



    • 发布于2015-12-14
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个肯定知道,我只是说他这个地方用这个跳转,我没明白什么意思,跳来跳去都在原地踏步
    • 发布于2015-12-15
    • 举报
    • 评论 0
    • 0
    • 0

  • 看起来象是等待按键释放,但是这样的防抖处理会有问题的。
    • 发布于2015-12-15
    • 举报
    • 评论 0
    • 0
    • 0

  • 晶振电路都没加。。。单片机都没工作。。。怎么可能走时
    • 发布于2015-12-16
    • 举报
    • 评论 0
    • 0
    • 0

  • 你可以考虑去proteus板块来试试!
    • 发布于2015-12-16
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

51单片机编写的数字时钟程序,总是无法走时,咋办?