- 打卡等级:常住居民II
- 打卡总天数:81
- 最近打卡:2025-06-05 07:27:24
已绑定手机
中级会员
- 积分
- 469
|
发表于 2025-3-21 22:35:46
|
显示全部楼层
第七集 定时器中断,本集主要学习什么是中断,AI5081U 中断的配置方法,并且使用ISP软件的定时器配置工具配置中断。
以下程序为本集课后练习的程序。
课后小练
电子功德箱
1:按下按钮1,串口显示”双倍功德时间“,再次按下显示”单倍功德时间“
2:按下按钮2,双倍功德时间下串口显示”功德+2 当前功德:xxx“
3:按下按钮2,单倍功德时间下串口显示”功德+1 当前功德:xxx“
4:功德+1时,LED点亮1秒后熄灭表示功德成功点亮;
5:功德+2时,LED点亮2秒后熄灭表示功德成功点亮;
#include "ai8051.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"
#include "stdio.h"
#define MAIN_Fosc 24000000UL
#define u8 unsigned char
#define u16 unsigned int
u8 state=1;
void delay_ms(u8 ms);
void Timer0_Init_1(void);
void Timer0_Init_2(void);
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void main(void)
{
u8 i=0;
u16 y=0;
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P_SW2 |= 0x80;
P0M1 = 0x00; P0M0 = 0xff; //设置为推挽输出
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P2M1 = 0x00; P2M0 = 0xff; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口
P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
usb_init(); //USB CDC 接口配置
IE2|=0x80;
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady)
{
// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
//课后小练
/*电子功德箱
1:按下按钮1,串口显示”双倍功德时间“,再次按下显示”单倍功德时间“
2:按下按钮2,双倍功德时间下串口显示”功德+2 当前功德:xxx“
3:按下按钮2,单倍功德时间下串口显示”功德+1 当前功德:xxx“
4:功德+1时,LED点亮1秒后熄灭表示功德成功点亮;
5:功德+2时,LED点亮2秒后熄灭表示功德成功点亮;
if(P32==0)
{
delay_ms(20);
if(P32==0)
{
*/
state=!state;
if(state)
{
printf("双倍功德时间\r\n");
}
else
{
printf("单倍功德时间\r\n");
}
while(P32==0);
}
}
if(P33==0)
{
delay_ms(20);
if(P33==0)
{
if(state)
{
y=y+2;
P27=0;
printf("功德+2 当前功德 %u \r\n",y);
Timer0_Init_2();
}
else
{
y++;
printf("功德+1 当前功德 %u \r\n",y);
P27=0;
Timer0_Init_1();
}
while(P33==0);
}
}
i++;
if(i%64==0)
{
P20=!P20;
}
delay_ms(5);
}
}
void delay_ms(u8 ms)
{
u16 i;
do{
i = MAIN_Fosc / 6000;
while(--i);
}while(--ms);
}
void Timer0_Init_1(void) //1秒@24.000MHz
{
TM0PS = 0x1E; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xFC; //设置定时初始值
TH0 = 0x03; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void Timer0_Init_2(void) //2秒@24.000MHz
{
TM0PS = 0x3D; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xFC; //设置定时初始值
TH0 = 0x03; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void Timer0_Isr(void) interrupt 1
{
P27=1;
TR0 = 0;
}
|
|