本帖最后由 狼迹天涯 于 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仿真能得到结果的情况下),求解释
三、其它方面的问题,还望各位多提啊,这是我第一次独立的写程序,除了书本和网络只好向各位请教了!
先问这三个问题,在线等解释!我的程序差不多要完成了,就差了那么一点了,还望各位花些时间看看啊,小弟不胜感激! |