
简介这是一份面向九齐NY8系列单片机开发者的全型号例程合集覆盖NY8A、NY8B、NY8T等主流子系列具体包括NY8A051D、NY8A053D、NY8B062D、NY8BE62D等数十款常见芯片适合从入门到进阶的嵌入式工程师按需查阅。资源共112个文件包含40个h头文件、17个nysln工程文件、17个cb配置文件、17个naprj工程文件、9个asm汇编源码、8个c源码及说明文档压缩包仅335KB轻量易用。目录按芯片型号分层组织便于快速定位初始化、GPIO控制、定时器、PWM、ADC、UART、I2C、SPI等外设驱动示例所有例程均提供标准C语言与传统汇编两种实现兼顾不同开发习惯与项目需求。配套include文件夹包含常用头文件与宏定义NY8 C文件夹集中存放C语言工程模板History.txt记录版本更新说明并附卸载程序便于环境清理。目前已有50人学习下载适合需要对照真实工程快速上手九齐单片机开发的读者。 好久没在博客里写这类实战总结了。正好最近把九齐NY8系列单片机的例程库从头到尾整理了一遍从NY8A、NY8B到NY8T的主流型号C语言和汇编两套代码都重新捋了捋踩了不少坑也补了不少之前没搞清楚的细节。这篇就当是自己的一个项目复盘顺便把能直接拿来抄作业的东西都放出来给正在用九齐或者准备从51、STM32转过来的朋友做个参考。先说说这份合集到底是什么。九齐Nyquest的NY8系列是一类8位内核的OTP/MTP单片机主打小家电、消费电子、玩具、灯控这类成本敏感、功能不算复杂的场景一颗芯片的价格通常在几毛到一两块钱之间资源也从1K ROM、64字节RAM这种“极小杯”到4K ROM、256字节RAM的“中杯”不等。我这份例程合集不搞花架子就是把每个型号的GPIO、定时器、中断、PWM、ADC、睡眠唤醒这些基础外设分别用C和汇编写一遍再加几个完整的小应用比如按键长按短按、呼吸灯、一路PWM调光、电池电压检测全是实际项目里天天用的东西。内容价值一句话概括你不用再从零啃数据手册一个个试寄存器直接把代码拉过来改改引脚和参数就能跑。这套合集适合谁看呢一类是刚接触八位单片机、想低成本做个小产品的硬件工程师另一类是常年用ST、NXP这类资源丰富MCU忽然被项目逼着换“资源抠门”方案的软件工程师。后者最容易栽跟头因为习惯了堆库函数、多开几个外设到NY8上会非常不适应。这篇帖子我不打算讲太多高深理论主要聊整理这套合集时的思路、代码组织方式以及那些数据手册不会写、但实际调试一定会遇到的教训。1. 我为什么攒了这份NY8例程合集它到底能干什么1.1 九齐NY8系列是一颗什么样的单片机把NY8系列放在整个单片机生态里看它的定位和经典的51单片机很像但比51更极端。51至少还有比较完善的Keil生态和众多教学资源而九齐属于台湾系八位机的一大分支同类的还有辉芒微、应广这类核心卖点就是一个字省。省到引脚最少的型号只有6个脚省到内部RC振荡器可以直接跑省到几个分钱的成本差异都能决定项目能不能量产。当然省也会有代价——没有昂贵的调试器资料相对分散开发环境也比较小众代码写不好还会出现各种奇怪的复位、跑飞现象。NY8系列的内部结构并不复杂CPU核心是单周期的精简8位RISC架构大部分指令一条周期就能执行完速度在同级别里算快的。片上集成的东西也很务实一路或两路定时器、若干路PWM、AD转换、比较器、上电复位、低压检测该有的小件都有唯独没有硬件乘法器、没有DMA这些东西。所以拿到这颗芯片第一件事就是调整心态它不是STM32不要指望外设自动接管一切很多时候连一个简单的延时都得自己算周期。1.2 合集覆盖的型号与内容构成这份合集一开始只写了NY8A051D一个型号的例程后来因为项目需要又把手上的NY8B062D、NY8T系列等几颗料也拉了进来顺便建了一个统一的代码目录结构。最终内容大概这样的型号系列覆盖例程语言版本典型封装主要用途NY8A系列GPIO/定时器/中断/ADC/低功耗C 汇编SOT23-6、DIP8、SOP8低成本小家电、玩具、灯控NY8B系列上述全部 PWM/比较器/多IO驱动C 汇编SOP14、SOP16、DIP14功能稍复杂的家电面板、风扇、充电器协议NY8T系列基础例程 触摸或特殊封装适配以C为主SOP8、SOP16触摸按键、对成本极度敏感的量产方案每个型号下都放着一套最小工程模板不管是C还是汇编拿过去直接改就能用。另外我还在顶层放了一个doc/文件夹里面是我整理过的各型号数据手册的关键页扫描笔记包括寄存器映射、中断向量表、封装引脚功能复用表。这玩意儿在调试的时候救了我好几次因为九齐官网的PDF分得散同一个系列不同型号的数据手册排版还不一样经常翻半天找不到一个寄存器在哪页。2. 选型之前先搞清楚NY8A/NY8B/NY8T的区别2.1 从命名规则看资源配置九齐这颗料的型号命名相当有规律看懂之后选型基本不用问代理。以NY8A051D为例NY8是系列名A是大类051代表具体的ROM/RAM配置档位最后的D一般是封装或版本后缀。不同字母开头的大类定位差异非常明显NY8A系列最入门、最抠资源的行列ROM大多在1K到2K左右RAM几十字节适合代码量千行以内的小控制逻辑。比如一个单按键电子蜡烛、一个闪烁LED胸牌用这个绰绰有余。NY8B系列资源比A系列明显宽松一档IO数量也更多支持的功能更全。如果要做带数码管显示的电饭煲面板、多档位风扇遥控解码这类程序体积稍大的活建议直接从B系列起步。NY8T系列从名字就能看出偏向触控应用。内部会带一些和触摸检测相关的模拟前端做小家电触摸按键比A系列裸用IO扫描稳很多。还有一点容易忽略九齐有不少型号是**OTP一次性可编程**的代码烧进去就改不了了所以调试阶段千万别直接用OTP型号要先选同系列的MTP多次可编程版本或者用带窗口的工程样品。吃过一次亏之后我把所有例程工程都区分了_otp和_mtp两种编译宏就是提醒自己别烧错芯片。2.2 选型思路与适用场景我在整理例程的过程中总结了一套自己的选型顺序分享出来供参考先数引脚需求。先看产品需要多少个IO包括按键、LED、传感器输入、输出驱动管。别只算功能需要的还得算上烧录接口占用的引脚否则画完板子发现烧录口被复用掉了调试时只能干瞪眼。再算程序体积。写C语言的话即便很简单的一个功能编译出来可能也要0.5K以上所以1K ROM的型号只建议做逻辑极其简单的小玩意儿。凡是有串口打印、多级菜单、复杂状态机需求的至少选2K以上。最后看电压和功耗场景。如果产品要电池供电注意选静态功耗低的型号并且要确认是否有真正可用的掉电模式。NY8这颗料在睡眠模式下能跑到微安级别的电流但前提是外部电路不能漏电否则再省电的单片机也白搭。3. C语言例程的核心部分怎么组织3.1 从工程模板到第一盏LED很多从大厂MCU转过来的朋友看到九齐的官方例程会有点懵没有标准外设库没有HAL甚至没有统一的启动文件风格。C语言例程里说白了就是直接和寄存器打交道。我整理例程时的第一件事就是建立一套足够“朴素”且稳定的工程模板。先看GPIO点亮LED这节。NY8系列的端口控制寄存器并不多核心就是方向寄存器、数据寄存器再加上上拉、开漏这些选项。C代码写起来大概是这种感觉// 以NY8B062D为例点亮接在PB0上的LED #include ny8.h void main(void) { // 设置PCON等系统控制寄存器选择内部16MHz RC振荡器 PCON 0x00; // PB0配置为输出方向 PB0 0; // 先输出低电平 _pb0 1; // 某些型号用位操作寄存器需看头文件定义 PB0CON | 0x01; // 配置PB0为IO功能而非其他复用功能 while (1) { // 简单延时注意NY8没有标准库delay for (volatile unsigned int i 0; i 30000; i); PB0 ~PB0; // 翻转电平 } }这里有一个很重要的坑NY8系列没有硬件除法指令也没有标准的delay库函数所有延时基本靠循环计数或者定时器。而循环计数的延时时间又和编译器优化等级强相关volatile关键字不能省否则优化器看到循环体没有实际输出直接就把整个延时循环删掉了程序跑起来LED闪得快到看不清。3.2 定时器、PWM与ADC例程的代码思路定时器在八位机上属于“用了就知道效率差距”的外设。NY8的定时器通常是8位的带有预分频器一两个定时器要同时承担延时、计数、PWM、唤醒计时等多种任务。例程里我一般会用定时器0做时基保持一个软件计数器累加这样主循环和中断都能共享一套时间基准volatile unsigned int systemTick 0; void interrupt(void) { if (T0IF) { T0IF 0; systemTick; } }PWM这块NY8很多型号自带PWM输出模块但通道数有限而且引脚复用关系比较复杂例程里专门做了一个简单的PWM调光案例通过定时器中断维护一个软件PWM把硬件PWM留给出声音或者需要更精准频率的场合。这样做的好处是代码可移植性强换一颗没有硬件PWM的型号也能直接跑缺点是占CPU而且LED调光频率低于1kHz时肉眼看得出闪烁。所以实际产品里如果PWM频率需求固定还是优先用硬件模块。ADC例程就更有意思了。NY8的AD转换结果寄存器宽度不同型号不太一样有的10位有的12位。我用一个结构体把AD相关的寄存器、通道、参考电压配置封装起来每个型号再单独写适配层上层调用时就统一用adc_read(channel)这个函数。这就引入了这套例程里最关键的一个设计原则底层寄存器每家都不同但给应用层的接口尽量统一。后续换芯片应用代码改动量能控制在很小的范围。4. 汇编例程的保留价值与学习路径4.1 为什么还要保留汇编例程现在写八位单片机纯汇编的比例确实越来越低了但我在整理这套合集时坚持每个型号都配一份汇编例程。原因有三个第一NY8这类芯片的C编译器在优化能力上远不如Keil对51的锤炼程度有些时序敏感的操作比如读写单总线温湿度传感器、模拟时序去驱动WS2812这类灯带用C写很容易因为几纳秒级别的时序偏差导致通信失败汇编则能把每条指令的周期算得明明白白第二中断入口、现场保护、启动代码这块不懂汇编的话连startup文件都不敢动出问题只能干着急第三学习任何一款新架构汇编例程是最快理解寄存器-硬件-指令集三者关系的捷径。4.2 中断现场保护与C/汇编混编的注意事项NY8的中断向量通常就一个入口这就意味着所有中断源共用一个中断函数。在C语言里写interrupt关键字的函数时编译器会自动生成入栈出栈代码可一旦涉及汇编和C混编现场保护就得自己盯着。我例程里专门放了一份纯汇编的中断处理骨架核心代码大概长这样; 中断入口 ORG 0x08 ; 中断向量地址 NOP GOTO ISR_Entry ISR_Entry: MOVAR ACC_SAVE ; 保存累加器到自定义RAM备份区 SWAPR STATUS, 0 MOVAR STATUS_SAVE MOVAR PFLAG_SAVE ; 根据标志位跳转到对应中断处理 BCR INT_FLAG ... ; 恢复现场 MOVR STATUS_SAVE, 0 SWAPR STATUS, 0 MOVR ACC_SAVE, 0 RETIE这里的坑主要在于不要轻易在中断里调用C函数因为C函数会假设自己的局部变量空间是干净的如果中断前主程序正好在运行一个更复杂的表达式中断里再调用C函数很可能造成变量覆盖或者栈溢出。汇编例程里解决这个问题的方式很粗暴——中断服务程序只做标志位置位、简单的寄存器备份真正复杂的处理全部放到主循环的轮询里。这个保守策略在资源极小的芯片上是完全正确的稳定压倒一切。5. 从安装到烧录的完整环境搭建过程5.1 工具链选择与工程创建九齐官方主推的集成开发环境是NYPIDE也有不少老工程师还在用较早的IDE版本配合第三方插件。我的建议是直接用官方最新的IDE因为旧版本在Windows 10/11上容易出现驱动签名问题新版本对汇编器和C编译器的集成更顺滑。安装过程不复杂一路默认就行但要注意安装路径最好全英文不要包含空格和中文否则后面编译汇编文件经常报找不到文件。新建工程的时候IDE会要求选择具体型号这一步千万别选错。同一系列不同型号的寄存器定义头文件是不同的选错型号之后编译可能正常通过但烧进去芯片完全不工作。我刚开始整理例程时就在NY8A051和NY8A050之间栽了一次两个型号差异非常小代码烧进NY8A050也能跑但ADC采集值异常排查了好几个小时。工程创建好后C编译器和汇编器会自动生成启动文件。如果是C工程默认会带上一个小启动文件主要做RAM清零、堆栈指针初始化然后再跳转到main。这个启动文件我不建议去动除非你已经完全搞懂了芯片的上电复位流程。5.2 烧录与调试流程烧录这块九齐官方烧录器配合上位机软件使用。OTP芯片烧录是一次性的操作前一定要确认三件事芯片型号选对防止烧录器依赖型号信息做烧录时序控制。烧录座引脚接触良好SOT23-6这类小封装放在烧录座上非常容易虚焊烧录校验失败多半是接触问题而不是芯片坏了。配置位设置正确包括系统时钟、看门狗、低电压复位这些选项。注意配置位的优先级比程序代码高代码里初始化得再好配置位把看门狗设成了永远开启芯片还是会不停复位。让我没想到的是调试过程中用不了在线仿真因为OTP芯片本来就不支持片上调试。所以我的调试手段非常原始用LED、用蜂鸣器、用IO口输出方波接示波器再配合串口或者逻辑分析仪。这套方法虽然土但在资源极小的八位机上反而最可靠。我最常用的招数是测试点翻IO怀疑哪段代码没执行就在那里放一个IO翻转用示波器一看便知。6. 整理和移植这些例程时踩过的坑6.1 高频问题排查速查表整理这套合集最大的价值就是把散落在各个项目里的“灵异事件”集中复盘了一遍。下面这张表是我遇到频率最高的问题直接可以当排查手册用现象可能原因解决思路芯片完全没反应电流几乎为零进入了睡眠模式但唤醒条件不满足检查唤醒引脚配置、看门狗是否关闭、复位脚电平是否被拉死程序偶发跑飞表现是功能突然失效堆栈溢出或中断里调用了重入函数精简中断服务程序主循环里处理一切非实时逻辑定时器时间不准误差远大于晶振偏差预分频器配置错误或循环延时被优化数一遍指令周期或用示波器实测翻转频率再校正参数端口读到的电平不稳定没有配置上拉电阻悬空输入设置内部上拉外部再加一个10k电阻上拉更稳烧录完之后校验失败烧录座接触不良或芯片被静电打坏清洁烧录座加防静电手环用MTP芯片先验证代码上电瞬间IC误动作比如LED亮一下复位时间不够IO默认状态是输入高阻增加上电延时主程序一开始就设好所有IO方向6.2 几个容易翻车、但数据手册不会写的细节第一个是IO口的复用切换。NY8很多引脚是多功能的同一个物理引脚既可以做普通IO又可以接定时器PWM输出。关键在于配置顺序——必须先切到GPIO模式再配置方向否则引脚在切换过程中可能会输出一个意外的电平直接驱动三极管导通、把负载打开半秒钟。那种“上电瞬间电机抖一下”的现象十有八九是这个原因。第二个是掉电模式的唤醒时间。NY8从睡眠到正常运行内部振荡器需要一段稳定时间不同型号差别较大快的几十微秒慢的可能要一两毫秒。如果唤醒之后立刻去采样ADC或者驱动外部设备数据大概率是错的。我的做法是唤醒之后先空转一小段时间让系统时钟稳下来再继续干活。第三个是编译器版本导致的代码差异。同一份C代码在不同版本的IDE里编译出来的指令序列完全不同尤其是涉及到位操作的时候。比如_pb0 1这种位操作有的编译器会编译成BSET这样一条指令有的编译器会转换成“读-改-写”三条指令。如果这个IO口正好同时作为外部中断输入那读改写中间的电平抖动就可能造成误触发。针对这类问题我例程里每条位操作都尽量加注释标明该操作是否为原子操作换编译器版本的时候一定要重点回归测试。最后分享一点个人体会我在整理这套合集的过程中最大的感受就是做小芯片的项目跟做大芯片完全是两种思路。大芯片可以靠资源换开发效率随便写写就能跑而NY8这类单片机更像是在螺蛳壳里做道场每一步都要精打细算。但也正是因为资源少逼着你去把每一个寄存器、每一条指令都吃透写完一个功能之后对整个体系的底层理解会扎实很多。如果你正准备上手九齐NY8系列我建议先从NY8A的C语言GPIO例程跑通再用汇编中断例程把现场保护这段吃透然后挑一个带ADC的B系列型号做一个小项目。等你把这份合集里的代码都过一遍再回头看数据手册就会发现那些原本玄乎的寄存器配置其实都有了清晰的画面感。本文还有配套的精品资源点击获取