upD79F8513A(NEC)或upD78F0511A(NEC)之定時器H0




本篇博文最後修改時間:2017年08月23日 16:30。




一、簡介

本文以79F8513A編程爲例,介紹79F8513A定時器H0 1Hz的頻率驅動LED。


二、實驗平臺

電腦平臺:Windows7 64位旗艦

編譯軟件:PM+ V6.30

硬件平臺:79F8513A



三、版權聲明

博主:_懵懂

聲明:此博客僅供參考不做任何商業用途,最終解釋權歸原博主所有。

原文地址:http://blog.csdn.NET/qq_18842031

QQ:951795235

E-mail [email protected]

懵懂之MCU交流羣:136384801




四、實驗前提

1、在進行本文步驟前,請先安裝PM+ V6.30版本;準備好79F8513A硬件平臺。

         

五、基礎知識

暫無


六、源碼地址

暫無


七、關聯文章

鏈接:暫無



八、實驗內容

1.系統時鐘初始化爲外部8M

參考http://blog.csdn.net/qq_18842031/article/details/77984026


2.初始化輸出引腳
    PM3 &= ~0x01;  //OutPut:P3.0 
    PU3 = 0x00; 



3.初始化定時器H0

void Init_TMH0(void)   // 設置H0 爲間隔 0.1ms 的定時器
{
    TMIFH0 = 0;              //清中斷標誌
    TMMKH0 = 1;              //禁止中斷服務	
        
    TMHMD0 = 0x20;           // 設置時鐘爲 Fx/4   8MH/4=2MH     0.5us 
    CMP00  = 199;            // 0.5*200=100us 
    TMMKH0 = 0;              //允許中斷服務
    TMIFH0 = 0;              //清中斷標誌    	
    TMHE0  = 1;              //使能計時
}



4.編寫主函數

/*********************************************************************
*                            pragma
**********************************************************************/
#pragma   SFR       /*程序中可以直接使用數據手冊上描述的特殊寄存器名*/
#pragma   DI        /*關全局中斷*/
#pragma   EI        /*開全局中斷*/
#pragma   NOP       /*允許嵌入NOP指令*/
#pragma   ASM       /*允許嵌入彙編指令*/
#pragma   STOP      /*允許嵌入STOP指令*/
#pragma   HALT      /*允許嵌入HALT指令*/

#pragma   interrupt INT_TMH0     

//#include<>   /*這裏包含文件*/

__interrupt void    INT_TMH0(void);    //這句放在main函數前面
#define W5NOP         NOP();NOP();NOP();NOP();NOP()      /*5個空指令*/
void main(void)
{
  DI();
  NOP();
/*嵌入彙編是清空內存*/
/*
注意事項:
1. #asm  #endasm __asm 只能小寫
2. 彙編程序段中的標號必須以"?L"開頭
3. 調用C程序中的子程序,必須在子程序名前增加 "_" ;CALL    !_CPU_init
*/
#asm
;清RAM
  MOVW    HL ,#0FB00H
?LRAM_CLEAR:
  MOV     A,   #0
  MOV     [HL],A
  INCW    HL
  MOVW    AX,HL
  CMPW    AX,#0FEDFH
  BC      $?LRAM_CLEAR
#endasm
/*嵌入彙編*/
    __asm(" MOV A,#0 ");   
  EI(); 
  Init_OST();   //初始化時鐘
  Init_TMH0();	//初始化定時器
  while(1)
  {
    WDTE = 0xAC;     
  }
}



5、編寫中斷服務函數

__interrupt void INT_TMH0(void)
{
    static uint16 i;
    WDTE = 0xAC;

//    TMIFH0 = 0;              //清中斷標誌   
      ++i; 	
      if(i == 10000)
      {
	 static uint8 k;
	 i = 0;
	 k = ~k;
	 P3.0 = k;
       }
}


6、結果

每1000msLED翻轉一次,實驗成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章