基于51单片机温度检测LCD显示课程设计报告_第1页
基于51单片机温度检测LCD显示课程设计报告_第2页
基于51单片机温度检测LCD显示课程设计报告_第3页
基于51单片机温度检测LCD显示课程设计报告_第4页
基于51单片机温度检测LCD显示课程设计报告_第5页
免费预览已结束,剩余47页可下载查看

下载本文档

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

文档简介

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

2、pt * q MOSH PlM C C9CXI PMC RSTC :RX£» P3 0 C erxoi Ai i ce - r(PUl h,匚 KTAL? C XTAll匚 8口 t*Q t (ADT)PQ J( 9 力PC 3 (ADS)PO : r*CMipaTtAonP2 7 (A14JF / 4*1?)*2 3 CM t)AT89S52是一个低功耗,高性能 CMOS 8位 单片机,片内含 8k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读 程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼

3、容标准MCS -51指令 系统及80C51引脚结构,芯片内集成了通用 8位 中央处理器和ISP Flash存储单元,功能强大的微 型计算机的AT89S52可为许多嵌入式控制应用系 统提供高性价比的解决方案。AT89S52具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,256 bytes的随机存取数据 存储器(RAM ), 32个外部双向输入/输出(I/O) 口,5个中断优先级2层中断嵌套中断,2个16 位可编程定时计数器,2个全双工串行通信口,看 门狗(WDT)电路,片内时钟振荡器。电源时钟晶振原理图I/O 接口r Ugg。-4i a uyn t .IS ._SI*<

4、;.W Ar rtJ 一 J .miMTi li .岫c uum-一一4 -WjLPpiAaF -11i. UJ6|Rj.t-u一> vuc'm. , * jR'ctfi-n .±1.«.4 3。,| 契4", i. li°U*i fun« .i, j Jif2 i. _*-4. |Ji -5 IJjrZ ,1 lLf>i < .264w打4 .,11 W T -外围电路工作原理及硬件图-阡 METT':EUXTA42制ABMQTE 5 H msx mMHWF1*3 K*f *r»<i*

5、1.1 inFtinu ”产也. IT3JnC»>,LIrurufwnk E I,4T”fimOTfilltdij'jn1四软件系统设计软件流程框图系统设计原理:本次课程设计是基于单片 机的数字温度计设计,在开始 课程设计的时候我们要理解并 掌握对单片机的开发,学会使 用KEIL及Proteus等仿真软件。 根据设计任务要求选择好器 件,编写好程序运行成功之后 进行软件联调,验证系统是否 正确。通过筛选,我们组选用 单片机AT89S52作为主控制系 统;用1602液晶显示模块芯片 作为温度数据显示装置;智能 温度传感器采用DS18B20器件 作为测温电路主要组成部分。五

6、仿真调试(1) Keil C51单片机软件开发系统的整体结构C51工具包的整体结构,uVision 与Ishell分别是 C51 forWindows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其 它编辑器编辑C或汇编源文件。然后分别由C51及C51编译器编 译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件 (.ABS)。ABS文件由OH51转换成标准的 Hex文件,以供调试器 dScope51或 tScope51使用进行源代码级调试,也可由仿真器使用直

7、接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。(2)使用独立的 Keil仿真器时,注意事项仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插 孔中换插其他频率的晶振。仿真器上的复位按钮只复位仿真芯片,不复位目标系统。仿真芯片的31脚(/EA)已接至高电平,所以仿真时只能使用片内ROM,不能使用片外 ROM;但仿真器外引插针中的31脚并不与仿真芯片的31脚相连,故该仿真器仍可插入到扩展有外部ROM(其CPU的/EA引脚接至低电平)的目标系统中使用。调试结果(3)结果分析在运行仿真结果时通过改变温度传感器 DS18B20的温度,然后调 用各种子函数,可以改变液晶显示

8、1602的第二行显示数据,说明程 序编写正确。(4)系统设计电路的特点和方案的优缺点我们组设计的数字温度计系统知识运用简单的AT89S52芯片的I/O 口传输功能,通过几个小的读数据、传递数据、延时子函数实现 温度的读取传输功能,是比较简单,容易实现的,所以我们的系统只是实现了一些简单的功能,系统整体来说比较简易,但好像这个温度计没有多大的应用价值,所以我们后续分析觉得这个系统可以加一个温度复位系统提高AT89S52 芯片的功能价值,也提高数字温度计的智能价值,还可以增加一个报警子函数,实现智能数字温度计更高的应用价值。六 结论虽然基本功能已经做好了, 但还可以有很多的扩展功能, 如串口设计和

9、时钟显示,由于时间有限,但对于单片机的设计还在继续参考文献附录一程序代码:#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit DQ = P2A2;/ 定义 DS18B20端口 DQsbit BEEP=P2A3 ; 蜂鸣器驱动线bit presence,flag;bit compare_th,compare_tl,alarm_on_off=0,temp_th,temp_tl;sbit LCD_RS = P3A5;sbit LCD_RW

10、= P3A6;sbit LCD_EN = P3A4;uchar code cdis1 = " READ_ROMCORD "uchar code cdis2 = ""uchar code cdis3 = " DS18B20 ERR0R "uchar code cdis4 = " PLEASE CHECK "uchar code cdis5 = " TEMP:"uchar code cdis6 = "TH:TL:"unsigned char datatemp_data2 = 0x

11、00,0x00;unsigned char datatemp_alarm2 = 0x20,0x10;unsigned char datadisplay5 =0x00,0x00,0x00,0x00,0x00; /温度值显示unsigned char datadisplay13 =0x00,0x00,0x00; /温度报警值显示unsigned char dataRomCode8 = 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;unsigned char code mytab18 = 0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00

12、;#define delayNOP(); _nop_();_nop_();_nop_();_nop_();unsigned 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<2

13、50; y+)_nop_();_nop_();_nop_();_nop_();/*/*/*检查LCD忙状态*/*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, £=高脉冲,D0-D7=指令码。*/*/*/void lcd

14、_wcmd(uchar cmd)delay1(10);LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();P0 = cmd;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;/*/*/* 写显示数据到 LCD*/*RS=H , RW=L, £=高脉冲,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();LC

