找回密码
 立即注册
查看: 88|回复: 9

8051U深度入门到32位51大型实战

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2026-05-29 15:13:45

1

主题

8

回帖

35

积分

新手上路

积分
35
发表于 2026-5-20 16:48:05 | 显示全部楼层 |阅读模式
重拾51单片机  深度再学习STC单片机  

哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前


当前使用的实验平台 自制最小系统板 STC8H8K64U


截图202605221451269069.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2026-05-29 15:13:45

1

主题

8

回帖

35

积分

新手上路

积分
35
发表于 2026-5-20 20:19:23 | 显示全部楼层
第一课 先学习了USB不断电下载 ,开始没有更新STC库文件,用的很久之前的stc keil库  直接范例程序都编译不过,缺少头文件"def.h"
后面在论坛里搜索 原来是需要用新的下载软件更新一下库文件。
目前用的是STC8H8K64U单片机上,
有这个USB功能下载程序非常方便,还可以通过串口进行调试,一根线搞定了下载和调试。 之前买的link1D 瞬间感觉不香了。


回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:87
  • 最近打卡:2026-05-23 08:34:25
已绑定手机

14

主题

158

回帖

1042

积分

版主

积分
1042
发表于 2026-5-21 08:48:48 | 显示全部楼层
要 做到 USB不停电下载
要 尝试 AiCube 图形化自动配置生成程序工具
推荐优先看的:  
printf_usb("Hello World !\r\n")
USB不停电下载, 演示视频链接:
https://www.stcaimcu.com/thread-19077-1-1.html

下载 最新的 AiCube-ISP-V6.96V-plus 或以上版本软件 !

深圳国芯人工智能有限公司-工具软件

下载 最新的 USB库函数,永远用最新的 USB库函数 !
深圳国芯人工智能有限公司-库函数
下载 最新的 用户手册 !
下载 最新的 上机实践指导书 !


下载 最新的 STC8H8K64U 用户手册
https://www.stcaimcu.com/data/download/Datasheet/STC8H.pdf

下载 最新的 STC8H8K64U 实验指导书
AiCube 图形化自动配置生成程序工具使用说明
https://www.stcaimcu.com/data/do ... %AF%BC%E4%B9%A6.pdf


推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接

上面是 小李 演示:STC8H8K64U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成

上面是 小赵 演示:STC8H8K64U, printf_usb("Hello World !\r\n")及usb不停电下载@AiCube之图形化程序自动生成

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2026-05-29 15:13:45

1

主题

8

回帖

35

积分

新手上路

积分
35
发表于 2026-5-21 15:41:45 | 显示全部楼层
第二课  硬件及工具介绍
硬件资源丰富,包含了芯片上所有的功能,各种实验都可以做的了。

软件之前在用STC32G的时候都已经安装过了。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2026-05-29 15:13:45

1

主题

8

回帖

35

积分

新手上路

积分
35
发表于 2026-5-21 16:46:31 | 显示全部楼层
第三课  太基础  看完没做实验, 第四课已经看过了
第五课 C语言基础 基础内容回顾
截图202605211646051004.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2026-05-29 15:13:45

1

主题

8

回帖

35

积分

新手上路

积分
35
发表于 2026-5-22 11:11:59 | 显示全部楼层
第六课  IO的收入输出   用的按键是P33   LED是P10
#include "stc8h.h"
#include "stc32_stc8_usb.h"

sbit LED0 = P1^0;
sbit LED1 = P1^1;

sbit KEY = P3^3;

void delay_ms(uint32_t ms)        //@11.0592MHz
{
        unsigned char data i, j;
        while(ms--)
        {
                i = 15;
                j = 90;
                do
                {
                        while (--j);
                } while (--i);       
        }
}


void main()
{
//        static u8 key_up = 1;
    P_SW2 |= 0x80;
   
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
  
        LED0 = 0;
        LED1 = 0;
       
    usb_init();                                     //USB CDC 接口配置
    //set_usb_ispcmd(0);  //禁用不停电下载功能会提升传输速度
    EA = 1;

    while (1)
    {
        if (bUsbOutReady)
        {
            //USB_SendData(UsbOutBuffer,OutNumber);//);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            printf_usb("test usb printf\r\n");
            usb_OUT_done();                       
        }
                if(KEY==0)
                {               
                        delay_ms(10);                       
                        if(KEY==0)
                        {
                                LED0=!LED0;
                        }
                        while(KEY==0);
                }
               
    }
}
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2026-05-29 15:13:45

1

主题

8

回帖

35

积分

新手上路

积分
35
发表于 2026-5-22 13:26:23 | 显示全部楼层
第7课  定时器中断
按键按下一次  CNT加1 并通过USB虚拟串口打印出来
定时器定时1ms@11.0592MHz LED1 一秒钟闪烁一次
void Timer0_Init(void)                //1毫秒@11.0592MHz
{
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x66;                                //设置定时初始值
        TH0 = 0xFC;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}

void Timer0_Isr(void) interrupt 1
{
        static u16 i = 0;
        i++;
        if(i==1000)
        {
                i = 0;
                LED1 = !LED1;
        }
       
}
截图202605221130598226.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2026-05-29 15:13:45

