news 2026/9/29 2:19:24

51单片机实现智能花盆灌溉系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
51单片机实现智能花盆灌溉系统

1. 项目概述:为什么一个51单片机就能管好一盆花?

你可能在淘宝上见过那种带LED屏、能连手机App的“智能花盆”,价格动辄两三百。但真正拆开看,里面跑的很可能就是一块不到五块钱的STC89C52RC——没错,就是那个被高校电子实验课用到发亮、被无数毕业设计反复蹂躏的51单片机。它没有Wi-Fi模块,不跑Linux,内存只有几百字节,却能把土壤湿度、环境温度、光照强度这些参数稳稳抓在手里,再精准控制水泵开关、LED补光灯亮灭、蜂鸣器报警,完成一套闭环灌溉逻辑。这不是炫技,而是工程思维的落地:用最成熟、最透明、最易调试的硬件平台,解决一个真实存在的小问题——人不在家时,花别渴死。

这个项目的核心关键词非常清晰:51单片机是大脑,智能花盆是应用场景载体,灌溉系统是功能落点。它不追求云端同步或AI识别植物种类,而是聚焦在“感知—判断—执行”这个最小闭环上。对初学者来说,它是理解嵌入式系统工作流的黄金入口;对DIY爱好者而言,它是可触摸、可修改、可扩展的实体作品;对园艺新手来讲,它是一套看得见、摸得着的“植物保姆”。我做过不下二十个基于51的毕业设计辅导,发现凡是能把这个花盆做通的同学,后续学STM32、做物联网节点,上手速度明显快一倍——因为底层时序、IO驱动、ADC采样、定时器中断这些硬核概念,全都在浇水这件事里扎扎实实练了一遍。它不是玩具,而是一块“嵌入式能力试金石”。

2. 整体架构与方案选型:为什么不用ESP32,非选51?

2.1 系统分层设计:从物理层到逻辑层的四层结构

整个系统不是把传感器和水泵随便焊在一起就完事,而是严格按嵌入式开发惯例划分为四层:

  • 感知层:负责采集原始数据。这里用了三类传感器——YL-69土壤湿度传感器(模拟量输出)、DS18B20数字温度传感器(单总线协议)、BH1750光照强度传感器(I²C接口)。注意,这三种通信方式在51上都必须手动“软实现”:DS18B20的微秒级延时、BH1750的I²C起始/停止信号、YL-69的ADC采样稳定性,全是考验你对51时钟周期和IO翻转精度的理解。

  • 控制层:即51单片机本体。我们选用STC89C52RC,原因很实在:它有8K Flash、512字节RAM、3个16位定时器、全双工串口,还支持ISP在线编程——意味着你不用买专用烧录器,一根USB转TTL线就能改程序。对比那些标榜“高性能”的新芯片,51的优势在于资料多、例程全、出错时能一眼看出哪条汇编指令卡住了。我在调试一个光照阈值误触发的问题时,直接用Keil的Memory Window查看P1口寄存器状态,3分钟定位到是BH1750读取后没清中断标志位,这种“裸眼看寄存器”的能力,在高级芯片上反而难实现。

  • 执行层:把决策变成动作。这里包含两个关键部件:5V微型直流水泵(带自吸功能),以及ULN2003达林顿阵列驱动芯片。为什么不用MOSFET?因为水泵启动电流峰值可达300mA,而51的IO口灌电流极限只有15mA。ULN2003内部集成续流二极管,能直接吸收水泵关断时产生的反向电动势,省掉外接二极管的麻烦。实测下来,用P2.0口控制ULN2003的IN1脚,OUT1接水泵正极,负极接地,整个驱动电路焊在洞洞板上,连续运行两周无发热异常。

  • 交互层:让人知道系统在干什么。我们用4位共阳数码管(带TM1650驱动芯片)显示当前土壤湿度百分比,用3个LED分别指示“缺水”(红)、“正常”(绿)、“过湿”(黄),再加一个有源蜂鸣器用于低电量或故障报警。这里有个细节:数码管显示不能占太多CPU时间,所以采用动态扫描+定时器中断方式,每2ms刷新一位,人眼完全看不出闪烁,而主循环可以专心处理传感器数据。

