实验教程中的代码没法编译 #include <AI8051U.H> //包含AI8051U的头文件 #include "ai_usb.h" //使用usb所需要包含的头文件 #include "intrins.h" char *USER_DEVICEDESC = NULL;//USB 库里预留的设备描述符,必须定义,但不要使用 char *USER_PRODUCTDESC = NULL;//USB 库里预留的产品描述符,必须定义,但不要使用 char *USER_STCISPCMD = "@STCISP#"; //这里使用"@STCISP#"这个字符串当作不停电自动下载命令,用户只需要在这里定义好这个字符串, //后面添加的库文件的 USB 中断程序会自动判断从电脑端下传的数据是否和这个字符串一样,如果一样, //则会自动软复位到系统区等待 USB 下载,用户不需要进行额外的处理。 void Delay1ms(void) //@40.000MHz { unsigned long edata i; _nop_(); _nop_(); _nop_(); i = 9998UL; while (i) i--; } void main(void) { EAXFR = 1; //允许访问扩展的特殊寄存器,XFR WTST = 0; //设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行 CKCON = 0; //设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间 P0M0 = 0x38; P0M1 = 0x20; //设置P03、P04为推挽输出,P05为开漏输出,其余为准双向口模式 P1M0 = 0x00; P1M1 = 0x00; //设置 P1 口为准双向口模式 P2M0 = 0x00; P2M1 = 0x00; //设置 P2 口为准双向口模式 P3M0 = 0x30; P3M1 = 0x3b; //P30、P31为高阻输入,P32为准双向口、P33为高阻输入、P34和P35为开漏输出 P3PU |= 0x38; //打开P33、P34、P35的内部上拉电阻,并且仅修改这三个I/O的上拉电阻打开状态 //P3M0 = 0x00; P3M1 = 0x00; //设置 P3 口为准双向口模式 //P3M0 = 0x00; P3M1 = 0x3c; //设置P32、P33、P34、P35为高阻输入,其余引脚为准双向口模式 //P3PU = 0x3c; //需要同时开启对应端口的上拉电阻 P4M0 = 0x00; P4M1 = 0x00; //设置 P4 口为准双向口模式 P5M0 = 0x00; P5M1 = 0x00; //设置 P5 口为准双向口模式 P6M0 = 0x00; P6M1 = 0x00; //设置 P6 口为准双向口模式 P7M0 = 0x00; P7M1 = 0x00; //设置 P7 口为准双向口模式 Delay1ms();//延时1ms,等待IO口电平稳定,因为前面刚改变了模式 //立刻读可能会读到错误的电平,所以需要先等待电平变化稳定后再读 usb_init(); //USB 接口配置 EA = 1;//打开总中断 while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置 P40 = 0;//打开LED部分的供电 while(1) { //使用USB串口控制来手动控制LED部分 if(bUsbOutReady) { printf_usb("P3%d当前的状态为:%d\r\n", (int)UsbOutBuffer[0],(int)(P3>>UsbOutBuffer[0])&1); //传入hex的位号来标识需要读取哪个位的状态,读取后通过对整组IO口数据的移位操作读取到对应IO的状态 P0 = P3|0xc3;//同步端口状态,并将其他不需要的位置1(不显示) printf_usb("已将状态同步给LED0%d\r\n",(int)UsbOutBuffer[0]);//显示同步完成 usb_OUT_done(); // 本包接收的数据处理完毕,准备接收下一包数据 } } }
|