"); //-->
注意:本人刚学C18,不能保证程序没有错误!
#include <p18cxxx.h>
#pragma config WDT = OFF
void timer0(void);
#pragma code timer_interrupt = 0x08 //把GOTO指令放在高优先级中断向量处
void timer_interrupt(void)
{
_asm //通过汇编的GOTO指令跳转到中断服务程序
//C语言里的goto只在函数内部有效
goto timer0
_endasm
}
#pragma code //切换回普通代码段
volatile unsigned char counter = 0; //有可能中断函数和普通程序都要用的变量要
//用volatile声明,以使编译器不对其进行优化
#pragma interrupt timer0
void timer0(void)
{
INTCONbits.T0IF = 0; //清除T0中断标志,必须操作
TMR0H = 0x3c; //重置定时器初值,这里也是要先TMR0H再L
TMR0L = 0xb0;
counter++;
}
void main(void)
{
//INTCONbits.PEIE = 0;
//RCONbits.IPEN = 1;
INTCONbits.T0IF = 0; //与INTCONbits.TMR0IF = 0;等价,清除T0中断标志
T0CONbits.T08BIT = 0; //设定T0为16位模式
T0CONbits.T0CS = 0; //选择内部指令时钟为时钟源,也是定时器计数器选
//择位,0即为定时器
T0CONbits.PSA = 1; //选择不使用分频器
TMR0H = 0x3c; //设定T0的定时初值,这里因为外部时钟设定为
//4MHz,PIC单片机的机器周期为4个时钟周期,即
//1μs,定时器定时时间为(0xFFFF-0x3CB0+1)*1μs=
//50ms
TMR0L = 0xb0; //注意,必须先定义TMR0H,再定义TMR0L。
INTCONbits.T0IE = 1; //与INTCONbits.TMR0IE = 1;等价,打开定时器中断
INTCONbits.GIE = 1; //打开全局中断使能
T0CONbits.TMR0ON = 1; //打开T0
while(1);
}
结果:
定时器溢出产生中断3次后,运行时间为150.180000ms
关于需要先定义TMR0H再定义TMR0L:
TMR0H只是Timer0高字节的缓存,在写入TMR0L时才会写入。这样是能一次读取Timer0的所有位,防止在读取低字节时高字节有变化。
参考资料:MPLAB C18 C编译器用户指南,PIC18Fxx2数据手册
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
「硅通膨」世代到来! 台积电、NVIDIA供应链点亮AI惊奇秀
求ADS1.2的中文User Guide
180度E-Bike解决方案(基于78K0R MCU)
创新不止,创芯不已:第六届ICDIA创芯展8月南京盛大启幕!
HT49系列单片机蜂鸣器的使用 说明及源程序
精准触控+压感“芯”体验 汇顶发布全新Newton Touchpad压力触控板方案
实用简易电池自动充电器电路
智能家居解决方案
HT49系列PFD的使用说明 说明及源程序
Sandisk闪迪携全新CFexpress 4.0 Type B 存储卡及升级版闪迪至尊超极速™ SD UHS-II 存储卡系列亮相NAB 2026
马斯克“对线”魏哲家:对Terafab的可行性存在分歧
一个专注于嵌入式系统开发技术讨论的站点
库克正式官宣卸任苹果CEO
一个专注于嵌入式系统开发技术讨论的站点
78K0微波炉解决方案
全自动镍镉电池充电器电路
实用镍镉电池自动充电器电路
应用的RF4CE协议的射频遥控器系统
UALink 2.0发布:GPU网络标准新进展
ChinaEEC.com中国电子设备委员会出售!
华为麒麟9030S芯片首发
HT49系列Timebase的使用说明 说明及源程序
HT49控制93LC46读写 说明及源程序
AI驱动内存供应重配,电子制造业面临供应挑战
精确的12V电瓶自动充电机电路
一个专注于嵌入式系统开发技术讨论的站点
180度E-Bike解决方案(基于R8C MCU)
IDC:智能手机内存短缺将重创2026年出货量
安全自动镍镉电池充电器电路
HT49系列 IO 口的应用 说明及源程序