找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5420|回复: 17
收起左侧

为什么按下key1,定时器停止计时,数码管显示无变化,但按下key2,定时器不能重新...

[复制链接]
ID:77673 发表于 2015-4-21 22:31 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit smg1=P2^4;
sbit smg2=P2^5;
sbit smg3=P2^6;
sbit key1=P3^2;
sbit key2=P3^3;
uchar flag;
uchar table[3];
unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x10};
unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};

uchar s1num;
uchar count;
int miao;
//uchar miao;             注意miao的范围
//char miao;   定义一个有符号的字符变量
void display();

void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
        for(j=110;j>0;j--);

}
void timer0init()
{
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        ET0=1;
        EA=1;
        TR0=1;
        
}
void main()
{
//        uchar i;
        timer0init();
        while(1)
        {
                display();        
        }
}
/*中断函数所用时间必须要大于数码管延时显示时间,否则定时就不准确 */
void timer0() interrupt 1
{
        TH0=(65536-5000)/256;
        TL0=(65536-5000)%256;
        count++;
        if(count==10)        
        {
                count=0;
                miao++;
                if(key1==0)
                {
                        delayms(5);
                        if(key1==0)
                        {
                                delayms(5);
                                while(!key1);
                                TR0=0;
                        }
               
                }
                if(key2==0)
                {
                        delayms(5);
                        if(key2==0)
                        {
                                delayms(5);
                                while(!key2);
                                TR0=1;
                        }
                }                                
        }
        

}
void display()
{
        if(miao==1000)
                        miao=0;
                //        miao=miao%60;
        table[0]=miao%10;
        table[1]=miao/10%10;
        table[2]=miao/100;
        
        smg1=0;
        smg2=0;
        smg3=0;

        P1=smg_du[table[0]];
        delayms(2);
        smg2=0;
        smg1=1;
        P1=smg_du[table[1]];
        delayms(2);
        smg1=0;
        smg2=1;
        smg3=0;
        P1=smg_du[table[2]];
        delayms(2);
//        delayms(2);
}        

为什么按下key1,定时器停止计时,数码管显示无变化,但按下key2,定时器不能重新开始计数了?
回复

使用道具 举报

ID:74484 发表于 2015-4-21 23:31 | 显示全部楼层
不要在定时中断调用延时函数

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:74245 发表于 2015-4-22 08:12 | 显示全部楼层
问题点应该是这样的:key2要在中断函数里面才有反应,而你按下key1后,count=0,且定时器就停止工作了,count永远也无法等于10再进入中断去检测key2,所以key2没反应。
可以试下将按键检测的部分写在while(1)里面。

评分

参与人数 1威望 +5 黑币 +5 收起 理由
liuqin + 5 + 5 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:77673 发表于 2015-4-22 10:27 | 显示全部楼层
 发表于 2015-4-21 23:31
不要在定时中断调用延时函数

为什么不能在中断里用延时函数呢?会出现错误吗?

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:77673 发表于 2015-4-22 10:32 | 显示全部楼层
yesonjob 发表于 2015-4-22 08:12
问题点应该是这样的:key2要在中断函数里面才有反应,而你按下key1后,count=0,且定时器就停止工作了,coun ...

那如果把按键检测放到if(count==10)外面为什么也不能实现呢?
回复

使用道具 举报

ID:72643 发表于 2015-4-22 10:36 | 显示全部楼层
你按KEY1 TR0 = 0,定时器中断关闭了 按KEY2不会进定时器中断

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:74245 发表于 2015-4-22 10:40 | 显示全部楼层
她为我心 发表于 2015-4-22 10:32
那如果把按键检测放到if(count==10)外面为什么也不能实现呢?

把按键检测放到if(count==10)外面?
程序是怎样的,看看才知道。

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:77673 发表于 2015-4-22 11:08 | 显示全部楼层
yesonjob 发表于 2015-4-22 10:40
把按键检测放到if(count==10)外面?
程序是怎样的,看看才知道。

就像这样
void timer0() interrupt 1
{
        TH0=(65536-5000)/256;
        TL0=(65536-5000)%256;
        count++;
        if(count==10)        
        {
                count=0;
                miao++;
                  
        }
         if(key1==0)
                {
                        delayms(5);
                        if(key1==0)
                        {
                                delayms(5);
                                while(!key1);
                                TR0=0;
                        }
               
                }
                if(key2==0)
                {
                        delayms(5);
                        if(key2==0)
                        {
                                delayms(5);
                                while(!key2);
                                TR0=1;
                        }
                }                             

}
回复

使用道具 举报

ID:77673 发表于 2015-4-22 11:12 | 显示全部楼层
superjiangzhen 发表于 2015-4-22 10:36
你按KEY1 TR0 = 0,定时器中断关闭了 按KEY2不会进定时器中断

那如果用两个按键控制跑表的开始与停止,而且按键检测要放到定时中断函数里面,程序代码应该怎么写?谢谢大神了!
回复

使用道具 举报

ID:72643 发表于 2015-4-22 12:51 | 显示全部楼层
你把按键扫描程序放在main函数里吧 应该可以

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:77673 发表于 2015-4-22 13:07 | 显示全部楼层
superjiangzhen 发表于 2015-4-22 12:51
你把按键扫描程序放在main函数里吧 应该可以

放到主函数的确可以,但有没有什么办法把它放到中断函数,也可以实现?
回复

使用道具 举报

ID:74484 发表于 2015-4-22 13:26 | 显示全部楼层
她为我心 发表于 2015-4-22 11:12
那如果用两个按键控制跑表的开始与停止,而且按键检测要放到定时中断函数里面,程序代码应该怎么写?谢谢 ...

按照你的这个想法的话应该用外部中断0和1来控制时间运行和停止。在定时中断里面扫描按键是不合理的,所以会出错,会出现的错误上面已经有人解答了。
回复

使用道具 举报

ID:72643 发表于 2015-4-22 14:01 | 显示全部楼层
为什么非要放在中断里?我觉得没必要

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:77673 发表于 2015-4-22 15:31 | 显示全部楼层
 发表于 2015-4-22 13:26
按照你的这个想法的话应该用外部中断0和1来控制时间运行和停止。在定时中断里面扫描按键是不合理的,所以 ...

嗯嗯
回复

使用道具 举报

ID:77740 发表于 2015-4-22 17:54 | 显示全部楼层
同问。。
回复

使用道具 举报

ID:74245 发表于 2015-4-22 21:04 | 显示全部楼层
她为我心 发表于 2015-4-22 11:08
就像这样
void timer0() interrupt 1
{

单片机运作是跟着程序跑的,你要知道程序是怎么跑,写出来的程序才能达到预期效果。
现在分析下程序:定时器是0.5s产生一次中断是吧,然后进入中断函数里面执行了count++这个动作,然后迅速扫描有没有按键按下,假如没有就返回主函数,是吧?主函数里没有按键检测程序当然按键没反应啦,然后继续过0.5s进入中断,如此循环。
所以你这程序想要按键有反应,就必须是刚好中断发生的时候就刚好按下键(就在那史诗般的一瞬间)才能检测到,不然按键是没反应的。
这样说应该比较清晰了吧,当初我也是不懂程序怎么跑,才走了很多弯路。

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:69712 发表于 2015-4-22 22:54 | 显示全部楼层
因为在按key1后你把定时器关了,所以不管你怎么按key2,定时器都不会重新计数

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:77782 发表于 2015-4-23 16:53 | 显示全部楼层
同问我也不会
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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