手打代码05定时器2,一秒,LED2闪烁

该代码示例展示了如何在STC15单片机上利用定时器2的16位重装模式,以1秒钟的间隔控制LED2进行闪烁。通过设置中断服务程序,每1毫秒增加计数,当达到1000毫秒(1秒)时,切换LED的状态并清除标志位。
摘要由CSDN通过智能技术生成
//任务,用定时器2控制LED2闪烁,间隔1秒钟

//第一步,生成头文件,包含进来,stc15

#include <stc15.h>

//接口sbit LED=P1^0;

//宏定义
#define LED 4
#define ULN 5
#define COM 6
#define ABC 7

 //STCISP的范例程序中,找到stc15案例代码,然后找到里面的定时器2,16位重装模式的代码,复制过来的。
#define FOSC 11059200L
#define T1MS (65536-FOSC/1000)      //1T模式
typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;
//全局变量
u8 LEDbuf=0xFF;
u8 ULNbuf=0x00;
u32 cnttms=0;//开机,设置一个定时器,1ms就加一次,大概几十天后溢出
u16 cnt1s=0;
u8 flag1s=0;
//函数声明
void sel(u8 x);
void sys0();//关闭所有外部设备
//主函数
void main()
{
	//局部变量
	
	//外设初始化
	  sys0();
	//内部资源初始化
	//定时器2,1ms定时
	  AUXR |= 0x04;           //定时器2为1T模式
    T2L = T1MS;                     //初始化计时值
    T2H = T1MS >> 8;
    IE2 |= 0x04;                    //开定时器2中断
    EA = 1;
	
    AUXR |= 0x10;                   //定时器2开始计时 
	
	//大循环
	while(1)
	{
	   if(1==flag1s)
		 {
			  sel(LED);
				LEDbuf=LEDbuf ^0x02;//0000 0010
				P0=LEDbuf;
				sel(0);
			 
			  flag1s=0;//注意标记清0
		 }
	}

}
//函数定义
 //STCISP的范例程序中,找到stc15案例代码,然后找到里面的定时器2,16位重装模式的代码,复制过来的。

//-----------------------------------------------
//中断服务程序
void t2int() interrupt 12           //中断入口
{
   cnt1s++;
	if(cnt1s%1000==0)//是不是被1000整除,整秒成立,没余数,就等于0
	{
	  cnt1s=0;
		flag1s =1;
	}

}




void sel(u8 x)
{
	switch(x)
	{
		case 0:P2=P2&0x1F;break;
		case LED:P2=P2&0x1F |0x80;break;
		case ULN:P2=P2&0x1F |0xA0;break;
		case COM:P2=P2&0x1F |0xC0;break;
		case ABC:P2=P2&0x1F |0xE0;break;
	}
}
void sys0()//关闭所有外部设备
{
	sel(LED);
	LEDbuf=0xFF;
	P0=LEDbuf;
	sel(0);
	
	sel(ULN);
	ULNbuf=0x00;
	P0=ULNbuf;
	sel(0);
	
	sel(COM);
	P0=0x00;
	sel(0);
	
	sel(ABC);
	P0=0xFF;
	sel(0);
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值