|
发表于 2025-2-4 20:37:33
|
显示全部楼层
#include "stc32g.h"
#include "stc32_stc8_usb.h"
#define FOSC 24000000UL // ISP下就时需将工作频率设置为24MHz
#define MAIN_Fosc 24000000UL
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#"; // 不停电自动ISP下就命令,可以自定义
#define Timer0_Reload (MAIN_Fosc / 1000) //Timer 0 中断频率, 1000次/秒
#define Timer1_Reload (MAIN_Fosc / 2000) //Timer 1 中断频率, 2000次/秒
#define Timer2_Reload (MAIN_Fosc / 1000) //Timer 2 中断频率, 3000次/秒
#define Timer3_Reload (MAIN_Fosc / 300) //Timer 3 中断频率, 4000次/秒
#define Timer4_Reload (MAIN_Fosc / 100) //Timer 4 中断频率, 5000次/秒
void Timer0_init(void);
void Timer1_init(void);
void Timer2_init(void);
void Timer3_init(void);
void Timer4_init(void);
void Delay2000ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 11999998UL;
while (i) i--;
}
void main()
{
WTST=0;
CKCON=0;
EAXFR=1;
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;
P3M0 &=~0x03; // P3.0,P3.1和USB的D-D+共用PIN引脚
P3M1 = 0x03; // 需要将P3.P3.1设置为高阻输入模式
IRC48MCR=0x80; // 使能内部48M前USB专用IRC
while (!(IRC48MCR & 0x01));
USBCLK = 0x00; // 设置USB时钟源为内部48M的USB专用IRC
USBCON = 0x90; // 使能USB功能
usb_init(); // 源用USB CDC初始化库函数
EUSB=1; // 使能USB中断
EA=1;
while (DeviceState != DEVSTATE_CONFIGURED); // 等特USB完成配置
// Timer0_init();
// Timer1_init();
Timer2_init();
// Timer3_init();
// Timer4_init();
while (1)
{P21 = !P21;
Delay2000ms();
P20 = !P20;
//当硬件接收完成上位机通过串口助手发来的数据后,会自动将bUsbOutReady置1
//接收的数据字节数保存在OutNumber变量中,接收的数据保存在UsbOutBuffer数组
if (bUsbOutReady)
{P20 = !P20;
USB_SendData(UsbOutBuffer,OutNumber); // 使用USB_SendData可向上位机发送数据
// 这里的代码为将接收到的数据原样返回
usb_OUT_done(); // 处理完成接收的数据后
// 源用usb_OUT_done准备接收下一笔数据
}
}
}
void Timer0_init(void)
{
TR0 = 0; //停止计数
#if (Timer0_Reload < 64) // 如果用户设置值不合适, 则不启动定时器
#error "Timer0设置的中断过快!"
#elif ((Timer0_Reload/12) < 65536UL) // 如果用户设置值不合适, 则不启动定时器
ET0 = 1; //允许中断
// PT0 = 1; //高优先级中断
TMOD &= ~0x03;
TMOD |= 0; //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
// T0_CT = 1; //计数
T0_CT = 0; //定时
// T0CLKO = 1; //输出时钟
T0CLKO = 0; //不输出时钟
#if (Timer0_Reload < 65536UL)
T0x12 = 1; //1T mode
TH0 = (u8)((65536UL - Timer0_Reload) / 256);
TL0 = (u8)((65536UL - Timer0_Reload) % 256);
#else
T0x12 = 0; //12T mode
TH0 = (u8)((65536UL - Timer0_Reload/12) / 256);
TL0 = (u8)((65536UL - Timer0_Reload/12) % 256);
#endif
TR0 = 1; //开始运行
#else
#error "Timer0设置的中断过慢!"
#endif
}
//========================================================================
// 函数: void Timer1_init(void)
// 描述: timer1初始化函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void Timer1_init(void)
{
TR1 = 0; //停止计数
#if (Timer1_Reload < 64) // 如果用户设置值不合适, 则不启动定时器
#error "Timer1设置的中断过快!"
#elif ((Timer1_Reload/12) < 65536UL) // 如果用户设置值不合适, 则不启动定时器
ET1 = 1; //允许中断
// PT1 = 1; //高优先级中断
TMOD &= ~0x30;
TMOD |= (0 << 4); //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装
// T1_CT = 1; //计数
T1_CT = 0; //定时
// T1CLKO = 1; //输出时钟
T1CLKO = 0; //不输出时钟
#if (Timer1_Reload < 65536UL)
T1x12 = 1; //1T mode
TH1 = (u8)((65536UL - Timer1_Reload) / 256);
TL1 = (u8)((65536UL - Timer1_Reload) % 256);
#else
T1x12 = 0; //12T mode
TH1 = (u8)((65536UL - Timer1_Reload/12) / 256);
TL1 = (u8)((65536UL - Timer1_Reload/12) % 256);
#endif
TR1 = 1; //开始运行
#else
#error "Timer1设置的中断过慢!"
#endif
}
//========================================================================
// 函数: void Timer2_init(void)
// 描述: timer2初始化函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void Timer2_init(void)
{
T2R = 0; //停止计数
#if (Timer2_Reload < 64) // 如果用户设置值不合适, 则不启动定时器
#error "Timer2设置的中断过快!"
#elif ((Timer2_Reload/12) < 65536UL) // 如果用户设置值不合适, 则不启动定时器
ET2 = 1; //允许中断
// T2_CT = 1; //计数
T2_CT = 0; //定时
// T2CLKO = 1; //输出时钟
T2CLKO = 0; //不输出时钟
#if (Timer2_Reload < 65536UL)
T2x12 = 1; //1T mode
T2H = (u8)((65536UL - Timer2_Reload) / 256);
T2L = (u8)((65536UL - Timer2_Reload) % 256);
#else
T2x12 = 0; //12T mode
T2H = (u8)((65536UL - Timer2_Reload/12) / 256);
T2L = (u8)((65536UL - Timer2_Reload/12) % 256);
#endif
T2R = 1; //开始运行
#else
#error "Timer2设置的中断过慢!"
#endif
}
//========================================================================
// 函数: void Timer3_init(void)
// 描述: timer3初始化函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void Timer3_init(void)
{
T3R = 0; //停止计数
#if (Timer3_Reload < 64) // 如果用户设置值不合适, 则不启动定时器
#error "Timer3设置的中断过快!"
#elif ((Timer3_Reload/12) < 65536UL) // 如果用户设置值不合适, 则不启动定时器
ET3 = 1; //允许中断
// T3_CT = 1; //计数
T3_CT = 0; //定时
// T3CLKO = 1; //输出时钟
T3CLKO = 0; //不输出时钟
#if (Timer3_Reload < 65536UL)
T3x12 = 1; //1T mode
T3H = (u8)((65536UL - Timer3_Reload) / 256);
T3L = (u8)((65536UL - Timer3_Reload) % 256);
#else
T3x12 = 0; //12T mode
T3H = (u8)((65536UL - Timer3_Reload/12) / 256);
T3L = (u8)((65536UL - Timer3_Reload/12) % 256);
#endif
T3R = 1; //开始运行
#else
#error "Timer3设置的中断过慢!"
#endif
}
//========================================================================
// 函数: void Timer4_init(void)
// 描述: timer4初始化函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void Timer4_init(void)
{
T4R = 0; //停止计数
#if (Timer4_Reload < 64) // 如果用户设置值不合适, 则不启动定时器
#error "Timer4设置的中断过快!"
#elif ((Timer4_Reload/12) < 65536UL) // 如果用户设置值不合适, 则不启动定时器
ET4 = 1; //允许中断
// T4_CT = 1; //计数
T4_CT = 0; //定时
// T4CLKO = 1; //输出时钟
T4CLKO = 0; //不输出时钟
#if (Timer4_Reload < 65536UL)
T4x12 = 1; //1T mode
T4H = (u8)((65536UL - Timer4_Reload) / 256);
T4L = (u8)((65536UL - Timer4_Reload) % 256);
#else
T4x12 = 0; //12T mode
T4H = (u8)((65536UL - Timer4_Reload/12) / 256);
T4L = (u8)((65536UL - Timer4_Reload/12) % 256);
#endif
T4R = 1; //开始运行
#else
#error "Timer4设置的中断过慢!"
#endif
}
//========================================================================
// 函数: void timer0_int (void) interrupt TIMER0_VECTOR
// 描述: timer0中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void timer0_int (void) interrupt 1
{
P67 = ~P67;
}
//========================================================================
// 函数: void timer1_int (void) interrupt TIMER1_VECTOR
// 描述: timer1中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void timer1_int (void) interrupt 3
{
P66 = ~P66;
}
//========================================================================
// 函数: void timer2_int (void) interrupt TIMER2_VECTOR
// 描述: timer2中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void timer2_int (void) interrupt 12
{
P65 = ~P65;
}
//========================================================================
// 函数: void timer3_int (void) interrupt TIMER3_VECTOR
// 描述: timer3中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void timer3_int(void) interrupt 19
{
P64 = ~P64;
}
//========================================================================
// 函数: void timer4_int (void) interrupt TIMER4_VECTOR
// 描述: timer4中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2015-1-12
//========================================================================
void timer4_int(void) interrupt 20
{
P63 = ~P63;
} |
|