标题: 有人可以帮我看一下吗,用定时器控制LED亮灭的一个小程序,但是LED一直亮着 [打印本页]

作者: Liruonn    时间: 2018-7-27 11:21
标题: 有人可以帮我看一下吗,用定时器控制LED亮灭的一个小程序,但是LED一直亮着
#include "config.h"
unsigned char T0RH=0;  //T0重载值高字节
unsigned char T0RL=0;  //T0重载值低字节

/******************** IO配置函数 **************************/
void GPIO_config(void)
{
P5M0 = 0;   //设置准双向口
P5M1 = 0;
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;  //临时变量
tmp = 11059200 / 12; //定时器计数频率
tmp = (tmp * ms)/1000 ; //计算所需的计数值
tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp + 33; //补偿中断响应延时造成的误差
T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零 T0 的控制位
TMOD |= 0x01; //配置 T0 为模式 1
TH0 = T0RH; //加载 T0 重载值
TL0 = T0RL;
ET0 = 1; //使能 T0 中断
TR0 = 1; //启动 T0
}
void ConfigTimer0(unsigned int ms);
void GPIO_config(void);

/******************** 主函数 **************************/
void main()
{
//unsigned char cnt = 0; //定义一个计数变量,记录 T0 溢出次数
GPIO_config();
//ConfigTimer0(1000);
while(1)
{
  P55 = ~ P55; //LED 取反:0-->1、1-->0
  ConfigTimer0(1000);
}
}

刚接触单片机,求大佬帮忙看看。非常感谢!!!!




作者: yousunny    时间: 2018-7-27 17:30
  P55 = ~ P55; //LED 取反:0-->1、1-->0
你既然配置了中断,这个应该放到中断服务函数内的。
还有,你检查一下你硬件电路接好没有
作者: yzwzfyz    时间: 2018-7-27 18:08
你再看看定时器的章节。
重点查一查:定时器需不需要不断地重设置,在什么情况下需要重设置?
作者: 多德    时间: 2018-7-27 19:07
你的configtimer0()函数几个机器周期就执行完了,所以你的p55 = ~p55;是一个机器周期执行一次的,通常是1微秒,所以它一直是亮着的。你应该把p55 = ~p55; 放到中断函数里面,并且在中断函数内重新装载初值(模式1)。
作者: Liruonn    时间: 2018-7-27 19:19
yousunny 发表于 2018-7-27 17:30
P55 = ~ P55; //LED 取反:0-->1、1-->0
你既然配置了中断,这个应该放到中断服务函数内的。
还有,你 ...

请问,修改后的代码是什么样的啊?可以帮忙改一下吗?
非常感谢!!!


作者: wenzedong    时间: 2018-7-27 19:53
我说下现在你的程序会是什么工作过程吧,
首先,你配置了GPIO,
然后进入死循环
在死循环中将P55取反,然后配置定时器0
之后定时器会开始计时,计时到你设定值时会进入中断,但你什么都没在中断服务函数中写,所以
除去保存中断上下文,跳转到中断向量地址,跳转到中断服务函数,将堆栈中保存的数据返回(总的来说就是中断执行过程),其它时间一直在执行P55取反和配置定时器0,看不到灯闪烁是因为单片机处理速度太快了,人眼跟不上,如果你会仿真的话,多运行几次,再中止,有1/2的概率看到灯是灭的
作者: 晓川55555    时间: 2018-7-27 22:00
#include <STC15F2K60S2.H>

/******************** IO配置函数 **************************/
void GPIO_config(void)
{
        P5M0 = 0;   //设置准双向口
        P5M1 = 0;
}
void Timer0Init(void)                //10毫秒@11.0592MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x01;                //设置定时器模式
        TL0 = 0x00;                        //设置定时初值
        TH0 = 0xDC;                        //设置定时初值
        TF0 = 0;                        //清除TF0标志
        TR0 = 1;                        //定时器0开始计时
       
        ET0 = 1;                         //使能 T0 中断
        EA = 1;                                //开启全局中断
}

/******************** 主函数 **************************/
void main(void)
{
        GPIO_config();                //端口设置
        Timer0Init();                //10毫秒@11.0592MHz
        while(1)
        {
        }
}
//定时器0中断函数,每10ms进一次中断
void tm0_isr(void) interrupt 1
{
    static int count=0;
       
        TL0 = 0x00;                        //设置定时初值
        TH0 = 0xDC;                        //设置定时初值
        TF0 = 0;                        //清除TF0标志
       
        if(++count>=50)//每50周期灯翻转一次,一个周期10ms
        {
                count = 0;
                P55 = ~ P55; //LED 取反:0-->1、1-->0
        }
       
}

作者: 晓川55555    时间: 2018-7-27 22:02
你应该先把中断学好
作者: 不需要知道我谁    时间: 2018-7-28 13:11
主函数里面的主循环取反有错误
作者: 不需要知道我谁    时间: 2018-7-28 13:12
P55 = ~ P55; //LED 取反:0-->1、1-->0
主循环哟错误
作者: ZYNG    时间: 2018-7-28 13:45
第一先看编译有没有错,然后检查头文件路径,查看大小写或者字符错误,逐字检查原理
作者: lixianzhuzhu    时间: 2018-7-28 14:28
你的configtimer0()函数几个机器周期就执行完了,所以你的p55 = ~p55;是一个机器周期执行一次的,通常是1微秒,所以它一直是亮着的。你应该把p55 = ~p55; 放到中断函数里面,并且在中断函数内重新装载初值(模式1)。
作者: lixianzhuzhu    时间: 2018-7-28 14:28

你的configtimer0()函数几个机器周期就执行完了,所以你的p55 = ~p55;是一个机器周期执行一次的,通常是1微秒,所以它一直是亮着的。你应该把p55 = ~p55; 放到中断函数里面,并且在中断函数内重新装载初值(模式1)。
作者: brotherzilong    时间: 2018-7-29 17:12
while(1)
{
  P55 = ~ P55; //LED 取反:0-->1、1-->0
  ConfigTimer0(1000);
}
}看一下这个while的中断设置
作者: Liruonn    时间: 2018-7-30 16:47
晓川55555 发表于 2018-7-27 22:00
#include

/******************** IO配置函数 **************************/

好的,非常感谢!
作者: Liruonn    时间: 2018-7-30 16:48
非常感谢大家!
作者: xsk    时间: 2018-7-30 17:23
取反写错了
作者: 造梦Sir    时间: 2018-7-30 17:44
中断不会写呀这是
作者: Jory_Ho    时间: 2018-7-30 21:00
p55 = ~p55; 把这句话写到中断里面就好
注意一点,定时器方式1需要手动装载数值




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1