- 打卡等级:偶尔看看III
- 打卡总天数:51
- 最近打卡:2025-12-17 15:46:32
已绑定手机
中级会员
- 积分
- 363
|
发表于 2025-11-4 22:58:48
|
显示全部楼层
问了豆包,终于修改出我想实现的流水灯,P00-P06是流水灯,P07通过中断亮3秒,灭3秒
#include <AI8051U.H> //包含AI8051U的头文件
#include "intrins.h" //使用_nop_()函数所必须要包含的头文件,
//否则延时函数中调用的_nop_()函数没有被头文件引用过来,
//会导致编译器找不到这个而函数而报错。
#include "stc32_stc8_usb.h" //不断电下载头文件
//char *USER_DEVICEDESC = NULL;
//char *USER_PRODUCTDESC = NULL;
//char *USER_STCISPCMD ="@STCISP#";
u8 state=0;
u8 temp=0;
void Delay20us(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 118UL;
while (i) i--;
}
void Delay500ms(void) //@24.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 2999998UL;
while (i) i--;
}
//上面延时函数部分代码可使用AIapp-ISP软件的“软件延时计算器”工具来生成。
void Timer0_Init(void) //3秒@24.000MHz
{
TM0PS = 0x5B; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x3F; //设置定时初始值
TH0 = 0x01; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main(void)
{
//int count; //按键计数变量
int cnt;
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
//(32 位模式请使用这句,注释下一句)
// P_SW2 |= 0x80; //允许访问扩展的特殊寄存器,XFR
//(8位模式请使用这句,注释上一句)。
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口为准双向口模式
//上面的将所有I/O口都初始化为准双向口工作模式的程序,
//可以使用AIapp-ISP软件的“I/O口配置工具”来生成。
usb_init(); //USB CDC 接口配置
IE2 |=0x80; //使能USB中断
Timer0_Init(); //定时器初始化
EA = 1;
P40 = 0; //打开LED部分的供电
while (DeviceState != DEVSTATE_CONFIGURED);//等待USB完成配置
while(1)
{
if (bUsbOutReady)
{
// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
//任务1 按下P32按钮灯亮松开P32灯灭
// if(P32==0)
// {
// Delay20us();
// if(P32==0)
// {
// P00=0;
// }
// else
// {
// P00=1;
// }
//
// }
//
// if(P32==0)
// {
// Delay20us();
// if(P32==0)
// {
// printf("按键按下次数:%d\r\n",(int)count);
// count++;
// while(P32==0); //等P32松开
// }
// }
//LED循环自动闪烁部分
temp = ~(1<<(cnt%7));
P0 = (P0 & 0x80)|(temp & 0x7f); //保留P07的状态,更新其他位
cnt++; //每次步进1
Delay500ms(); //调用延时函数,延时0.5s
}
}
void Timer0_Isr(void) interrupt 1 //3秒执行一次 在初始化配置好了
{
state=!state;
P07=state;
}
|
|