/*****************************
单片机型号STC15W401AS(1T)
使用芯片内部振荡器11.0592MHz
使用芯片内部加电复位功能
使用P3.2 INT0双向中断功能
随意使用其他端口做输出
只通过编译,未经仿真验证
*****************************/
#include "" //STC15系列通用头文件
sbit INT0 = P3^2; //外部中断端口
sbit LED1 = P1^0; //输出端口
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P5^4;
sbit LED8 = P5^5;
void Timer0Init(); //初始化定时器0声明
unsigned int Counter=0; //定时中断计数器
bit FLAG=0; //中断标志 1:上升沿中断 0:下降沿中断
/******************************
主程序
******************************/
void main()
{
Timer0Init(); //初始化定时器0
LED1 = 0; //初始化输出端口
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;
LED8 = 0;
INT0 = 1; //初始化INT0中断端口
IT0 = 0; //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX0 = 1; //开INT0中断
ET0 = 1; //开定时器0中断
EA = 1; //开总中断
while (1)
{
if(FLAG==1) //如果中断标志为1
{
if(Counter<=200)
LED2 = 1;
if(Counter<=400)
LED3 = 1;
if(Counter<=800)
LED4 = 1;
if(Counter<=1000)
LED5 = 1;
if(Counter<=1200)
LED6 = 1;
if(Counter<=1400)
LED7 = 1;
if(Counter<=1600)
LED8 = 1;
}
}
}
/*****************************************
定时器初始化,时钟12T、16位自动重载模式
*****************************************/
void Timer0Init() //200微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x5C; //设置定时初值
TH0 = 0xF7; //设置定时初值
// TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
}
/*-------------------------------
定时器0中断服务程序
-------------------------------*/
void timer0() interrupt 1
{
if(Counter<65535)
Counter++;
}
/*-------------------------------
外部中断服务程序
-------------------------------*/
void exint0() interrupt 0 //INT0中断入口
{
INT0 = !INT0; //将测试口取反
FLAG = INT0; //保存INT0口的状态, INT0=0(下降沿); INT0=1(上升沿)
if(FLAG==1)
{
LED1 = 1; //第一输出与测试口同步
TR0 = 1; //开定时器0
}
else
{
TR0 = 0; //关闭定时器0
Counter = 0; //定时中断计数器清0
LED1 = 0; //输出端口全清0
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;
LED8 = 0;
}
}