基于单片机的时钟温度显示器制作报告.docx

上传人:b****8 文档编号:30378053 上传时间:2023-08-14 格式:DOCX 页数:26 大小:195.57KB
下载 相关 举报
基于单片机的时钟温度显示器制作报告.docx_第1页
第1页 / 共26页
基于单片机的时钟温度显示器制作报告.docx_第2页
第2页 / 共26页
基于单片机的时钟温度显示器制作报告.docx_第3页
第3页 / 共26页
基于单片机的时钟温度显示器制作报告.docx_第4页
第4页 / 共26页
基于单片机的时钟温度显示器制作报告.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

基于单片机的时钟温度显示器制作报告.docx

《基于单片机的时钟温度显示器制作报告.docx》由会员分享,可在线阅读,更多相关《基于单片机的时钟温度显示器制作报告.docx(26页珍藏版)》请在冰豆网上搜索。

基于单片机的时钟温度显示器制作报告.docx

基于单片机的时钟温度显示器制作报告

基于单片机的时钟温度显示器制作报告

班级:

电子信息工程1003班姓名:

刘洋

一:

方案

1:

采用STC89C52单片机便于硬件扩展。

2:

采用LCD1602液晶显示。

3:

采用DS12C887时钟芯片。

4:

采用DS18B20温度传感器。

5:

采用直流电源供电。

因知识水平有限,所以直接采用5.5V直流电源供电。

6:

安装有电池仓,可用两节CR2302电池供电。

二:

主要元件简介

1:

1602LCD:

标准字符型液晶显示模块(LCM),采用点阵型液晶显示器(LCD),可显示16个字符X2行西文字符,字符尺寸为2.95X4.35(WXH)mm,内置HD44780及兼容芯片接口型液晶显示控制器,可与单片机直接连接,广泛应用于各类仪器仪表及电子设备。

2:

DS12C887实时时钟芯片功能丰富,可以用来直接代替IBMPC上的时钟日历芯片DS12887,同时,它的管脚也和MCB、DS12887相兼容。

由于DS12C887能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部又增加了世纪寄存器,从而利用硬件电路解决子“千年”问题;DS12C887中自带有锂电池,外部掉电时,其内部时间信息还能够保持10年之久;对于一天内的时间记录,有12小时制和24小时制两种模式。

在12小时制模式中,用AM和PM区分上午和下午;时间的表示方法也有两种,一种用二进制数表示,一种是用BCD码表示;DS12C887中带有128字节RAM,其中有11字节RAM用来存储时间信息,4字节RAM用来存储DS12C887的控制信息,称为控制寄存器,113字节通用RAM使用户使用;此外用户还可对DS12C887进行编程以实现多种方波输出,并对其内部的三路中断通过软件进行屏蔽。

3:

TS-18B20数字温度传感器,采用DALLAS公司生产的DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。

  3.1独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

  3.2测温范围-55℃~+125℃,固有测温分辨率0.5℃。

  3.3支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定,实现多点测温

  3.4工作电源:

3~5V/DC

  3.5在使用中不需要任何外围元件

  3.6测量结果以9~12位数字量方式串行传送

  3.7适用于DN15~25,DN40~DN250各种介质工业管道和狭小空间设备测温

3.8PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接。

 

三:

设计

1:

电子线路:

用导线与锡条手工焊制,略显粗陋。

2:

程序设计:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitlcdrs=P2^4;//液晶控制

sbitlcden=P2^6;

sbitlcdrr=P2^5;

sbitwen=P3^6;//温度按键

sbitled=P3^7;

sbits1=P1^0;//按键

sbits2=P1^1;

sbits3=P1^2;

sbits4=P1^3;

sbitdscs=P1^4;//时钟控制

sbitdsas=P1^5;

sbitdsrw=P1^6;

sbitdsds=P1^7;

sbitdsirq=P3^3;

sbitds=P3^1;//温度数据传输口

bitflag1,flag_ri,flag2;

ucharyear,month,week,day,shi,fen,miao,amiao,ashi,afen,str[6],flag_get,strt[]="Temperature";

ucharcount,s1num,flag,t0_num;

uinttemp;

intnum,j;

voiddelay(intz)//延时1ms函数

{

intx,y;

for(x=z;x>0;x--)

for(y=0;y<110;y++);

}

voidshan()

{

led=1;

delay(50);

led=0;

}

voidwrite_com(charcom)//液晶写指令

