久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4967|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费久久久 | 国产美女黄色 | 日韩 欧美 综合 | 久久精品一区二区视频 | 99热在这里只有精品 | 六月色婷 | 午夜欧美一区二区三区在线播放 | 国产小视频在线 | 亚洲精品一区二区三区免 | 欧美亚洲高清 | 国产高潮av| 久久免费精品视频 | 亚洲欧美一区二区三区国产精品 | 久久国产精品久久久久久 | 国产精品久久久久久久久久久久 | 区一区二区三在线观看 | 久久久久国产一区二区三区四区 | 一区欧美 | 国产精品地址 | 国产精品一二三区 | 99福利视频 | www.99热.com| 国产精品嫩草影院精东 | 国产精品一区在线 | 成人在线观看免费 | 亚洲视频观看 | www视频在线观看 | 国产视频中文字幕 | 青青草免费在线视频 | 国产探花在线精品一区二区 | 国产资源在线播放 | 久久草在线视频 | 美女天天干 | 久久免费精品视频 | 日韩在线一区二区三区 | 亚洲精品丝袜日韩 | 久久久精品视频一区二区三区 | 在线精品一区 | 国产91久久久久蜜臀青青天草二 | 中文字幕精品一区 | 超碰97免费在线 |