51单片机时钟显示+温度显示Word文件下载.docx

上传人:b****3 文档编号:7778368 上传时间:2023-05-09 格式:DOCX 页数:29 大小:37.79KB
下载 相关 举报
51单片机时钟显示+温度显示Word文件下载.docx_第1页
第1页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第2页
第2页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第3页
第3页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第4页
第4页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第5页
第5页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第6页
第6页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第7页
第7页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第8页
第8页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第9页
第9页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第10页
第10页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第11页
第11页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第12页
第12页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第13页
第13页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第14页
第14页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第15页
第15页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第16页
第16页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第17页
第17页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第18页
第18页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第19页
第19页 / 共29页
51单片机时钟显示+温度显示Word文件下载.docx_第20页
第20页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

51单片机时钟显示+温度显示Word文件下载.docx

《51单片机时钟显示+温度显示Word文件下载.docx》由会员分享,可在线阅读,更多相关《51单片机时钟显示+温度显示Word文件下载.docx(29页珍藏版)》请在冰点文库上搜索。

51单片机时钟显示+温度显示Word文件下载.docx

备用用电源也实现了当系统断电后,时钟仍然可以保持。

而且它是串行接口,与单片机通信所需要的接口少。

2.2显示系统的方案比较

方案1:

用数码管或LED显示。

方案2:

用液晶1602显示。

方案3:

用液晶12864显示。

时钟和温度的显示可以用数码管或LED,而且价格便宜。

但是数码管的只能显示简单的设计的系统,与我们设计要求也不相符。

有很多东西需要显示,还是用显示功能更好的液晶显示器比较好,它能显示更多的数据,用12864显示略想复杂,用1602液晶显示可以完全满足本次设计的数据显示要求。

2.3温度系统方案选择

用热敏电阻等测温元件测出电压,再转换成对应的温度。

需要比较多的外部元件支持,且硬件电路复杂,制作成本相对较高。

用DS18B20直接测温。

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

经比较,我们选择方案2。

温度实现只能通过外部的温度传感器来实现。

经上网查阅,DS18b20体积小,只有3只脚,电路接法简单。

精度为0.5°

C,也符合我们设计的要求。

DS18B20也是我们通常使用的型号,因此温度传感器用DS18B20。

2.4键盘控制方案选择

购买集成键盘,采用矩阵形式连接。

购买单个复位开关做成键盘。

虽然集成键盘美观,与单片机的接口少,但是它的成本比较高。

单片机的IO口对于我们的设计绰绰有余。

通常我们选用价格便宜单个复位开关做成键盘。

3.时钟显示和温度测量系统总体设计

初步确定设计系统由单片机主控模块、时钟模块、测温模块、闹铃模块、显示模块、键盘接口模块共6个模块组成,电路系统框图如下图所示。

图1:

电路系统框图

三、硬件电路单元设计

1、单片机最小系统设计

1.1复位电路:

复位电路有两种方式:

上电复位和按钮复位,我们主要用按钮复位方式。

如下图所示:

图2:

复位电路

1.2晶振电路

晶振电路选取条件:

晶振12M,电容20pF到30pF,本电路选取20pF。

晶振电路原理如下图:

图3:

晶振电路

2、时钟系统设计

DS1302时钟电路晶振选用3.2678KHZ,原理图如下:

图4:

基于ds1302时钟系统设计电路

3、温度系统设计

DS18B20温度传感DQ端接单片机P1.3口,电路原理图如下:

图5:

基于DS18b20温度系统设计电路

4、液晶显示系统设计

1602液晶显示电路由1K电阻和10K的精密电阻组成,控制端接P1.0、P1.1、P1.2口,数据端接P2口,电路图如下:

图6:

液晶1602显示电路

把15脚的10K电阻改成1K电阻

5、蜂鸣器系统设计

蜂鸣器闹铃电路由蜂鸣器跟1K限流电阻组成,电路图如下:

图7:

蜂鸣器电路

6、电源模块

本系统采用USB供电,用发光二极管显示通电状况,电源电源电路如下:

图8:

电源电路

7、时间调节模块

本系统采用3个按键调节时间。

S1是菜单键,选择要调节的位;

S2按一下表示加一;

S3按一下表示减一。

电路如下:

图9:

时钟调节电路

四、软件调试

1、程序流程图如下:

图10:

程序流程图

2、程序见附录

5、硬件调试

1、原理图如下:

图11:

总原理图

2、PCB图如下:

图12:

PCB图

其中红色部分为跳线;

3、实物测试

板子制作完成后上电测试发现电源灯没有显示,用万用表测量之后发现精密电阻接线错误,导致VCC与GND直接连通。

