找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 5068|回復(fù): 19
打印 上一主題 下一主題
收起左側(cè)

有人可以幫我看一下嗎,用定時(shí)器控制LED亮滅的一個(gè)小程序,但是LED一直亮著

  [復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 5 黑幣 回復(fù)本帖可獲得 5 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
ID:368428 發(fā)表于 2018-7-27 11:21 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include "config.h"
unsigned char T0RH=0;  //T0重載值高字節(jié)
unsigned char T0RL=0;  //T0重載值低字節(jié)

/******************** IO配置函數(shù) **************************/
void GPIO_config(void)
{
P5M0 = 0;   //設(shè)置準(zhǔn)雙向口
P5M1 = 0;
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;  //臨時(shí)變量
tmp = 11059200 / 12; //定時(shí)器計(jì)數(shù)頻率
tmp = (tmp * ms)/1000 ; //計(jì)算所需的計(jì)數(shù)值
tmp = 65536 - tmp; //計(jì)算定時(shí)器重載值
tmp = tmp + 33; //補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差
T0RH = (unsigned char)(tmp>>8); //定時(shí)器重載值拆分為高低字節(jié)
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零 T0 的控制位
TMOD |= 0x01; //配置 T0 為模式 1
TH0 = T0RH; //加載 T0 重載值
TL0 = T0RL;
ET0 = 1; //使能 T0 中斷
TR0 = 1; //啟動(dòng) T0
}
void ConfigTimer0(unsigned int ms);
void GPIO_config(void);

/******************** 主函數(shù) **************************/
void main()
{
//unsigned char cnt = 0; //定義一個(gè)計(jì)數(shù)變量,記錄 T0 溢出次數(shù)
GPIO_config();
//ConfigTimer0(1000);
while(1)
{
  P55 = ~ P55; //LED 取反:0-->1、1-->0
  ConfigTimer0(1000);
}
}

剛接觸單片機(jī),求大佬幫忙看看。非常感謝�。。�!



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:308437 發(fā)表于 2018-7-27 17:30 | 只看該作者
  P55 = ~ P55; //LED 取反:0-->1、1-->0
你既然配置了中斷,這個(gè)應(yīng)該放到中斷服務(wù)函數(shù)內(nèi)的。
還有,你檢查一下你硬件電路接好沒有
回復(fù)

使用道具 舉報(bào)

板凳
ID:123289 發(fā)表于 2018-7-27 18:08 | 只看該作者
你再看看定時(shí)器的章節(jié)。
重點(diǎn)查一查:定時(shí)器需不需要不斷地重設(shè)置,在什么情況下需要重設(shè)置?
回復(fù)

使用道具 舉報(bào)

地板
ID:221865 發(fā)表于 2018-7-27 19:07 | 只看該作者
你的configtimer0()函數(shù)幾個(gè)機(jī)器周期就執(zhí)行完了,所以你的p55 = ~p55;是一個(gè)機(jī)器周期執(zhí)行一次的,通常是1微秒,所以它一直是亮著的。你應(yīng)該把p55 = ~p55; 放到中斷函數(shù)里面,并且在中斷函數(shù)內(nèi)重新裝載初值(模式1)。
回復(fù)

使用道具 舉報(bào)

5#
ID:368428 發(fā)表于 2018-7-27 19:19 | 只看該作者
yousunny 發(fā)表于 2018-7-27 17:30
P55 = ~ P55; //LED 取反:0-->1、1-->0
你既然配置了中斷,這個(gè)應(yīng)該放到中斷服務(wù)函數(shù)內(nèi)的。
還有,你 ...

請(qǐng)問,修改后的代碼是什么樣的��?可以幫忙改一下嗎?
非常感謝�。�!

回復(fù)

使用道具 舉報(bào)

6#
ID:319344 發(fā)表于 2018-7-27 19:53 | 只看該作者
我說下現(xiàn)在你的程序會(huì)是什么工作過程吧,
首先,你配置了GPIO,
然后進(jìn)入死循環(huán)
在死循環(huán)中將P55取反,然后配置定時(shí)器0
之后定時(shí)器會(huì)開始計(jì)時(shí),計(jì)時(shí)到你設(shè)定值時(shí)會(huì)進(jìn)入中斷,但你什么都沒在中斷服務(wù)函數(shù)中寫,所以
除去保存中斷上下文,跳轉(zhuǎn)到中斷向量地址,跳轉(zhuǎn)到中斷服務(wù)函數(shù),將堆棧中保存的數(shù)據(jù)返回(總的來說就是中斷執(zhí)行過程),其它時(shí)間一直在執(zhí)行P55取反和配置定時(shí)器0,看不到燈閃爍是因?yàn)閱纹瑱C(jī)處理速度太快了,人眼跟不上,如果你會(huì)仿真的話,多運(yùn)行幾次,再中止,有1/2的概率看到燈是滅的
回復(fù)

使用道具 舉報(bào)

