time-int.txt

来自「该程序利用了定时器1的周期中断功能」· 文本 代码 · 共 72 行

TXT
72
字号
// 该程序利用了定时器1的周期中断功能,每1ms产生一次中断
#include	"register.h"
//  屏蔽中断程序        
void inline disable() 
{
	asm(" setc INTM");
}
// 开总中断程序
void inline enable()
{
	asm(" clrc INTM"); 
}
// 系统初始化子程序
initial()
{
	asm(" setc	SXM");				// 符号位扩展有效
	asm(" clrc	OVM");				// 累加器中结果正常溢出
	asm(" clrc	CNF");				// B0被配置为数据存储空间
	SCSR1=0x81FE;				// CLKIN=6M,CLKOUT=4CLKIN=24M
	WDCR=0x0E8;				// 不使能看门狗,因为SCSR2中的WDOVERRIDE
		     					// 即WD?の桓次缓蟮娜笔≈滴?,故可以用
		     					// 软件禁止看门狗
	IMR=0x0002;					// 允许INT2中断
	IFR=0x0FFFF;				// 清除全部中断标志,"写1清0"
	WSGR=0X00;					// 禁止所有的等待状态
}
// 定时器1的初始化子程序
int  timer1int()
{
	EVAIMRA=EVAIMRA|0X0080;	// 允许定时器1的周期中断
	EVAIFRA=EVAIFRA&0X0080;	// 清除定时器1周期中断标志
	T1CON=0X160C;				// Timer1为连续增计数模式,预分频值为64,使用内部时钟
	T1PR=0X0177;				// Timer1的周期寄存器的值根据1ms延时和预分频值确定
	T1CNT=0X00;				// Timer1的计数器清零
}
// 定时器1周期中断服务程序
void interrupt T1INT()
{
	int flag;						// 定义一个局部变量
	flag=EVAIFRA&0X0080;
	if(flag!=0x0080)
	{
		enable( );					// 允许总中断
		return;					// 如果不是定时器1周期中断,则直接返回
	}
// 如果是定时器1周期中断定时器1的周期中断,则执行下面的程序
	T1CNT=0X00;				// 定时器1的计数器重新赋0
	EVAIFRA=EVAIFRA&0X0080;	// 清除定时器1周期中断标志,否则以后的中断将被忽略
	enable( );						// 允许总中断,因一进中断服务程序后总中断就自动关闭了
	return;						// 中断返回
}
// 其它优先级的中断服务程序,虽然程序中已经禁止,
// 但可能由于干扰会引起他们的执行,故该中断服务程序无额外操作,直接返回
void	interrupt nothing()
{
	enable( );						// 允许总中断,因一进中断服务程序后总中断就自动关闭了
	return;						// 中断返回
}
// 主程序
main()
{
	disable();						// 初始化时禁止中断
	initial();						// 系统初始化
 	timer1int();					// 定时器1的初始化	
	enable();						// 允许总中断
	T1CON=T1CON|0X0040;		// 启动Timer1
while(1)
{
		;						// 等待中断发生
}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?