2.2 关键器件选型背后的硬道理

很多人看到“51单片机”就默认用ADC0804这类老式AD芯片,其实大可不必。STC89C52RC自带8路10位ADC(虽然精度一般,但对土壤湿度这种非精密测量完全够用),只需配置P1口为模拟输入模式,再调用内置AD转换函数即可。我试过用外部ADC和内置ADC做对比测试:在相同土壤样本下,两者读数偏差不超过3%,但内置方案节省了至少5个外围元件和3cm² PCB面积。

另一个常被忽视的点是电源管理。整个系统由12V/1A开关电源供电,但51、传感器、数码管、水泵各自需要不同电压:51和数码管要5V,DS18B20和BH1750要3.3V,水泵要6~12V。如果全用7805线性稳压,发热会非常严重。我的方案是:12V先经LM2596降压模块稳到6V供水泵;6V再经AMS1117-3.3稳压到3.3V给数字传感器;最后用另一路AMS1117-5.0给51和数码管供电。这样三路隔离,互不干扰。有次水泵启动瞬间导致数码管乱码,查了半天才发现是3.3V和5V共地路径上存在压降,后来在两地之间加了10μF钽电容才解决。

2.3 软件逻辑框架:状态机才是灌溉系统的灵魂

灌溉不是简单“湿度<30%就开泵”,而是典型的有限状态机(FSM)应用。我把整个流程拆成5个状态:

  • 待机态(IDLE):系统上电后首先进入此态,只做基础初始化(IO口配置、定时器启动、数码管清屏),不读传感器。
  • 采样态(SAMPLING):启动ADC采集土壤湿度,同时读取DS18B20和BH1750数据,所有数据存入全局结构体。
  • 判断态(JUDGING):根据预设阈值做决策。比如湿度<25%且温度>15℃且光照>50lux,才进入灌溉准备;若湿度<15%,则跳过光照判断,直接强制灌溉——这是防止夏季暴晒导致土壤板结干裂的保护逻辑。
  • 执行态(ACTUATING):控制ULN2003打开水泵,同时启动灌溉计时器(比如持续15秒)。期间持续监测湿度变化,一旦达到45%,立即停泵——避免过量灌溉。
  • 恢复态(RECOVERING):泵停后进入此态,关闭所有执行器,点亮绿色LED,数码管显示“OK”,并等待下次采样周期(默认30分钟)。

这个状态机用switch-case实现,每个case里只做一件事,绝不混杂。好处是逻辑清晰、易于调试、方便后期加功能。比如想加“雨天自动暂停灌溉”,只需在JUDGING态里加一行“if (rain_sensor == HIGH) goto IDLE;”,其他状态完全不动。

3. 核心模块详解与实操要点

3.1 土壤湿度检测:模拟信号里的陷阱与对策

YL-69传感器输出的是0~3V模拟电压,对应土壤湿度0~100%。但实际使用中,它有两个致命缺陷:一是电极容易氧化导致读数漂移,二是输出信号受电源电压波动影响极大。我最初直接接51的P1.0口做ADC,结果早上读数75%,下午同一盆土变成52%,折腾两天才发现是电源纹波太大。

解决方案分三层:

  • 硬件滤波:在YL-69输出端串联1kΩ电阻,再并联10μF电解电容到地,构成RC低通滤波器,截止频率约16Hz,能有效滤除工频干扰和水泵启停噪声。

  • 软件校准:每次上电时,先将传感器探头悬空(模拟完全干燥),读取ADC值记为DryValue;再将探头浸入纯净水(模拟饱和),读取ADC值记为WetValue。之后所有实时读数都按公式换算:Humidity = 100 - (ADC_Read - DryValue) * 100 / (WetValue - DryValue)。这个动态校准比固定阈值靠谱得多,尤其适合不同土壤类型(沙土、黏土、营养土)。

  • 采样策略:不单次采样,而是连续采样5次,去掉最大最小值后取平均。更关键的是,每次采样前让P1.0口先输出高电平100ms,给传感器电极一个“唤醒脉冲”,减少极化效应。这部分代码我封装成uint8_t GetSoilHumidity(void)函数,调用一次返回0~100整数,主程序完全不用关心底层细节。