15、D_EN = 0;/*/*/* 自 定 义 字 符 写 入*/CGRAM*/*/* /*/voidwritetab()unsigned char i;lcd_wcmd(0x40);/ 写 CGRAMfor (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 位数据del

16、ay1(5);lcd_wcmd(0x38);delay1(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 D

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

18、eadOneChar(void)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;Delay(5)

19、;DQ = 1;dat>>=1;/*/*/* 温度报警值写入DS18B20*/*/*/Write_Temperature_alarm(void)Init_DS18B20();WriteOneChar(0xCC);WriteOneChar(0x4e);WriteOneChar(temp_alarm0);WriteOneChar(temp_alarm1);WriteOneChar(0x7f);Init_DS18B20();WriteOneChar(0xCC);WriteOneChar(0x48);/ 跳过读序号列号的操作/ 将设定的温度报警值写入DS18B20/ 写 TH/ 写 TL/

20、12 位精确度/ 跳过读序号列号的操作/ 把暂存器里的温度报警值拷贝到 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;for(x = 0; x <8; x+)crcb

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

22、= 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(display1);/ 低位数显示/*/*/*/*/* /* 读取温度/* /*/Read_Temperature(

23、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 = ReadOneChar();/ 温度低 8 位temp_data1 = ReadOneChar();/ 温度高 8 位temp_alarm

24、0 = ReadOneChar();/ 温度报警 THtemp_alarm1 = ReadOneChar();/ 温度报警 TLtemp_comp=(temp_data0&0xf0)>>4)|(temp_data1&0x0f)<<4);/ 取温度整数值TR0=1;/ 开中断/*/*/* 数据转换与温度显示/*/*/*/*/Disp_Temperature()uchar s=0;if(temp_data1>127)/ 温度为负值/ 取反加一,将补码变成原码temp_data0=(temp_data0)+1;if(temp_data0)>=0xf

25、f)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;display1=display4%100;display2=display1/10+0x30;display1=display1%10+0x30;if(disp

26、lay3=0x30)/ 高位为0,不显示display3=0x20;if(display2=0x30) / 次高位为0,不显示display2=0x20;if(s)display3=0x2d;/ 显示负号lcd_pos(0x07);/ 百位数显示/ 十位数显示/ 个位数显示/ 小数位数显示/ 显示自定义字符/ 显示 Clcd_wdat(display3);lcd_wdat(display2);lcd_wdat(display1);lcd_wdat('.');lcd_wdat(display0);lcd_wdat(0x00);lcd_wdat('C');/*/*/

27、*/*/* /* 蜂鸣器响一声/* /*/ 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();/ 初始化 LCDlcd_pos(0);/ 设置显示位置为第一行for(m=0;m<16;m+)/ 显示字符lcd_wdat(cdis1m);Read_RomCord();/ 读取 64 位序列码CRC8();/CRC 效验if(

28、crc=0)/CRC 效验正确Disp_RomCode(2);/ 显示64 位序列码/*/*/*/*/* /* DS18B20 ERROR 显示菜单/* /*/ void Error_Menu ()uchar m;lcd_init();/ 初始化 LCDlcd_pos(0);/ 设置显示位置为第一行的第 1 个字符for(m=0;m<16;m+)lcd_wdat(cdis3m);/ 显示字符lcd_pos(0x40);/ 设置显示位置为第二行第1 个字符for(m=0;m<16;m+)lcd_wdat(cdis4m);/ 显示字符/*/*/*/*/* /* DS18B20 正常显示

29、菜单/* /*/ void Natural_Menu ()uchar m;lcd_init();/ 初始化 LCDlcd_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_Temp_alarm(0x4b,1);显示 TL值Disp_Temperature

30、();/ 显示实时温度值*/* / 显示报警温度/*/ void Disp_Temp_alarm(uchar addr,uchar num)/0=TH,1=TLdisplay12=temp_alarmnum/100+0x30;display10=temp_alarmnum%100;display11=display10/10+0x30;display10=display10%10+0x30;if(display12=0x30)/ 高位为 0,不显示display12=0x20;if(display11=0x30)/ 次高位为0,不显示display11=0x20;lcd_pos(addr);lcd_wdat(display12);/百位数显示lcd_wdat(display11);/十位数显示lcd_wdat(display10);/个位数显示/*/ / Time0 中断函数/*/ void Time0(void) interrupt 1 using 0TH0=0x4c;/50ms 定时TL0

温馨提示

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

评论

0/150

提交评论