任务一 300,600,900毫秒取反led1,2,3,
通过三个变量,在定时器中断里面分别控制三个计时,达到led不同闪烁
#include "ai8051u.h" //头文件
#include "stc32_stc8_usb.h" //不停电下载头文件
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
#define MAIN_Fosc 24000000UL
#define BRT (65536 - (MAIN_Fosc / 115200+2)/4)
sbit key=P3^2;
sbit key1=P3^3;
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
bit state1=0; //led1状态
bit state2=0;
bit state3=0;
bit run_state=0; //运行状态
u8 count_300;
u8 count_600;
u8 count_900;
void Timer0_Init(void);
void delayms(u8 ms);
void main(void)
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
usb_init(); //USB CDC 接口配置
Timer0_Init();
IE2 |= 0x80; //使能USB中断
EA = 1; //打开总中断 IE|=0x80;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady)
{
// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
if(count_300>=30)
{
count_300=0;
state1=!state1;
led1=state1;
}
if(count_600>=60)
{
count_600=0;
state2=!state2;
led2=state2;
}
if(count_900>=90)
{
count_900=0;
state3=!state3;
led3=state3;
}
}
}
void Timer0_Isr(void) interrupt 1
{
count_300++;
count_600++;
count_900++;
}
void Timer0_Init(void) //10毫秒@24.000MHz
{
TM0PS = 0x03; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xA0; //设置定时初始值
TH0 = 0x15; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void delayms(u8 ms)
{u16 i;
do{
i = MAIN_Fosc /10002;
while(--i);
} while(--ms);
}