单片机课程设计Word文档下载推荐.docx

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

单片机课程设计Word文档下载推荐.docx

《单片机课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机课程设计Word文档下载推荐.docx(37页珍藏版)》请在冰点文库上搜索。

单片机课程设计Word文档下载推荐.docx

2.1各单元模块功能介绍及电路设计3

2.1.1温度采集电路3

2.1.2DS1302时钟电路3

2.1.3串行通信接口电路4

2.1.4电源电路4

2.1.5按键电路5

2.1.6液晶显示显示电路5

2.2特殊器件介绍5

2.2.1AT89S52单片机芯片5

2.2.2DS1302介绍6

2.2.3温度传感器DS18B207

2.2.4液晶显示LCD16027

3软件设计8

3.1软件设计流程8

3.1.1温度采集流程9

3.2.2日期数据处理流程9

4调试与结果10

附录11

参考文献23

1总体方案设计

1.1设计内容

该电路具有显示日期、时间、温度的基本功能,还可以实现对它们的调整。

掉电后无需重新设置时间和日期;

系统不但接口设计简单、便于控制,而且具有很好的人机界面,可以通过几个按键对当前的时间进行调整,对闹钟进行随意设置,以及温度超过上下限会自动进行报警(LED亮)等功能。

其原理框图如下图2.1所示:

图1.1数字钟原理框图

在现代SOC技术的引领下,人们对低故障、高实时、高可靠、高稳定的性能更加青睐,其抗干扰性强,加密性强,超低功耗,可以远程升级,内部有专用复位电路,价格也较便宜,结合本设计的要求及综合以上比较的情况,我们选择用AT89S52单片机芯片来实现本次设计。

2单元模块设计

2.1各单元模块功能介绍及电路设计

2.1.1温度采集电路

DS18B20是美国Dallas半导体公司生产的一线制数字温度传感器。

测量范围为-50℃~+125℃,精度可达0.1℃,不需A/D转换电路,直接将温度值转换成数字量。

温度数据的传输,只需要一根数据线,直接将数据线与单片机的P3.6口相连接。

其图如下3.1所示:

图2.1温度采集

2.1.2DS1302时钟电路

DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时。

DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录。

DS1302提供2个电源引脚:

一个(VCC2)接主电源;

另一个(VCC1)接备用电源。

其图如下3.2所示:

图2.2DS1302时钟电路

2.1.3串行通信接口电路

MAX232是电压转换芯片,将TTL电平转换成可以和电脑串口匹配的电压。

DB9通过下载线缆与电脑连接,可以将程序下载到单片机上。

其图如下3.3所示:

图2.3RS232串行通信

2.1.4电源电路

为了便于使用,本次采用了把交流的220V经变压器再经LM7805B变为单片机所使用的5V电源,如图3.4。

图2.4电源电路

2.1.5按键电路

本次设计中用到了4*4的矩阵键盘列阵,通过赋低电平选中其中一列,以便来控制时,分,秒,年,月,日,以及闹钟的调整。

其电路如图3.5:

图2.5按键控制电路

2.1.6液晶显示显示电路

本设计中会将时分秒,年月日周以及闹钟的设置,温度全部都会显示到液晶LCD1602上面,其具有16×

2能够显示所有英文大小写字母,0到9十个数字以及一些常用的符号。

该液晶在4.5V到5.5V电压范围内都能正确工作,平均工作电流为2mA。

液晶HS162共16个管脚。

但是由于原理图中电路很简单并且只用到接插件所以此处没有给出原理图。

2.2特殊器件介绍

2.2.1AT89S52单片机芯片

AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。

使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。

片上Flash允许程序存储器在系统可编程,亦适于常规编程器。

在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

AT89S52具有以下标准功能:

8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。

另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

其图如下3.6所示:

图2.6AT89S52引脚图

2.2.2DS1302介绍

DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。

实时时钟可提供秒、分、时、日、星期、月、年,一个月小于31天时可自动进行调整,且具有闰年补偿功能。

工作电压宽达2.5~5.5V。

采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行。

DS1302是以下的特性:

双电源管脚用于主电源和备份电源供应,Vcc1为课编程涓流充电电源,附加七个字节存储器。

其外部引脚分配如图所示:

图2.7DS1302的外部时钟引脚分配

2.2.3温度传感器DS18B20

采用独特的一线接口,可用数据总线供电,电压范围为3.0V至5.5V无需备用电源。

测量温度范围为-55℃至+125℃。

华氏相当于是-67°

F到257华氏度-10°

C至+85°

C范围内精度为±

0.5℃。

温度传感器可编程的分辨率为9~12位温度转换为12位数字格式最大值为750毫秒用户可定义的非易失性温度报警设置应用范围包括恒温控制,工业系统,消费电子产品温度计,或任何热敏感系统。

DS18B20内部结构主要由四部分组成:

64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。

