找回密码
 立即注册
楼主: 夏永华

业余爱好电子技术20年,申请学习单片机,不留人生遗憾

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:83
  • 最近打卡:2026-04-27 17:12:41

31

主题

97

回帖

988

积分

版主

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

下载 最新的 AiCube-ISP-V6.96J 或以上版本软件 !
深圳国芯人工智能有限公司-工具软件

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

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

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

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


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:363
  • 最近打卡:2026-04-30 06:16:54
已绑定手机

1

主题

26

回帖

1401

积分

金牌会员

积分
1401
发表于 2026-3-16 09:12:01 | 显示全部楼层
通过豆包学习,位移操作在操作配置,清零和移位通讯和ADC拼接位的用途
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:32
  • 最近打卡:2026-05-01 00:01:26
已绑定手机

0

主题

45

回帖

459

积分

中级会员

积分
459
发表于 2026-4-1 01:23:58 | 显示全部楼层
学习打卡
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:363
  • 最近打卡:2026-04-30 06:16:54
已绑定手机

1

主题

26

回帖

1401

积分

金牌会员

积分
1401
发表于 2026-4-1 17:12:13 | 显示全部楼层
吾还在补习位操作取一位串口放到数据线上与取数,结构体,库,宏定义,指针。原来多是先写启动,停止,应答的,在组装,IIC通讯,EEPROM,软件I2C和硬件I2C寄存器,内置EEPROM,IAP硬件寄存器,很多不懂问豆包,学习一边又一边。PWM理解了点,叫中位对齐全,死区控制寄存器,刹车其实就是切断PWM输出硬件保护,硬件速度快,以免炸IGBT,研究了PFC-PWM,以前对模拟PWM学的多点。不懂反复看。慢慢想。原来三目条件运算符是用来取位作SDA = (dat & 0x80) ? 1 : 0;现在只需要记住三句话:
  • dat & 0x80 → 只看最高位
  • if(不等于0) → 最高位是 1
  • else → 最高位是 0
  • 原来是个条件判断语句

原来是这样写(dat & 0x80) ? 1 : 0,理解难
现在

if( (dat & 0x80) != 0 )
{    SDA = 1;}
else
{    SDA = 0;}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:363
  • 最近打卡:2026-04-30 06:16:54
已绑定手机

1

主题

26

回帖

1401

积分

金牌会员

积分
1401
发表于 2026-4-16 09:43:31 | 显示全部楼层

阅读了王志浩板本的T12烙铁程序感悟

新手抱着试试看,阅读了王志浩板本的T12烙铁程序,去看了MAIN函数,发现只有开关机和主界面程序,按键程序调用,没有PWM加热,ADC,显示,PID等程序,百思不得其解,后来发现中断好像有,问了豆包,牵出来关于程序结构问题,原来单片机是主程序和中断程序分2路同时运行的,其它程序在中断程序里执行的,以定时中断时间1MS为基准,再用变量计数10MS、20MS,50MS等分别判断执法其它程序,是可以没有MAIN,或不在MAIN也能单独运行,又了解了程序结构的时间片轮询,状态机结构等。比方每隔20MS重复一次,结构为定时器每中断1MS,变量++,间隔变量=当前变量一一前次变量。IF间隔时间如果=10MS,就执行,ADC,然后把前次变量=当前变量,然后其它按此方法,间隔20MS,50MS时间间隔分别执行PWM加热开关,PID算法,滤波等程序。后来发现疑问,这个变量没有清零,是不是有问题呢,又问豆包,它说溢出后计数为5,5-65535=11,不改间隔时间。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:363
  • 最近打卡:2026-04-30 06:16:54
已绑定手机

1

主题

26

回帖

1401

积分

金牌会员

积分
1401
发表于 2026-4-18 15:51:01 | 显示全部楼层
本帖最后由 I9000-琳爸 于 2026-4-18 13:52 编辑
学习T12烙铁程序之心得2

/*********************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2017-2018, XinJiang University. All right reserved. All rights reserved.
*
* 文件名                :        config.h
* 描述                 :        系统配置
*
* 版本                        :        V3.3.4
* 作者                        :        王志浩
* 日期                        :        2017-10-22
*
* 以下全部程序之著作权归属新疆大学所有,软件著作权登记编号2018R11L423999
* 未经著作权所有人书面授权,任何单位和个人不得将以下程序用于商业盈利用途!
* 修改此程序请保留上述版权声明,引用程序请注明出处!
**********************************************************************************/
#ifndef                __CONFIG_H
#define                __CONFIG_H