{

lcdrs=0;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

voidwrite_date(chardate)//液晶写数据

{

lcdrs=1;

P0=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

voidwrite_ds(ucharadd,uchardate)//写时钟芯片数据

{

dscs=0;

dsas=1;

dsds=1;

dsrw=1;

P0=add;

dsas=0;

P0=0xff;

dsrw=0;

P0=date;

dsrw=1;

dsas=1;

dscs=1;

}

ucharread_ds(ucharadd)//读取时钟芯片数据

{

uchards_date;

dsas=1;

dsds=1;

dsrw=1;

dscs=0;

P0=add;

dsas=0;

dsds=0;

P0=0xff;

ds_date=P0;

dsds=1;

dscs=1;

returnds_date;

}

voidinittem(void)//温度芯片初始化

{

ds=1;

delay1(8);

ds=0;

delay1(80);

ds=1;

delay1(20);

}

voidwriteone(uchardat)//温度写一个字节

{

uchari=0;

for(i=8;i>0;i--)

{

ds=0;

ds=dat&0x01;

delay1(5);

ds=1;

dat>>=1;

}

delay1(5);

}

ucharreadone()//温度读一个字节

{

uchari=0;

uchardat=0;

for(i=8;i>0;i--)

{

ds=0;

dat>>=1;

ds=1;

if(ds)

dat|=0x80;

delay1(5);

}

return(dat);

}

uintreadtem(void)//读取温度数据

{

uchara=0;

uintb=0;

uintt=0;

inittem();

writeone(0xCC);

writeone(0x44);

delay1(200);

inittem();

writeone(0xCC);

writeone(0xBE);

a=readone();

b=readone();

b<<=8;

t=a+b;

returnt;

}

voidjisuan()//转换原始温度数据为十进制数

{

ucharTempH,TempL;

temp=readtem();

if(temp&0x8000)

{

str[0]='-';

temp=~temp;

temp+=1;

}

else

str[0]='+';

TempH=temp>>4;

TempL=temp&0x0F;

TempL=TempL*6/10;

flag_get=0;

str[1]=(TempH%100)/10+0x30;//储存在数组中

str[2]=TempH%10+0x30;

str[3]='.';

str[4]=TempL+0x30;

str[5]='C';

}

voidinit()//中断、液晶、数据初始化

{

write_ds(1,0);

EA=1;

EX1=1;

IT1=1;

flag1=0;

t0_num=0;

s1num=0;

week=1;

lcden=0;

lcdrs=0;

lcdrr=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80+0x40+6);

write_date(':

');

write_com(0x80+0x40+9);

write_date(':

');

write_com(0x80);

write_date('2');

write_date('0');

}

voidwrite_tem()//液晶显示温度函数

{

inti;

jisuan();

write_com(0x80+0x40+6);

for(i=0;i<6;i++)

write_date(str[i]);//直接使用存在数组中的温度数据

}

voidwrite_sfm(charadd,chardate)//液晶显示时分秒函数

{

charshi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+0x40+add);

write_date(0x30+shi);

write_date(0x30+ge);

}

voidwrite_nyr(charadd,chardate)//液晶显示年月日函数(与时分秒不在一行,所以分开方便控制)

{

charshi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+add);

write_date(0x30+shi);

write_date(0x30+ge);

}

voidwrite_week(charw)//液晶显示星期函数(与年月日等显示方式不同)

{

inti;

charweek[7][3]={"MON","TUE","WEN","THU","FRI","SAT","SUN"};

write_com(0x80+13);

for(i=0;i<3;i++)

{

write_date(week[w-1][i]);

delay(5);

}

}

voidread_alarm()//从时钟芯片中读取闹钟数据

{

amiao=read_ds

(1);

afen=read_ds(3);

ashi=read_ds(5);

}

voidkeyscan()//键盘扫描

{

if(flag_ri==1)

{

if((s1==0)||(s2==0)||(s3==0)||(s4==0))//随意按键闹钟结束提示

{

delay(5);

if((s1==0)||(s2==0)||(s3==0)||(s4==0))

{

while(!

(s1&&s2&&s3&&s4));

shan();

}

}

}

if(s1==0)

{

delay(5);

if(s1==0)//功能键按下后停止液晶刷新

{

s1num++;

if(flag1==1&&s1num==4)

s1num=1;//调整闹钟时只在时分秒处闪烁

flag=1;//功能键按下后停止液晶刷新

while(s1==0);

shan();//指示灯提示按下

if(s1num==1)

{

write_com(0x0f);

write_com(0x80+0x40+11);

}

elseif(s1num==2)

{

write_com(0x80+0x40+8);

}

elseif(s1num==3)

{

write_com(0x80+0x40+5);

}

elseif(s1num==4)

{

write_com(0x80+15);

}

elseif(s1num==5)

{

write_com(0x80+9);

}

elseif(s1num==6)

{

write_com(0x80+6);

}

elseif(s1num==7)

{

write_com(0x80+3);

}

else

{

s1num=0;

flag=0;

write_ds(0,miao);//调整完毕后储存在时钟芯片内

write_ds(2,fen);

write_ds(4,shi);

write_ds(6,week);

write_ds(7,day);

write_ds(8,month);

write_ds(9,year);

write_com(0x0c);

}

}

}

if(s1num!

=0)//只有功能键按下后还能调整时间

{

if(s2==0)//加一

{

delay(5);

if(s2==0)

{

shan();

while(s2==0);

if(s1num==1)

{

miao++;

if(miao>=60)miao=0;

write_sfm(10,miao);

write_com(0x80+0x40+11);

}

if(s1num==2)

{

fen++;

if(fen>=60)fen=0;

write_sfm(7,fen);

write_com(0x80+0x40+8);

}

if(s1num==3)

{

shi++;

if(shi>=24)shi=0;

write_sfm(4,shi);

write_com(0x80+0x40+5);

}

if(s1num==4)

{

week++;

if(week>7)week=1;

write_week(week);

write_com(0x80+15);

}

if(s1num==5)

{

day++;

if(day>31)day=1;

write_nyr(8,day);

write_com(0x80+9);

}

if(s1num==6)

{

month++;

if(month>12)month=1;

write_nyr(5,month);

write_com(0x80+6);

}

if(s1num==7)

{

year++;

if(year>=100)year=0;

write_nyr(2,year);

write_com(0x80+3);

}

}

}

if(s3==0)//减一

{

delay(5);

if(s3==0)

{

shan();

while(s3==0);

if(s1num==1)

{

miao--;

if(miao==-1)miao=59;

write_sfm(10,miao);

write_com(0x80+0x40+11);

}

if(s1num==2)

{

fen--;

if(fen==-1)fen=59;

write_sfm(7,fen);

write_com(0x80+0x40+8);

}

if(s1num==3)

{

shi--;

if(shi==-1)shi=23;

write_sfm(4,shi);

write_com(0x80+0x40+5);

}

if(s1num==4)

{

week--;

if(week==0)week=7;

write_week(week);

write_com(0x80+15);

}

if(s1num==5)

{

day--;

if(day==0)day=31;

write_nyr(8,day);

write_com(0x80+9);

}

if(s1num==6)

{

month--;

if(month==0)month=12;

write_nyr(5,month);

write_com(0x80+6);

}

if(s1num==7)

{

year--;

if(year==-1)year=99;

write_nyr(2,year);

write_com(0x80+3);

}

}

}

}

if(s4==0&&s1num==0)//调整闹钟按键,只有在功能键没按下时才能调整

{

delay(5);

if(s4==0&&s1num==0)

{

flag1=~flag1;

shan();

while(s4==0);

if(flag1==0)

{

flag=0;

write_com(0x80+0x40);

write_date('');

write_date('');

write_date('');

write_date('');

write_com(0x0c);

write_ds(1,miao);

write_ds(3,fen);

write_ds(5,shi);

}

else

{

read_alarm();

miao=amiao;

fen=afen;

shi=ashi;

write_com(0x80+0x40);

write_date('R');

write_date('I');

write_date('N');

write_date('G');

write_sfm(4,shi);

write_sfm(7,fen);

write_sfm(10,miao);

}

}

}

if(wen==0&&s1num==0)//显示温度按键,只有在功能键没按下时才能显示

{

delay(5);

if(wen==0&&s1num==0)

{

flag2=~flag2;

shan();

while(wen==0);

if(flag2==1)

{

write_com(0x01);

delay(5);

write_com(0x80+1);

for(j=0;j<11;j++)

write_date(strt[j]);

write_tem();

}

if(flag2==0)

{

write_com(0x01);

delay(5);

write_com(0x80+0x40+6);

write_date(':

');

write_com(0x80+0x40+9);

write_date(':

');

write_com(0x80);

write_date('2');

write_date('0');

}

}

}

}

voidmain()//主函数

{

inti;

init();

while

(1)

{

keyscan();//不停进行键盘扫描

if(flag2==1)//按下温度显示键后显示温度

{

for(i=10;i>0;i--)

{write_tem();}

}

if(flag_ri==1)//闹铃中断后指示灯提示

{

shan();

delay(100);

shan();

delay(500);

}

if(flag2==0&&flag==0&&flag1==0)//在没调整时间、闹铃,没显示温度的时候显示时间

{keyscan();

year=read_ds(9);

month=read_ds(8);

keyscan();

day=read_ds(7);

week=read_ds(6);

keyscan();//增加扫描次数减少卡顿感

shi=read_ds(4);

fen=read_ds

(2);

miao=read_ds(0);

keyscan();

write_sfm(10,miao);

write_sfm(7,fen);

write_sfm(4,shi);

write_nyr(2,year);

keyscan();

write_nyr(5,month);

write_nyr(8,day);

writ

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1