打印

有时间的电工来帮我看看关于定时器的问题

[复制链接]
1958|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 狼迹天涯 于 2011-8-28 16:49 编辑

有时间的电工来帮我看看关于定时器的问题

主程序中的定义如下:
EA=1;                                
ET0=1;
ET1=1;
TMOD=0x11;

/*定时器0中断服务子程序,每50ms中断一次,20次即为一秒*/
void time0(void)  interrupt 1               
{   
    TR0=0;
    countor++;
    if(countor==20);
    {
        countor=0;
        timeval--;
    }
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    TR0=1;
}

/*定时器1中断服务子程序,每50ms中断一次,20次即为一秒,用于按键是否为连键的检测*/
void time1(void) interrupt 3               
{   
    kcountor++;                //kcountor,全局变量,记录定时器1的中断次数
    if(kcountor==20)
    {   
        ktime++;            //ktime,全局变量,记下按键按下持续的时间
        kcountor=0;
    }
}

/*键扫描程序*/
void keyscan(void)
{
    unsigned char i;
    P0=0xff;
    if((P0&0xff)!=0xff)
    {   
        if(qi==0)            //qi为P1口的位定义,便于得到键值,以下各括号内相同
            i=1;
        else if(reset==0)
            i=2;
        else if(shijian==0)
            i=3;
        else if(menu==0)
            i=4;
        else if(up==0)
            i=5;
        else if(down==0)
            i=6;
        else if(ok==0)
            i=7;     
        else
        ;                                
    }
    else                     //即没有键按下
    {
        i=0;                     
        TR1=0;
        kcountor=0;                 
        ktime=0;                 
        key=i;                //存储键值,便于和下次比较
        keyval=i;
    }
    if(i!=0)
    {
        if(i==key&ktime==0)        //和上次键值一样,定时一秒钟没到
        {
            keyval=0;        //一次按键处理
            TR1=1;            //启动计时,若已经启动,则继续计时
        }
        else if(i==key&ktime!=0)    //和上次键值一样,定时一秒钟已到
            keyval=i;        //作为连键处理
        else                 // 和上次键值不一样
        {
            TR1=0;            //停止计时
            kcountor=0;                 
            ktime=0;                 
            key=i;            //存储键值,便于和下次比较
            keyval=i;        //
        }
    }
    else
    ;            
}



下面有几个问题像各位大侠请教:
一、为什么我启动之后,就是开启定时器0的时候,时间走的特别快,每秒钟走了10个数字吧
二、我的键扫描电路是这样的:当检测到按键按下的时候,首先和上次的键值比较,若相同,则键值为0(一次按键处理),同时启动定时器1,当1s钟之后若键值仍然相同,则返回键值,作为连键处理。若键值和上次不同,则得到键值。
我的问题是,为什么我的按键一次检测及连键判断能够成功,因为我才发现我整个程序中根本就没有给定时器1赋值(这是我后来才发现的,是在用proteus仿真能得到结果的情况下),求解释
三、其它方面的问题,还望各位多提啊,这是我第一次独立的写程序,除了书本和网络只好向各位请教了!
先问这三个问题,在线等解释!我的程序差不多要完成了,就差了那么一点了,还望各位花些时间看看啊,小弟不胜感激!

相关帖子

沙发
狼迹天涯|  楼主 | 2011-8-28 18:11 | 只看该作者
看来各位电工们的生活都不错哦,这都星期天了,小弟还得再这调试程序!:'(

使用特权

评论回复
板凳
狼迹天涯|  楼主 | 2011-8-28 21:54 | 只看该作者
补充个问题,我用TLC1543采样电压值,程序采用的是这位仁兄的http://blog.21ic.com/user1/3047/archives/2009/62930.html#
可现在用proteus仿真的时候得到一个固定值,调节电位器不能改变,且proteus提示如下信息,不知是怎么回事!

捕获.JPG (39.25 KB )

捕获.JPG

使用特权

评论回复
地板
狼迹天涯|  楼主 | 2011-9-1 20:50 | 只看该作者
好吧!自己给自己解释了
一、在定时器0中断服务子程序中,if(countor==20);这句后面多加了个分号,导致每次响应中断时都会执行{
        countor=0;
        timeval--;
    }这句,所以理论上每秒钟timeval应减小20
二、定时器1没有赋初值,所以TH1及TL1的初值均为0(单片机上电复位时就是这样),故约65ms响应一次中断,置位TF1,TH1 TL1回0,在响应中断后清零TF1,继续定时中断。哈哈,这样以后连赋初值的步骤都省啦
三、目前正在看TLC1543的时序图,等程序编好且通过后再传上来

使用特权

评论回复
5
NE5532| | 2011-9-2 18:23 | 只看该作者
你说你回答的2个问题哪一个是真正的技术问题?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
狼迹天涯 + 1
6
狼迹天涯|  楼主 | 2011-9-3 08:33 | 只看该作者
5# NE5532
我刚入门,以前只是看书学习,很模糊,这次真的写程序了,确实发现了不少问题,也许都是些简单的语法问题吧,所以还请前辈们多多帮忙了!

使用特权

评论回复
7
virtualtryon| | 2011-9-3 10:43 | 只看该作者
本帖最后由 virtualtryon 于 2011-9-3 12:17 编辑

程序有点乱哦。
按键扫描根本不用中断,一般主程序在1ms内要跑完,10ms以上的任务在主程序中跑完全可以了。
如果不行,那程序架构绝对有问题了。
给你一下按键扫描程序,按键扫描周期一般在10ms左右,去抖时间<100ms。
U8 i, cdata;
        for(i = 0; i <  SWTICHNUM; i++)
        {
                cdata = 0;
                if(i == 0)
                {
                        if(IN(SW1_PORT))
                        {
                                cdata = cbitMask;
                        }
                }
                cdata = (cdata ^ bLevel);
                if(cdata & cbitMask)
                {
                        byCount ++;
                }
                else
                {
                        byCount = 0;
                }
                if(byCount >= DEBOUNCENUM)
                {
                        bLevel =  bLevel ^ cbitMask;
                        bTriger = bTriger | cbitMask;
                        byCount = 0;
                }
        }

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
狼迹天涯 + 1
8
NE5532| | 2011-9-3 11:11 | 只看该作者
所以只要细心就可以了,写程序的门槛很低的,可以说只要智商正常,都能写。

使用特权

评论回复
9
yuajun| | 2011-9-3 13:37 | 只看该作者
这是单片机的程序吗?怎么入门?

使用特权

评论回复
10
gogogobomb| | 2011-9-4 19:22 | 只看该作者
能发现分号问题,并且能明白自动赋值和软件赋值的新手,是个好新手。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
狼迹天涯 + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

102

帖子

0

粉丝