中断服务程序模板

通常定时器初始化过程如下:

①对 TMOD赋值,以确定TO和T1的工作方式。
②计算初值,并将初值写入THO、TLO或TH1、TL1。
③中断方式时,则对IE赋值,开放中断。
④使TRO或TR1置位,启动定时器/计数器定时或计数。

代码

利用定时器0工作方式1,在实验板上实现第一个发光管以1s亮灭闪烁。程序代码如下:

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
uchar num;
void main()
{
	TMOD=0x01;//设置定时器0为工作方式1
	TH0=(65536-45872)/256;//装初值11.0592M晶振定时50ms 数为45872
	TL0=(65536-45872)%256;//
	EA=1;//打开总中断
	ET0=1;//打开定时器0
	TR0=1;//启动定时器0
	while(1);//程序停止在这里等待中断发生

}
void T0_time() interrupt 1
{
	TH0=(65536-45872)/256;//重装初值
	TL0=(65536-45872)%256;
	num++;//num每加一次判断是否到20次
	if(num==20)
	{
		num=0;
		led1=~led1;//让发光管状态取反
	
	}

}

在这里插入图片描述
在实验板上完成如下功能:用定时器0的方式1实现第一个发光管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时。程序代码如下:

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
//申明U1锁存器的锁存端
sbit wela=P2^7;
//申明U2锁存器的锁存端
sbit led1=P1^0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,Ox66,0x6d,0x7d,0x07,0x7f,Ox6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delayms(uint);
void display(uchar,uchar);
uchar num,num1,num2,shi,ge;
void main()
{

		TMOD=0x11;
		//设置定时器0和1为工作方式1(0001 0001)
		THO=(65536-45872)/256;//装初值
		TLO=(65536-45872)%256;
		TH1=(65536-45872)/256;//装初值
		TL1=(65536-45872)%256;
		EA=1;//开总中断
		ETO=1;//开定时器0中断
		ET1=1;//开定时器1中断
		TRO=1;/启动定时器0
		TR1=1;//启动定时器1
		while(1)//程序在这里不停的对数码管动态扫描同时等待中断发生
			{
				display(shi,ge);
			}
}
void display(uchar shi,uchar ge)//显示子函数
{
		dula=1;
		PO=table[shi];//送段选数据
		dula=0;
		PO=Oxff;//送位选数据前关闭所有显示,防止打开位选锁存时
		wela=1;//原来段选数据通过位选锁存器造成混乱
		PO=Oxfe;//送位选数据
		wela=O;
		delayms(5);//延时
	
		dula=1;
		PO=table[ge];
		dula=O;
		PO=Oxff;
		wela=1;
		PO=Oxfd;
		wela=0;
		delayms(5);
}
void delayms(uint xms)
{
		uint i,j;
		for(i=xms;i>0;i--)
		for(j=110;j>0;j--);
}

void TO_time() interrupt 1
{
		THO=(65536-45872)/256;
		TLO=(65536-45872)%256;
		num1++;
		if(num1==4)
			{
					num1=O;
					led1=~led1;
			}
}

void T1_time() interrupt 3
{
		TH1=(65536-45872)/256;
		TL1=(65536-45872)%256;
		num2++;
		if(num2==20)
			{
					num2=O;
					num++;
					if(num==60)
					num=O;
					shi=num/10;
					ge=num%10;
			}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力努力再努力@李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值