单片机课程设计说明书
题 目: 温度检测系统设计 系 部: 专 业: 班 级: 学生姓名: 学 号: 指导教师:
年 月 日
目 录
1 设计任务与要求 .................................................... 1
1.1 设计任务 ..................................................... 1 1.2 设计要求 ..................................................... 1 2 设计方案 .......................................................... 1 3 硬件电路设计 ...................................................... 1
3.1 最小系统电路 ................................................. 1 3.2 温度采集模块 ................................................. 3 3.3 显示模块 ..................................................... 4 3.4 硬件总体仿真图 ............................................... 7 4 主要参数计算与分析 ................................................ 7
4.1 DS18B20的主要参数 ........................................... 7 4.2 STC89C52RC的主要参数 ........................................ 8 4.3 LCD1602的主要参数 ........................................... 8 5 软件设计 .......................................................... 9
5.1 主程序流程图 ................................................. 9 5.2 温度测量系统各子模块 ......................................... 9 6 心得体会 ......................................................... 12 7 参考文献 ......................................................... 12 8 附录 ............................................................. 12
8.1 实物图 ...................................................... 12 8.2 元件清单 .................................................... 13 8.3 C语言程序 .................................................. 14
1 设计任务与要求
1.1 设计任务
设计一个温度检测系统。
1.2 设计要求
(1)用温度传感器18B20测环境温度,用LCD1602显示测量结果。 (2)用PROTEUS仿真。 (3)焊接电路板并调试运行。
2 设计方案
总体设计方案采用STC89C52RC单片机作控制器,温度传感器选用DS18B20来设计数字温度计。主控制器由单片机STC89C52RC实现,测温电路由温度传感器DS18B20实现,显示电路由LCD1602液晶显示器直读显示。本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用。该设计控制器使用单片机STC89C52RC,测温传感器使用DS18B20,实现温度显示,能准确达到以上要求。如图一所示。
图一 总体设计方案
3 硬件电路设计
3.1 最小系统电路
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统,对于51系列单片机来说,最小系统包括:单片机、时钟电路、复位电路。如图二所示:
1
图二 最小系统电路
3.1.1 时钟电路
STC89C52内部有一个用于构成振荡器的高增益反相放大器,引脚RXD和TXD分别是此放大器的输入端和输出端。时钟可以由内部方式产生或外部方式产生。在RXD和TXD引脚上外接定时元件,内部振荡器就产生自激振荡。定时元件通常采用石英晶体和电容组成的并联谐振回路。晶体振荡频率可以在1.2~12MHz之间选择,电容值在5~30pF之间选择,电容值的大小可对频率起微调的作用。
外部方式的时钟,RXD接地,TXD接外部振荡器。对外部振荡信号无特殊要求,只要求保证脉冲宽度,一般采用频率低于12MHz的方波信号。片内时钟发生器把振荡频率两分频,产生一个两相时钟P1和P2,供单片机使用。如图三所示:
图三 时钟电路
2
3.1.2 复位及复位电路
复位是单片机的初始化操作。其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。
RST引脚是复位信号的输入端。复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期)以上。若使用颇率为6MHz的晶振,则复位信号持续时间应超过4us才能完成复位操作。
整个复位电路包括芯片内、外两部分。外部电路产生的复位信号(RST)送至施密特触发器,再由片内复位电路在每个机器周期的S5P2时刻对施密特触发器的输出进行采样,然后才得到内部复位操作所需要的信号。
复位操作有上电自动复位相按键手动复位两种方式。 复位电路如图四所示:
图四 复位电路
3.2 温度采集模块
3.2.1 温度传感器的选择
DS18B20是常用的温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。 DS18B20测温原理如图3所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修
3
正计数器1的预置值。
3.2.2 DS18B20管脚功能及接线方法
管脚功能:GND为电源地、DQ为数字信号输入/输出端、VDD为外接供电电源输入端(在寄生电源接线方式时接地)
接线方法:面对着平的那一面,左负右正,一旦接反就会立刻发热,有可能烧毁!同时,接反也是导致该传感器总是显示85℃的原因。实际操作中将正负反接,传感器立即发热,液晶屏不能显示读数,正负接好后显示85℃。另外,如果使用51单片机的话,那么中间那个引脚必须接上4.7K—10K的上拉电阻,否则,由于高电平不能正常输入/输出,要么通电后立即显示85℃,要么用几个月后温度在85℃与正常值上乱跳。
DS18B20管脚如图五所示。
图五 DS18B20管脚
DS18B20与单片机的连接电路,如图六所示。
图六 DS18B20与单片机的连接电路
3.3 显示模块
4
3.3.1 LCD的选择
LCD是一种工业型字符液晶,它能够显示32个字符(16列×2行),工作电压为3.3V或5V,对比度可自行调节,LCD的内部内部含有复位电路,用来提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能。由于LCD1602功耗低、体积小、显示多样,常用在微型仪表和低功耗应用中。市面上字符液晶绝大多数是基于HD44780液晶芯片,LCD1602控制原理也基于HD44780。LCD1602采用标准14脚(无背光)或16脚(有背光)接口。 3.3.2 LCD1602显示器的管脚功能
LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明
如下表一所示。
表一 LCD1602显示器引脚说明
编号 1 2 3 4 5 6 7 8 符号 VSS VDD VL RS R/W E D0 D1 引脚说明 电源地 电源正极 液晶显示偏压 数据/命令选择 读/写选择 使能信号 数据 数据 编号 9 10 11 12 13 14 15 16 符号 D2 D3 D4 D5 D6 D7 BLA BLK 引脚说明 数据 数据 数据 数据 数据 数据 背光源正极 背光源负极 5
图七 LCD1602管脚图
第1脚:VSS为地电源。 第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。
液晶与单片机的连接电路如图八所示。
6
图八 液晶与单片机的连接电路
3.4 硬件总体仿真图
本设计大体可分为三个部分,即CPU处理模块、温度采集模块、显示模块。CPU处理模块采用单片机STC89C52RC,包括时钟电路、复位电路;温度采集模块采用温度传感器DS18B20进行温度采集,通过P3.6管脚发送到CPU进行处理;显示模块采用16管脚的LCD1602,数据通过单片机的P2口传输到LCD1602,最终LCD1602将温度显示出来。如图九所示。
图九 硬件总体仿真图
4 主要参数计算与分析
4.1 DS18B20的主要参数
(1) 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(2) 测温范围 -55℃~+125℃,固有测温误差(注意,不是分辨率,这里之前
7
是错误的)1℃。
(3) 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
(4) 工作电源: 3.0~5.5V/DC (可以数据线寄生电源) (5) 在使用中不需要任何外围元件
(6) 测量结果以9~12位数字量方式串行传送 (7) 不锈钢保护管直径 Φ6
(8) 适用于DN15~25, DN40~DN250各种介质工业管道和狭小空间设备测温 (9) 标准安装螺纹 M10X1, M12X1.5, G1/2\"任选
(10) PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接。
4.2 STC89C52RC的主要参数
(1) 增强型8051 单片机,6 时钟/机器周期和12 时钟/机器周期可以任意 选择,指令代码完全兼容传统8051.[2]?
(2) 工作电压:5.5V~3.3V(5V 单片机)/3.8V~2.0V(3V 单片机) (3) 工作频率范围:0~40MHz,相当于普通8051 的0~80MHz,实际工作 频率可达48MHz
(4) 用户应用程序空间为8K 字节 (5) 片上集成512 字节RAM
(6) 通用I/O 口(32 个),复位后为:P0/P1/P2/P3 是准双向口/弱上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O 口用时,需加上拉电阻。
(7) ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无 需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程 序,数秒即可完成一片
(8) 具有EEPROM 功能 (9)具有看门狗功能
(10) 共3 个16 位定时器/计数器。即定时器T0、T1、T2
(11) 外部中断4 路,下降沿中断或低电平触发电路,Power Down 模式可 由外部中断低电平触发中断方式唤醒
(12) 通用异步串行口(UART),还可用定时器软件实现多个UART (13) 工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)
4.3 LCD1602的主要参数
显示容量:16×2个字符 芯片工作电压:4.5—5.5V
8
工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H)mm
5 软件设计
5.1 主程序流程图
图十 主程序流程图
5.2 温度测量系统各子模块
5.2.1 DS18B20读取温度部分
读温度值模块需要调用4个子程序,分别为:
DS18B20初始化子程序:让单片机知道DS18B20在总线上且已准备好操作 DS18B20写字节子程序:对DS18B20发出命令 延时子程序:对DS18B20操作时的时序控制 读温度值模块流程,如图十一所示:
DS18B20读字节子程序:读取DS18B20存储器的数据
9
图十一 读温度值模块流程
DS18B20初始化子程序流程图,如图十二所示:
10
图十二 DS18B20初始化子程序流程
本系统中液晶显示器初始化程序流程,如图十三所示:
图十三 液晶显示器初始化程序流程
11
6 心得体会
经过两周时间的努力,基于单片机的简易温度系统设计基本完成。但设计中的不足之处仍然存在。这次设计是我第一次设计电路,并用Proteus实现了仿真。在这过程中,我对电路设计,单片机的使用等都有了新的认识。通过这次设计学会了Proteus和Keil C51软件的使用方法,掌握了从系统的需要、方案的设计、功能模块的划分、原理图的设计和电路图的仿真的设计流程,积累了不少经验。
基于单片机的简易温度系统设计使用性强、结构简单、成本低、外接元件少。在实际应用工作应能好,测量温度准确,精度高。系统功能、指标达到了课题的预期要求、系统在硬件设计上充分考虑了可扩展性,经过一定的改造,可以增加功能。本文设计主要实现了简易温度测量的功能,详细说明了从原理图的设计、电路图的仿真再到软件的调试。
通过本次设计,我对单片机这门课有了进一步的了解。无论是在硬件连接方面还是在软件编程方面。本次设计采用了STC89C52RC单片机芯片,以前在学单片机课程时只是对其理论知识有了初步的理解。通过这次设计,对它的工作原理有了更深的理解。在调试过程中遇到很多问题,硬件上的理论知识学得不够扎实,对电路的仿真方面也不够熟练。
总之这次电路的设计和仿真,基本上达到了设计的功能要求。在以后的实践中,我将继续努力学习电路设计方面的理论知识,并理论联系实际,争取在电路设计方面能有所提升。
7 参考文献
[1] 单片机原理及应用.张兰红,邹华主编.机械工业出版社,2016. [2] 数字电子技术基础(第5版).阎石编.高等教育出版社,2006. [3] 模拟电子技术基础(第五版).童诗白编.高等教育出版社,2006. [4] 电路(第5版).邱关源编.高等教育出版社,2006.
[5] 电子技术课程设计指导.彭介华编.高等教育出版社,2005年出版. [6] 电子技术基础实验-电子电路实验、设计、仿真.陈大钦主编. 高等教育出版社,2002年出版.
8 附录
8.1
实物图
12
8.2 元件清单
温度检测单机用元器件明细表 封装 直插 直插 直插 直插 双列直插 双列直插 直插 直插 直插 邦头 直插 型号 1/4W STC89C52RC DIP-40 1/4W DS18B20 3296W-103 LCD1602 一排 11 参数 30PF 11.0592MHZ 10K 22UF/16V HD 4.7K 10K 20cm 针 单面 数量 2 1 1 1 1 1 1 1 1 1 针 线 1 1 名称 瓷片电容 石英晶体 电阻 电解电容 CPU CPU座 电阻 温度传感器 电位器 液晶显示器 色 排针 最小系统板 洞洞板 1P杜邦线彩母对母两头插好杜孔对孔40根单根长度30脚距2.54高1X40单排插30 9X7CM 13
8.3 C语言程序
#include \"reg51.h\" #include \"intrins.h\" #define uchar unsigned char #define uint unsigned int
uchar code table1 []={\" \欢迎显示 uchar code table2 []={\" \欢迎显示 uchar code str1 []={\" Temperature \uchar code str2 []={\" \//************管脚定义************************ sbit lcd_rs = P3^0; //液晶数据命令选择端 sbit lcd_en = P3^1; //液晶使能 sbit DQ = P3^6; //液晶使能
//************参数定义************************ uint tvalue; //温度值 uchar tflag; //温度正负标志 uchar data disdata[5];
//************子函数定义************************ void delay(uint z); void init_lcd();
//delay延时子程序 //LCD1602初始化函数
void write_com(uchar com); //LCD1602写指令函数 void write_data(uchar date); //LCD1602写数据函数
void lcd1602_display(uchar *q,uchar *p);//LCD1602显示函数
14
void welcome_1(); //LCD1602显示欢迎函数1
void delay_DS18B20(uint i); //delay_DS18B20函数 void Init_DS18B20_display(); //DS18B20初始化显示 void Init_DS18B20(); //DS18B20初始化 uchar ReadOneByte();
//DS18B20读一字节
void WriteOneByte(uchar dat); //DS18B20写一字节 Read_Temperature();
//DS18B20读取温度值并转换
void DS18B20_display(); //DS18B20温度显示 //************主函数************************ void main() { }
//************delay延时子程序************************ void delay(uint z) {
uint x,y;
15
welcome_1();
Init_DS18B20_display(); while(1) {
Read_Temperature(); DS18B20_display(); }
}
for(x=0;x //************LCD1602初始化函数************************ void init_lcd() { } //************LCD1602写指令函数************************ void write_com(uchar com) { delay(5); lcd_rs = 0; lcd_en = 0; P2 = com; delay(5); // 选择写指令 // 将使能端置0 write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口 write_com(0x08); //写一个字符后地址指针加1 write_com(0x01); //显示清零,数据指针清零 write_com(0x06); //写一个字符后地址指针加1 write_com(0x0c); //关显示,光标不显示不闪烁 // 将要写的命令送到数据总线上 // 延时5ms,待数据稳定 lcd_en = 1;// 由于初始化已将lcd_en置为0,使能端给一个高脉冲, delay(5); lcd_en = 0; // 延时5ms,待数据稳定 // 将使能端置0以完成脉冲 16 } //************LCD1602写数据函数************************ void write_data(uchar date) { delay(5); lcd_rs = 1; lcd_en = 0; P2 = date; delay(5); lcd_en = 1; // 选择写数据 // 将使能端置0 // 将要写的数据送到数据总线上 // 延时5ms,待数据稳定 // 由于初始化已将lcd_en置为0,使能端给 一个高脉冲, } //************LCD1602显示函数****************** void lcd1602_display(uchar *q,uchar *p) { write_com(0x80); // 现将数据指针定位到第一行第一个字处 while(*q!='\\0') { write_data(*q); q++; delay(1); delay(5); lcd_en = 0; // 延时5ms,待数据稳定 // 将使能端置0以完成脉冲 17 } } write_com(0xc0); // 现将数据指针定位到第二行第一个字处 while(*p!='\\0') { } write_data(*p); p++; delay(1); //************LCD1602显示欢迎函数1****************** void welcome_1() { } //************DS18B20初始化显示************** void Init_DS18B20_display() { } //************LCD1602显示函数****************** 18 init_lcd(); lcd1602_display(table1,table2); delay(300); init_lcd(); lcd1602_display(str1,str2); void delay_DS18B20(uint i) { } //************DS18B20初始化****************** void Init_DS18B20() { } //************DS18B20读一字节****************** uchar ReadOneByte() { uchar i,dat = 0; for(i=8;i>0;i--) { DQ = 0; dat>>=1; DQ = 1; //给脉冲信号 19 while(i--); DQ = 1; //DQ复位 delay_DS18B20(4); //延时 DQ = 0; //DQ拉低 delay_DS18B20(100); DQ = 1; //拉高 delay_DS18B20(40); //给脉冲信号 } } if(DQ) dat|=0x80; delay_DS18B20(10); return (dat); //************DS18B20写一字节****************** void WriteOneByte(uchar dat) { } //************DS18B20读取温度值并转换****************** Read_Temperature() { uchar a,b; Init_DS18B20(); 20 uchar i; for(i=8;i>0;i--) { } DQ = 0; DQ = dat&0x01; delay_DS18B20(10); DQ = 1; dat>>=1; WriteOneByte(0xcc); //跳过读序列号 WriteOneByte(0x44); //启动温度转换 Init_DS18B20(); WriteOneByte(0xcc); //跳过读序列号 WriteOneByte(0xbe); //读取温度 a = ReadOneByte(); b = ReadOneByte(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0xfff) } //************DS18B20温度显示****************** void DS18B20_display() { 21 tflag = 0; else { } tvalue = tvalue*(0.625); //温度值扩大10倍,精确到1位小数 return (tvalue); tvalue = ~tvalue+1; tflag = 1; uchar flagdat; disdata[0]=tvalue/1000+0x30; //百位数 disdata[1]=tvalue%1000/100+0x30;//十位数 disdata[2]=tvalue%100/10+0x30; //个位数 disdata[3]=tvalue%10+0x30; //小数位 if(tflag == 0) flagdat = 0x20; //正温度不显示符号 else flagdat = 0x2d; //负温度显示负号 if(disdata[0] == 0x30) { } write_com(0xc4); write_data(flagdat); //显示符号位 write_com(0xc5); write_data(disdata[0]);//显示百位 write_com(0xc6); write_data(disdata[1]);//显示十位 22 disdata[0] =0x20; //如果百位为0,不显示 if(disdata[1] == 0x30) { } disdata[1] =0x20;//如果百位为0,十位为0也不显示 write_com(0xc7); write_data(disdata[2]);//显示个位 write_com(0xc8); write_data(0x2e); //显示小数点 write_com(0xc9); write_data(disdata[3]);//显示小数位 write_com(0xca); //显示摄氏度 write_data(0xdf); write_com(0xcb); write_data('C'); } 23 因篇幅问题不能全部显示,请点此查看更多更全内容