大学毕设论文基于51单片机用lcd1602显示的ds18b20课程设计键控上下限报警功能Word格式.docx
- 文档编号:17642642
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:19
- 大小:146.82KB
大学毕设论文基于51单片机用lcd1602显示的ds18b20课程设计键控上下限报警功能Word格式.docx
《大学毕设论文基于51单片机用lcd1602显示的ds18b20课程设计键控上下限报警功能Word格式.docx》由会员分享,可在线阅读,更多相关《大学毕设论文基于51单片机用lcd1602显示的ds18b20课程设计键控上下限报警功能Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
5.可编辑数据为9~12位,转换12位温度时间为750ms(最大)。
6.DS18B20可将检测到温度值直接转化为数字量,并通过串行通信的方式与主控制器进行数据通信。
DS18B20引脚如图所示。
四.DS18B20时序图
1.初始化时序
2.写时序
3.读时序
五.STC89C51单片机简介。
89C52单片机主要特性
1.一个8位的微处理器(CPU)。
2.片内数据存储器RAM(128B),用以存放可以读/写的数据,如运算的中间结果、最终结果以及欲显示的数据等,SST89系列单片机最多提供1K的RAM。
3.片内程序存储器ROM(4KB),用以存放程序、一些原始数据和表格。
但也有一些单片机内部不带ROM/EPROM,如8031,8032,80C31等。
目前单片机的发展趋势是将RAM和ROM都集成在单片机里面,这样既方便了用户进行设计又提高了系统的抗干扰性。
SST公司推出的89系列单片机分别集成了16K、32K、64KFlash存储器,可供用户根据需要选用。
4.四个8位并行I/O接口P0~P3,每个口既可以用作输入,也可以用作输出。
5.两个定时器/计数器,每个定时器/计数器都可以设置成计数方式,用以对外部事件进行计数,也可以设置成定时方式,并可以根据计数或定时的结果实现计算机控制。
为方便设计串行通信,目前的52系列单片机都会提供3个16位定时器/计数器。
6.五个中断源的中断控制系统。
现在新推出的单片机都不只5个中断源,例如SST89E58RD就有9个中断源。
7.一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单机与微机之间的串行通信。
8.片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。
最高允许振荡频率为12MHz。
SST89V58RD最高允许振荡频率达40MHz,因而大大的提高了指令的执行速度。
6.总程序(分模块写)
1.main.c
#include<
reg51.h>
#include"
lcd.h"
temp.h"
voidLcdDisplay(int);
sbitK1=P2^0;
sbitK2=P2^1;
sbitK3=P2^2;
sbitK4=P2^3;
externintth=20;
externinttl=-10;
sbitbeep=P1^0;
voidmain()
{
LcdInit();
LcdWriteCom(0xc7);
LcdWriteData('
C'
);
while
(1)
{
if(K1==0)
Delay1ms(500);
if(K1==0);
th++;
}
if(K2==0)
if(K2==0);
th--;
if(K3==0)
if(K3==0);
tl++;
if(K4==0)
if(K4==0);
tl--;
LcdDisplay(Ds18b20ReadTemp());
}
voidLcdDisplay(inttemp)
{
inti,tt,rr,mm;
unsignedchardatas[]={0,0,0,0},datas1[]={0,0,0},datas2[]={0,0,0};
floattp;
if(temp<
0)
LcdWriteCom(0xc0);
-'
i=1;
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*10+0.5;
mm=-temp;
}
else
{
+'
mm=temp;
datas[0]=temp/1000;
datas[1]=temp%1000/100;
datas[2]=temp%100/10;
datas[3]=temp%10;
if(th<
LcdWriteCom(0x89);
tt=-th;
else
LcdWriteCom(0x89);
tt=th;
datas1[0]=tt/100;
datas1[1]=tt%100/10;
datas1[2]=tt%10;
LcdWriteCom(0x87);
H'
LcdWriteCom(0x88);
:
'
LcdWriteCom(0x8a);
0'
+datas1[0]);
LcdWriteCom(0x8b);
+datas1[1]);
LcdWriteCom(0x8c);
+datas1[2]);
if(tl<
LcdWriteCom(0x90);
rr=-tl;
{
LcdWriteCom(0x90);
rr=tl;
datas2[0]=rr/100;
datas2[1]=rr%100/10;
datas2[2]=rr%10;
LcdWriteCom(0x8e);
L'
LcdWriteCom(0x8f);
LcdWriteCom(0x91);
+datas2[0]);
LcdWriteCom(0x92);
+datas2[1]);
LcdWriteCom(0x93);
+datas2[2]);
if(mm>
=(th*10)||mm<
=(tl*10)||th<
=tl)
beep=0;
beep=1;
LcdWriteCom(0x80);
T'
LcdWriteCom(0x81);
A'
LcdWriteCom(0x82);
I'
'
LcdWriteCom(0x84);
LcdWriteCom(0x85);
N'
LcdWriteCom(0xc1);
+datas[0]);
LcdWriteCom(0xc2);
+datas[1]);
LcdWriteCom(0xc3);
+datas[2]);
LcdWriteCom(0xc4);
.'
LcdWriteCom(0xc5);
+datas[3]);
LcdWriteCom(0xc6);
"
2.lcd.h
#ifndef__LCD_H_
#define__LCD_H_
/**********************************
当使用的是4位数据传输的时候定义,
使用8位取消这个定义
**********************************/
#defineLCD1602_4PINS
包含头文件
//---重定义关键词---//
#ifndefuchar
#defineucharunsignedchar
#endif
#ifndefuint
#defineuintunsignedint
PIN口定义
#defineLCD1602_DATAPINSP0
sbitLCD1602_E=P2^7;
sbitLCD1602_RW=P2^5;
sbitLCD1602_RS=P2^6;
函数声明
/*在51单片机12MHZ时钟下的延时函数*/
voidLcd1602_Delay1ms(uintc);
//误差0us
/*LCD1602写入8位命令子函数*/
voidLcdWriteCom(ucharcom);
/*LCD1602写入8位数据子函数*/
voidLcdWriteData(uchardat);
/*LCD1602初始化子程序*/
voidLcdInit();
3.temp.h
#ifndef__TEMP_H_
#define__TEMP_H_
sbitDSPORT=P3^7;
voidDelay1ms(unsignedint);
unsignedcharDs18b20Init();
voidDs18b20WriteByte(unsignedcharcom);
unsignedcharDs18b20ReadByte();
voidDs18b20ChangTemp();
voidDs18b20ReadTempCom();
intDs18b20ReadTemp();
4.lcd.c
voidLcd1602_Delay1ms(uintc)//延时
uchara,b;
for(;
c>
0;
c--)
for(b=19;
b>
b--)
{
for(a=1;
a>
a--);
}
#ifndefLCD1602_4PINS//当没有定义这个LCD1602_4PINS时
voidLcdWriteCom(ucharcom)//写入一个字节命令
LCD1602_E=0;
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_DATAPINS=com;
Lcd1602_Delay1ms
(1);
LCD1602_E=1;
Lcd1602_Delay1ms(5);
#else
voidLcdWriteCom(ucharcom)
//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
LCD1602_DATAPINS=com<
<
4;
//发送低四位
#endif
#ifndefLCD1602_4PINS
voidLcdWriteData(uchardat)//写入一个字节数据
LCD1602_RS=1;
LCD1602_DATAPINS=dat;
#else
voidLcdWriteData(uchardat)
//写入时序
LCD1602_DATAPINS=dat<
//写入低四位
#ifndefLCD1602_4PINS
voidLcdInit()//LCD初始化子程序
LcdWriteCom(0x38);
LcdWriteCom(0x0c);
LcdWriteCom(0x06);
LcdWriteCom(0x01);
voidLcdInit()
LcdWriteCom(0x32);
LcdWriteCom(0x28);
5.temp.c
voidDelay1ms(unsignedinty)//延时
unsignedintx;
for(y;
y>
y--)
for(x=110;
x>
x--);
unsignedcharDs18b20Init()//初始化
unsignedinti;
DSPORT=0;
i=70;
while(i--);
DSPORT=1;
i=0;
while(DSPORT)
i++;
if(i>
5000)
return0;
//失败
return1;
//成功
voidDs18b20WriteByte(unsignedchardat)//写字节
unsignedinti,j;
for(j=0;
j<
8;
j++)
DSPORT=0;
//每写入一位数据之前先把总线拉低1us(数据手册上模糊)
DSPORT=dat&
0x01;
i=6;
while(i--);
DSPORT=1;
dat>
>
=1;
unsignedcharDs18b20ReadByte()
unsignedcharbyte,bi;
for(j=8;
j>
j--)
bi=DSPORT;
byte=(byte>
1)|(bi<
7);
i=4;
}
returnbyte;
voidDs18b20ChangTemp()//温度转换
Ds18b20Init();
Delay1ms
(1);
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0x44);
voidDs18b20ReadTempCom()//读取温度命令
Ds18b20WriteByte(0xbe);
intDs18b20ReadTemp()//读取温度
inttemp=0;
unsignedchartmh,tml;
Ds18b20ChangTemp();
Ds18b20ReadTempCom();
tml=Ds18b20ReadByte();
tmh=Ds18b20ReadByte();
temp=tmh;
temp<
=8;
temp|=tml;
returntemp;
7.心得体会
通过两个星期的努力,我的单片机课程设计基于DS18B20的温度显示系统,终于完成了。
虽然功能还不是很完善但却让我通过此次设计学会了不少东西。
学会了keil和proteus软件的使用,从原本的生涩到现在的纯熟,是一个进步的过程!
并且自己用C语言来编写代码,又通过这次课程设计学到了很多东西,部分跟C不太一样,通过网络的查找与应用,取得了不错的成效!
这次课程设计让我清楚的认识到只有理论与实践相结合才是真正的学习!
为了自己的将来,我定会认真学好大学课程,在图书馆与网络上拓宽自己的知识(网络对我们的帮助很大),努力进取,实现自己的抱负与理想!
8.参考文献
1.张俊谟著《单片机中级教程》,(第二版)。
2.《C语言课程设计》,山东农业大学版。
仿真的最终效果图如上
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大学 论文 基于 51 单片机 lcd1602 显示 ds18b20 课程设计 键控 下限 报警 功能
链接地址:https://www.bdocx.com/doc/17642642.html