/************************定义系统时钟*****************************/
#define MAIN_Fosc                24000000L        //定义主时钟
#define Main_Fosc_KHZ        (MAIN_Fosc / 1000)

/****************************用户可调设置****************************/
//如果需要开机LOGO,请定义DRAW_LOGO;不需要LOGO可把该定义注释
//#define DRAW_LOGO
//如果需要在调整温度时大字显示设定的温度,请定义SET_TEMP;如果需要大字持续显示实际温度可把该定义注释
#define SET_TEMP
//此处选择使用的控制板版本,支持智盟1.0/智盟1.1/小张设计(ZM1_0),
//智盟1.2(ZM1_2),雪驹旧版(XJ_OLD),雪驹新版(XJ_NEW),五笔LCD版(WB_LCD)
#define ZM1_2
//屏幕选择(0.96寸OLED(SSD1306)选择0;1.3寸OLED(SSH1106)选择1;LCD选择2)
#define SCREEN                        1

/****************************IO设置****************************/
//版本号
#define VERSION_DIS                ("V3.3.4")


#if        SCREEN == 1
        #define DIS_ERR 2
#else
        #define DIS_ERR 0
#endif
//以下是三个自定义按键
#define KEY_A                         (P25)
#define KEY_B                         (P26)
#define KEY_C                         (P27)

//单片机切断220V电源输出IO
#define SHUTDOWN                (P33)

#ifdef WB_LCD
//蜂鸣器
        #define        BEEP                                 (P13)
        #define BEEP_ON                        (P13 = 1)
        #define BEEP_OFF                (P13 = 0)
        //LCD背光
        #define        LED                                 (P10)
        #define LED_ON                        (P10 = 1)
        #define LED_OFF                  (P10 = 0)

        //编码器
        #define        EC11_A                        (P31)
        #define        EC11_B                        (P30)
        #define        EC11_KEY                (P15)

        //PWM
        #define IRON                                (P23)
        //水银开关
        #define SLEEP                                (P20)
        #define PWM_EN                        (P00)

        //ADC设置
        #define ADC_VCC                                1u
        #define ADC_IRON                        4u
        #define ADC_ROOMTEMP        6u
#endif

#ifdef ZM1_0
        //蜂鸣器
        #define        BEEP                                 (P03)
        #define BEEP_ON                        (P03 = 1)
        #define BEEP_OFF                (P03 = 0)
        //LCD背光
        #define        LED                                 (P11)
        #define LED_ON                        (P11 = 1)
        #define LED_OFF                  (P11 = 0)
        //编码器
        #define        EC11_A                        (P32)
        #define        EC11_B                        (P31)
        #define        EC11_KEY                (P30)
        //PWM
        #define IRON                                (P10)
        //水银开关
        #define SLEEP                                (P01)
        #define PWM_EN                        (P00)
      
        //ADC设置
        #define ADC_VCC                                3u
        #define ADC_IRON                        5u
        #define ADC_ROOMTEMP        7u
#endif

#ifdef ZM1_2
        //蜂鸣器
        #define        BEEP                                 (P33)
        #define BEEP_ON                        (P33 = 1)
        #define BEEP_OFF                (P33 = 0)
        //LCD背光
        #define        LED                                 (P11)
        #define LED_ON                        (P11 = 1)
        #define LED_OFF                  (P11 = 0)
        //编码器
        #define        EC11_A                        (P32)
        #define        EC11_B                        (P31)
        #define        EC11_KEY                (P30)
        //PWM
        #define IRON                                (P10)
        //水银开关
        #define SLEEP                                (P01)
        #define PWM_EN                        (P00)
      
        //ADC设置
        #define ADC_VCC                                3u
        #define ADC_IRON                        5u
        #define ADC_ROOMTEMP        7u
#endif