提示:千万别用万用表直接测YL-69输出端电压来标定!因为万用表内阻极大,会改变传感器负载特性。正确做法是用示波器看波形,或用51自身ADC读取后通过串口打印出来比对。

3.2 温度与光照协同判断:为什么单靠湿度不够?

很多初学者以为“湿度低=该浇水”,结果把喜湿的绿萝浇成了烂根。真正的智能在于环境协同判断。我们引入DS18B20和BH1750,不是为了凑数,而是构建一个三维决策空间:

  • 温度补偿:植物蒸腾速率随温度升高而加快。当DS18B20读数>28℃时,系统自动将湿度报警阈值从25%下调到20%;反之,若温度<10℃,则上调至30%。这个动态阈值用查表法实现,定义const uint8_t TempCompTable[10] = {30,30,28,28,25,25,22,22,20,20};,索引为摄氏度整数部分,既省RAM又快。

  • 光照联动:BH1750输出单位是lux,但植物对光的需求不是线性的。我实测发现,当光照<50lux(阴天室内),即使湿度35%,绿萝也基本不蒸腾,此时灌溉应延迟;而光照>500lux(晴天窗边),湿度40%就该预警。因此在JUDGING态里,判断逻辑是:(humidity < HumidityThresh[light_level]) && (temp > 15),其中HumidityThresh[]是预设的光照等级阈值数组。

  • 防误触发机制:为避免短暂阴影(如人走过)导致误判,所有传感器数据必须连续3次采样达标才触发状态跳转。比如湿度连续3次<20%,才从SAMPLING进入JUDGING。这个“防抖”逻辑用一个计数器变量实现,比加延时函数更可靠。

3.3 水泵驱动与保护:小电流如何安全驱动大负载

ULN2003是这个项目里最值得细说的芯片。它内部是7组达林顿管,每组最大驱动电流500mA,完全满足小型水泵需求。但接线有讲究:

  • 输入端:P2.0口接ULN2003的IN1,必须加10kΩ上拉电阻到5V。因为51的P2口内部无上拉,悬空时电平不确定,曾导致水泵莫名启停。

  • 输出端:OUT1接水泵正极,水泵负极直接接地。注意!ULN2003的COM引脚必须接水泵电源正极(这里是6V),否则内部续流二极管无法工作,水泵关断时产生的反向电动势会击穿芯片。

  • 保护措施:在水泵两端并联一个1N4007二极管(阴极接正极,阳极接负极),作为第二道防线;在ULN2003的VCC引脚(第8脚)和地之间加100μF电解电容,抑制电源突变。

实操中最大的坑是“水泵启停噪音干扰ADC”。现象是:一开泵,土壤湿度读数就乱跳。根源在于水泵电机是感性负载,启停瞬间产生宽频电磁干扰,耦合进ADC参考电压。解决方法有三:第一,ADC参考电压不用VCC,改用独立的2.5V基准源(如TL431);第二,ADC采样避开水泵动作窗口,即在泵停稳100ms后再启动ADC;第三,PCB布线时,水泵电源线远离P1口走线,且用地平面隔离。我最终采用第二+第三种组合,成本最低效果最好。

3.4 人机交互设计:让数码管和LED讲人话

4位数码管用TM1650驱动,好处是节省IO口——仅需SDA/SCL两根线(模拟I²C),比传统8位并行驱动少占6个IO。但TM1650有个隐藏特性:它内部有显示缓存,写入数据后会自动刷新,无需CPU干预。这意味着主循环可以放心去做传感器处理,显示任务交给TM1650自己完成。

具体操作流程:

  1. 初始化TM1650:发送0x24(设置亮度为4级)、0x81(开启显示)、0xE0(设置地址自动加);
  2. 显示湿度:将湿度值拆成千百十个位,查七段码表(const uint8_t SegCode[10] = {0x3F,0x06,0x5B,...}),依次写入地址0x00~0x03;
  3. 动态更新:每2秒调用一次显示函数,避免频繁写总线。