该装置信号线高的时候,内部电容器储存能量通由1线通信线路给片子供电,而且在低电平期间为片子供电直至下一个高电平的到来重新充电。

图2.8DS18B20的管脚

2.2.4液晶显示LCD1602

HS1602是目前最常用的字符液晶之一。

在操作液晶时,先要对液晶进行初始化,即进行最初是的命令设置。

要设置液晶的工作方式设置,显示状态设置,输入方式设置等。

最后再向液晶写入数据,即写入想要显示字符的ASCII码。

3软件设计

3.1软件设计流程

本次设计的系统软件设计主要包括主程序设计和温度采集子模块程序设计、日历日期数据子模块程序、按键控制子模块程序和LCD液晶显示子模块程序设计等。

主程序主要完成器件的初始化,并判断有无按键按下,并根据判断的结果调用相应的子模块程序;

而温度采集子模块程序和日历日期数据子模块程序完成相应的数据采集、处理和保存,按键处理子模块程序完成日期和闹钟的设置,而液晶显示子模块只要把上述子模块储存的数据送去显示即可。

系统总的流程图如下图所示:

图3.1主程序流程

3.1.1温度采集流程

DS18B20在进行温度采集时,必须首先进行初始化,然后发ROM操作指令,再发存储器操作指令,最后才能传输数据。

每次对器件进行读写操作时,必须严格按照DS18B20的时序要求。

因为温度数据在DS18B20中是以2的补码形式存放的,且低4位为小数部分,4位到10位为整数部分,其余为符号位,因此在读出2个字节的温度数据后,首先求一次补码得到原码,再将数据分离为整数温度值和小数温度值,整数部分的值可通过数据交换指令得到,而小数温度值部分可通过查表得到。

因为在液晶显示器上显示的是字符的ASCII码,因而还要转换为BCD,在加30H转换为ASCII码。

其流程图如图3.2:

3.1.2日期数据处理流程

对时钟芯片的操作主要包括一是将芯片中的日期等数据读出来,二是在进行日期等设置时将设置的数据写入芯片,这也是按键处理时的主要内容。

无论是读数据还是写数据满足DS1302对时序的要求。

而对芯片各个数据部分的访问是通过地址进行的,且读和写的地址不一样。

读出的数据同样要转为ASCII码,然后储存起来,等待送去显示,流程图如图3.3:

图3.2流程图

图3.3流程图

4调试与结果

系统的调试可以分为软件调试与硬件调试。

软件调试可以在其集成开放环境中进行,编译完之后,分别对各子程序进行仿真。

仿真之后在下载到单片机,根据实际要求,进行逐一测试。

如果不满足则进行修改。

直到可以准确的报站以及显示各站名为止。

对于硬件的测试,要对电路板的各个部分进行测试,尤其对虚焊要严格检查,因为如果发生短路可能是其他元件损坏。

用万用表对电路板进行反复检查,再分别测试键盘部分,I/O部分,LED显示部分等。

通过本次设计,我们对单片机有了更深刻的认识,也从实践的例子中去感受到了单片机设计给我们设计带来的改变与进步。

我们不仅掌握KeiluVision3软件的使用,与此同时,我们还对电子设计的思路有了更多的认识。

这次对多功能数字钟的设计与制作,让我了解设计电路的程序,也了解了关于智能电子钟的原理与设计理念。

在此次的智能电子钟设计过程中,更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和具体的使用方法。

总之是受益匪浅。

这为自己今后进一步深化学习,积累了一定宝贵经验。

附录

实现程序:

//介绍整个程序所包含的头文件

#include<

reg52.h>

intrins.h>

ds1302.h>

lcd1602.h>

1820.h>

//定义

#defineucharunsignedchar

#defineuintunsignedint

Ucharu,u1,u2,u3,u4,u5,u6,u7,u8,

alarmOn;

uintfen,miao,shi,nian,yue,ri,anshu,

zh;

ucharlinshi,a,a1,a2,a3,a4,a5,a6;

uinttab[3];

sbitrd=P3^5;

sbitP30=P3^0;

sbitP31=P3^1;

sbitP32=P3^2;

sbitP33=P3^3;

sbitbeep=P3^3;

sbitds1302_rst=P0^2;

sbitds1302_sclk=P0^0;

sbitds1302_io=P0^1;

sbitACC7=ACC^7;

sbitB1=B^0;

sbitlcd1602_en=P0^5;

sbitlcd1602_rw=P0^6;

sbitlcd1602_rs=P0^7;

#definelcd1602_dataP2

ucharlow,high;

//存储温度的高位

值和低位值

sbitDQ=P3^6;

//--定义通信端口

sbitD1=P0^7;

uchargw,sw,w4,tpl,tph;

uintbai,b;

//主函数部分

voidfenjia(ucharrddr,ucharwddr,ucharyddr,ucharfenjiajian)//键盘扫描

