- 打卡等级:偶尔看看III
- 打卡总天数:35
- 最近打卡:2026-04-09 09:20:22
已绑定手机
注册会员
- 积分
- 151
|
第八集 定时器周期性任务调度
这一集收货满满,打开了思路,用数组制作流水灯,定时器的各种应用等等
贴上 按键按一下,LED通过数组移动一下的手打程序
#include "ai8051u.h"
#include "stc32_stc8_usb.h"
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
u8 num = 0;
u16 key_val = 0; // 按键按下持续时间
u8 State[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u16 Count_ms[3] = {0,0,0}; // 三个计时变量
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#"; // USB库默认的不停电下载命令为“@STCISP#” 与ISP一致
void Timer0_Init(void);
void Delay10ms(void);
void main(void)
{
u16 count = 1; // 按键计数
WTST = 0;
EAXFR = 1;
CKCON = 0; // 第7为置为1,使能访问XFR
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(); // USB CDC 接口配置
IE2 |= 0x80; // 使能USB中断,理论上只要放在while之前都可以,但是尽量放在EA总中断之前
Timer0_Init(); // 定时器初始化
EA = 1; //I E |= 0X80
while (DeviceState != DEVSTATE_CONFIGURED); // 等待USB完成配置
while(1)
{
if (bUsbOutReady) // 如果接收到数据
{
// USB_SendData(UsbOutBuffer,OutNumber); // 发送数据缓冲区,长度(接收数据原样返回, 用于测试)
// printf("State的第一个数\xfd据为:%d\r\n",(int)State[0]);
usb_OUT_done();
P2 = ~State[num];
if(Count_ms[1]>=1000)
{
Count_ms[1] = 0;
printf("AI8051U\r\n");
}
if(Count_ms[2] >= 10) // 10ms执行一次
{
Count_ms[2] = 0;
if(P32 == 0) // 按键按下
{
key_val ++;
if(key_val == 5) // 按键按下
{
num ++;
if(num > 7){num = 0;}
}
}
else
{
key_val = 0;
}
}
}
}
void Timer0_Init(void) //1毫秒@24.000MHz
{
TM0PS = 0x00; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x30; //设置定时初始值
TH0 = 0xF8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void Timer0_Isr(void) interrupt 1 // 3秒中断
{
u8 i;
for(i = 0;i < 3;i++)
{
Count_ms++;
}
// Count_300++;
// Count_600++;
// Count_900++;
}
void Delay10ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 59998UL;
while (i) i--;
}
|
|