LED指示灯则采用“语义化编码”:红灯常亮=缺水待灌溉,绿灯常亮=状态正常,黄灯慢闪(1Hz)=土壤过湿警告,红灯快闪(5Hz)=系统故障(如传感器断线)。这种设计让用户不用看数码管就能快速掌握状态,特别适合放在办公室隔断或卧室床头。

注意:所有LED都必须串联限流电阻。实测2mA电流足够点亮贴片LED,所以统一用2.2kΩ电阻(5V供电下电流≈2.3mA),既省电又延长LED寿命。

4. 实操过程与完整代码实现

4.1 硬件搭建步骤:从面包板到洞洞板的演进

整个硬件搭建分三个阶段,每个阶段都有明确目标:

  • 阶段一:面包板验证(1天)
    目标是验证各模块单独工作是否正常。先不接水泵,只连YL-69、DS18B20、BH1750和数码管。用Keil编写最简程序:上电后每2秒读一次湿度,通过串口打印到电脑(波特率9600)。这一步确认ADC、单总线、I²C通信全部OK。常见问题:DS18B20读数为0xFF,一般是上拉电阻没接(4.7kΩ到5V);BH1750无响应,检查I²C地址是否为0x23(默认)。

  • 阶段二:洞洞板焊接(2天)
    将验证成功的电路焊到洞洞板。重点注意:电源线用粗导线(≥0.3mm²),信号线尽量短且远离电源线;ULN2003的COM脚必须接到水泵电源正极,不是5V;所有芯片的地线先汇到一点,再用粗线接到电源地。我焊完第一次通电,数码管全亮但无数字,查了半小时发现是TM1650的VDD和GND焊反了——洞洞板没有丝印,全靠自己画图,这种低级错误新人几乎必踩。

  • 阶段三:外壳整合(1天)
    用亚克力板激光切割一个长方体盒子(15×10×8cm),底部开孔走线,侧面开窗露数码管。关键技巧:水泵进水管用硅胶软管,出水口接一个带小孔的塑料喷头,让水流分散不冲刷土壤;传感器探头用热熔胶固定在花盆侧壁,深度距土表3cm,避开根系密集区。最后用DC插座引出电源线,整个系统变成一个可移动的独立设备。

4.2 主程序框架与关键函数解析

以下是Keil C51环境下核心代码框架(已精简注释,保留主干逻辑):

#include <reg52.h> #include "intrins.h" #include "ds18b20.h" #include "bh1750.h" #include "tm1650.h" #define ADC_CHANNEL 0 // P1.0 for YL-69 sbit PUMP = P2^0; sbit LED_RED = P3^0; sbit LED_GREEN = P3^1; sbit LED_YELLOW = P3^2; typedef struct { uint8_t humidity; uint8_t temperature; uint16_t light; } SensorData; SensorData g_Sensor; uint8_t g_State = IDLE; uint16_t g_IrrigateTime = 0; // ms counter void main() { InitSystem(); // 初始化IO、定时器、ADC等 while(1) { switch(g_State) { case IDLE: g_State = SAMPLING; break; case SAMPLING: ReadAllSensors(); g_State = JUDGING; break; case JUDGING: if (ShouldIrrigate()) { g_State = ACTUATING; PUMP = 0; // ULN2003低电平导通 LED_RED = 0; LED_GREEN = 1; LED_YELLOW = 1; } else { g_State = RECOVERING; } break; case ACTUATING: if (++g_IrrigateTime >= 15000) { // 15s PUMP = 1; g_IrrigateTime = 0; g_State = RECOVERING; } break; case RECOVERING: DelayMs(30000); // 30s wait g_State = SAMPLING; break; } DisplayHumidity(g_Sensor.humidity); UpdateLEDs(); } } // 关键函数:土壤湿度读取(含校准与滤波) uint8_t GetSoilHumidity(void) { uint16_t adc_sum = 0; uint16_t adc_val[5]; for(uint8_t i=0; i<5; i++) { ADC_CONTR = 0x80 | ADC_CHANNEL; // 启动ADC _nop_(); _nop_(); _nop_(); while(!(ADC_CONTR & 0x10)); // 等待转换完成 adc_val[i] = ADC_RES << 2 | ADC_RESL; DelayMs(10); } // 去极值平均 uint16_t max=0, min=0xFFFF; for(uint8_t i=0; i<5; i++) { if(adc_val[i] > max) max = adc_val[i]; if(adc_val[i] < min) min = adc_val[i]; } for(uint8_t i=0; i<5; i++) { if(adc_val[i]!=max && adc_val[i]!=min) adc_sum += adc_val[i]; } uint16_t adc_avg = adc_sum / 3; // 动态校准 return 100 - (uint8_t)((adc_avg - g_DryVal) * 100 / (g_WetVal - g_DryVal)); }

