wuzhengmin 发表于 2026-1-7 11:36:02

DMA中断:

wuzhengmin 发表于 2026-1-7 11:36:56

RTC中断:

wuzhengmin 发表于 2026-1-7 11:38:39

预告下节课内容:

主要是设计和调试程序

第十一集到此结束

cyranohsl 发表于 2026-1-7 13:08:45

学习一下!谢谢分享!

wuzhengmin 发表于 2026-1-8 08:49:38

cyranohsl 发表于 2026-1-7 13:08
学习一下!谢谢分享!

其实,我没有退休的时候,也讲过大专层次的单片机原理,也上过微机原理及应用

当时没有经验,重理论轻实验,有点像何宾老师,导致学生学习效果很差,其实应该像陈桂友老

师这样,该快的地方不要细讲,没用的,关键是吸引学生,每天搞懂一点点就好........................

wuzhengmin 发表于 2026-1-8 08:54:50

今天我们继续学习第十二集 单片机C语言程序设计导入二

那天举例说明如何设计,如何调试...........

看看正规高工,是怎么设计、调试

wuzhengmin 发表于 2026-1-8 08:57:51

仿真和调试,是工程师的基本功,在调试当中发现问题

要注意细节,不拘小节是不行的

wuzhengmin 发表于 2026-1-8 10:02:11

我们参考冲哥的做法,先把不停电下载加进去:

#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;       

}

wuzhengmin 发表于 2026-1-8 11:17:03

注意,延时函数里用XDATA和DATA,延时时间的不同的!

有时候对延时时间严格要求的时候,就要特别小心

按照姚总的经验,还是要强制指定变量存储类型,DATA,XDATA,EDATA

要 写清楚!现在建议一般都指定XDATA,现在都有XDATA了,统一起来

下面跟着陈老师仿真:




wuzhengmin 发表于 2026-1-8 12:07:08

可能是我加了不停电下载

硬件仿真的时候,竟然失败了

我们把不停电下载先屏蔽,再试一下:

其他都正常,但是有个小问题:

为什么不能把变量LEDdata加到观察窗watch1?

页: 47 48 49 50 51 52 53 54 55 56 [57] 58 59 60 61 62 63 64 65 66
查看完整版本: 有关DMA,山东大学陈桂友教授