- 打卡等级:以坛为家II
- 打卡总天数:453
- 最近打卡:2026-07-03 08:57:36
管理员
- 积分
- 23929
|
发表于 2026-6-1 17:34:44
|
显示全部楼层
将 USB程序去除,系统时钟看程序说明
#include "stc8h.h" //STC8H的通用头文件,头文件不分大小写
#include "ai_usb.h" //USB库的头文件,头文件不分大小写
/*
如何获得上面这2个头文件,如已按照前面介绍的方法:
从www.STCAI.com 网站,【软件工具 | 工具软件】处,下载安装最新的【AIapp-ISP 软件】,
选择其中的选项卡 【Keil仿真设置 】,
点击【添加型号和头文件到Keil中,并添加仿真器驱动到Keil中】按钮,
则 stc8h 和 AI_usb.h 都会自动复制到Keil 中, 包含进来就可以直接使用,
大家可以打开看下其中的内容,AI_usb.h 和 stc32_stc8_usb.h是相似的,只需用其中的1个头文件,
具体见 Keil_v5\C251\INC\STC 目录,或 Keil_v5\C51\INC\STC 目录。
如将对应的 USB库文件添加到 项目中,后续用户程序中,USB如收到命令字符串 "@STCISP#"
USB库函数就会自动软复位到系统ISP程序区,实现 USB不停电下载,具体见相应部分的说明。
//char *USER_DEVICEDESC = NULL;
//char *USER_PRODUCTDESC = NULL;
//char *USER_STCISPCMD = "@STCISP#";
//使用20250319之前版本的库函数时需要在用户代码中增加上面3行定义。
//使用20250319及以后的版本都不再需要上面的定义
*/
bit t0_flag = 0; //定义1个位变量,T0事件位变量标志,记录定时器0已产生中断
// 供主循环查询到该定时器已产生中断,在主循环中处理定时器0的中断任务,不堵塞其他中断
bit t1_flag = 0; //定义1个位变量,T1事件位变量标志,记录定时器1已产生中断
// 供主循环查询到该定时器已产生中断,在主循环中处理定时器1的中断任务,不堵塞其他中断
void Timer0_Isr(void) interrupt TMR0_VECTOR //定时器0中断服务程序
{
P60 = ~P60; //P60灯闪烁,中断服务程序中尽量少执行长的任务,防止堵塞其他中断
t0_flag = 1; //置1,记录定时器0已产生中断,供主循环判断要处理定时器0的中断任务
}
//定时器0中断服务程序,TMR0_VECTOR在stc8h头文件中已宏定义为1
void Timer0_Init(void) //定时器0初始化,2秒@40.000MHz
{
TM0PS = 0x65; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xB1; //设置定时初始值
TH0 = 0x00; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void Timer1_Isr(void) interrupt TMR1_VECTOR
{
P67 = ~P67; //P67灯闪烁,中断服务程序中尽量少执行长的任务,防止堵塞其他中断
t1_flag = 1; //置1,记录定时器1已产生中断,供主循环判断要处理定时器1的中断任务
}
//定时器1中断服务程序,TMR1_VECTOR在stc8h头文件中已宏定义为3
void Timer1_Init(void) //定时器1初始化,500毫秒@40.000MHz
{
TM1PS = 0x19; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x99; //设置定时初始值
TH1 = 0x05; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //使能定时器1中断
}
void sys_init(void) //系统初始化
{
P_SW2 |= 0x80; //允许访问扩展的特殊寄存器,XFR
//32位8051需要使用下面3句进行初始化
// EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
// WTST = 0; //设置取程序代码等待时间,赋值为0表示不等待,程序以最快速度运行
// CKCON = 0; //设置访问片内的xdata速度,赋值为0表示用最快速度访问,不增加额外的等待时间
P0M0 = 0x00; P0M1 = 0x00; //设置 P0 口为准双向口模式
P1M0 = 0x00; P1M1 = 0x00; //设置 P1 口为准双向口模式
P2M0 = 0x00; P2M1 = 0x00; //设置 P2 口为准双向口模式
P3M0 = 0x00; P3M1 = 0x00; //设置 P3 口为准双向口模式
P4M0 = 0x00; P4M1 = 0x00; //设置 P4 口为准双向口模式
P5M0 = 0x00; P5M1 = 0x00; //设置 P5 口为准双向口模式
P6M0 = 0x00; P6M1 = 0x00; //设置 P6 口为准双向口模式
P7M0 = 0x00; P7M1 = 0x00; //设置 P7 口为准双向口模式
}
void main(void)
{
sys_init(); //调用系统初始化函数
usb_init(); //调用USB初始化函数,不需要立即判断电脑已正确识别到USB从设备
/* USB型单片机从设备,如需要主动向电脑发送数据,
在执行USB_SendData( )函数和printf_usb( )函数时,
这两个函数已增加了判断电脑是否已正确识别到USB从设备的程序。
如果电脑要主动发送数据给USB从设备,电脑自己会主动判断与USB从设备是否已正确连接。
*/
EA = 1; //使能中断
Timer0_Init(); //调用定时器0初始化函数
Timer1_Init(); //调用定时器1初始化函数
P40 = 0; //给LED灯供电
while(1) //主循环中查询需要处理的各种事件,如T0/T1中断事件,并打印输出状态
{
if(t0_flag) //主循环中查询,定时器0是否已产生中断,是否有需要处理的定时器0事件
{
t0_flag = 0; //清0,T0事件位变量标志
printf_usb("Timer0!\r\n");
}
if(t1_flag) //主循环中查询,定时器1是否已产生中断,是否有需要处理的定时器1事件
{
t1_flag = 0; //清0,T1事件位变量标志
printf_usb("Timer1!\r\n");
}
}
}
|
|