基于51单片机温度检测LCD显示课程设计报告_第1页
基于51单片机温度检测LCD显示课程设计报告_第2页
基于51单片机温度检测LCD显示课程设计报告_第3页
基于51单片机温度检测LCD显示课程设计报告_第4页
基于51单片机温度检测LCD显示课程设计报告_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、大 连 民 族 学 院单 片 机 系 统 课 程 设 计 题目:温度计的设计 班级:电子105 姓名:赵萌 同组人:张瑛笛 指导教师:李绍民 设计日期: 一 设计内容及要求设计内容:基于单片机的室内温度检测LCD显示要求:测量温度 55125 温度上下限 TH:32 TL:16 温度报警:超出温度上下限BEEP报警二 设计方案测温部分:采用18B20作为温度传感器,有一个由高低电平触发的且不因掉电而丢失的报警功能。控制部分:89S52最小系统显示部分:1602液晶显示,模块内的字符发生存储器存储了160个不同的点阵图形,先是方便,同时好可以进行时间的显示。三 硬件系统设计AT89S52是一个低

2、功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS -51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。   AT89S52具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,256 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(

3、I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个 全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。        AT89S52引脚图     此外,AT89S52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断 系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三 种封装形式,以适应不同产品的需求。 电源 时钟晶振原理

4、图I/O接口外围电路工作原理及硬件图四 软件系统设计软件流程框图系统设计原理:本次课程设计是基于单片机的数字温度计设计,在开始课程设计的时候我们要理解并掌握对单片机的开发,学会使用KEIL及Proteus等仿真软件。根据设计任务要求选择好器件,编写好程序运行成功之后进行软件联调,验证系统是否正确。通过筛选,我们组选用单片机AT89S52作为主控制系统;用1602液晶显示模块芯片作为温度数据显示装置;智能温度传感器采用DS18B20器件作为测温电路主要组成部分。 五 仿真调试(1)Keil C51单片机软件开发系统的整体结构 C51工具包的整体结构,uVision与Ishell分别是C51 fo

5、r Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及C51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。(2)使用独立的Keil仿真器时,注意事项 l 仿真器标配11.0592MHz的晶振

6、,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。 l 仿真器上的复位按钮只复位仿真芯片,不复位目标系统。 l 仿真芯片的31脚(/EA)已接至高电平,所以仿真时只能使用片内ROM,不能使用片外ROM;但仿真器外引插针中的31脚并不与仿真芯片的31脚相连,故该仿真器仍可插入到扩展有外部ROM(其CPU的/EA引脚接至低电平)的目标系统中使用。 l 调试结果l(3)结果分析 在运行仿真结果时通过改变温度传感器DS18B20的温度,然后调用各种子函数,可以改变液晶显示1602的第二行显示数据,说明程序编写正确。(4)系统设计电路的特点和方案的优缺点我们组设计的数字温度计系统知识运用简单的AT8

7、9S52芯片的I/O口传输功能,通过几个小的读数据、传递数据、延时子函数实现温度的读取传输功能,是比较简单,容易实现的,所以我们的系统只是实现了一些简单的功能,系统整体来说比较简易,但好像这个温度计没有多大的应用价值,所以我们后续分析觉得这个系统可以加一个温度复位系统提高AT89S52芯片的功能价值,也提高数字温度计的智能价值,还可以增加一个报警子函数,实现智能数字温度计更高的应用价值。六 结论虽然基本功能已经做好了,但还可以有很多的扩展功能,如串口设计和时钟显示,由于时间有限,但对于单片机的设计还在继续参考文献附录一程序代码:#include <reg52.h>#include

8、<intrins.h>#define uchar unsigned char#define uint unsigned intsbit DQ = P22; /定义DS18B20端口DQ sbit BEEP=P23 ; /蜂鸣器驱动线bit presence,flag;bit compare_th,compare_tl,alarm_on_off=0,temp_th,temp_tl;sbit LCD_RS = P35; sbit LCD_RW = P36;sbit LCD_EN = P34;uchar code cdis1 = " READ_ROMCORD "uch

9、ar code cdis2 = " "uchar code cdis3 = " DS18B20 ERR0R "uchar code cdis4 = " PLEASE CHECK "uchar code cdis5 = " TEMP: "uchar code cdis6 = "TH: TL: "unsigned char data temp_data2 = 0x00,0x00;unsigned char data temp_alarm2 = 0x20,0x10;unsigned char data

10、 display5 = 0x00,0x00,0x00,0x00,0x00; /温度值显示unsigned char data display13 = 0x00,0x00,0x00; /温度报警值显示unsigned char data RomCode8 = 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; unsigned char code mytab18 = 0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00;#define delayNOP(); _nop_();_nop_();_nop_();_nop_();unsigned

11、char Temp,temp_comp,timecount,count;unsigned char crc;void Disp_Temp_alarm(uchar addr,uchar num);void spk(uchar addr);void set_temp_alarm();void temp_compare();void beep();/*/void delay1(int ms) unsigned char y; while(ms-) for(y = 0; y<250; y+) _nop_(); _nop_(); _nop_(); _nop_(); /*/* */*检查LCD忙状态

12、 */*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */* */*/ bit lcd_busy() bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); /*/* */*写指令数据到LCD */*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */* */*/void lcd_wcmd(uchar cmd) delay1(10); LCD_RS = 0; LCD_RW = 0

13、; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; /*/* */*写显示数据到LCD */*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */* */*/void lcd_wdat(uchar dat) delay1(10); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; /*/* */*自定义字符写入CGRAM */*

14、 */*/void writetab() unsigned char i; lcd_wcmd(0x40); /写CGRAM for (i = 0; i< 8; i+) lcd_wdat(mytab1i); for (i = 0; i< 8; i+) lcd_wdat(mytab2i); /*/* */* LCD初始化设定 */* */*/void lcd_init() delay1(15); lcd_wcmd(0x01); /清除LCD的显示内容 lcd_wcmd(0x38); /16*2显示,5*7点阵,8位数据 delay1(5); lcd_wcmd(0x38); delay1

