//任务,用定时器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);
}
手打代码05定时器2,一秒,LED2闪烁
于 2023-03-02 11:30:31 首次发布
该代码示例展示了如何在STC15单片机上利用定时器2的16位重装模式,以1秒钟的间隔控制LED2进行闪烁。通过设置中断服务程序,每1毫秒增加计数,当达到1000毫秒(1秒)时,切换LED的状态并清除标志位。
摘要由CSDN通过智能技术生成