|
|
楼主 |
发表于 2026-7-25 09:40:50
|
显示全部楼层
第七集定时器中断
#include "AI8051U.h"
#include "stc32_stc8_usb.h"
#include "intrins.h" //调用头文件
#define u8 unsigned char
#define u16 unsigned int
u8 state = 0; //初始状态
u8 Run_state=0; //运行状态
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay20ms(void)
{
unsigned long edata i;
_nop_();
_nop_();
i=119998UL;
while(i) i--;
}
void Timer0_Init(void); //3秒@24.000MHz //函数声明
void main(void)
{
int count=1; //按键计数
WTST = 0;
EAXFR=1;
CKCON=0;
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
usb_init();
IE2 |= 0x80;
// Timer0_Init(); //定时器初始化
EA = 1;
P40=0;
while (DeviceState != DEVSTATE_CONFIGURED);
while(1)
{
if (bUsbOutReady) //如果接收到一个数据
{
usb_OUT_done();
}
//任务1:按键按下次数
// if(P32 == 0) //判断P32是否按下
// {
// Delay20ms();
// if(P32==0)
// {
//
// printf("按键按下次数\xfd:%d 次\r\n",(int)count); // "\xfd"特数字加上就会显示
// count++;
// while(P32 == 0); //等待P32松开
// }
// }
//任务2:灯按一下点亮三秒熄灭
// if(P32 == 0) //判断P32是否按下
// {
// Delay20ms();
// if(P32==0)
// {
//
// //printf("按键按下次数\xfd:%d 次\r\n",(int)count); // "\xfd"特数字加上就会显示
// //count++;
// P00=0;
// Timer0_Init();
//
// while(P32 == 0); //等待P32松开
// }
// }
//任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁 (LED1表示红LED2表示蓝)再按下按钮红蓝停止
if(P32 == 0) //判断P32是否按下
{
Delay20ms();
if(P32==0)
{
Run_state=!Run_state; //运行状态取反
if (Run_state==1) //运行
{
Timer0_Init();
}
else
{
TR0 = 0; //关闭定时器
P00 =1;
P01 = 1;
}
// P00=0;
// Timer0_Init();
while(P32 == 0); //等待P32松开
}
}
}
}
// void Timer0_Init(void) //3秒@24.000MHz //函数定义
//{
//
// TM0PS = 0x63; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
// AUXR &= 0x7F; //定时器时钟12T模式
// TMOD &= 0xF0; //设置定时器模式
// TL0 = 0xA0; //设置定时初始值
// TH0 = 0x15; //设置定时初始值
// TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
// ET0 = 1; //使能定时器0中断
//
// TMOPS = 91
// 12T /12
//TH0 TDO =319
//}
void Timer0_Init(void) //500毫秒@24.000MHz
{
TM0PS = 0xBF; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xDC; //设置定时初始值
TH0 = 0x0B; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Timer0_Isr(void) interrupt 1 //定时器等待三秒
{
state = !state;
P00 = state;
P01 = !state;
}
|
|