找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3617|回复: 19
打印 上一主题 下一主题
收起左侧

有人可以帮我看一下吗,用定时器控制LED亮灭的一个小程序,但是LED一直亮着

  [复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:368428 发表于 2018-7-27 11:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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);
}
}

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



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:308437 发表于 2018-7-27 17:30 | 只看该作者
  P55 = ~ P55; //LED 取反:0-->1、1-->0
你既然配置了中断,这个应该放到中断服务函数内的。
还有,你检查一下你硬件电路接好没有
回复

使用道具 举报

板凳
ID:123289 发表于 2018-7-27 18:08 | 只看该作者
你再看看定时器的章节。
重点查一查:定时器需不需要不断地重设置,在什么情况下需要重设置?
回复

使用道具 举报

地板
ID:221865 发表于 2018-7-27 19:07 | 只看该作者
你的configtimer0()函数几个机器周期就执行完了,所以你的p55 = ~p55;是一个机器周期执行一次的,通常是1微秒,所以它一直是亮着的。你应该把p55 = ~p55; 放到中断函数里面,并且在中断函数内重新装载初值(模式1)。
回复

使用道具 举报

5#
ID:368428 发表于 2018-7-27 19:19 | 只看该作者
yousunny 发表于 2018-7-27 17:30
P55 = ~ P55; //LED 取反:0-->1、1-->0
你既然配置了中断,这个应该放到中断服务函数内的。
还有,你 ...

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

回复

使用道具 举报

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

使用道具 举报

7#
ID:233552 发表于 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
        }
       
}
回复

使用道具 举报

8#
ID:233552 发表于 2018-7-27 22:02 | 只看该作者
你应该先把中断学好
回复

使用道具 举报

9#
ID:380174 发表于 2018-7-28 13:11 | 只看该作者
主函数里面的主循环取反有错误
回复

使用道具 举报

10#
ID:380174 发表于 2018-7-28 13:12 | 只看该作者
P55 = ~ P55; //LED 取反:0-->1、1-->0
主循环哟错误
回复

使用道具 举报

11#
ID:379889 发表于 2018-7-28 13:45 | 只看该作者
第一先看编译有没有错,然后检查头文件路径,查看大小写或者字符错误,逐字检查原理
回复

使用道具 举报

12#
ID:380193 发表于 2018-7-28 14:28 | 只看该作者
你的configtimer0()函数几个机器周期就执行完了,所以你的p55 = ~p55;是一个机器周期执行一次的,通常是1微秒,所以它一直是亮着的。你应该把p55 = ~p55; 放到中断函数里面,并且在中断函数内重新装载初值(模式1)。
回复

使用道具 举报

13#
ID:380193 发表于 2018-7-28 14:28 | 只看该作者

你的configtimer0()函数几个机器周期就执行完了,所以你的p55 = ~p55;是一个机器周期执行一次的,通常是1微秒,所以它一直是亮着的。你应该把p55 = ~p55; 放到中断函数里面,并且在中断函数内重新装载初值(模式1)。
回复

使用道具 举报

14#
ID:380546 发表于 2018-7-29 17:12 | 只看该作者
while(1)
{
  P55 = ~ P55; //LED 取反:0-->1、1-->0
  ConfigTimer0(1000);
}
}看一下这个while的中断设置
回复

使用道具 举报

15#
ID:368428 发表于 2018-7-30 16:47 | 只看该作者
晓川55555 发表于 2018-7-27 22:00
#include

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

好的,非常感谢!
回复

使用道具 举报

16#
ID:368428 发表于 2018-7-30 16:48 | 只看该作者
非常感谢大家!
回复

使用道具 举报

17#
ID:380969 发表于 2018-7-30 17:23 | 只看该作者
取反写错了
回复

使用道具 举报

18#
ID:139945 发表于 2018-7-30 17:44 | 只看该作者
中断不会写呀这是
回复

使用道具 举报

19#
ID:381033 发表于 2018-7-30 21:00 | 只看该作者
p55 = ~p55; 把这句话写到中断里面就好
注意一点,定时器方式1需要手动装载数值
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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