OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4265|回复: 7

C51的秒表程序,能暂停 但是暂停后不能开始,求前辈帮忙看一下啊

[复制链接]

5

主题

9

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-5-23
在线时间
8 小时
发表于 2016-5-23 17:16:44 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 mssjwb 于 2016-5-24 14:27 编辑

/*能暂停,但是暂停后不能开始了,请前辈帮看一下,万分感谢*/
#include<reg51.h>      
#include<intrins.h>
#define uint unsigned int                        // 宏定义
#define uchar unsigned char
#define dula P0        
#define wela P2
sbit k4 = P3^6;                                 //  位定义
sbit k5 = P3^7;
uint aa,qian,bai,shi,ge,temp;
bit stop = 1;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                           0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
void delay(uint z);                                    //子函数声明
void display(uint qian,uint bai,uint shi,uint ge);
void init();
void start_timer();
void stop_timer();

void main()                                          //主函数
{        
        init();                                 //初始化         
        while(1)                             
        {
                if(k4 == 0)               //判断是否按下K4  ,暂停和开始
                {
                        delay(10);        //消抖
                        if(k4 == 0)       //再次判断是否按下K4按键
                        {
                                while(k4 == 0);   //直到按键判断松开
                                {
                                        if(stop)
                                                start_timer();                  //打开定时器      
                                        else        
                                        stop_timer();                        //关闭定时器
                                        stop = ~ stop;                        
                                }
                        }
                }
                else        if(k5 == 0)     //按下K5清零
                {
                        delay(10);        //消抖
                        if(k5 == 0)        //再次判断是否按下K5按键
                        {
                                while(k5 == 0);
                                {        
                                        init();
                                        stop_timer();
                                        stop = 1;
                                        qian=0;
                                        bai=0;
                                        shi=0;
                                        ge=0;

                                }
                        }
                }
                if(aa==2)                          //数码管显示              
                {
                        aa=0;
                        temp++;
                        if(temp==9999)
                                {
                                temp=0;
                                }
                                qian=temp/1000%10;    //数码管千位
                                bai=temp/100%10;       //数码管百位
                                shi=temp/10%10;        //数码管十位
                                ge=temp%10;            //数码管个位
                        }
                display(qian,bai,shi,ge);
        }
}
        

void delay(uint z)                //延时子程序
        {
        uint x,y;
        for(x=z;x>0;x--)
                for(y=114;y>0;y--);
        }

        
void display(uint qian,uint bai,uint shi,uint ge)       //数码管显示子程序
{               
                dula=table[qian];
                wela=0x18;
                delay(1);
               
                dula=table1[bai];
                wela=0x28;
                delay(1);
               
                dula=table[shi];
                wela=0x48;
                delay(1);
               
                dula=table[ge];        
                wela=0x88;        
                delay(1);
}

void start_timer()         //开启定时器子程序                  
{
           ET0=1;                        
        EA=1;                        
        TR0=1;                        
}

void stop_timer()         //关闭定时器子程序
{
           ET0=0;                       
        EA=0;                        
        TR0=0;                        
}

void init()            //初始化子程序                                    
{               
                temp=0;
                TMOD = 0x01;
                TH0=(65536-4608)/256;
                TL0=(65536-4608)%256;

}
void timer0() interrupt 1       //定时器延时子程序                                 
{
                TH0=(65536-4608)/256;
                TL0=(65536-4608)%256;
                aa++;
}

最佳答案

查看完整内容[请看2#楼]

暂停、启动部分的程序没有问题,应该是6楼说的原因,实际是不能刷新显示了。 void timer0() interrupt 1 //定时器延时子程序 { TH0=(65536-4608)/256; TL0=(65536-4608)%256; aa++; } 其中的aa++应该修改为temp++,因为你需要显示的是temp。 uint aa,qian,bai,shi,ge,temp,temp1; temp1=0xff00; 把if(aa==2) 修改成: if (te ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

168

帖子

0

精华

高级会员

Rank: 4

积分
780
金钱
780
注册时间
2016-5-28
在线时间
64 小时
发表于 2016-5-23 17:16:45 | 显示全部楼层
暂停、启动部分的程序没有问题,应该是6楼说的原因,实际是不能刷新显示了。

void timer0() interrupt 1       //定时器延时子程序                                 
{
                TH0=(65536-4608)/256;
                TL0=(65536-4608)%256;
                aa++;
}
其中的aa++应该修改为temp++,因为你需要显示的是temp。
uint aa,qian,bai,shi,ge,temp,temp1;
temp1=0xff00;
把if(aa==2) 修改成:
if (temp!=temp1)
{
   temp1=temp;
   你原来程序中的显示程序拷贝到这里
}
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-4-27
在线时间
2 小时
发表于 2016-5-23 20:30:46 | 显示全部楼层
把else去掉试一下?
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3990
金钱
3990
注册时间
2015-11-14
在线时间
541 小时
发表于 2016-5-24 06:58:14 | 显示全部楼层
程序逻辑就不清晰
回复

使用道具 举报

5

主题

9

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-5-23
在线时间
8 小时
 楼主| 发表于 2016-5-24 14:27:06 | 显示全部楼层
Electronic 发表于 2016-5-24 06:58
程序逻辑就不清晰

刚学51不久,请教哪个地方需要改进的!
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
31
金钱
31
注册时间
2016-5-23
在线时间
2 小时
发表于 2016-5-25 09:09:40 | 显示全部楼层
有两个地方你看看:
while(k4 == 0);
while(k5 == 0);
后面加;号,实际是空的死循环,有可能卡死你的程序。
我初看了一下,给你参考。
回复

使用道具 举报

7

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2280
金钱
2280
注册时间
2013-12-16
在线时间
448 小时
发表于 2016-5-25 12:48:52 | 显示全部楼层
if(aa==2)                          //数码管显示
改成
if(aa>=2)                          //数码管显示
回复

使用道具 举报

5

主题

9

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-5-23
在线时间
8 小时
 楼主| 发表于 2016-7-26 17:58:06 | 显示全部楼层
mcudiy 发表于 2016-5-23 17:16
暂停、启动部分的程序没有问题,应该是6楼说的原因,实际是不能刷新显示了。

void timer0() interrupt 1 ...

谢谢,我确实是这样的!后面自己也想清楚了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 16:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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