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

版权声明:喝水不忘挖井人,转载请注明出处,[email protected]。 https://blog.csdn.net/qq_18842031/article/details/77508200

本篇博文最后修改时间:2017年08月23日 16:30。

一、简介

本文以79F8513A编程为例,介绍79F8513A定时器H0 1Hz的频率驱动LED。

二、实验平台

电脑平台:Windows7 64位旗舰

编译软件:PM+ V6.30

硬件平台:79F8513A

三、版权声明

博主:_懵懂

声明:此博客仅供参考不做任何商业用途,最终解释权归原博主所有。

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

懵懂之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;     
  }
}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翻转一次,实验成功。

猜你喜欢

转载自blog.csdn.net/qq_18842031/article/details/77508200
upd