15、(5); lcd_wcmd(0x38); delay1(5); lcd_wcmd(0x0c); /显示开,关光标 delay1(5); lcd_wcmd(0x06); /移动光标 delay1(5); lcd_wcmd(0x01); /清除LCD的显示内容 delay1(5);writetab(); /自定义字符写入CGRAM/*/* */* 设定显示位置 */* */*/void lcd_pos(uchar pos) lcd_wcmd(pos | 0x80); /数据指针=80+地址变量/*/* */*us级延时函数 */* */*/void Delay(unsigned int num)

16、while( -num );/*/* */*初始化ds1820 */* */*/Init_DS18B20(void) DQ = 1; /DQ复位 Delay(8); /稍做延时 DQ = 0; /单片机将DQ拉低 Delay(90); /精确延时 大于 480us DQ = 1; /拉高总线 Delay(8); presence = DQ; /如果=0则初始化成功 =1则初始化失败 Delay(100); DQ = 1; return(presence); /返回信号,0=presence,1= no presence/*/* */* 读一个字节 */* */*/ ReadOneChar(vo

17、id) unsigned char i = 0; unsigned char dat = 0; for (i = 8; i > 0; i-) DQ = 0; / 给脉冲信号 dat >>= 1; DQ = 1; / 给脉冲信号 if(DQ) dat |= 0x80; Delay(4); return (dat);/*/* */* 写一个字节 */* */*/ WriteOneChar(unsigned char dat) unsigned char i = 0; for (i = 8; i > 0; i-) DQ = 0; DQ = dat&0x01; Dela

18、y(5); DQ = 1; dat>>=1; /*/* */* 温度报警值写入DS18B20 */* */*/Write_Temperature_alarm(void) Init_DS18B20(); WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0x4e); /将设定的温度报警值写入 DS18B20WriteOneChar(temp_alarm0); /写THWriteOneChar(temp_alarm1); /写TL WriteOneChar(0x7f); /12位精确度 Init_DS18B20(); WriteOneChar(0

19、xCC); /跳过读序号列号的操作 WriteOneChar(0x48); /把暂存器里的温度报警值拷贝到EEROM/*/* */* 读取64位序列码 */* */*/ Read_RomCord(void) unsigned char j; Init_DS18B20(); WriteOneChar(0x33); / 读序列码的操作 for (j = 0; j < 8; j+) RomCodej = ReadOneChar() ; /*/* */*DS18B20的CRC8校验程序 */* */*/uchar CRC8() uchar i,x; uchar crcbuff; crc=0; f

