找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2275|回复: 1
收起左侧

IAP15F2K60S2单片机定时器延时问题

 关闭 [复制链接]
ID:716794 发表于 2020-3-27 12:14 | 显示全部楼层 |阅读模式
本帖最后由 程鹏 于 2020-3-31 10:44 编辑

我原想通过按键来控制定时器的延时时间的,但是出现的情况是,按键绝大多数情况都是失灵的。无法控制定时器服务程序里的延时函数。

单片机源程序如下:
  1. //实验目标效果:用按键控制LED灯的闪烁频率。
  2. //实验实际效果:单片机上电后,LED会以1秒/次的频率闪烁;按下S5,频率为5秒/次,若此时再按下S4,LED灭很久,时间未知;在按下S5后按下S6,改变频率为30秒/次;在按下S6后按下S7,改变频率为60秒/次,若此时再按下S5,LED灭很久,时间未知(远大于所有设定时间)。可推测,在上电后,按键只能顺序按一次有用(即从S4→S7),若逆序按下,则LED灯会一直熄灭很久。
  3. #include <stc15f2k60s2.h>
  4. #include <absacc.h>
  5. #include <intrins.h>
  6. void button(void);//独立键盘函数。
  7. void led(void);//led函数。
  8. void Delayms(unsigned int ms);//软件延时函数,单位为微秒。
  9. void Timer0Init(void);//定时器0初始化函数。
  10. void T0_Ser(void);//定时器0中断服务函数。
  11. unsigned char time,lt;//LED亮灯间隔时间参数。
  12. unsigned int count=0;//定时器0中断服务程序计数参数,延长中断时间。
  13. int main(void)
  14. {
  15.         XBYTE[0xA000]=0;//初始化无关元器件。
  16.         EA=1;//开总中断。
  17.         Timer0Init();
  18.         while(1)
  19.         {
  20.                 button();
  21.         }
  22.         return 0;
  23. }
  24. void button(void)//独立键盘函数。
  25. {
  26.         unsigned char key;
  27.         P3=0x0f;
  28.         key=(P3&0x0f);
  29.         if(key!=0x0f)//第一次消抖开始。
  30.         {
  31.                 Delayms(5);
  32.                 key=(P3&0x0f);
  33.                 if(key!=0x0f)
  34.                 {
  35.                         key=(P3&0x0f);//第一次消抖结束。
  36.                         switch(key)
  37.                         {
  38.                                 case 0x07:time=1;break;//s4。
  39.                                 case 0x0b:time=2;break;//s5。
  40.                                 case 0x0d:time=3;break;//s6。
  41.                                 case 0x0e:time=4;break;//s7。
  42.                                 default:XBYTE[0x8000]=0;//判断键值是否正确。
  43.                         }
  44.                         while(key!=0x0f)//第二次消抖开始。
  45.                                 key=(P3&0x0f);//第二次消抖结束。
  46.                 }
  47.         }
  48.         switch(time)//根据按键给lt赋不同值,即让定时器延时不同的时间。
  49.         {
  50.                 case 1:lt=1;break;//LED闪烁频率为1秒(亮1秒、灭1秒)。
  51.                 case 2:lt=5;break;//LED闪烁频率为5秒(亮5秒、灭5秒)。
  52.                 case 3:lt=30;break;//LED闪烁频率为30秒(亮30秒、灭30秒)。
  53.                 case 4:lt=60;break;//LED闪烁频率为5秒(亮60秒、灭60秒)。
  54.         }
  55. }
  56. void Timer0Init(void)                //10毫秒@12.000MHz
  57. {
  58.         AUXR &= 0x7F;                //定时器时钟12T模式
  59.         TMOD &= 0xF0;                //设置定时器模式,16位自动重载。
  60.         TL0 = 0xF0;                //设置定时初值
  61.         TH0 = 0xD8;                //设置定时初值
  62.         TF0 = 0;                //清除TF0标志
  63.         TR0 = 1;                //定时器0开始计时
  64.         ET0=1;                        //开定时器0中断。
  65. }
  66. void T0_Ser(void) interrupt 1//定时器0中断服务函数。
  67. {
  68.         count++;
  69.         if(count<(100*lt))
  70.                 XBYTE[0x8000]=0;//LED亮。
  71.         else if(count>=(100*lt))
  72.                 XBYTE[0x8000]=0xff;//LED灭。
  73.         if (count==(200*lt))
  74.                 count=0;
  75.         
  76. }
  77. void Delayms(unsigned int ms)                //@12.000MHz
  78. {
  79.         unsigned char i, j;
  80.         while(ms)
  81.         {
  82.                 i = 12;
  83.                 j = 169;
  84.                 do
  85.                 {
  86.                         while (--j);
  87.                 } while (--i);
  88.                 ms--;
  89.         }
  90. }
复制代码



1.国信长天单片机竞赛平台V20原理图 - 副本.pdf

175.19 KB, 下载次数: 5

回复

使用道具 举报

ID:716794 发表于 2020-3-29 22:41 | 显示全部楼层
问题解决了,只需要更改中断服务函数就可以。
  1. if (count==(200*lt))
  2.                 count=0;
复制代码

将以上部分由“count==(200*lt)”改为“count>=(200*lt)”就可以了。
为什么要这么修改?我个人推测如下:
在按键函数中,消抖延时时间为5毫秒;而在定时器0中,产生一次中断的时间为10毫秒。当我把条件设置为“==”时,两者之间相差较小,容错率较低,会出现按键失灵的情况。反之,当条件为“>=”时,大大提高了容错率,就不会出现上述情况了。

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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