/*----------
单片机中断定时小程序----------*/
/*----------2014-05-07--------------------*/
/*----------STC12C5A16S2------------------*/
#include <intrins.h>
#include <STC12C5A.h>
/*---------------端口定义----------------*/
sbit TEST_OUT0 = P0^5;
sbit TEST_OUT1 = P0^4;
sbit TEST_OUT2 = P0^3; //可以根据需要增加更多的端口
sbit SW = P3^2;
/*---------------常量定义----------------*/
#define FOSC 29491200L //这个数值取决于所选用的晶振频率
#define MODE1T //定时器时钟模式1 声明则是12T模式,不声明是1T模式
#ifdef MODE1T
#define T1MS (65536-FOSC/500000)//1T模式中10us定时器计数量
#else
#define T1MS (65536-FOSC/12/500000)//12T模式中10us定时器计数量
#endif
/*---------------变量定义---------------*/
int count = 100000;
int n = 0;
/*---------------延时函数---------------*/
sta
tic void Delay(unsigned int s)
{
unsigned int i;
for(i=0;i<s;i++);
for(i=0;i<s;i++);
}
/*---------------中断0------------------*/
void exint0() interrupt 0
{
ET0 = 1; //开启定时器0中断
Delay(500); //做延时
if(SW == 0)
{
SW = 1;
TEST_OUT0 = !TEST_OUT0; //灯亮
//TEST_OUT1 = !TEST_OUT1;
n = 0; //计数值重设为0
}
}
/*---------------Timer0中断-------------*/
void tm0_isr()interrupt 1 using 1
{
TL0 = T1MS;
TH0 = T1MS>>8;
if(count-- == 0)
{
TEST_OUT0 = !TEST_OUT0; //这里只写了一个端口的操作,根据需要可以自行增加
//TEST_OUT1 = !TEST_OUT1;
count = 100000;
}
n++;
while(n == 60) //是否满一分钟
{
n = 0;
TEST_OUT0 = 0; //灯灭
//TEST_OUT1 = 0;
TR0 = 0; //定时器0停止运行
ET0 = 0; //关闭定时器0中断
}
}
//---------------------------------
/*------------------主函数---------------------*/
void main()
{
//TEST_OUT1 = 1;
#ifdef MODE1T
AUXR = 0x80; //定时器0工作在1T模式
#endif
TMOD = 0x01; //设置定时器0为模式1(16bit)
TL0 = T1MS; //初始化定时器0低位
TH0 = T1MS>>8; //初始化定时器0高位
TR0 = 1; //定时器0开始运行
EA = 1; //开启全局中断开关
while(1); //循环
}
拜托了
一周热门 更多>