{

u=ds1302_read(rddr);

fen=((u&

0x70)>

>

4)*10+(u&

0x0f);

//进制转换

if(fenjiajian==1)

fen++;

if(fen==60)

fen=0;

}

else

fen--;

if((fen+1)==0)

fen=59;

ds1302_write(wddr,((fen/10)<

<

4)|(fen%10));

write_sfm(yddr,fen);

lcd1602_writecom(0x80+0x40+yddr);

lcd1602_writecom(0x0f);

voidshijia(ucharrddr,ucharwddr,ucharyddr,ucharshijiajian)//键盘扫描

a4=ds1302_read(rddr);

shi=((a4&

4)*10+(a4&

if(shijiajian==1)

shi++;

if(shi==24)

shi=0;

shi--;

if((shi+1)==0)

shi=23;

}ds1302_write(wddr,(shi/10)<

4|(shi%10));

write_sfm(yddr,shi);

lcd1602_writecom(0x80+0x40+yddr)

voidsfmset()

ucharlinshi;

do

if(P30==0)

delay(5);

while(!

(P30));

linshi=1;

anshu++;

if(anshu==1)

a=ds1302read(0x81);

miao=((a&

4)*10+(a&

/

write_sfm(6,miao)lcd1602_writecom(0x80+0x40+6);

lcd1602_writecom(0x0f);

lcd1602_writecom(0x80+0x40+6);

if(anshu==2)

u1=ds1302_read(0x83)fen=((u1&

4)*10+(u1&

write_sfm(3,fen);

lcd1602_writecom(0x80+0x40+3);

if(anshu==3)

u2=ds1302_read(0x85);

shi=((u2&

4)*10+(u2&

write_sfm(0,shi);

lcd1602_writecom(0x80+0x40+0);

if(anshu==4)

lcd1602_writecom(0x0c);

lcd1602_writecom(0x80+0x40+14);

lcd1602_writedata('

s'

);

lcd1602_writedata('

t'

if(anshu==5)

u7=ds1302_read(0x83)tab[0]=((u7&

4)*10+(u7&

write_sfm(3,tab[0]);

//table[0]为分存储器lcd1602_writecom(0x80+0x40+3);

lcd1602_writecom(0x0f);

if(anshu==6)

{u8=ds1302_read(0x85);

tab[1]=((u8&

4)*10+(u8&

write_sfm(0,tab[1]);

//table[1]为时存储器lcd1602_writecom(0x80+0x40+0);

if(anshu==7)

lcd1602_writecom(0x80+0x40+14);

O'

//显示"

On"

提示闹钟已开启lcd1602_writedata('

n'

linshi=0;

if(anshu==8)

anshu=0;

beep=1;

//第二次按下清除"

标记

'

'

if(anshu==9)

anshu=0;

ds1302_write(0x80,0x00);

lcd1602_writecom(0x38);

//不出现光标

if(anshu==2)

if(P32==0)

P32);

fenjia(0x83,0x82,3,1);

if(P33==0)

P33);

fenjia(0x83,0x82,3,0);

if(anshu==3)

shijia(0x85,0x84,0,1);

shijia(0x85,0x84,0,0);

if(anshu==5)

tab[0]++;

write_sfm(3,tab[0]);

if(tab[0]==60)

tab[0]=0;

tab[0]--;

if(tab[0]==0)

tab[0]=59;

if(anshu==6)

tab[1]++;

write_sfm(0,tab[1]);

if(tab[1]==24)

tab[1]=0;

tab[1]--;

if(tab[1]==0)

tab[1]=23;

if(anshu==7)//设置好闹钟返回时钟界面并开启闹钟

//闹钟已经设置好

lcd1602_writecom(0x80+0x40+16);

提示闹钟已开启

u7=ds1302_read(0x83);

fen=((u7&

u8=ds1302_read(0x85);

shi=((u8&

if(tab[0]==fen&

&

tab[1]==shi)

alarmOn=1;

//闹钟时间到了

if(alarmOn==1)

beep=0;

delay(10);

while(linshi);

voidzhjia(ucharrddr,ucharwddr,ucharyddr,ucharzhjiajian)

u6=ds1302_read(rddr);

zh=u6&

0x07;

if(zhjiajian==1)

zh++;

if(zh==8)

zh=1;

zh--;

if(zh==0)

zh=7;

ds1302_write(wddr,(zh/10)<

4|(zh%10));

write_nyr(yddr,zh);

lcd1602_writecom(0x80+yddr);

Voidrijia(ucharrddr,ucharwddr,ucharyddr,ucharrijiajian)

u3=ds1302_read(rddr);

ri=((u3&

4)*10+(u3&

if(rijiajian==1)

ri++;

if(ri==31)

ri=1;

ri--;

if((ri+1)==0)

ri=30;

ds1302_write(wddr,(ri/10)<

4|(ri%10));

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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