- 打卡等级:以坛为家I
- 打卡总天数:239
- 最近打卡:2026-02-12 07:42:26
已绑定手机
金牌会员
- 积分
- 1073
|
发表于 2025-12-31 20:42:40
|
显示全部楼层
/************* 功能说明 **************
本例程基于AI8051U为主控芯片进行编写测试.配合USB不停电下载,
使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
程序使用P2口来演示跑马灯,输出低驱动。
下载时, 选择时钟 24MHZ (用户可自行修改频率).
******************************************/
/*------------------ 头文件声明 ---------------------*/
#include "ai8051u.H"
#include "stc32_stc8_usb.H"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
#define MAIN_Fosc 24000000UL //系统频率
/*------------------ 用户变量声明 ---------------------*/
u8 LED1_State;
u8 LED2_State;
u8 LED3_State;
//u16 Count1=0;
//u16 Count2=0;
//u16 Count3=0;
u16 Count[3] = {0,0,0};
u8 Led_State[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 num = 0;
u8 Key_num;
u8 i;
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中断
}
/*------------------ MAIN主函数 ---------------------*/
void main(void)
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M0 = 0x00; P0M1 = 0x00; //设置P0--P7口为标准IO口
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
usb_init(); //USB接口配置
IE2 |= 0x80; //使能USB中断
Timer0_Init(); //定时器0初始化
EA = 1; //全能总中断
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while(1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
printf("今天是%d年%d月%d日\r\n",25,12,28);
usb_OUT_done();
}
//任务1:用一个定时器实现LED1 0.3秒取反一次,LED2 0.6秒取反一次,LED3 0.9秒取反一次
// if(Count1>=300)
// {
// Count1 = 0;
// LED1_State = !LED1_State;
// P20 = LED1_State;
// }
// else if(Count2>=600)
// {
// Count2 = 0;
// LED2_State = !LED2_State;
// P21 = LED2_State;
// }
// else if(Count3>=900)
// {
// Count3 = 0;
// LED3_State = !LED3_State;
// P22 = LED3_State;
// }
// if(Count[0]>=300)
// {
// Count[0] = 0;
// LED1_State = !LED1_State;
// P20 = LED1_State;
// }
// if(Count[1]>=600)
// {
// Count[1] = 0;
// LED2_State = !LED2_State;
// P21 = LED2_State;
// }
// if(Count[3]>=900)
// {
// Count[3] = 0;
// LED3_State = !LED3_State;
// P22 = LED3_State;
// }
//任务2:利用数组点亮LED灯,实现流水灯效果
P2 = ~Led_State[num];
if(Count[0] >= 600)
{
Count[0] = 0;
num++;
if(num>=8)
num=0;
}
// if(Count[1] >= 10)
// {
// Count[1] = 0;
// if(P32==0)
// {
// Key_num++;
// if(Key_num==5)
// {
//
// num++;
// if(num>=8)
// num=0;
// }
//
// }
// else
// {
// Key_num=0;
// }
// }
}
}
/*------------------ 中断服务函数 ---------------------*/
void Timer0_Isr(void) interrupt 1
{
for(i=0;i<3;i++)
{
Count[i]++;
}
// Count1 ++;
// Count2 ++;
// Count3 ++;
// if(Count1>=300)
// {
// Count1 = 0;
// LED1_State = !LED1_State;
// P20 = LED1_State;
//
// }
// Count2++;
// if(Count2>=600)
// {
// Count2 = 0;
// LED2_State = !LED2_State;
// P22 = LED2_State;
// }
// Count3++;
// if(Count3>=900)
// {
// Count3 = 0;
// LED3_State = !LED3_State;
// P24 = LED3_State;
//
// }
}
|
|