20、or(x = 0; x <8; x+) crcbuff=RomCodex; for(i = 0; i < 8; i+) if(crc crcbuff)&0x01)=0) crc >>= 1; else crc = 0x18; /CRC=X8+X5+X4+1 crc >>= 1; crc |= 0x80; crcbuff >>= 1; return crc;/*/* */* 数据转换与显示 */* */*/ Disp_RomCode(uchar H_num) uchar j; if(H_num=1) lcd_pos(0x00); if(H_

21、num=2) lcd_pos(0x40); for(j=0;j<8;j+) Temp = RomCodej; display0=(Temp&0xf0)>>4); if(display0>9) display0=display0+0x37; elsedisplay0=display0+0x30; lcd_wdat(display0); /高位数显示 display1=(Temp&0x0f); if(display1>9) display1=display1+0x37; else display1=display1+0x30; lcd_wdat(dis

22、play1); /低位数显示 /*/* */* 读取温度 */* */*/ Read_Temperature(void) uchar i; TR0=0; /关中断,防止读数错误 Init_DS18B20(); WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0x44); /启动温度转换 Init_DS18B20(); WriteOneChar(0x55); /匹配ROM命令 for(i=0;i<8;i+) WriteOneChar(RomCodei); WriteOneChar(0xBE); /读取温度寄存器 temp_data0 = ReadO

23、neChar(); /温度低8位 temp_data1 = ReadOneChar(); /温度高8位 temp_alarm0 = ReadOneChar(); /温度报警TH temp_alarm1 = ReadOneChar(); /温度报警TL temp_comp=(temp_data0&0xf0)>>4)|(temp_data1&0x0f)<<4); /取温度整数值 TR0=1; /开中断/*/* */* 数据转换与温度显示 */* */*/ Disp_Temperature() uchar s=0; if(temp_data1>127)

24、/温度为负值 temp_data0=(temp_data0)+1; /取反加一,将补码变成原码 if(temp_data0)>=0xff) temp_data1=(temp_data1)+1; else temp_data1=temp_data1; s=1; display4=temp_data0&0x0f; display0=(display4*10/16)+0x30; display4=(temp_data0&0xf0)>>4)|(temp_data1&0x0f)<<4); display3=display4/100+0x30; dis

25、play1=display4%100; display2=display1/10+0x30; display1=display1%10+0x30; if(display3=0x30) /高位为0,不显示 display3=0x20; if(display2=0x30) /次高位为0,不显示 display2=0x20; if(s) display3=0x2d; /显示负号 lcd_pos(0x07); lcd_wdat(display3); /百位数显示 lcd_wdat(display2); /十位数显示 lcd_wdat(display1); /个位数显示 lcd_wdat('.&

26、#39;); lcd_wdat(display0); /小数位数显示 lcd_wdat(0x00); /显示自定义字符 lcd_wdat('C'); /显示C /*/* */* 蜂鸣器响一声 */* */*/void beep() unsigned char y; for (y=0;y<100;y+) Delay(70); BEEP=!BEEP; /BEEP取反 BEEP=1; /关闭蜂鸣器Delay(25000);/*/* */* ROMCORD 显示菜单 */* */*/void RomCode_Menu () uchar m; lcd_init(); /初始化LCD

27、 lcd_pos(0); /设置显示位置为第一行 for(m=0;m<16;m+) /显示字符 lcd_wdat(cdis1m); Read_RomCord(); /读取64位序列码 CRC8(); /CRC效验 if(crc=0) /CRC效验正确 Disp_RomCode(2); /显示64位序列码 /*/* */* DS18B20 ERROR 显示菜单 */* */*/void Error_Menu () uchar m; lcd_init(); /初始化LCD lcd_pos(0); /设置显示位置为第一行的第1个字符 for(m=0;m<16;m+) lcd_wdat(c

28、dis3m); /显示字符 lcd_pos(0x40); /设置显示位置为第二行第1个字符 for(m=0;m<16;m+) lcd_wdat(cdis4m); /显示字符/*/* */* DS18B20 正常显示菜单 */* */*/void Natural_Menu () uchar m; lcd_init(); /初始化LCD lcd_pos(0); /设置显示位置为第一行的第1个字符 for(m=0;m<16;m+) lcd_wdat(cdis5m); /显示字符 lcd_pos(0x40); /设置显示位置为第二行第1个字符 for(m=0;m<16;m+) lcd_wdat(cdis6m); /显示字符 Read_Temperature(); Disp_Temp_alarm(0x43,0); /显示TH值 Disp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论