基于单片机可调式时钟与温度显示.docx
- 文档编号:11878310
- 上传时间:2023-04-08
- 格式:DOCX
- 页数:34
- 大小:711.26KB
基于单片机可调式时钟与温度显示.docx
《基于单片机可调式时钟与温度显示.docx》由会员分享,可在线阅读,更多相关《基于单片机可调式时钟与温度显示.docx(34页珍藏版)》请在冰豆网上搜索。
基于单片机可调式时钟与温度显示
基于单片机的可调式万年历与温度显示论文
目录
一、设计目的2
二、摘要:
2
三、硬件电路设计2
1、单片机模块设计2
2、显示模块4
3、ds1302时钟系统5
4、ds18b20温度传感器7
5、键盘模块9
四、软件设计9
1、ds1302模块设计9
2、ds18b20模块设计12
3、主函数设计14
五、Proteus仿真26
1、开始界面26
2、修改状态27
修改后状态27
六、参考文献27
一、设计目的
本方案设计LCD1602显示万年历与温度的实验,使用基于AT89C51单片机,液晶1602显示,通过按键选中可以修改年月日,时分秒,外加温度显示。
二、摘要:
通过lcd1602显示万年历与温度,通过按键选中修改键,选中要修改的选项进行修改,修改后按确定键,修改成功,后面就会按这个显示,同时具有温度显示。
关键词:
单片机,键盘,lcd1602系统,ds1302系统,ds18b20系统
三、硬件电路设计
1、单片机模块设计
本次设计采用的是单片机AT89C51。
芯片共有40个引脚,引脚的排列顺序为从靠芯片的缺口,如图3.1所示。
左边那列逆时针数起,依次为1,2,3.....40,其中芯片的1脚顶上有一个凹点。
在单片机的40个引脚中,电源引脚2根,外接晶体振荡器引脚2根,控制引脚4根以及4组8位可编程I/O引脚32根。
本次电路板上电路图
图AT89C51管脚图
AT89C51单片机共有4组8位可编程I/O口,分别为P0、P1、P2、P3口,每个口有8位,共32根。
每一根引脚都可以编程,比如用来控制电机、交通灯等,开发产品时就是利用这些可编程引脚来实现我们想要的功能。
P0口:
8位双向I/O口线,名称为P0.0-P0.7;
P1口:
8位准双向I/O口线,名称为P1.0-P1.7;
P2口:
8位准双向I/O口线,名称为P2.0-P2.7;
P3口:
8位准双向I/O口线,名称为P3.0-P3.7。
本文单片机模块如图所示,主要是由单片机芯片与晶振和复位电路组成的。
是由单片机来控制整个系统,让我们的系统可以正常的运行。
2、显示模块
LM016L液晶模块采用HD44780控制器,HD44780具有功能较强而又简单的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU通讯可采用4位或8位并行传输两种方式,HD44780控制器是由2个8bit的寄存器、显示数据存储(DDRAM)、指令寄存器(IR)、RAM(DR)、地址计数器RAM(AC)、忙标志(BF)、字符发生器ROMA(CGOROM)以及字符发生器RAM(CGRAM)组成。
其中,DR是用来寄存数据的;IR是用来寄存指令码的,它只能够写入而不能够读出。
其数据是由内部操作自动地写入到CGRAM和DDRAM中来,或者是暂存从CGRAM以及DDRAM中读出的数据,BF为1时,LED模块工作于内部模式,既不会接受数据也不会响应外部的操作指令,DDTAM用来存储显示的字符,能存储80个字符码,CGROM由8位字符码生成5*7点阵字符160中和5*10点阵字符32种.8位字符编码和字符的对应关系,可以查看参考文献(30)中的表4.CGRAM是为用户编写特殊字符留用的,它的容量仅64字节,可以自定义8个5*7点阵字符或者4个5*10点阵字符,AC可以存储DDRAM和CGRAM的地址,如果地址码随指令写入IR,则IR自动把地址码装入AC,同时选择DDRAM或CGRAM但愿,LM016L液晶模块的引脚图如图3.5所示。
图3.51601引脚图
LM016L引脚介绍:
Vss(1脚):
一般接地。
Vdd(2脚):
接电源。
Vee(3脚):
LED显示器对比度调整端口,接地时,其对比度达到最高(当对比度过高时,就会产生“鬼影”,若要正常工作,则可以通过使用一个大小为10K的电位器来调整对比度),接电源时,其对比度降至最弱。
RS(4脚):
RS是寄存器选择端口。
当接低电平时,选择指令寄存器;接高电平时,选择数据寄存器。
R/W(5脚):
R/W为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
E(6脚):
E(或EN)端为使能(enable)端,下降沿使能。
Lcd1602与单片机的接口
3、ds1302时钟系统
DS1302是DALLAS公司推出的涓流充电时钟芯片。
内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作。
DS1302芯片广脚介绍:
X1、X2为32.768KHz晶振管脚。
GND 为地。
RST复位脚。
I/O数据输入/输出引脚。
SCLK串行时钟。
Vcc1,Vcc2电源供电管脚。
与单片机连接的信号线为:
DS1302_SCLK 接P3^6;
实时时钟时钟线引脚 DS1302_IO 接P3^4;
实时时钟数据线引脚 DS1302_RST 接P3^5; 实时时钟复位线引脚
特别注意DS1302芯片在读取或写入数据时,都是一位一位传送的,并且每传送一位,SCLK信号线要有一个负跳变。
即单片机对SCLK咬先送高电平,再送低电平。
数据时通过IO进行传送的。
单片机与ds1302接口
4、ds18b20温度传感器
DS1820数字温度计提供9位温度读数,指示器件的温度
信息经过单线接口送入DS1820或从DS1820送出因此从中央处理器到DS1820仅需连接一条
线和地读写和完成温度变换所需的电源可以由数据线本身提供而不需要外部电源
因为每一个DS1820有唯一的系列号siliconserialnumber因此多个DS1820可以存在
于同一条单线总线上这允许在许多不同的地方放置温度灵敏器件此特性的应用范围包括HVAC
环境控制建筑物设备或机械内的温度检测以及过程监视和控制中的温度检测
112特性
独特的单线接口只需1个接口引脚即可通信
多点multidrop能力使分布式温度检测应用得以简化
不需要外部元件
可用数据线供电
不需备份电源
测量范围从-55至+125增量值为0.5等效的华氏温度范围是-67F至257F
增量值为0.9F
以9位数字值方式读出温度
在1秒典型值内把温度变换为数字
用户可定义的非易失性的温度告警设置
告警搜索命令识别和寻址温度在编定的极限之外的器件温度告警情况
应用范围包括恒温控制工业系统消费类产品温度计或任何热敏系统
5、键盘模块
本次试验需要四个独立按键,分别接到单片机的p3^0,P3^1,P3^2,P3^3,分别的意思的菜单,加一,减一,确定键,通过这些键修改lcd1602显示,与ds1302内部数据。
四、软件设计
1、ds1302模块设计
Ds1302.h
#ifndef__DS1302_H__
#define__DS1302_H__
#include
#include
//---重定义关键词---//
#ifndefuchar
#defineucharunsignedchar
#endif
#ifndefuint
#defineuintunsignedint
#endif
sbitio=P3^4;
sbitsclk=P3^6;
sbitrst=P3^5;
voidds1302_write(ucharaddr,uchardat);
uchards1302_read(ucharaddr);
voidds1302_init();
voidds1302_readtime();
#endif
Ds1302.c
#include
uchardatatime[7]={0x20,0x10,0x20,0x07,0x04,0x04,0x16};//存取数据
voidds1302_write(ucharaddr,uchardat)
{
ucharn;
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
_nop_();
for(n=0;n<8;n++)
{
io=addr&0x01;
addr>>=1;
sclk=1;
_nop_();
sclk=0;
_nop_();
}
for(n=0;n<8;n++)
{
io=dat&0x01;
dat>>=1;
sclk=1;
_nop_();
sclk=0;
_nop_();
}
rst=0;
_nop_();
}
uchards1302_read(ucharaddr)
{
ucharn,dat,dat1;
sclk=0;
_nop_();
rst=1;
_nop_();
for(n=0;n<8;n++)
{
io=addr&0x01;
addr>>=1;
sclk=1;
_nop_();
sclk=0;
_nop_();
}
_nop_();
for(n=0;n<8;n++)
{
dat1=io;
dat=(dat1<<7)|(dat>>1);
sclk=1;
_nop_();
sclk=0;
_nop_();
}
rst=0;
_nop_();
sclk=1;
_nop_();
io=0;
_nop_();
io=1;
_nop_();
returndat;
}
voidds1302_init()
{
ucharn,addr=0x80;
ds1302_write(0x8e,0x00);
for(n=0;n<7;n++)
{
ds1302_write(addr,datatime[n]);
addr+=2;
}
ds1302_write(0x8e,0x80);
}
voidds1302_readtime()
{
ucharn,addr=0x81;
for(n=0;n<7;n++)
{
datatime[n]=ds1302_read(addr);
addr+=2;
}
}
2、ds18b20模块设计
Ds18b20.h
#ifndef__DS18B20_H__
#define__DS18B20_H__
#include
#include
//---重定义关键词---//
#ifndefuchar
#defineucharunsignedchar
#endif
#ifndefuint
#defineuintunsignedint
#endif
sbitDQ=P3^7;
#definedelay_4us();{_nop_();_nop_();_nop_();_nop_();}
ucharinit_ds18b20();
ucharreadbyte();
voidwritebyte(uchardat);
ucharread_tem();
voiddelay_ms(uchari);
voiddelay_8us(uchari);
#endif
Ds18b20.c
#include"ds18b20.h"
inttemp;
voiddelay_8us(uchari)
{
while(i--);
}
voiddelay_ms(uchari)
{
ucharm;
while(i--)
{
for(m=0;m<120;m++);
}
}
ucharinit_ds18b20()
{
ucharstatus;
DQ=1;delay_8us(8);
DQ=0;delay_8us(90);
DQ=1;delay_8us(5);
status=DQ;delay_8us(90);DQ=1;
returnstatus;
}
voidwritebyte(uchardat)
{
uchari;
for(i=0;i<8;i++)
{
DQ=0;dat>>=1;
DQ=CY;delay_8us(8);
DQ=1;
}
}
ucharreadbyte()
{
uchari,dat=0x00;
for(i=0x01;i!
=0x00;i<<=1)
{
DQ=0;_nop_();
DQ=1;_nop_();
if(DQ)dat=dat|i;
delay_8us(8);
DQ=1;
}
returndat;
}
ucharread_tem()
{
uchartml,tmh;
if(init_ds18b20()==1)return0;
else
{
writebyte(0XCC);
writebyte(0X44);
delay_8us(500);
init_ds18b20();
writebyte(0XCC);
writebyte(0XBE);
tml=readbyte();//先读低字节
tmh=readbyte();
temp=tmh;
temp<<=8;
temp|=tml;
return1;
}
}
3、主函数设计
Main,C
#include"string.h"
#include"lcd1602.h"
#include"ds1302.h"
#include"ds18b20.h"
#include"stdio.h"
sbitkey1=P3^0;//菜单
sbitkey2=P3^1;//加一
sbitkey3=P3^2;//减一
sbitkey4=P3^3;//确定
codeucharm_days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
uchark1=0,k2=0,k3=0,k4=0;
ucharcount=0,meue=1;
ucharw1;
ucharyear=16,mon=4,day=7,hou=20,min=15,sec=20;
ucharyear1=1,year2=6,mon1=0,mon2=4,day1=0,day2=7,hou1=2,hou2=0,min1=1,min2=5,sec1=2,sec2=0,a=2,b=0;
uchar*week[]={"sun","mon","tus","wen","thu","fri","sat"};
ucharlcd_buf_1[]="2016-04-07";
ucharlcd_buf_2[]="20:
15:
20\xdf\x43";
externuchardatatime[7];
externinttemp;
ucharisleapyear(uchary)//判断是否为闰年
{
return(y%4==0&&y%100!
=0)||(y%400==0);
}
voidformat_datatime(uchard,uchar*c)
{
*c=(d>>4)+'0';*(c+1)=(d&0x0f)+'0';
}
voidkeyscan()
{
if(key1==0)
{
delay_ms(5);
if(key1==0)
{
while(key1==0);
k1=1;
meue=0;//进入参数设置模式
count++;
if(count>14)
count=1;
}
}
if(key2==0)
{
delay_ms(5);
if(key2==0)
{
while(key2==0);
if(k1==1)
k2=1;
}
}
if(key3==0)
{
delay_ms(5);
if(key3==0)
{
while(key3==0);
if(k1==1)
k3=1;
}
}
if(key4==0)
{
delay_ms(5);
if(key4==0)
{
while(key4==0);
k4=1;
count=0;
if(count==0)
count=14;
}
}
}
voidkeyhandle()
{
uchartemp;
switch(count)
{
case1:
write_lcd_command(0x80);
write_lcd_command(0x0f);
if(k2==1)
{
a++;
if(a>9)
a=0;
k2=0;
write_lcd_command(0x80);
write_lcd_data(a+'0');
}
if(k3==1)
{
a--;
if(a==-1)
a=9;
k3=0;
write_lcd_command(0x80);
write_lcd_data(a+'0');
}
break;
case2:
write_lcd_command(0x80+0x01);
write_lcd_command(0x0f);
if(k2==1)
{
b++;
if(b>9)
b=0;
k2=0;
write_lcd_command(0x80+0x01);
write_lcd_data(b+'0');
}
if(k3==1)
{
b--;
if(b==-1)
b=9;
k3=0;
write_lcd_command(0x80+0x01);
write_lcd_data(b+'0');
}
break;
case3:
write_lcd_command(0x80+0x02);
write_lcd_command(0x0f);
if(k2==1)
{
year1++;
if(year1>9)
year1=0;
k2=0;
write_lcd_command(0x80+0x02);
write_lcd_data(year1+'0');
}
if(k3==1)
{
year1--;
if(year1==-1)
year1=9;
k3=0;
write_lcd_command(0x80+0x02);
write_lcd_data(year1+'0');
}
break;
case4:
write_lcd_command(0x80+0x03);
write_lcd_command(0x0f);
if(k2==1)
{
year2++;
if(year2>9)
year2=0;
k2=0;
write_lcd_command(0x80+0x03);
write_lcd_data(year2+'0');
}
if(k3==1)
{
year2--;
if(year2==-1)
year2=9;
k3=0;
write_lcd_command(0x80+0x03);
write_lcd_data(year2+'0');
}
break;
case5:
write_lcd_command(0x80+0x05);
write_lcd_command(0x0f);
if(k2==1)
{
mon1++;
if(mon1>1)
mon1=0;
k2=0;
write_lcd_command(0x80+0x05);
write_lcd_data(mon1+'0');
}
if(k3==1)
{
mon1--;
if(mon1==-1)
mon1=1;
k3=0;
write_lcd_command(0x80+0x05);
write_lcd_data(mon1+'0');
}
break;
case6:
write_lcd_command(0x80+0x06);
write_lcd_command(0x0f);
if(k2==1)
{
mon2++;
if(mon1==1)
{if(mon2>2)
mon2=0;}
else
if(mon2>9)
mon2=0;
k2=0;
write_lcd_command(0x80+0x06);
write_lcd_data(mon2+'0');
}
if(k3==1)
{
mon2--;
if(mon1==1)
{if(mon2==-1)
mon2=2;}
else
if(mon2==-1)
mon2=9;
k3=0;
write_lcd_command(0x80+0x06);
write_lcd_data(mon2+'0');
}
break;
case7:
write_lcd_command(0x80+0x08);
write_lcd_command(0x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 调式 时钟 温度 显示