修正之后发现电源指示灯还是没有亮,测量USB两端电压为-4.88V,卸掉USB口,插上排针用杜邦线连接单片机的VCC和GND之后,电源灯能够点亮,液晶能够驱动,但是亮度不够。

测量液晶两端的电压发现只有2.5V,用导线将液晶背光的VCC直接接上电源VCC后,液晶亮度正常。

将程序下载之后经过几次调试和修改,最终实现了想要达到的效果。

6、总结与体会

在开始本次课程设计前花费了十多天的时间认真学习了单片机,通过书本和视频的学习,对单片机有了进一步的掌握并学会C51编程的一些方法。

这对于完成本次课程设计提供了很大的帮助。

从这次的课程设计中,我真真正正的意识到,在写程序时,逻辑思维要清晰,要有耐心。

同时要巧妙的利用C语言的可移植性,这对写程序有很大的帮助。

参考文献:

1.郭天祥单片机学习板配套资料

2.《51单片机C语言教程》郭天祥主编电子工业出版社

3.《C语言程序设计》尹业安,白燕主编国防科技大学出版社

4.《单片机原理与应用及C51程序设计》谢维成杨加国主编清华大学出版社

程序如下:

#include<

reg52.h>

#include<

intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

#defineLCDIOP2

sbitDQ=P1^3;

//ds18b20与单片机连接口

sbitrs=P1^0;

sbitrd=P1^1;

sbitlcden=P1^2;

sbitacc0=ACC^0;

//移位时的第0位

sbitacc7=ACC^7;

//移位时用的第7位

ucharsecond,minute,hour,day,month,year,week,count=0;

ucharReadValue,num,time;

uinttvalue;

//温度值

uchartflag;

ucharcodetable[]={"

2012-06-29FIR"

};

ucharcodetable1[]={"

08:

45:

00000.0C"

ucharcodetable2[]="

FRISATSUNMONTUEWESTUR"

;

uchardatadisdata[5];

sbitDATA=P0^1;

//时钟数据接口

sbitRST=P0^2;

sbitSCLK=P0^0;

sbitmenu=P3^5;

//菜单

sbitadd=P3^6;

//加一

sbitdec=P3^7;

//减一

voiddelay(uintz)

{

uintx,y;

for(x=z;

x>

0;

x--)

for(y=110;

y>

y--);

}

voiddelay1(uintz)

for(;

z>

z--);

voidwrite_com(ucharcom)//lcd写命令指令:

RS=L,RW=L,D0~D7=指令码,E=高脉冲

rs=0;

rd=0;

lcden=0;

P2=com;

delay(5);

lcden=1;

voidwrite_date(uchardate)//lcd写数据指令:

RS=H,RW=L,D0~D7=数据,E=高脉冲

rs=1;

P2=date;

voidinit()

ucharnum;

write_com(0x38);

//显示模式设置,默认为0x38,不用变。

write_com(0x0c);

//显示功能设置0x0f为开显示,显示光标,光标闪烁;

0x0c为开显示,不显光标,光标不闪

write_com(0x06);

//设置光标状态默认0x06,为读一个字符光标加1.

write_com(0x01);

//显示清屏,将上次的内容清除,默认为0x01.

write_com(0x80);

//设置初始化数据指针,是在读指令的操作里进行的

//初始化显示时间(tabletable1中的内容)

for(num=0;

num<

15;

num++)

{

write_date(table[num]);

delay(5);

}

write_com(0x80+0x40);

write_date(table1[num]);

}

voidWrite1302(uchardat)//写8bit数据

uchari;

SCLK=0;

//拉低SCLK,为脉冲上升沿写入数据做好准备

delay1

(2);

//稍微等待,使硬件做好准备

for(i=0;

i<

8;

i++)//连续写8个二进制位数据

{

DATA=dat&

0x01;

//取出dat的第0位数据写入1302

delay

(2);

SCLK=1;

//上升沿写入数据

//重新拉低SCLK,形成脉冲

dat>

>

=1;

//将dat的各数据位右移1位,准备写入下一个数据位

}

voidWriteSet1302(ucharCmd,uchardat)//向cmd相应地址中写入一个字节的数据

RST=0;

//禁止数据传递

//确保写数居前SCLK被拉低

RST=1;

//启动数据传输

Write1302(Cmd);

//写入命令字

Write1302(dat);

//写数据

//将时钟电平置于已知状态

ucharRead1302(void)//读8bit数据

uchari,dat;

i++)//连续读8个二进制位数据

//将dat的各数据位右移1位,因为先读出的是字节的最低位

if(DATA==1)//如果读出的数据是1