#ifdef XJ_OLD
        //蜂鸣器
        #define        BEEP                                 (P03)
        #define BEEP_ON                        (P03 = 0)
        #define BEEP_OFF                (P03 = 1)
        //LCD背光
        #define        LED                                 (P00)
        #define LED_ON                        (P00 = 1)
        #define LED_OFF                  (P00 = 0)
        //编码器
        #define        EC11_A                        (P32)
        #define        EC11_B                        (P31)
        #define        EC11_KEY                (P30)
        //PWM
        #define IRON                                (P10)
        //水银开关
        #define SLEEP                                (P01)
        #define PWM_EN                        (P11)
      
        //ADC设置
        #define ADC_VCC                                3u
        #define ADC_IRON                        5u
        #define ADC_ROOMTEMP        7u
#endif
#ifdef XJ_NEW
        //蜂鸣器
        #define        BEEP                                 (P03)
        #define BEEP_ON                        (P03 = 0)
        #define BEEP_OFF                (P03 = 1)
        //LCD背光
        #define        LED                                 (P00)
        #define LED_ON                        (P00 = 1)
        #define LED_OFF                  (P00 = 0)
        //编码器
        #define        EC11_A                        (P32)
        #define        EC11_B                        (P31)
        #define        EC11_KEY                (P30)
        //PWM
        #define IRON                                (P10)
        //水银开关
        #define SLEEP                                (P01)
        #define PWM_EN                        (P11)
      
        //ADC设置
        #define ADC_VCC                                3u
        #define ADC_IRON                        5u
        #define ADC_ROOMTEMP        7u
#endif
/***************************包含库函数***************************/
#include        "STC15Fxxxx.H"
#include         "stdio.h"
#include  "math.h"
#include  "LQ12864.h"
#include        "img.h"
//#include  "DataScope_DP.h"

/***************************包含用户函数***************************/
#include "Sys_Init.h"
#include "Sys_Basic.h"
#include "Sys_Monitor.h"
#include "Sys_IO.h"
#include "Sys_Sample.h"
#include "Sys_Control.h"
#include "Sys_Para.h"
#include "user_menu.h"

#endif

改上面红的代码绿色为对应的代码,选择性编译,配不同屏和不同版本硬件程序,可以编译成三种程序,一个程序可配多种硬件
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:363
  • 最近打卡:2026-04-30 06:16:54
已绑定手机

1

主题

26

回帖

1401

积分

金牌会员

