|
本帖最后由 程鹏 于 2020-3-31 10:44 编辑
我原想通过按键来控制定时器的延时时间的,但是出现的情况是,按键绝大多数情况都是失灵的。无法控制定时器服务程序里的延时函数。
单片机源程序如下:
- //实验目标效果:用按键控制LED灯的闪烁频率。
- //实验实际效果:单片机上电后,LED会以1秒/次的频率闪烁;按下S5,频率为5秒/次,若此时再按下S4,LED灭很久,时间未知;在按下S5后按下S6,改变频率为30秒/次;在按下S6后按下S7,改变频率为60秒/次,若此时再按下S5,LED灭很久,时间未知(远大于所有设定时间)。可推测,在上电后,按键只能顺序按一次有用(即从S4→S7),若逆序按下,则LED灯会一直熄灭很久。
- #include <stc15f2k60s2.h>
- #include <absacc.h>
- #include <intrins.h>
- void button(void);//独立键盘函数。
- void led(void);//led函数。
- void Delayms(unsigned int ms);//软件延时函数,单位为微秒。
- void Timer0Init(void);//定时器0初始化函数。
- void T0_Ser(void);//定时器0中断服务函数。
- unsigned char time,lt;//LED亮灯间隔时间参数。
- unsigned int count=0;//定时器0中断服务程序计数参数,延长中断时间。
- int main(void)
- {
- XBYTE[0xA000]=0;//初始化无关元器件。
- EA=1;//开总中断。
- Timer0Init();
- while(1)
- {
- button();
- }
- return 0;
- }
- void button(void)//独立键盘函数。
- {
- unsigned char key;
- P3=0x0f;
- key=(P3&0x0f);
- if(key!=0x0f)//第一次消抖开始。
- {
- Delayms(5);
- key=(P3&0x0f);
- if(key!=0x0f)
- {
- key=(P3&0x0f);//第一次消抖结束。
- switch(key)
- {
- case 0x07:time=1;break;//s4。
- case 0x0b:time=2;break;//s5。
- case 0x0d:time=3;break;//s6。
- case 0x0e:time=4;break;//s7。
- default:XBYTE[0x8000]=0;//判断键值是否正确。
- }
- while(key!=0x0f)//第二次消抖开始。
- key=(P3&0x0f);//第二次消抖结束。
- }
- }
- switch(time)//根据按键给lt赋不同值,即让定时器延时不同的时间。
- {
- case 1:lt=1;break;//LED闪烁频率为1秒(亮1秒、灭1秒)。
- case 2:lt=5;break;//LED闪烁频率为5秒(亮5秒、灭5秒)。
- case 3:lt=30;break;//LED闪烁频率为30秒(亮30秒、灭30秒)。
- case 4:lt=60;break;//LED闪烁频率为5秒(亮60秒、灭60秒)。
- }
- }
- void Timer0Init(void) //10毫秒@12.000MHz
- {
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式,16位自动重载。
- TL0 = 0xF0; //设置定时初值
- TH0 = 0xD8; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0=1; //开定时器0中断。
- }
- void T0_Ser(void) interrupt 1//定时器0中断服务函数。
- {
- count++;
- if(count<(100*lt))
- XBYTE[0x8000]=0;//LED亮。
- else if(count>=(100*lt))
- XBYTE[0x8000]=0xff;//LED灭。
- if (count==(200*lt))
- count=0;
-
- }
- void Delayms(unsigned int ms) //@12.000MHz
- {
- unsigned char i, j;
- while(ms)
- {
- i = 12;
- j = 169;
- do
- {
- while (--j);
- } while (--i);
- ms--;
- }
- }
复制代码
|
|