1

主题

8

回帖

35

积分

新手上路

积分
35
发表于 2026-5-22 14:43:10 | 显示全部楼层
第8课  定时器周期性调度任务
简单的任务调度功能实现多任务的切换,对于51单片机来讲还是非常方便的。
程序框架思路值得借鉴, 在STC8H8K64U上移植了下。
注意点:
1需要将keil中的内存模式由small 改为 Large 不然单片机的内存不够用
2需要将原来使用的stc_usb_cdc_8h_data_bl51.LIB 库改为 stc_usb_cdc_8h_xdata_bl51.LIB 两个库文件不兼容

补充一下:
使用xdata idata声明变量也可以,不需要改变USB库 “stc_usb_cdc_8h_data_bl51.LIB”

1.使用usb data库  RAM使用情况
Program Size: data=121.4 xdata=224 code=4588   

2.使用usb xdata库 RAM使用情况
Program Size: data=15.4 xdata=382 code=5405

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2026-05-29 15:13:45

1

主题

8

回帖

35

积分

新手上路

积分
35
发表于 2026-5-22 22:19:17 | 显示全部楼层
51 单片机data idata xdata 什么区别 如何使用

对于51单片机,data、idata 和 xdata 是三个用于指定变量存储位置的关键字。简单来说:

data:最快,但容量最小(128字节),用于核心变量。
idata:稍慢,容量较大(256字节),涵盖所有内部RAM。
xdata:最慢,但容量最大(可达64KB),用于大批量数据

深入理解:三个存储区域的区别
这三种存储类型对应了8051单片机内部和外部的不同物理存储区域,它们在访问速度、容量和寻址方式上均有显著区别。

data 段 (直接寻址区)
物理存储: 内部RAM的低128字节 (地址0x00-0x7F)
容量: 128字节
访问方式: 直接寻址,使用ACC寄存器,速度最快
主要特点: 访问速度最快,但空间非常宝贵,通常只用于最频繁读写的变量。若未指定存储类型,变量将默认存放于此。

idata 段 (间接寻址区)
物理存储: 整个256字节的内部RAM (地址0x00-0xFF)
容量: 256字节
访问方式: 间接寻址,使用@R0/@R1 寄存器
主要特点: 覆盖全部内部RAM,其低128字节与data段重叠,但因访问方式不同速度稍慢。

xdata 段 (外部数据存储器)
物理存储: 片外扩展的RAM
容量: 理论上可扩展到64KB (地址0x0000-0xFFFF)
访问方式: 16位间接寻址,使用DPTR寄存器,是最慢的访问方式
主要特点: 容量巨大,适合存放大型数组、缓冲区或不经常访问的数据。

此外,还有 pdata(分页外部RAM)和 code(程序存储器)等类型,pdata 存在已知问题,建议优先使用 xdata;code 用于将常量放在ROM中节省RAM
Keil C51的内存模型(Memory Model)
除了手动指定,Keil C51还提供了三种内存模型来间接控制变量的默认存储位置,这对未明确指定存储类型的变量有效。


使用建议
  • 核心变量,追求速度:将频繁使用的变量(如循环计数器)或对性能要求高的变量放入data区。若空间不足,再考虑使用idata。
  • 大型数据,牺牲速度:将占用空间大的数组、缓冲区等不常访问的数据放入xdata区,以释放宝贵的内部RAM。
  • 常量固化,节约 RAM:对于程序中固定不变的表格、字符串等,使用code关键字将其保存到ROM中,不占用宝贵的RAM空间。
  • 灵活选择内存模型:对于中小型程序,优先选择 SMALL 模型以求最高效率。只有当RAM资源紧张时,再考虑 COMPACT 或 LARGE 模型。
  • 谨慎使用指针:当声明指向不同存储区域的指针时,务必清楚指定类型,避免指针类型不匹配导致的错误。



回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2026-05-29 15:13:45

1

主题

8

回帖

35

积分

新手上路

积分
35
发表于 5 天前 | 显示全部楼层
第九课  数码管
没有实物 使用的调试仿真接口
1.虚拟LED流水灯,用的虚拟P0口

void PLED_40(void)
{
        u8 cod[8];
        cod[0] = 0x01;                //表示开启P0        
        cod[1] = ~T_NUM[state_now];                //P0
        LED40_SendData( cod,2 );
        
        state_now++;
        if( state_now>7 )
                state_now = 0;
}


void SEG_PC(void)
{
        u8 cod[8];
       
        cod[0] = SEG_NUM[shi/10];                                        //小时的十位数的数码管段码
        cod[1] = SEG_NUM[shi%10];
        cod[2] =SEG_NUM[16];                                                //数码管刷段码和位码

        cod[3] = SEG_NUM[fen/10];                                        //分钟
        cod[4] = SEG_NUM[fen%10];
        cod[5] =SEG_NUM[16];                                                //数码管刷段码和位码       

        cod[6] = SEG_NUM[miao/10];                                        //分钟
        cod[7] = SEG_NUM[miao%10];
       
        SEG7_ShowCode(cod);
}


虚拟数码管和LED

虚拟数码管和LED





回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-30 04:44 , Processed in 0.116721 second(s), 81 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表