这段代码的关键在于:所有耗时操作(如ADC转换、DS18B20读取)都用阻塞式延时,因为51资源有限,加RTOS反而增加复杂度。但延时函数必须精确——我用_nop_()内联汇编实现1us级延时,再组合成毫秒函数,确保DS18B20的60us复位脉冲分毫不差。

4.3 参数整定与现场调试技巧

参数整定不是靠理论计算,而是实测+经验。我记录了三周的调试日志,总结出几条铁律:

  • 湿度阈值:沙质土设定20%~45%,黏土设定25%~50%,营养土设定15%~40%。没有万能值,必须针对你的花盆土壤实测。方法是:用手指插入土中2cm,感觉微潮时用传感器读数,记为“舒适区上限”。

  • 灌溉时长:15秒是起点,但要看花盆大小。直径15cm的小盆,15秒足够渗透;直径25cm的大盆,需延长到25秒。判断标准是:灌溉结束后1小时,用手指探入土中3cm,应有明显湿润感,但无积水。

  • 采样间隔:30分钟是平衡点。太短(如5分钟)会导致水泵频繁启停,缩短寿命;太长(如2小时)可能错过土壤快速失水期(如空调房中午)。我试过用光照强度动态调整间隔:光照>500lux时缩至15分钟,<100lux时延至60分钟。

  • 抗干扰调试口诀:“一地、二容、三远离”。一地:所有地线单点汇聚;二容:电源入口加100μF电解+0.1μF瓷片;三远离:传感器线远离水泵线、远离变压器、远离手机。

5. 常见问题与排查技巧实录

5.1 典型故障速查表

故障现象可能原因排查步骤解决方案
数码管全暗TM1650未供电或I²C通信失败用万用表测VDD是否5V;用逻辑分析仪抓SDA/SCL波形检查电源极性;重焊SDA/SCL线;确认I²C地址0x23
湿度读数恒为0YL-69电源未接或ADC通道配置错误测YL-69输出端电压;查Keil中ADC_CONTR寄存器值接通12V电源;设置ADC_CONTR=0x80 | 0x00
DS18B20读数-127℃单总线无上拉或时序错误测DQ线空闲电平是否5V;用示波器看复位脉冲加4.7kΩ上拉电阻;检查_delay_us()函数精度
水泵不启动ULN2003 COM脚未接电源或P2.0口损坏测ULN2003 IN1脚电平;测OUT1脚对地电压COM接水泵正极;更换P2口或改用P2.1
系统运行几分钟后死机电源功率不足或ADC溢出测12V电源空载/带载电压;监控ADC_RES寄存器换12V/2A电源;在ADC读取后加if判断防溢出

5.2 我踩过的五个深坑及独家解法

坑一:DS18B20在低温下响应变慢
现象:冬天室温10℃时,DS18B20转换时间从750ms延长到1.2s,导致主循环卡死。
解法:在ReadTemperature()函数里加超时保护——启动转换后,用定时器中断计时,超过1.5s强制退出并返回上次有效值。代码片段:

bit g_ADC_Timeout = 0; void T0_ISR() interrupt 1 { static uint16_t cnt = 0; cnt++; if(cnt > 1500) { // 1.5s @ 1ms/tick g_ADC_Timeout = 1; cnt = 0; } } // 在读取函数中: while(!DS18B20_Presence()) { if(g_ADC_Timeout) break; }

坑二:BH1750在强光下数据溢出
现象:正午阳光直射时,BH1750返回0xFFFF,导致光照判断失效。
解法:BH1750有连续高分辨率模式(0x10)和连续低分辨率模式(0x13),后者量程扩大4倍。我在初始化时加判断:若首次读数>30000,则自动切换到低分辨率模式,并重新校准阈值。

坑三:数码管显示数字跳变
现象:湿度显示在“35”和“36”间不停闪烁。
解法:不是硬件问题,而是主循环里DisplayHumidity()和ReadAllSensors()并发访问g_Sensor.humidity变量。加入临界区保护:

#define CRITICAL_SECTION_START EA=0; #define CRITICAL_SECTION_END EA=1; // 使用时: CRITICAL_SECTION_START g_Sensor.humidity = GetSoilHumidity(); CRITICAL_SECTION_END

坑四:水泵停机后土壤湿度读数飙升
现象:泵一停,湿度值瞬间从20%跳到60%,持续10秒才回落。
解法:这是水泵水流冲击导致土壤局部饱和的假象。在ACTUATING态结束后,不立即采样,而是延时30秒再进入SAMPLING,让土壤水分自然扩散均匀。

坑五:电池供电时续航极短
现象:用12V/2000mAh锂电池,只能工作8小时。
解法:51本身功耗不大,问题出在数码管和LED常亮。改用“事件驱动显示”:只在状态变化或用户按键时刷新数码管,其余时间保持最后显示;LED改为呼吸灯模式(PWM调光),亮度降到30%仍清晰可见,整机功耗从120mA降至25mA,续航提升至36小时。

6. 扩展思路与进阶方向

这个51智能花盆绝不是终点,而是嵌入式学习的起点。基于现有硬件,你可以用极低成本实现三个实用升级:

  • 无线远程监控:在P3.0/P3.1引脚加MAX3232芯片,接HC-05蓝牙模块。手机APP通过串口发送“GET_DATA”指令,单片机回传湿度/温度/光照JSON字符串。我实测传输距离达15米(无遮挡),代码只需增加20行AT指令解析。

  • 多盆协同管理:用51的串口扩展SP3485芯片,构建RS-485总线,最多挂载32个花盆节点。主机(另一块51)轮询各节点,统一调度灌溉。难点在于485收发使能控制,我用P1.7口做DE/RE控制,配合定时器精确切换。

  • 太阳能供电改造:拆除12V电源,改用6V/5W太阳能板+TP4056充电模块+18650电池。关键是电源管理——当光照充足时,优先给电池充电,多余电量直接供系统;阴天时切至电池供电。需要增加光敏电阻检测光照强度,用P1.2口读取。

最后分享一个小技巧:所有传感器探头在长期使用后都会结盐垢,导致灵敏度下降。我的维护方法是每月用白醋浸泡10分钟,再用软毛牙刷轻刷,晾干后校准一次Dry/Wet值。坚持三年,我的第一版花盆至今还在办公室窗台上兢兢业业地工作着,屏幕上的数字跳动如初——它提醒我,真正的智能不在于芯片多先进,而在于系统能否在真实环境中稳定运行,像植物一样,沉默而坚韧。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 2:18:11

Stable Diffusion三大核心模块:VAE、CLIP与U-Net原理解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 2:17:38

Ubuntu CUDA环境配置:驱动、Toolkit、cuDNN与框架版本

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 2:16:22

解决 PyInstaller 打包时的 tuple 索引异常

在使用 PyInstaller 对 PyQt 应用程序进行打包时&#xff0c;遇到了 IndexError: tuple index out of range 错误。错误信息显示在 dis.py 文件中&#xff0c;涉及 _get_const_info 方法&#xff0c;具体错误如下&#xff1a; File "H:\MyGitProject\GUI\PyQt6\PyQt-Fluen…

作者头像 李华
网站建设 2026/9/29 2:15:12

语言模型的上下文表示与下一个词预测

同一句“苹果”出现在水果介绍和手机评测中,后面可能接不同的词。语言模型怎样依据前文改变预测?读完本文,可以统计简单语料中的条件概率,检查未知上下文,并解释上下文窗口的作用。 分词、词向量和主题模型分别解决不同问题。语言模型进一步关注序列:给定已出现的内容,…

作者头像 李华