已阅读5页,还剩59页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计任务书 专业 年级 班 一、 设计题目 电饭煲控制器二、 主要内容电饭煲控制器有预约功能,有烹饪大米饭、粥、保温、冷饭加热等功能三、 具体要求 1.具体功能大米饭:当达到105时,停止加热,并在15分钟后通过蜂鸣器提示用户。粥:开始加热后,通过测温元件监视锅底温度,使锅底温度保持在99100.5之间(100时停止加热、99时开始加热),此种状态持续20分钟,之后通过蜂鸣器提示用户过程结束。保温:使锅底温度维持在5060之间。冷饭加热:锅底加热至100,使锅底温度保持在99100.5之间(100时停止加热、99时开始加热),此种状态持续5分钟,之后通过蜂鸣器提示用户过程结束。2.定时 用户可以是电饭煲在预约时间(倒计时方式)开始工作,最长预约时长为12小时。3.控制面板四个发光管分别与大米饭、粥、保温、冷饭加热相对应,另一发光管用于区分工作与预约,两位数码管用于预约时间及倒计时。按键有:开始键、功能键、加键、减键。四、 进度安排1、了解任务要求,确定具体方案2、lcd12864液晶屏子程序设计3、DS18B20温度传子程序感器设计4、设计单片机按键功能程序5、根据任务要求编写程序,设计按键电路6、检验设计效果,完善功能五、 完成后应上交的材料电饭煲控制器论文六、 总评成绩指导教师 签名日期 年 月 日系主任 审核日期 年 月 日摘要电饭煲控制器有预约功能,有烹饪大米饭、粥、保温、冷饭加热等功能.。基于stc89c52单片机控制的电饭煲控制器,有lcd液晶屏显示和ds18b20温度检测功能,还有定时工作选择功能。关键字:电饭煲 温度控制 DS18B20 LCD12864 键盘按键目录一、任务分析与设计电路11、总体方案设计11.1、控制方案选择11.2、测温模块控制选择11.3、键盘按键方案选择21.4、显示方案选择21.5、声音模块方案选择31.6、功率元件模块方案选择32、电路设计32.1、控制模块32.2、测温模块62.3、键盘模块102.4、显示模块112.5、声音模块132.6、功率模块14二、软件设计151、程序流程图151.1、主流程图151.2、子流程图171.3、功率元件控制流程图171.4、定时预约工作流程图18三、系统调试分析201、系统硬件调试202、系统软件调试20四、心得体会2058一、任务分析与设计电路1、总体方案设计1.1、控制方案选择 方案:采用STC公司的STC89C52RC。此单片机价格低,资源多,高性价比,应用广泛,无论是从内部构造,还是编程方面,51系列单片机都相对简单容易掌握和使用。 对于本题目而言,由于电饭煲需要实现的功能少,对处理器的要求不高, 使用STC89C52RC不仅可以完全实现对电饭煲的控制,还节约了成本。综合考虑,电饭煲控制器采用STC89C52RC单片机。1.2、测温模块控制选择测温模块采用数字温度传感器DS1820。DS1820是美国DALLAS半导体公司生产的可组网数字式温度传感器,其内部使用了在板(ON-B0ARD)专利技术。全部传感元件及转换电路集成在形如一只三极管的集成电路内。与其它温度传感器相比,DS1820具有以下特性:1. 独特的单线界面方式,DS1820在与微处理器连接时仅需要一条口线即可实现微处理器与DS1820的双向通讯。2.DS1820支持多点组网功能,多个DS1820可以并联在唯一的三在线,实现多点测温。3.DS1820在使用中不需任何外围元键。4.测温范围55125,固有测温分辨率0.5。5.测量结果以9位数字量方式串行传送。由于在本课程设计中,电饭煲的期望温度最高值在数字温度传感器DS1820的量程内,同时,DS1820具有测温系统简单、测温精度高、连接方便、占用口线少等优点。所以,我选用DS18B20温度传感器。1.3、键盘按键方案选择由于在该课程设计中,需要的按键只要四个:开始键、功能键、加键、减键,键盘个数较少,可以用独立式按键电路。所以我选用独立按键电路。1.4、显示方案选择方案一、使用数码管显示。数码管能显示数字,使用方法简单方便,可是显示过于单调。方案二、使用lcd12864液晶屏。lcd12864能清晰显示字符和数字,显示的信息更多。因为数码管只能显示数字,过于单调,而lcd12864能显示汉字和数字,还有各种图案,能更好地进行人机沟通,达到更好的显示效果。综上所述,我选用lcd1286液晶屏。1.5、声音模块方案选择由于在该课程设计中,只需要对工作状态和工作方式的提示,用蜂鸣器产生的bee bee声音即可。1.6、功率元件模块方案选择功率元件的控制通过固态继电器来完成。固态继电器也称作固态开关。是一种由固态电子组成的新型电子开关器件,集光电藕合,大功率双向晶闸管,及触发电路,阻容吸收回路于一体.用来代替传统的电磁式继电器。实现对单相或者三相电动机的正反转控制,或者其他控制无触点无动作噪音。开关速度快无火花干扰和可靠性高等特性。由于单片机学习板配有固态继电器,所以直接选用单片机学习板的继电器作为功率元件模块。2、电路设计2.1、控制模块STC89C52是一个低电压,高性能CMOS8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,STC89C52单片机在电子行业中有着广泛的应用。特点:1、兼容MCS51指令系统2、8kB可反复擦写(大于1000次)Flash ROM;3、32个双向I/O口;4、256x8bit内部RAM;5、3个16位可编程定时/计数器中断;6、时钟频率0-24MHz;7、2个串行中断,可编程UART串行通道;8、2个外部中断源,共8个中断源;9、2个读写中断口线,3级加密位;10、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;11、有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。工作原理:STC89C52为8 位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部界面等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收译码及与主板CPU通信等。主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0P3 为可编程通用I/O 脚,其功能用途由软件定义,如图1-1、1-2所示。图1-1 AT89C52的DIP封装引脚图图1-2 最小系统图2.2、测温模块测温模块采用数字温度传感器DS1820。DS1820是美国DALLAS半导体公司生产的可组网数字式温度传感器,其内部使用了在板(ON-B0ARD)专利技术。全部传感元件及转换电路集成在形如一只三极管的集成电路内。与其它温度传感器相比,DS1820具有以下特性:独特的单线界面方式,DS1820在与微处理器连接时仅需要一条口线即可实现微处理器与DS1820的双向通讯。2.DS1820支持多点组网功能,多个DS1820可以并联在唯一的三在线,实现多点测温。3.DS1820在使用中不需任何外围元件。4.测温范围55125,固有测温分辨率0.5。5.测量结果以9位数字量方式串行传送。DS18B20有两种封装形式,即TO92封装和8-pinSOIC封装。每种封装的样式及引脚排列见图1-3,其引脚功能描述见表1。 图1-3DS18B20的引脚排列序号名称引脚功能描述1GND地信号2DQ数据输入/输出引脚。开漏单总线界面引脚。当被用着在寄生电源下,也可以向器件提供电源。3VDD可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。表1 DS18B20详细引脚功能描述下图是温度检测模块原理如图1-4所示:图1-4 温度检测模块原理图2.3、键盘模块在键盘模块中,我采用独立式按键电路。特点:1)每个键独立地接入一根数据输入线。2)平时所有的数据输入线都连接成高电平;3)当任何一个按键压下时,与之相连的数据输入线被拉成低电平。4)要判断是否有键按下,只要位处理指令即可。独立连接式键盘优点是结构简单、使用方便,但随着键数的增多,所占用的IO口线也增加。该系统的键盘由4个独立键盘构成。键盘的一脚接在单片机的P1.0至P1.4脚上,另外一脚接在电源地上,当有键盘按下时对应的键盘就会有一低电平送到单片机内部。为消除触点式按键开关的机械抖动,单片机内部有程序进行消抖处理,然后确定那一个键盘被按下后来执行程序完成该系统的指定工作。按键键盘原理图如图1-5所示:图1-5 按键图2.4、显示模块显示模块我使用了lcd12864液晶屏。带中文字库的12864是一种具有4位/8位并行、2线或3线串行多种界面方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为12864,内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的界面方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示84行1616点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。其控制方法如图1-7、1-8所示。12864显示电路如图1-6所示:图1-6 12864电路图图1-7 图1-82.5、声音模块该模块使用蜂鸣器。蜂鸣器需要的驱动电流较大(50100mA),由于单片机输出低电平时的驱动电流只有十几毫安,因此要外接一个PNP三极管作为功率驱动器件。当P37口输出低电平时,PNP导通,蜂鸣器正常工作,当当P37口输出高电平时,PNP截止,蜂鸣器暂停工作。原理如图1-9:图1-9蜂鸣器2.6、功率模块功率模块我选用单片机学习板上的固态继电器。如图1-10所示。图1-10 继电器电路图当单片机P36口输出低电平时,BJT管导通,LED9指示灯亮,继电器工作。二、软件设计1、程序流程图系统的软件设计采用结构化和模块化设计的方法,便于程序的编写、调试和排除错误,同时也便于检验和维护。单片机系统的软件程序主要由以下模块组成:初始化主程序、输入及显示、温度采集、功率元件控制。1.1、主流程图如图2-1所示:图2-1 系统主流程图1.2、子流程图如图2-2:图2-2 系统子程序流程图1.3、功率元件控制流程图图2-2子流程图 电饭煲控制系统对电饭煲加热与否需要根据当前锅内温度以及所处的工作模式做出选择。其软件控制流程如下图所示。 控制器先通过温度传感器获得当前锅内温度,根据所处的工作模式,得到需要到达的目标温度。若当前锅内温度小于目标温度,则控制器接通加热盘加热,否则断开加热盘,停止加热。功率元件控制流程如图2-3所示。图2-3 功率元件控制流程图1.4、定时预约工作流程图系统运行后,若按下“开始”按键,系统即可进入定时预约功能状态,表示“时”位的个位数值处于可设定状态,高位默认显示“0”。此时按下“加”键,预定时间的小时数的个位将累加1,如果累加后的数值大于9,高位的数值将自动变为1;若按下“减”键,预定时间的小时数的个位将减去1。 由于本控制系统支持最大定时12小时,当小时数超出12后会溢出为0。即置定时数值时,若当前示数为12,且按下“加”键,则lcd显示的数值由12变为00。预约小时数设定完成后,按下“开始”键,系统则保存用户设定的定时时间并退出定时时间设定状态。随如图2-4所示:图2-4 定时工作流程图三、系统调试分析1、系统硬件调试按照画好的电路图把外围电路接好,主要的自己做了一个独立按键小键盘。而ds18b20温度传感器的接线比较简单,只需3跟线就完成了。2、系统软件调试12864液晶屏的原理比较好理解,不要多长时间就看懂。而ds18b20温度传感器的原理就有点难懂,看了比较久才看懂。但在自己编译过程中,却出现很多错误。比如,系统无法读取ds18b20里面的温度,仔细检查程序后发现在ds18b20读取数据时间那里有错误,时间太短,导致无法读取。在编写主程序时,发现无法返回温度值给单片机,搞了很久都搞不定。后来发现是忘记了在ds18b20子程序那里加入返回函数return,加上return后,终于完成。四、心得体会在看到课程设计的题目后,我就感觉应该是挺好玩的。果然我看到了电饭煲控制器这个题目!以前在家里就修过坏了的电饭煲,可惜没能修好.经过这次的课程设计后,我想我应该能修坏了的电饭煲了!这次课程设计获益良多,既加深了我c语言的知识,又让我学会了lcd12864和ds18b20的使用。而在编程过程中,一个小小的语句错误就会到致程序无法运行,更让我明白谨慎小心的重要性。在最后系统能正常运作时,整个人都有一种成功的飘然.附录程序:主程序#include#include#include#include/#include#define uchar unsigned char#define uint unsigned intsbit k1=P32; /功能按键sbit k2=P33;sbit k3=P34;sbit k4=P35;sbit a1=P10; /按键指示灯sbit b1=P11;sbit c1=P12;sbit c2=P13;uchar code m1=煮饭;uchar code m2=煮粥;uchar code m3=保温;uchar code m4=冷饭加热;uchar code m5=工作状态;uchar code m6=定时状态;uchar code m7=预定时间:;uchar code m8=H;uchar m9=0123456789;uchar code m10=定时时间:;void zhufan(); /煮饭函数声明void zhuzhou(); /煲粥函数声明void baowen(); /保温函数声明void jiare(); /冷饭加热函数声明void timing(); /定时预约函数void select();sbit y1=P36; /继电器 sbit y2=P37;/蜂鸣器uint s1=0,s=0,m=0,h=0;/秒,分,时计数/*延时*/void delay2(uint x) while(x-)uint y;for(y=125;y0;y-);/*定时器*/void time0() /定时器0TMOD=0x01;TH0=(65536-50000)/256; /50msTL0=(65536-50000)%256;ET0=1;TR0=1;void t0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;s1+;if(s1=20)s+;s1=0; / 1 s if(s=60)m+;s=0; / 1 minif(m=60)h+;m=0; / 1 hourif(h=12)h=0; /12 hour /*按键功能*/ void key() if(k1=0) / 工作状态按键delay2(10);if(k1=0)lcd_init();/lcd初始化a1=0;b1=1;c1=1;c2=1;lcd_pos(0,0); /显示菜单print(m1);lcd_pos(0,3);print(m2);lcd_pos(0,6);print(m3);lcd_pos(2,2);print(m4); while(!k1); /等待松开按键 while(k1&k2&k3&k4);/等待选择菜单功能 delay2(10); select(); if(k2=0) / 预定功能按键delay2(10);if(k2=0)lcd_init();a1=0x02;lcd_pos(0,0);print(m7); timing(); void select() /选择4种功能if(k1=0)/煮饭delay2(10);if(k1=0)a1=0;b1=1;c1=1;c2=1; /工作指示灯lcd_init();lcd_pos(0,3);print(m1);/while(!k1);/lcd_pos(0,3);/print(m2);zhufan();if(k2=0) /煮粥delay2(10);if(k2=0)a1=1;b1=0;c1=1;c2=1;lcd_init();lcd_pos(0,3);print(m2);zhuzhou();if(k3=0) /保温delay2(10);if(k3=0)a1=1;b1=1;c1=0;c2=1;lcd_init();lcd_pos(0,3);print(m3);baowen();if(k4=0)/冷饭加热delay2(10);if(k4=0)a1=1;b1=1;c1=1;c2=0;lcd_init();lcd_pos(0,2);print(m4);jiare();/*煮饭*/void zhufan() uchar w1,w4; lcd_init(); lcd_pos(0,3); print(m1); y1=1; /打开继电器,开始加热/ get_temp();/ delay(100);/ w4=get_temp(); while(get_temp()26)break;/ / while(1)/ lcd_pos(3,0);print(m1); / while(temp25)/温度大于105C时 / get_temp();/ lcd_pos(2,0);/ dis_temp(); EA=1;while(s0;w1-) /煮饭完成,鸣笛5次 y2=0; delay2(100); delay2(100); y2=1; delay2(100); delay2(100); if(y2=1)break; baowen();/*煮粥*/void zhuzhou() uchar w1; lcd_init(); lcd_pos(0,3); print(m2);y1=1; /打开继电器,开始加热get_temp(); /获取温度数值while(temp100); EA=1;while(m100)y1=0; /温度大于100,停止加热if(temp0;w1-) y2=0; delay2(100); delay2(100); y2=1; /煲粥完成,鸣笛5次 delay2(100); delay2(100);baowen(); /*保温*/void baowen() lcd_init(); lcd_pos(0,3); print(m3); while(1) get_temp(); if(temp=60)y1=0;delay2(100);if(k1=0)delay2(10);if(k1=0)zhufan();if(k2=0)delay2(10);if(k2=0)zhuzhou();if(k3=0)delay2(10);if(k3=0)baowen();if(k4=0)delay2(10);if(k4=0)jiare(); /*冷饭加热*/void jiare()uchar w1;lcd_init(); lcd_pos(0,2); print(m4);y1=1;get_temp();while(temp100); EA=1; while(m100)y1=0; delay2(100); /温度大于100,停止加热if(temp0;w1-) y2=0; delay2(100); delay2(100); y2=1; /冷饭加热完成,鸣笛5次 delay2(100); delay2(100);baowen();/*定时预约*/void timing()uchar e1=0,e2=0,e3=0;uchar q1;lcd_pos(0,5);write_data(m90);delay2(10);lcd_pos(0,6);write_data(m90);lcd_pos(0,7);print(m8);delay2(10);do/while(1)/if(k3=0) /个位减1delay2(10);if(k3=0)e2-;while(!k3);if(k4=0) /个位加1delay2(10);if(k4=0)e2+;while(!k4); if(e2=10)e2=0;e1+;if(e212)e1=0;e2=0;lcd_pos(0,5); write_data(m9e1);delay2(10);lcd_pos(0,6);write_data(m9e2);/ while(k1); /按确认键结束lcd_init();/lcd初始化a1=0;b1=1;c1=1;c2=1;lcd_pos(0,0); /显示菜单print(m1);lcd_pos(0,3);print(m2);lcd_pos(0,6);print(m3);lcd_pos(2,2);print(m4);EA=1;delay2(100);do /预定功能选择if(k1=0) /煮饭delay2(10);if(k1=0)q1=1; lcd_init();lcd_pos(0,3);print(m1);if(k2=0) /煲粥delay2(10);if(k2=0)q1=2;lcd_init();lcd_pos(0,3);print(m2);if(k3=0) /保温delay2(10);if(k3=0)q1=3;lcd_init();lcd_pos(0,3);print(m3);if(k4=0) /冷饭加热delay2(10);if(k4=0)q1=4;lcd_init();lcd_pos(0,2);print(m4);e2=e3%10; /定时时间显示e1=e3/10; lcd_pos(3,0); print(m10); lcd_pos(3,5);write_data(m9e1);delay2(10);lcd_pos(3,6);write_data(m9e2);lcd_pos(3,7);print(m8); while(e3=e3-s)!=0);/定时计算EA=0;if(q1=1)zhufan(); /电饭煲工作状态if(q1=2)baozhou();if(q1=3)baowen();if(q1=4)jiare(); void main() EA=0; /关中断time0(); /定时器初始化lcd_init(); / 12864液晶 初始化 lcd_pos(0,2); print(m5); /显示 工作状态 lcd_pos(2,2); print(m6); /显示 预定状态 while(1) key(); 12864LCD显示子程序/*12864子函数函数(各启动命令)*/#include #include #include #define uchar unsigned char#define uint unsigned int/* 端口定义*/sbit LCD_RS = P20; /寄存器选择输入 sbit LCD_RW = P21; /液晶读/写控制sbit LCD_EN = P22; /液晶使能控制sbit LCD_PSB = P23; /串/并方式控制void delay1ms(uint x) uint i,j; for(j=0;jx;j+) for(i=0;i110;i+); /*/* */*写指令数据到LCD */*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */* */*/void write_com(uchar com) LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; P0 = com;delay1ms(5); LCD_EN = 1;delay1ms(5); LCD_EN = 0; /*/* */*写显示数据到LCD */*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */* */*/void write_data(uchar dat) LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat;delay1ms(5); LCD_EN = 1;delay1ms(5); LCD_EN = 0; /*直接输出数组中的字符串*/void print(uchar *str) /LCD显示函数 while(*str!=0)write_data(*str);str+;/*/* */* 设定显示位置 */* */*/void lcd_pos(uchar X,uchar Y) uchar pos; if (X=0) X=0x80; else if (X=1) X=0x90; else if (X=2) X=0x88; else if (X=3) X=0x98; pos = X+Y ; write_com(pos); /显示地址/*/* */* LCD初始化设定 */* */*/void lcd_init() LCD_PSB = 1; /并口方式 write_com(0x30); /基本指令操作 write_com(0x0C); /显示开,关光标 write_com(0x01); /清除LCD的显示内容DS18B20温度子程序/*get_temp()直接求出温度值,有两位有效小数与一位有效小数(默认),dis_temp()显示温度值*/#include #include#define uchar unsigned char#define uint unsigned intsbit DQ = P17 ; /定义DS18B20端口DQ uchar num;uint temp; / 整型温度数据float f_temp;/浮点型温度数据,用于间接变换或串口通信uint x,y,z,w;uchar data temp_data2 = 0x00,0x00 ;uchar code ASCII25 = 0123456789.CTEMP:; /uchar data tempdata4=0;void delay1us(uint i) /微定时wh
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 铁路车辆电工安全知识评优考核试卷含答案
- 酒精酿造工发展趋势模拟考核试卷含答案
- 光纤着色并带工岗前安全应急考核试卷含答案
- 羽绒羽毛充填处理工操作能力知识考核试卷含答案
- 汽车铸造生产线操作工岗前工艺规程考核试卷含答案
- 硅橡胶装置操作工岗前发展趋势考核试卷含答案
- 水供应输排工成果转化竞赛考核试卷含答案
- 抽纱刺绣工岗前实操评估考核试卷含答案
- 2026年能源科技地热能应用报告及未来五至十年新能源报告
- 数据中心运行和维护管理指南
- 2025广东佛山顺德农商银行秋季招聘(行测)综合能力测试题附答案
- 烘焙业导购岗位课件
- 2025福建省能源石化集团有限责任公司秋季招聘416人参考考试试题及答案解析
- 生命伦理课件
- 2026年银行精准营销客户获取方案
- 公民信息素养(人工智能安全)知识试题及答案
- 2026届高考政治一轮复习:统编版必修1~4+选择性必修1~3全7册必背考点提纲汇编
- 2025浙江省农村发展集团有限公司招聘笔试考试备考题库及答案解析
- 常见机械类安全事故与预防措施
- 香砂平胃丸作用与功效
- GB/T 12368-2025锥齿轮模数
评论
0/150
提交评论