7#
ID:233552 發(fā)表于 2018-7-27 22:00 | 只看該作者
#include <STC15F2K60S2.H>

/******************** IO配置函數(shù) **************************/
void GPIO_config(void)
{
        P5M0 = 0;   //設(shè)置準(zhǔn)雙向口
        P5M1 = 0;
}
void Timer0Init(void)                //10毫秒@11.0592MHz
{
        AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TMOD |= 0x01;                //設(shè)置定時(shí)器模式
        TL0 = 0x00;                        //設(shè)置定時(shí)初值
        TH0 = 0xDC;                        //設(shè)置定時(shí)初值
        TF0 = 0;                        //清除TF0標(biāo)志
        TR0 = 1;                        //定時(shí)器0開始計(jì)時(shí)
       
        ET0 = 1;                         //使能 T0 中斷
        EA = 1;                                //開啟全局中斷
}

/******************** 主函數(shù) **************************/
void main(void)
{
        GPIO_config();                //端口設(shè)置
        Timer0Init();                //10毫秒@11.0592MHz
        while(1)
        {
        }
}
//定時(shí)器0中斷函數(shù),每10ms進(jìn)一次中斷
void tm0_isr(void) interrupt 1
{
    static int count=0;
       
        TL0 = 0x00;                        //設(shè)置定時(shí)初值
        TH0 = 0xDC;                        //設(shè)置定時(shí)初值
        TF0 = 0;                        //清除TF0標(biāo)志
       
        if(++count>=50)//每50周期燈翻轉(zhuǎn)一次,一個(gè)周期10ms
        {
                count = 0;
                P55 = ~ P55; //LED 取反:0-->1、1-->0
        }
       
}
回復(fù)

使用道具 舉報(bào)

8#
ID:233552 發(fā)表于 2018-7-27 22:02 | 只看該作者
你應(yīng)該先把中斷學(xué)好
回復(fù)

使用道具 舉報(bào)

9#
ID:380174 發(fā)表于 2018-7-28 13:11 | 只看該作者
主函數(shù)里面的主循環(huán)取反有錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

10#
ID:380174 發(fā)表于 2018-7-28 13:12 | 只看該作者
P55 = ~ P55; //LED 取反:0-->1、1-->0
主循環(huán)喲錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

11#
ID:379889 發(fā)表于 2018-7-28 13:45 | 只看該作者
第一先看編譯有沒有錯(cuò),然后檢查頭文件路徑,查看大小寫或者字符錯(cuò)誤,逐字檢查原理
回復(fù)

使用道具 舉報(bào)

12#
ID:380193 發(fā)表于 2018-7-28 14:28 | 只看該作者
你的configtimer0()函數(shù)幾個(gè)機(jī)器周期就執(zhí)行完了,所以你的p55 = ~p55;是一個(gè)機(jī)器周期執(zhí)行一次的,通常是1微秒,所以它一直是亮著的。你應(yīng)該把p55 = ~p55; 放到中斷函數(shù)里面,并且在中斷函數(shù)內(nèi)重新裝載初值(模式1)。
回復(fù)

使用道具 舉報(bào)

13#
ID:380193 發(fā)表于 2018-7-28 14:28 | 只看該作者

你的configtimer0()函數(shù)幾個(gè)機(jī)器周期就執(zhí)行完了,所以你的p55 = ~p55;是一個(gè)機(jī)器周期執(zhí)行一次的,通常是1微秒,所以它一直是亮著的。你應(yīng)該把p55 = ~p55; 放到中斷函數(shù)里面,并且在中斷函數(shù)內(nèi)重新裝載初值(模式1)。
回復(fù)

使用道具 舉報(bào)

14#
ID:380546 發(fā)表于 2018-7-29 17:12 | 只看該作者
while(1)
{
  P55 = ~ P55; //LED 取反:0-->1、1-->0
  ConfigTimer0(1000);
}
}看一下這個(gè)while的中斷設(shè)置
回復(fù)

使用道具 舉報(bào)

15#
ID:368428 發(fā)表于 2018-7-30 16:47 | 只看該作者
曉川55555 發(fā)表于 2018-7-27 22:00
#include

/******************** IO配置函數(shù) **************************/

好的,非常感謝!
回復(fù)

使用道具 舉報(bào)

16#
ID:368428 發(fā)表于 2018-7-30 16:48 | 只看該作者
非常感謝大家!
回復(fù)

使用道具 舉報(bào)

17#
ID:380969 發(fā)表于 2018-7-30 17:23 | 只看該作者
取反寫錯(cuò)了
回復(fù)

使用道具 舉報(bào)

18#
ID:139945 發(fā)表于 2018-7-30 17:44 | 只看該作者
中斷不會(huì)寫呀這是
回復(fù)

使用道具 舉報(bào)

19#
ID:381033 發(fā)表于 2018-7-30 21:00 | 只看該作者
p55 = ~p55; 把這句話寫到中斷里面就好
注意一點(diǎn),定時(shí)器方式1需要手動(dòng)裝載數(shù)值
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表