积分
1401
发表于 2026-4-21 16:42:05 | 显示全部楼层
Sys_Sample.c 逐行超详细解释(51 单片机 / 嵌入式 采样程序)
我给你逐行、逐句、逐函数彻底讲透,你是新手也能完全看懂。
这份代码是电烙铁温控的采样核心:采集电源电压、室温、烙铁温度,带滤波 + 查表。
0. 文件开头(版权 / 版本)
c
运行
/*********************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2017-2018, XinJiang University. All right reserved
*
* 文件名                :        Sys_Sample.c
* 描述                 :        系统采样
*
* 版本                        :        V3.3.4
* 作者                        :        王志浩
* 日期                        :        2017-10-22
*
* 以下全部程序之著作权归属新疆大学所有...
**********************************************************************************/
解释:
这是注释,不参与程序运行。
作用:记录文件用途、作者、版权、版本。
1. 头文件 + 全局变量
c
运行
#include "config.h"
解释:
引入配置文件,里面定义了 u8 u16 ADC通道 PWM 等。
c
运行
float RoomTemp = 25.0f;
解释:
全局浮点变量,存储当前室温,默认 25℃。
c
运行
float VCCVoltage = 0.0f;
解释:
全局浮点变量,存储电源电压(24V)。
2. 中值滤波函数(采样降噪)
c
运行
static u16 mid_filter(void)
解释:
静态函数,只能本文件用。
功能:多次采样求平均,过滤噪声。
c
运行
{
        u16        sum = 0;
解释:定义 16 位变量,用来累加采样值。
c
运行
        u8 temp;
解释:循环用的 8 位变量。
c
运行
        for(temp = 0; temp < NUM; temp++)
        {
                sum += Get_ADC10bitResult(ADC_IRON);
        }
解释:
循环采样 NUM 次 烙铁温度 ADC 值,全部累加到 sum。
c
运行
        return(sum >> DIV);
}
解释:
sum >> DIV = 右移 DIV 位 = 除以 2^DIV
用移位代替除法,单片机运行更快。
3. 读取 24V 电源电压
c
运行
float GetVoltage(void)
{
        return (float)Get_ADC10bitResult(ADC_VCC) / 5550.0f * (float)FAC_DATA_Table.Adjust_s.Voltage;
}
解释:
读取电源电压通道 ADC 值
除以 5550 归一化
乘以校准系数,得到真实 24V 电压值
返回浮点型电压
4. NTC 室温对照表(-10℃ ~ 50℃)
c
运行
unsigned int code NTCTAB[61] =
{
        324,318,...55   //共61个值
};
解释:
code = 存在单片机ROM(程序区),不占 RAM。
数组含义:
下标 0 → -10℃
下标 1 → -9℃
...
下标 60 → 50℃
数值是 NTC 热敏电阻对应的 ADC 值。
5. 读取室温(二分法查表)
c
运行
float GetRoomTemp(void)
{
        u16 temp=0;
        unsigned char det = 60,head = 0,tail = 60,mid = 0;
解释:
head:表开头(-10℃)
tail:表结尾(50℃)
mid:中间值
det:差值
c
运行
        temp = Get_ADC10bitResult(ADC_ROOMTEMP);
解释:读取室温 NTC 的 ADC 值。
c
运行
        if(temp >= NTCTAB[head])
        {
                return -10.0f;
        }
解释:
ADC 值比 -10℃ 还大 → 温度 ≤ -10℃
c
运行
        else if(temp <= NTCTAB[tail])
        {
                return 50.0f;
        }
解释:
ADC 值比 50℃ 还小 → 温度 ≥ 50℃
c
运行
        else
        {
                while(det > 1)
                {
                        mid = (head + tail)/2;

                        if(temp > (NTCTAB[mid]))
                        {
                                tail = mid;
                        }
                        else
                        {
                                head = mid;
                        }
                        det = tail - head;
                }
解释:
二分法快速查表,找到当前 ADC 值对应的温度下标。
c
运行
                return ((float)(head-10)  / 100.0f * (float)FAC_DATA_Table.Adjust_s.Temp);
        }
}
解释:
head 是温度下标
head -10 就是真实温度(0→-10℃,10→0℃,60→50℃)
做精度校准
返回室温浮点值
6. 读取烙铁温度(核心温控函数)
c
运行
float GetIronTemp(unsigned char num)
解释:
输入:烙铁头编号(1-4)
输出:烙铁温度(float)
c
运行
{
        u16 temp=0;
        unsigned char det = 6,head = 0,tail = 6,mid = 0,i=0;
解释:二分法查表变量。
c
运行
        PWM.Run = Disable;
        IRON = 0;
解释:
关 PWM 加热 → 关烙铁
防止加热时干扰 ADC 采样,必须先断电再采温度。
c
运行
        temp = mid_filter();
解释:调用滤波函数,采平均 ADC 值。
c
运行
        if(temp < FAC_DATA_Table.Heater_Tip[num-1][tail])
        {
                while(det > 1)
                {
                        mid = (head + tail) / 2;

                        if(temp < (FAC_DATA_Table.Heater_Tip[num-1][mid]))
                        {
                                tail = mid;
                        }
                        else
                        {
                                head = mid;
                        }
                        det = tail - head;
                }
解释:
同样二分法查表,找到烙铁温度对应的区间。
c
运行
                return RoomTemp + 100 * head  + ((temp - ...) * 100 / (...));
        }
解释:
线性插值计算精准温度
公式 = 室温 + 100℃档位 + 插值小数温度
最终得到真实烙铁温度。
c
运行
        else
        {
                return 599.0f;
        }
}
解释:
超出温度表范围 → 直接返回 599℃(最高温)
🔥 整份代码一句话总结
这是电烙铁控制器的采样核心:
采 24V 电压
采室温(NTC + 二分查表)
采烙铁温度(关加热→滤波→二分查表→插值算精准温度)
全部给温控逻辑使用
你最需要记住的 4 个关键点
mid_filter() = 多次采样求平均,降噪
NTCTAB[] = 室温 ADC 对照表
二分法 = 快速查表,不浪费 CPU
读烙铁温度前必须 关加热(IRON=0),否则采样不准
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-5-1 10:33 , Processed in 0.119458 second(s), 78 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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