版权声明:喝水不忘挖井人,转载请注明出处,[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翻转一次,实验成功。