xx-20xx年单片机温度控制总结内容摘要:

,超调值大约为 %左右。 虽然超调为不利结果,但另一方面却减小了系统 的调节时间。 从其数据表可以看出该系统为稳定系统。 设计方案评价 优点 在硬件方面:本设计方案采用了单总线型数字式的温度传感器,提高了温度的采集精度,节约了单片机的口线资源。 方案还使用场效应管作加热控制器件,使设计简单化,且可靠性强。 在控制精度方面,本设计在不能确定执行机构的数学模型的情况下,大胆的假设小心的求证,利用模糊控制的算法来提高控制精度。 在软件方面:我们采用模块化编程,思路清晰,使程序简洁、可移植性强。 缺点 本设计方案虽然采用了当前市场最先进的电子器件,使电 路设计简单,但设计方案不是最佳。 本系统虽然具有较小的超调量,但加大了调节时间。 如果需要更高的控制精度,则我们的模糊控制将不适应,需要修改程序。 设计中加热控制方面存在遗憾,虽采用了场效应管控制加热,但不能使温度加热到限制温度时截止,需要更好的控制器件。 6 结论 本次实验采用了 C 语言编程方式,实现了温度的测量与控制,完全达到了本次实验的要求,更重要的是该实验的测量误差小于 1℃ 度,控制精度小于 ℃度,已基本实现本实验扩展部分的要求。 它可以广泛用于温度测量精度要求比较高的场面,实现简单,成本低。 综上所示,本系统的方案具有实用推广价值。 本系统通过添加一个传感器,还有一个 12V 供电的加热片,使系统能够实时显示温度和快速加热。 若系统开始加热就使温度迅速上升,则说明杯中水不足,很有可能为干烧,为不安全加热,用户请注意,这属于该系统需 要改进的地方。 附 录 1 源程序清单如下: //ds18b20 drive program //for 51 mcu with lcd1602 display include include /*******************************************************************/ define HIGH 1 //高电平 define LOW 0 //低电平 define TRUE 1 //真 define ZERO 0 //假 define MSB 0x80 //ds18b20 part define SkipRom 0xcc define ConvertTemperature 0x44 define Read Scratchpad 0xbe sbit One_Wire_Bus=P1^6。 void One_ Wire_ Delay (unsigned char delay_ time)。 void One_Wire_Write_Byte (unsigned char oww_dat)。 unsigned char One_Wire_Read_Byte(void)。 void Read_18B20(void)。 void Initize_One_Wire_Bus(void)。 void delay(void)。 /********************************************************************/ data unsigned char GetScratchpad[2]。 code unsignedchardecimalH[16]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93}。 code unsigned char decimalL[16]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75}。 unsigned char Result Temperature H。 //经过处理后的温度整数部分 unsigned char Result Temperature L H, Result Temperature LL。 //经过处理后的温度的小数部分 data unsigned char ResultSignal。 //温度为负数标志位 /********************************************************************/ void Initize_One_Wire_Bus(void) {One_Wire_Bus=0。 One_Wire_Delay (80)。 / /Bus master pulling low 488us One_Wire_Bus=1。 One_Wire_Delay (25)。 //Resister pull up 158us。 } /********************************************************************/ /******************* ds18b20 **********************************/ void One_Wire_Delay (unsigned char delay_time) { While (delay_time) delay_time。 //Delay time us :=(8+delay_time*6)us。 } /********************************************************************/ unsigned char One_Wire_Read_Byte (void) { bit temp_bit。 unsigned char i,result=0。 for (i=0。 i8。 i++) { One_Wire_Bus=0。 One_Wire_Bus=1。 temp_bit=One_Wire_Bus。 One_Wire_Delay (9)。 //delay 62 us If (temp_bit) result|=0x01i。 } Return (result)。 } /********************************************************************/ void One_Wire_Write_Byte(unsigned char oww_dat) { unsigned char i。 for (i=0。 i8。 i++) { One_Wire_Bus=0。 if(oww_datamp。 0x01)One_Wire_Bus=1。 One_Wire_Delay (20)。 //delay 128 us One_Wire_Bus=1。 oww_dat=1。 } One_Wire_Delay (10)。 } /********************************************************************/ void Read_18B20 (void) { unsigned char tempH,tempL。 Initize_One_Wire_Bus ()。 One_Wire_Write_Byte (SkipRom)。 _nop_()。 One_Wire_Write_Byte (ConvertTemperature)。 One_Wire_Delay (5)。 Initize_One_Wire_Bus ()。 One_Wire_Write_Byte (SkipRom)。 _nop_()。 One_Wire_Write_Byte (ReadScratchpad)。 GetScratchpad[0]=One_Wire_Read_Byte()。 //从 DS18B20 读出的低 8 位温度值 GetScratchpad[1]=One_Wire_Read_Byte()。 //从 DS18B20 读出的高 8 位温度值 One_Wire_Delay (120)。 tempH=(GetScratchpad[1]4)|(GetScratchpad[0]4)。 //温度的整数部分 tempL=(GetScratchpad[0]amp。 0x0f)。 //温度的小数部分 Initize_One_Wire_Bus()。 if(tempHamp。 0x80) //判断温度的正负值 { tempH=~tempH。 tempL=~tempL+1。 ResultSignal=1。 //温度为负数标志位 } Result Temperature H=tempH。 //经过处理后的温度的整数部分 Result Temperature L=decimalL[tempL]。 //经过处理的温度的小数部分十分位 Result Temperature LH=decimalH[tempL]。 //经过处理的温度的小数部分的百分位 } /********************************************************************/ /*******************************************************************/ //lcd part define LINE1 0 define LINE2 1 define LINE1_HEAD 0x80 define LINE2_HEAD 0xC0 define LCD_DELAY_TIME 40 define DATA_MODE 0x38 define OPEN_SCREEN 0x0C define DISPLAY_ADDRESS 0x80 define CLEARSCREEN LCD_en_mand(0x01) define COMMAND_SLOT LCD1602_RS=LOW。 LCD1602_RW=LOW。 LCD1602_EN=LOW define DATA_SLOT LCD1602_RS=HIGH。 LCD1602_RW=LOW。 LCD1602_EN=LOW //mon part define HIGH 1 //高电平 define LOW 0 //低电平 define TRUE 1 //真 define ZERO 0 //假 define MSB 0x80 //change this part at different board define LCDIO P0 sbit LCD1602_RS=P1^0。 //数据命令选择 1 data 0 mand sbit LCD1602_RW=P1^1。 //读写选择 1 read 0 write sbit LCD1602_EN=P1^2。 //LCD 使能信号 //function define /********************************************************************/ void LCD_delay(void)。 //lcd 延时函数 void LCD_en_mand(unsigned char mand)。 //写命令 void LCD_en_dat(unsigned char temp)。 //写数据 void LCD_set_xy( unsigned char x, unsigned char y )。 //设置显示地址 void LCD_write_char( unsigned x,unsigned char y,unsigned char dat)。 //write lcd a character function void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)。 //write lcd string function void LCD_init(void)。 //lcd 初始化 . //unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00}。 //自定义字符 /************************************************。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。