DMA中断:
RTC中断:
预告下节课内容:
主要是设计和调试程序
第十一集到此结束
学习一下!谢谢分享!
cyranohsl 发表于 2026-1-7 13:08
学习一下!谢谢分享!
其实,我没有退休的时候,也讲过大专层次的单片机原理,也上过微机原理及应用
当时没有经验,重理论轻实验,有点像何宾老师,导致学生学习效果很差,其实应该像陈桂友老
师这样,该快的地方不要细讲,没用的,关键是吸引学生,每天搞懂一点点就好........................
今天我们继续学习第十二集 单片机C语言程序设计导入二
那天举例说明如何设计,如何调试...........
看看正规高工,是怎么设计、调试
仿真和调试,是工程师的基本功,在调试当中发现问题
要注意细节,不拘小节是不行的
我们参考冲哥的做法,先把不停电下载加进去:
#include "ai8051u.h" //调用头文件
#include "stc32_stc8_usb.h" //调用头文件
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
void Delay500ms(void); //@11.0592MHz
void SYS_int(void); //系统初始化
void main(void)
{
SYS_int(); //系统初始化
// P4M1=0xff;
// P4M0=0xff;
// P6M1=0;
// P6M0=0;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
//注意:擎天柱的LED端口在P2,且没有三极管的电源控制,所以只要控制P2端口即可
P40 = 0; //拉低三极管基极,相当于打开总开关
//这里和冲哥的不同,主要是擎天柱的LED在P2
//试验箱的LED在P0,而且试验箱P40上还有个三极管
while (1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
P00 = 0; //P00端口输出3.3V,熄灭共阳极LED
//Ai8051U试验箱的LED是在P0口
P02 = 0;//P02端口输出0V,共阳极LED点亮
P04 = 0;//P04端口输出0V,共阳极LED点亮
P06 = 0;//P06端口输出0V,共阳极LED点亮
Delay500ms();
P00 = 1;//P00端口输出3.3V,共阳极LED熄灭
P02 = 1;//P02端口输出3.3V,共阳极LED熄灭
P04 = 1;//P04端口输出3.3V,共阳极LED熄灭
P06 = 1;//P06端口输出3.3V,共阳极LED熄灭
Delay500ms();
}
}
void Delay500ms(void) //@11.0592MHz
{
unsigned long edata i;
/*edata是代表扩展数据存储区(Extended DATA)。
作用:用于声明变量存储在单片机片内 RAM 的高 128 字节(地址范围 0x80-0xFF)。
特点:
访问速度:比外部扩展 RAM(xdata)快,但比低 128 字节的直接寻址区(data)稍慢,因为它只能通过间接寻址访问。
使用场景:当 data 区空间不足,但又需要比 xdata 更快的访问速度时使用。
*/
_nop_();
_nop_();
i = 1382398UL;
while (i) i--;
}
void SYS_int(void) //系统初始化
{
P_SW2 |= 0x80; //B7位写1,使能访问XFR
P0M1 = 0x00; P0M0 = 0x00; //端口配置直接用STC的ISP,很方便的
P1M1 = 0x00; P1M0 = 0x00; //端口配置直接用STC的ISP,很方便的
P2M1 = 0x00; P2M0 = 0x00; //端口配置直接用STC的ISP,很方便的
P3M1 = 0x00; P3M0 = 0x00; //端口配置直接用STC的ISP,很方便的
P4M1 = 0x00; P4M0 = 0x00; //端口配置直接用STC的ISP,很方便的
P5M1 = 0x00; P5M0 = 0x00; //端口配置直接用STC的ISP,很方便的
P6M1 = 0x00; P6M0 = 0x00; //端口配置直接用STC的ISP,很方便的
P7M1 = 0x00; P7M0 = 0x00; //端口配置直接用STC的ISP,很方便的
usb_init();
IE2 |= 0x80; //使能USB中断
EA = 1;
}
注意,延时函数里用XDATA和DATA,延时时间的不同的!
有时候对延时时间严格要求的时候,就要特别小心
按照姚总的经验,还是要强制指定变量存储类型,DATA,XDATA,EDATA
要 写清楚!现在建议一般都指定XDATA,现在都有XDATA了,统一起来
下面跟着陈老师仿真:
可能是我加了不停电下载
硬件仿真的时候,竟然失败了
我们把不停电下载先屏蔽,再试一下:
其他都正常,但是有个小问题:
为什么不能把变量LEDdata加到观察窗watch1?