小区液晶显示仪.docx
《小区液晶显示仪.docx》由会员分享,可在线阅读,更多相关《小区液晶显示仪.docx(26页珍藏版)》请在冰豆网上搜索。
![小区液晶显示仪.docx](https://file1.bdocx.com/fileroot1/2023-7/24/15dd2129-2779-43e1-bae9-d1279cf629e9/15dd2129-2779-43e1-bae9-d1279cf629e91.gif)
小区液晶显示仪
单片机课程设计报告
题目小区液晶显示仪
专业电气工程及其自动化
班级
组长
成员
指导教师
2011年03月09日
摘要:
为了让小区的居民更方便,不必为不知道当天的温度而犯愁,本项目设置了一个液晶显示系统,它能够感应周围的温度和显示当天时间。
本课题分成两大模块,分别是温度采集模块以及由时钟芯片设计的高精度时间模块。
温度采集模块是使用ds18b20,时间模块是用ds12c887,两个采集模块将采集信号送入单片机89c51,随后单片机将信号进行整理,送入液晶12864显示。
关键词:
单片机89c51,温度传感器ds18b20,时钟芯片ds12c887,液晶12864
Abstract:
Thisdesignisbasedonsinglechip12864LCDdisplaysystem,usingAT89C51controlcircuit,realizetheperipheryLCDdigital,temperature,timeordate,andotherfunctions.Candirectlythroughholdingthetemperaturesensor,toadjusttheLCDscreenabovenumber.Temperaturesensoradopts-,clockmoduleUSESAT89C51,throughtocontrol-temperaturesensors,clockmodule.IntheLCDdisplayed.SCMjoinsconvenientandmakesimplecircuit,theattachmentisconcise,compactstructure,thedesignwithflexibility,fullyrealizedthetopicrequest.
Keyword:
89c51ds18b20ds12c88712864
目录
1课程设计任务4
1.1功能要求4
1.2元器件清单4
2整体设计方案5
2.1设计思路5
2.2整体框图5
2.3各模块功能5
2.4单片机口线分布6
3硬件电路设计6
3.1AT89C51单片机6
3.2温度采集模块设计电路8
3.3时钟模块硬件电路10
3.4液晶模块硬件电路13
4控制软件设计15
4.1温度采集模块软件设计15
4.2时钟模块软件设计16
5系统调试16
5.1温度采集模块调试及问题16
5.2时间模块调试及问题17
6个人小结18
7参考文献21
8附件22
8.1附件一硬件电路图22
8.2附件二设计成品实物图23
8.3附件三程序清单24
1课程设计任务
1.1功能要求
本项目设置了一个液晶显示系统,它能够显示周围的温度和当天时间,通过温度传感器ds18b20将温度信号传给单片机处理,再经过液晶屏显示出来。
时钟芯片ds12c887可提高时间的精度。
利用单片机,结合传感器技术而开发设计了这一温度监控系统。
课题中将传感器理论与单片机实际应用有机结合。
1.2元器件清单
元器件
数量
89c51
1
ds18b20
1
ds12c887
1
液晶12864
1
DC~5V电源
1
按钮开关
6
电容
若干
电阻
若干
2整体设计方案
2.1设计思路
本课题采用两个模块:
温度模块和时间模块。
温度采集模块使用ds18b20,现有温度传感器感应周围的温度,将采集到的温度传送到单片机内,经过处理后将数据送入液晶屏内;时间模块是用ds12c887,硬件连接后,通过软件单片机直接对其进行处理,随后将信号进行整理,送入液晶显示。
2.2整体框图
2.3各模块功能
温度传感器模块:
采集温度信号传递给单片机
时钟模块:
能够自动产生年、月、日、时、分、秒等时间信息
液晶模块:
显示温度、时间
单片机89C51:
信号处理
2.4单片机口线分布
口线
功能
P0
液晶D0~D7数据读、写口
P1
时钟模块数据接口
P2
温度传感器信号口、时钟模块控制接口
P3
液晶控制接口
RST/Vpd
复位信号输入端(高电平有效)
ALE/-PROG
地址锁存信号输出端
PSEN
外部程序存储器读选通信号
EA/Vpp
外部程序存储器使能端
3硬件电路设计
3.1AT89C51单片机
注:
引脚说明:
①电源引脚
Vcc(40脚):
典型值+5V。
Vss(20脚):
接低电平。
②外部晶振
X1、X2分别与晶体两端相连接。
当采用外部时钟信号时,X2接振荡信号,X1接地。
③输入输出口引脚:
P0口:
I/O双向口。
作输入口时,应先软件置“1”。
P1口:
I/O双向口。
作输入口时,应先软件置“1”。
P2口:
I/O双向口。
作输入口时,应先软件置“1”。
P3口:
I/O双向口。
作输入口时,应先软件置“1”。
④控制引脚:
RST/Vpd、ALE/-PROG、-PSEN、-EA/Vpp组成了MSC-51的控制总线。
RST/Vpd(9脚):
复位信号输入端(高电平有效)。
第二功能:
加+5V备用电源,可以实现掉电保护RAM信息不丢失。
ALE/-PROG(30脚):
地址锁存信号输出端。
第二功能:
编程脉冲输入。
-PSEN(29脚):
外部程序存储器读选通信号。
-EA/Vpp(31脚):
外部程序存储器使能端。
第二功能:
编程电压输入端(+21V)。
3.2温度采集模块设计电路
a、接线电路图:
b、实物图:
c、工作原理:
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
1)DS18B20的写时序
对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
图3.1-1DS18B20的写时序
2)DS18B20的读时序
对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。
DS18B20在完成一个读时序过程,至少需要60us才能完成。
图3.1-2DS18B20的读时序
d、设计原理:
温度传感器感应周围的温度,将采集到的温度传送到单片机内,经过处理后将数据送入液晶屏内;
3.3时钟模块硬件电路
a、接线电路图:
b、实物图:
c、工作原理:
1)DS12C887中自带有锂电池,外部掉电时,其内部时间信息还能够保持10年之久;对于一天内的时间记录,有12小时制和24小时制两种模式。
在12小时制模式中,用AM和PM区分上午和下午;时间的表示方法也有两种,一种用二进制数表示,一种是用BCD码表示;DS12C887中带有128字节RAM,其中有11字节RAM用来存储时间信息,4字节RAM用来存储DS12C887的控制信息,称为控制寄存器,113字节通用RAM使用户使用;此外用户还可对DS12C887进行编程以实现多种方波输出,并可对其内部的三路中断通过软件进行屏蔽。
2)口线分布:
GND、VCC
VCC=+5V时,访问内部RAM中的数据,对其进行读、写操作;
VCC<+4.25V时,禁止用户对内部RAM进行读、写操作
MOT
模式选择脚,当MOT接VCC时,选用的工作模式是Motorola模式,当MOT接GND时,选用的是Intel模式
SQW
方波输出脚,本课题不使用
AD0~AD7
复用地址数据总线
AS
地址选通输入脚
DS/RD
数据选择或读输入脚
R/W
读/写输入端
CS
片选输入,低电平有效
IRQ
中断请求输入,低电平有效
3)如表1所示其存储功能:
d、设计原理:
单片机P1口接时钟芯片数据口,其余控制口接P2口,通过单片机控制时钟芯片的控制端口,将时钟模块从数据口产生信号传入单片机内,分别读出时钟的时、分、秒、年、月、日,最后显示到液晶。
3.4液晶模块硬件电路
a、接线电路图:
b、实物图:
c、工作原理:
1)管脚说明:
2)读、写时序图:
1.写操作时序
2. 读操作时序
d、设计原理:
由控制口来打开液晶的读、写操作,数据口处理单片机发送的指令显示温度、时间。
4控制软件设计
4.1温度采集模块软件设计
a、功能:
温度传感器采集周围温度变化信号
b、流程图:
4.2时钟模块软件设计
a、功能:
实现时钟的时、分、秒、年、月、日,最后显示到液晶
b、流程图:
5系统调试
5.1温度采集模块调试及问题
a、调试方法:
改变环境,观察液晶显示数值是否与温度计测量数值相符
b、出现问题:
(1)液晶不显示
解决方法:
软件调试无问题,检查硬件线路,经仔细排查,发现是晶振损坏
(2)显示温度与实际温度有较大差别
解决方法:
修改软件中的参数
5.2时间模块调试及问题
a、调试方法:
将芯片与单片机相连,软件输入指令后,观察是否在液晶上显示正确
b、出现问题:
液晶显示不正确
c、解决方法:
调试软件,检查相关线路
6个人小结
实验心得
在电子技术应用领域中,单片机的应用愈来愈多地应用到各行各业。
如:
工业控制、仪器仪表、电讯技术、汽车与节能、商用产品、家用电器等。
要开发单片机的应用,不但要掌握单片机硬件和软件方面的知识,而且还要深入了解各应用系统的专业知识,将这两方面的知识融会贯通和有机结合,才能设计出优良的应用系统。
通过单片机课程设计,不仅加深了对单片机理论的理解,将理论很好的应用到实践当中去,而且学回了如何培养我们的创新精神,从而不断超越自己。
整个设计过程中,我也遇到了不少问题,单片机最小系统不工作,后来才发现是晶振坏掉了之后的液晶也不显示,后来对照同学发现也是硬件有问题。
后来花了很长时间又重新检查线路、调试程序,最终成功实现了功能。
为了提高对传感器的认识和了解,尤其是对温度传感器的深入研究以及其用法与用途,基于实用、广泛和典型的原则而设计了本系统。
本文利用单片,机结合传感器技术而开发设计了这一温度监控系统。
文中传感器理论单片机实际应用有机结合,详细地讲述了利用热敏传感器探测环境温度的过程,以及实现热电转换的原理过程。
本设计应用性强,系统可以作为生物培养液温度监控系统,如果稍微改装可以做热水器温度调节系统、实验室温度监控系统等等。
课题主要任务是完成环境温度检测,利用单片机实现温度调节并通过计算机实施温度监控。
设计后的系统具有操作方便,控制灵活等优点。
成员签名:
实验心得
在本次设计过程中,遇到过许多的问题。
刚开始不知道怎么把电话线上的语音信号录制到语音芯片中也不知道怎么把语音芯片中的语音信号上传到电话线上,后来查阅很多相关资料后原来使用变压器耦合到电话线。
但是还是不知道怎么耦合,再继续研究后才搞明白了。
在电路中采用了模拟器件和数字器件所以需要+5V和+3V电源供电。
在本次设计的过程中,我发现很多的问题,给我的感觉就是很难,很不顺手,看似很简单的电路,要动手把它给设计出来,是很难的一件事,主要原因是我们没有经常动手设计过电路,还有资料的查找也是一大难题,这就要求我们在以后的学习中,应该注意到这一点,更重要的是我们要学会把从书本中学到的知识和实际的电路联系起来,这不论是对我们以后的就业还是学习,都会起到很大的促进和帮助。
同时,通过本次设计,巩固了我们学习过的专业知识,也使我们把理论与实践从真正意义上相结合了起来;考验了我们借助互联网络搜集、查阅相关文献资料,和组织材料的综合能力;从中可以自我测验,认识到自己哪方面有欠缺、不足,以便于在日后的学习中得以改进、提高;通过使用电子电路设计软件Protel99se,也让我们了解到计算机辅助设计(CAD)的智能化,有利于提高工作效率,虽然在设计中遇见很多的问题,但通过查阅书刊和网上收集资料,逐步解决了遇见的问题,对设计中出现的比较生疏的芯片进行了收集和学习,对掌握新的知识能力有了进一步的提高,节省了电路的设计需要。
成员签名:
实验心得
这次的实验遇到了不少的困难,原本想做一个温度、湿度和时间的液晶显示,但是效果与预期的并不非常乐观,刚开始的硬件连接就有问题,导致后来的时间跟不上,因为单单硬件检测就花了我们好多的时间,程序上只作出温度的显示,原先预定的时间遇到了非常大的困难,我们的液晶是12864这型号的,一行只显示8位,一共4行,可我的年月日和当天的时间加起来有二十多位,最后不得不放弃,这是一大遗憾,尽管如此,这次单片机的课程设计对今后的学习工作有很大的帮助。
我觉得就我们在课堂上学到的这点知识还是极其有限的,更多的东西还靠我们自己去课下学习。
老师只起到一个引导我们学习的作用,关键还是在于我们自己。
我们不但要掌握单片机硬件和软件方面的知识,而且还要深入了解各应用系统的专业知识,只有将这两方面的知识融会贯通和有机结合,才能设计出优良的应用系统。
这次的实验教会了我很多,令我感触最深的是硬件的检测,在程序一样的情况下,我们的液晶不显示而别人的却能显示,可是光凭肉眼却又无法看出线路的问题,在这样的情况下,我们学会了如何用万用表来检测电路,这不仅仅是理论上的,更是从实际操作上慢慢体验出来的,这对我们也未尝不是件好事,在老师的指导下终于检测出虚汗加焊,然后再调试软件。
组长签名
7参考文献
[1]沈任元吴勇《常用电子元器件简明手册》
机械工业出版社2000.4
[2]宋彩利孙友仓吴宏岐《单片机原理与C51编程》
西安交通大学出版社2008.6
[3]郭天祥51单片机C语言教程——入门、开发、拓展全攻略
电子工业出版社2010.5
[4]彭伟单片机C语言程序设计100例
电子工业出版社2010.6
[5]皮大能,南光群,刘金华单片机课程设计指导书
北京理工大学出版社2010.7
[6]王义军单片机原理及应用习题与实验指导书
中国电力出版社2006.7
[7]马静单片机原理与应用实践教学
中国计量出版社2004.11
[8]学林单片机网
[9]XX百科
8附件
8.1附件一硬件电路图
8.2附件二设计成品实物图
8.3附件三程序清单
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P2^2;//ds18b20与单片机连接口
sbitRS=P3^5;
sbitRW=P3^6;
sbitEN=P3^4;
sbitPSB=P3^7;
unsignedcharcodestr1[]={"温度:
"};
unsignedcharcodestr2[]={""};
uchardatadisdata[5];
uinttvalue;//温度值
uchartflag;//温度正负标志
/********************lcd12864程序****************/
voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的)
{unsignedinti,j;
for(i=0;ifor(j=0;j<100;j++);
}
voidwr_com(unsignedcharcom)//写指令//
{delay1ms
(1);
RS=0;
RW=0;
EN=0;
P0=com;
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
voidwr_dat(unsignedchardat)//写数据//
{delay1ms
(1);;
RS=1;
RW=0;
EN=0;
P0=dat;
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
voidlcd_init()//初始化设置//
{delay1ms(15);
PSB=1;
wr_com(0x30);delay1ms(5);
wr_com(0x0c);delay1ms(5);
wr_com(0x01);delay1ms(5);
}
voidlcd_pos(ucharX,ucharY)//设定显示位置//
{
ucharpos;
if(X==0)
{X=0x80;}
elseif(X==1)
{X=0x90;}
elseif(X==2)
{X=0x88;}
if(X==3)
{X=0x98;}
pos=X+Y;
write_com(pos);//显示地址//
}
init_play()//初始化显示
{uchari;
lcd_init();
lcd_pos(2,0);
i=0;
while(str1[i]!
='\0')
{
wr_dat(str1[i]);
i++;
}
}
/********************ds18b20程序******************/
voiddelay_18B20(unsignedinti)//延时1微秒
{
while(i--);
}
voidds1820rst()//ds1820复位//
{unsignedcharx=0;
DQ=1;//DQ复位//
delay_18B20(4);//延时//
DQ=0;//DQ拉低
delay_18B20(100);//精确延时大于480us
DQ=1;//拉高
delay_18B20(40);
}
uchards1820rd()//读数据//
{unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
voidds1820wr(ucharwdata)//写数据//
{unsignedchari=0;
for(i=8;i>0;i--)
{DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ=1;
wdata>>=1;
}
}
read_temp()//读取温度值并转换//
{uchara,b;
ds1820rst();
ds1820wr(0xcc);//跳过读序列号//
ds1820wr(0x44);//启动温度转换//
ds1820rst();
ds1820wr(0xcc);//跳过读序列号//
ds1820wr(0xbe);//读取温度//
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/**************************************/
voidds1820disp()//温度值显示
{ucharflagdat;
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)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
wr_com(0x98);
wr_dat(flagdat);//显示符号位
wr_com(0x99);
wr_dat(disdata[0]);//显示百位
wr_com(0x9a);
wr_dat(disdata[1]);//显示十位
wr_com(0x9b);
wr_dat(disdata[2]);//显示个位
wr_com(0x9c);
wr_dat(0x2e);//显示小数点
wr_com(0x9d);
wr_dat(disdata[3]);//显示小数位
}
/*****************主程序****************/
voidmain()
{init_play();//初始化显示
while
(1)
{read_temp();//读取温度
ds1820disp();//显示
}
}