找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 5131|回復: 19
收起左側

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

  [復制鏈接]
回帖獎勵 5 黑幣 回復本帖可獲得 5 黑幣獎勵! 每人限 1 次
ID:368428 發(fā)表于 2018-7-27 11:21 | 顯示全部樓層 |閱讀模式
#include "config.h"
unsigned char T0RH=0;  //T0重載值高字節(jié)
unsigned char T0RL=0;  //T0重載值低字節(jié)

/******************** IO配置函數(shù) **************************/
void GPIO_config(void)
{
P5M0 = 0;   //設置準雙向口
P5M1 = 0;
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;  //臨時變量
tmp = 11059200 / 12; //定時器計數(shù)頻率
tmp = (tmp * ms)/1000 ; //計算所需的計數(shù)值
tmp = 65536 - tmp; //計算定時器重載值
tmp = tmp + 33; //補償中斷響應延時造成的誤差
T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節(jié)
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);

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

剛接觸單片機,求大佬幫忙看看。非常感謝�。。。�



回復

使用道具 舉報

ID:308437 發(fā)表于 2018-7-27 17:30 | 顯示全部樓層
  P55 = ~ P55; //LED 取反:0-->1、1-->0
你既然配置了中斷,這個應該放到中斷服務函數(shù)內的。
還有,你檢查一下你硬件電路接好沒有
回復

使用道具 舉報

ID:123289 發(fā)表于 2018-7-27 18:08 | 顯示全部樓層
你再看看定時器的章節(jié)。
重點查一查:定時器需不需要不斷地重設置,在什么情況下需要重設置?
回復

使用道具 舉報

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

使用道具 舉報

ID:368428 發(fā)表于 2018-7-27 19:19 | 顯示全部樓層
yousunny 發(fā)表于 2018-7-27 17:30
P55 = ~ P55; //LED 取反:0-->1、1-->0
你既然配置了中斷,這個應該放到中斷服務函數(shù)內的。
還有,你 ...

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

回復

使用道具 舉報

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

使用道具 舉報

ID:233552 發(fā)表于 2018-7-27 22:00 | 顯示全部樓層
#include <STC15F2K60S2.H>

/******************** IO配置函數(shù) **************************/
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;                                //開啟全局中斷
}

/******************** 主函數(shù) **************************/
void main(void)
{
        GPIO_config();                //端口設置
        Timer0Init();                //10毫秒@11.0592MHz
        while(1)
        {
        }
}
//定時器0中斷函數(shù),每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
        }
       
}
回復

使用道具 舉報

ID:233552 發(fā)表于 2018-7-27 22:02 | 顯示全部樓層
你應該先把中斷學好
回復

使用道具 舉報

ID:380174 發(fā)表于 2018-7-28 13:11 | 顯示全部樓層
主函數(shù)里面的主循環(huán)取反有錯誤
回復

使用道具 舉報

ID:380174 發(fā)表于 2018-7-28 13:12 | 顯示全部樓層
P55 = ~ P55; //LED 取反:0-->1、1-->0
主循環(huán)喲錯誤
回復

使用道具 舉報

ID:379889 發(fā)表于 2018-7-28 13:45 | 顯示全部樓層
第一先看編譯有沒有錯,然后檢查頭文件路徑,查看大小寫或者字符錯誤,逐字檢查原理
回復

使用道具 舉報

ID:380193 發(fā)表于 2018-7-28 14:28 | 顯示全部樓層
你的configtimer0()函數(shù)幾個機器周期就執(zhí)行完了,所以你的p55 = ~p55;是一個機器周期執(zhí)行一次的,通常是1微秒,所以它一直是亮著的。你應該把p55 = ~p55; 放到中斷函數(shù)里面,并且在中斷函數(shù)內重新裝載初值(模式1)。
回復

使用道具 舉報

ID:380193 發(fā)表于 2018-7-28 14:28 | 顯示全部樓層

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

使用道具 舉報

ID:380546 發(fā)表于 2018-7-29 17:12 | 顯示全部樓層
while(1)
{
  P55 = ~ P55; //LED 取反:0-->1、1-->0
  ConfigTimer0(1000);
}
}看一下這個while的中斷設置
回復

使用道具 舉報

ID:368428 發(fā)表于 2018-7-30 16:47 | 顯示全部樓層
曉川55555 發(fā)表于 2018-7-27 22:00
#include

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

好的,非常感謝!
回復

使用道具 舉報

ID:368428 發(fā)表于 2018-7-30 16:48 | 顯示全部樓層
非常感謝大家!
回復

使用道具 舉報

ID:380969 發(fā)表于 2018-7-30 17:23 | 顯示全部樓層
取反寫錯了
回復

使用道具 舉報

ID:139945 發(fā)表于 2018-7-30 17:44 | 顯示全部樓層
中斷不會寫呀這是
回復

使用道具 舉報

ID:381033 發(fā)表于 2018-7-30 21:00 | 顯示全部樓層
p55 = ~p55; 把這句話寫到中斷里面就好
注意一點,定時器方式1需要手動裝載數(shù)值
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

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

快速回復 返回頂部 返回列表