dat|=0x80;

//将1取出,写在dat的最高位

//将SCLK置于高电平,为下降沿读出

//稍微等待

//拉低SCLK,形成脉冲下降沿

}

returndat;

//将读出的数据返回

ucharReadSet1302(ucharCmd)//从cmd相应地址中读一个字节的数据

uchardat;

//拉低RST

dat=Read1302();

//读出数据

voidInit_DS1302(void)

{

WriteSet1302(0x8E,0x00);

//根据写状态寄存器命令字,写入不保护指令

WriteSet1302(0x80,((0/10)<

<

4|(0%10)));

//根据写秒寄存器命令字,写入秒的初始值

WriteSet1302(0x82,((45/10)<

4|(45%10)));

//根据写分寄存器命令字,写入分的初始值

WriteSet1302(0x84,((8/10)<

4|(8%10)));

//根据写小时寄存器命令字,写入小时的初始值

WriteSet1302(0x86,((29/10)<

4|(29%10)));

//根据写日寄存器命令字,写入日的初始值

WriteSet1302(0x88,((6/10)<

4|(6%10)));

//根据写月寄存器命令字,写入月的初始值

WriteSet1302(0x8c,((12/10)<

4|(12%10)));

//根据写年寄存器命令字,写入年的初始值

WriteSet1302(0x8a,((1/10)<

4|(1%10)));

//根据写星期寄存器命令字,写入星期的初始值

voidDisplaySecond(ucharx)//显示秒

uchari,j;

i=x/10;

j=x%10;

write_com(0xc7);

write_date(0x30+i);

write_date(0x30+j);

voidDisplayMinute(ucharx)//显示分

write_com(0xc4);

voidDisplayHour(ucharx)//显示小时

write_com(0xc1);

voidDisplayDay(ucharx)//显示日期、天

write_com(0x89);

voidDisplayMonth(ucharx)//显示日期、月

write_com(0x86);

voidDisplayYear(ucharx)//显示日期、年

write_com(0x83);

voidDisplayWeek(ucharx)//显示星期

{uchari;

x=x*3;

write_com(0x8c);

3;

i++)

write_date(table2[x]);

x++;

voidread_date(void)

ReadValue=ReadSet1302(0x81);

second=((ReadValue&

0x70)>

4)*10+(ReadValue&

0x0F);

//从DS1302读取时间秒

ReadValue=ReadSet1302(0x83);

minute=((ReadValue&

//从DS1302读取时间分

ReadValue=ReadSet1302(0x85);

hour=((ReadValue&

//从DS1302读取时间小时

ReadValue=ReadSet1302(0x87);

day=((ReadValue&

//从DS1302读取日期日

ReadValue=ReadSet1302(0x89);

month=((ReadValue&

//从DS1302读取日期月

ReadValue=ReadSet1302(0x8d);

year=((ReadValue&

//从DS1302读取日期年

ReadValue=ReadSet1302(0x8b);

week=ReadValue&

0x07;

//从DS1302读星期

DisplaySecond(second);

//显示秒、分、小时、天、月、年、星期

DisplayMinute(minute);

DisplayHour(hour);

DisplayDay(day);

DisplayMonth(month);

DisplayYear(year);

DisplayWeek(week);

voidturn_val(charnewval,ucharflag,ucharnewaddr,uchars1num)//刷新时间(将改变的时间显示到LCD上)

newval=ReadSet1302(newaddr);

//读取当前时间

newval=((newval&

4)*10+(newval&

0x0f);

//将bcd码转换成十进制

if(flag)//判断是加一还是减一

{

newval++;

switch(s1num)

{case1:

if(newval>

99)newval=0;

DisplayYear(newval);

break;

case2:

12)newval=1;

DisplayMonth(newval);

case3:

31)newval=1;

DisplayDay(newval);

case4:

6)newval=0;

DisplayWeek(newval);

case5:

23)newval=0;

DisplayHour(newval);

case6:

59)newval=0;

DisplayMinute(newval);

case7:

DisplaySecond(newval);

default:

break;

}

else

newval--;

switch(s1num)

if(newval==0)newval=99;

if(newval==0)newval=12;

break;

if(newval==0)newval=31;

DisplayDay(newval);

if(newval<

0)newval=6;

0)newval=23;

0)newval=59;

default:

}

}

WriteSet1302((newaddr-1),((newval/10)<

4)|(newval%10));

//将新数据写入寄存器

voidkey_scan(void)//键盘扫描程序

{ucharmiao,s1num=0;

if(menu==0)

while(!

menu);

s1num++;

while

(1)

if(menu==0)

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

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2