单片机C语言万年历电子钟设计报告含电路图和源程序.docx

上传人:b****2 文档编号:198310 上传时间:2023-04-28 格式:DOCX 页数:37 大小:651.71KB
下载 相关 举报
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第1页
第1页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第2页
第2页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第3页
第3页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第4页
第4页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第5页
第5页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第6页
第6页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第7页
第7页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第8页
第8页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第9页
第9页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第10页
第10页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第11页
第11页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第12页
第12页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第13页
第13页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第14页
第14页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第15页
第15页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第16页
第16页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第17页
第17页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第18页
第18页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第19页
第19页 / 共37页
单片机C语言万年历电子钟设计报告含电路图和源程序.docx_第20页
第20页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机C语言万年历电子钟设计报告含电路图和源程序.docx

《单片机C语言万年历电子钟设计报告含电路图和源程序.docx》由会员分享,可在线阅读,更多相关《单片机C语言万年历电子钟设计报告含电路图和源程序.docx(37页珍藏版)》请在冰点文库上搜索。

单片机C语言万年历电子钟设计报告含电路图和源程序.docx

单片机C语言万年历电子钟设计报告含电路图和源程序

 

 

万年历设计报告

学院:

机械与电子工程学院

班级:

09通信2班

组员:

李培文

一、设计要求与方案论证3

1.1 设计要求:

3

1.1.1基本要求3

1.1.2发挥部分3

1.2系统基本方案选择和论证3

1.2.1单片机芯片的选择方案和论证:

3

1.2.2显示模块选择方案和论证:

4

1.2.3时钟芯片的选择方案和论证:

4

1.3电路设计最终方案决定4

二、理论分析与计算4

2.1,秒数的产生由定时器T0产生:

4

三.系统的硬件设计与实现5

3.1电路设计框图:

5

3.2系统硬件概述:

6

3.3主要单元电路的设计6

3.3.1单片机主控制模块的设计6

3.3.2显示模块的设计7

3.3.3闹钟模块的设计9

3.3.4电源稳压模块9

四、系统的软件设计10

4.1程序流程框图10

4.2闹钟模块流程图:

11

4.3按键调整模块流程图:

11

五、测试方案与测试结果分析13

5.1测试仪器13

5.2软件测试平台KeilC5113

5.3模块测试13

5.3.1显示模块测试13

5.4测试结果分析与结论14

5.4.1测试结果分析14

5.4.2测试结论14

六、作品总结14

参考文献14

附录一:

系统电路图15

附录三:

系统C程序16

一、设计要求与方案论证

1.1 设计要求:

1.1.1基本要求

(1)准确显示:

时、分、秒(24小时制)

(2)显示星期

(3)显示公历

(4)时间、日期、星期可调节

(5)断电记忆功能

1.1.2发挥部分

(1)闹钟功能

(2)显示阴历

(3)显示24节气

(4)其他

1.2系统基本方案选择和论证

1.2.1单片机芯片的选择方案和论证:

方案一:

采用89C51芯片作为硬件核心,采用FlashROM,内部具有4KBROM存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。

方案二:

采用AT89S52,片内ROM全都采用FlashROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KBROM存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。

所以选择采用AT89S52作为主控制系统.

1.2.2显示模块选择方案和论证:

方案一:

采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以不用此种作为显示.

方案二:

采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,但无法显示图形文字,在显示星期是也只能用数字表示,而且采用动态扫描法与单片机连接时,在编程时比较复杂。

所以也不采用了LED数码管作为显示。

方案三:

采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示文字,图形,显示多样,清晰可见,所以在此设计中采用LCD液晶显示屏.

 

1.2.3时钟芯片的选择方案和论证:

方案一:

采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.但在,题目中明确规定不能选用不可以使用任何专用的时钟芯片和模块,因此不采用此方案。

方案二:

直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。

采用此种方案可以减少芯片的使用,也可以节约成本。

所以采用此方案。

1.3电路设计最终方案决定

综上各方案所述,对此次作品的方案选定:

采用AT89S52作为主控制系统;采用单片机定时器提供时钟;液晶显示屏作为显示。

 

二、理论分析与计算

2.1,秒数的产生由定时器T0产生:

T0置10ms定时初值dc00H(2^16=65536D,dc00H=56320D)

定时时间=(65536-56320)*(1/11.0592)*12=10ms(单片机晶振f0=11.0592Mhz)

用累加的方法让定时时间累加一百次即可产生一秒时间:

100*10ms=1000ms=1s

2.2.总天数的算法:

首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为355。

然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。

2.3输出月份第一天为星期几的算法:

使总天数除以7取余加2得几既为星期几,若是7,则为星期日。

2.4.算出输出月份的完整日历算法:

算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。

5,计算某一天是星期几的算法:

蔡勒(Zeller)公式

 历史上的某一天是星期几?

未来的某一天是星期几?

关于这个问题,有很多计算公式(两个通用计算公式和一些分段计算公式),其中最著名的是蔡勒(Zeller)公式。

即:

w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1

 公式中的符号含义如下,w:

星期;c:

世纪-1;y:

年(两位数);m:

月(m大于等于5,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:

日;[]代表取整,即只要整数部分。

(C是世纪数减一,y是年份后两位,M是月份,d是日数。

1月和2月要按上一年的13月和14月来算,这时C和y均按上一年取值。

)算出来的W除以7,余数是几就是星期几。

如果余数是0,则为星期日。

以2049年10月1日(100周年国庆)为例,用蔡勒(Zeller)公式进行计算,过程如下:

 蔡勒(Zeller)公式:

w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1

 =49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1

 =49+[12.25]+5-40+[28.6]

 =49+12+5-40+28

 =54(除以7余5)

 即2049年10月1日(100周年国庆)是星期5。

三.系统的硬件设计与实现

3.1电路设计框图:

AT89S52

主控制

模块

液晶显示模块

闹钟模块

3.2系统硬件概述:

本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;显示部份LCD1602实现,能够同时显示16x02即32个字符;闹钟部分由蜂鸣器构成,蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。

3.3主要单元电路的设计

3.3.1单片机主控制模块的设计

AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。

单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端.如图-1所示

图-1主控制系统

3.3.2显示模块的设计

LCD1602液晶显示屏工业字符型液晶,能够同时显示16x02即32个字符。

(16列2行),

有16个引脚,通过D0~D7的8位数据端传输数据和指令,引脚图如图6-5。

图6-5 LCD1602引脚示意图

LCD1602液晶显示屏引脚功能如表6-5所示:

表6-5LCD1602引脚功能

管脚1

Vss

一般接地

管脚2

Vdd

接电源(+5V)

管脚3

V0

液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高

管脚4

RS

RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器

管脚5

R/W

R/W为读写信号线,高电平

(1)时进行读操作,低电平(0)时进行写操作。

管脚6

E

E(或EN)端为使能(enable)端,下降沿使能。

管脚7

DB0

底4位三态、双向数据总线0位

管脚8

DB1

底4位三态、双向数据总线1位

管脚9

DB2

底4位三态、双向数据总线2位

管脚10

DB3

底4位三态、双向数据总线3位

管脚11

DB4

高4位三态、双向数据总线4位

管脚12

DB5

高4位三态、双向数据总线5位

管脚13

DB6

高4位三态、双向数据总线6位

管脚14

DB7

高4位三态、双向数据总线7位

管脚15

BLA

背光电源正极

管脚16

BLK

背光电源负极

1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:

序号

指令

RS

R/W

D7

D6

D5

D4

D3

D2

D1

D0

1

清显示

0

0

0

0

0

0

0

0

0

1

2

光标返回

0

0

0

0

0

0

0

0

1

*

3

置输入模式

0

0

0

0

0

0

0

1

I/D

S

4

显示开/关控制

0

0

0

0

0

0

1

D

C

B

5

光标或字符移位

0

0

0

0

0

1

S/C

R/L

*

*

6

置功能

0

0

0

0

1

DL

N

F

*

*

7

置字符发生存贮器地址

0

0

0

1

字符发生存贮器地址

8

置数据存贮器地址

0

0

1

显示数据存贮器地址

9

读忙标志或地址

0

1

BF

计数器地址

10

写数到CGRAM或DDRAM)

1

0

要写的数据内容

11

从CGRAM或DDRAM读数

1

1

读出的数据内容

表10-14:

控制命令表

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。

(说明:

1为高电平、0为低电平)

指令1:

清显示,指令码01H,光标复位到地址00H位置。

指令2:

光标复位,光标返回到地址00H。

指令3:

光标和显示模式设置I/D:

光标移动方向,高电平右移,低电平左移S:

屏幕上所有文字是否左移或者右移。

高电平表示有效,低电平则无效。

指令4:

显示开关控制。

D:

控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:

控制光标的开与关,高电平表示有光标,低电平表示无光标B:

控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:

光标或显示移位S/C:

高电平时移动显示的文字,低电平时移动光标。

指令6:

功能设置命令DL:

高电平时为4位总线,低电平时为8位总线N:

低电平时为单行显示,高电平时双行显示F:

低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。

指令7:

字符发生器RAM地址设置。

指令8:

DDRAM地址设置。

指令9:

读忙信号和光标地址BF:

为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。

指令10:

写数据。

指令11:

读数据。

将lcd的引脚与单片机连接,通过单片机实现对显示的输出,电路图实现如下:

3.3.3闹钟模块的设计

闹钟模块采用蜂鸣器实现,蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电。

通过单片机的p3.7引脚输出的电平变化来控制蜂鸣器的导通与否,设计如下:

3.3.4电源稳压模块

方案一:

LM7805稳压

方案二:

USB接口+5V供电

四、系统的软件设计

4.1程序流程框图

4.2闹钟模块流程图:

4.3按键调整模块流程图:

五、测试方案与测试结果分析

5.1测试仪器

序号

名称

作用

1

KELL51软件

编写调试C程序并生成可烧录hex文件

2

仿真软件Proteus

对电路进行焊接前的仿真与测试

3

变压器

提供5伏输出电源

4

数字万用表

测试工作电源检测电路运行状况

5.2软件测试平台KeilC51

KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。

用过汇编语言后再使用C来开发,体会更加深刻。

KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。

另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。

在开发大型软件时更能体现高级语言的优势。

下面详细介绍KeilC51开发系统各部分功能和使用。

KeilC51工具包的整体结构,其中uVision与Ishell分别是C51forWindows和forDos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。

5.3模块测试

5.3.1显示模块测试

出现的问题:

LCD1602液晶显示屏背景灯亮但不显示内容。

解决问题:

初步假设电源已经供电但单片机没有工作。

用万用表测试LCD使能端6引脚和写命令选择端4引脚,均有电位变化,推出单片机已经工作。

再次假设,LCD1602的显示屏对比度没调好。

让电路工作,慢慢旋转变阻器,但仍无内容显示。

三次假设,LCD1602某些引脚短路,经检测各引脚电平,发现6脚线路某地方与电源VCC相连,导致数据命令无法写入LCD1602显示器,导致内容无法显示,改正后,显示正常,问题解决。

VCC1602MOXx01)//");________________________________________________________________________________________________

5.4测试结果分析与结论

5.4.1测试结果分析

在测试过程中遇到lcd1602显示不出来,首先使用万用表对电路进行测试,检查工作电压是否正常并查找出电路没正常工作的部分,再次检查各引脚接线情况。

5.4.2测试结论

经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力.同时在软件的编程方面得到更到的提高,对编程能力得到加强.同时对所学的知识得到很大的提高与巩固.

六、作品总结

在整个设计过程中,发挥团队精神,分工合作,我吴余壮健负责电路设计,软件编程,设计报告的编写,李培文负责网上查阅相关有用资料,王文龙负责电路的焊接,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。

较好的完成了作品。

达到了预期的目的,在最初的设计中,发挥“三个臭皮匠,顶个诸葛亮”的作用。

相互学习、相互讨论、研究。

完了最初的设想。

在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。

也练就了我们的耐心,做什么事都在有耐心。

此次比赛中学到了很多很多东西,这是最重要的。

总之,参加电子竞赛我们的能力得到了全方位的提高。

 

参考文献

新概念51单片机C语言教程郭天祥编电子工业出版社2009

单片机C语言应用一百例王东锋王会良董冠强编电子工业出版社2009

杨子文编单片机原理及应用西安电子科技大学出版社2006

附录一:

系统电路图

附录二:

仿真效果图

附录三:

系统C程序

#include

#include

unsignedcharcodedis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"};

unsignedcharcodepara_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5};//星期月参变数

unsignedchardatadis_buf1[16];//lcd上排显示缓冲区

unsignedchardatadis_buf2[16];//lcd下排显示缓冲区

unsignedchardatayear,month,date,week;//年、月、日、星期

unsignedchardataarmhour,armmin,armsec;//闹钟时、分、秒

unsignedchardatahour,min,sec,sec100;//时、分、秒、百分之一秒

unsignedchardataflag,vkey,skey;//设置状态计数标志、按键先前值、按键当前值

bitalarm;//标识是否启用闹钟,1--启用,0--关闭

sbitrs=P2^0;//LCD数据/命令选择端(H/L)

sbitrw=P2^1;//LCD读/写选择端(H/L)

sbitep=P2^2;//LCD使能控制

sbitPRE=P1^6;//调整键(k3)

sbitSET=P1^7;//调整键(k4)

sbitSPK=P3^7;

voiddelayms(unsignedcharms);//延时程序

bitlcd_busy();//测试LCD忙碌状态程序

voidlcd_wcmd(charcmd);//写入指令到LCD程序

voidlcd_wdat(chardat);//写入数据到LCD程序

voidlcd_pos(charpos);//LCD数据指针位置程序

voidlcd_init();//LCD初始化设定程序

voidpro_timedate();//时间日期处理程序

voidpro_display();//显示处理程序

voidpro_key();//按键处理程序

voidtime_alarm();//定时报警功能(闹钟)

unsignedcharscan_key();//按键扫描程序

unsignedcharweek_proc();//星期自动计算与显示函数

bitleap_year();//判断是否为闰年

voidlcd_sef_chr();//LCD自定义字符程序

voidupdate_disbuf(unsignedchart1,unsignedchart2[],unsignedchardis_h,unsignedchardis_m,unsignedchardis_s);//更新显示缓冲区函数

//延时程序

voiddelay(unsignedcharms)

{while(ms--)

{unsignedchari;

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

{

_nop_();//执行一条_nop_()指令为一个机器周期

_nop_();

_nop_();

_nop_();

}

}

}

//测试LCD忙碌状态

bitlcd_busy()

{

bitresult;

rs=0;

rw=1;

ep=1;

_nop_();

_nop_();

_nop_();

_nop_();

result=(bit)(P0&0x80);//LCD的D0--D7中,D7=1为忙碌,D7=0为空闲

ep=0;

returnresult;

}

//写入指令到LCD

voidlcd_wcmd(charcmd)

{

while(lcd_busy());//当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令

rs=0;

rw=0;

ep=0;

_nop_();

_nop_();

P0=cmd;

_nop_();

_nop_();

_nop_();

_nop_();

ep=1;

_nop_();

_nop_();

_nop_();

_nop_();

ep=0;

}

//写入数据到LCD

voidlcd_wdat(chardat)

{

while(lcd_busy());//当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数据

rs=1;

rw=0;

ep=0;

P0=dat;

_nop_();

_nop_();

_nop_();

_nop_();

ep=1;

_nop_();

_nop_();

_nop_();

_nop_();

ep=0;

}

//LCD数据指针位置程序

voidlcd_pos(charpos)

{

lcd_wcmd(pos|0x80);//数据指针=80+地址码(00H~27H,40H~67H)

}

//设定二个自定义字符,(注意:

LCD1602中自定义字符的地址为0x00--0x07,即可定义8个字符)

//这里我们设定把一个自定义字符放在0x00位置(000),另一个放在0x01位子(001)

voidlcd_sef_chr()

{//第一个自定义字符

lcd_wcmd(0x40);//"01000000"第1行地址(D7D6为地址设定命令形式D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))

lcd_wdat(0x1f);//"XXX11111"第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭)

lcd_wcmd(0x41);//"01000001"第2行地址

lcd_wdat(0x11);//"XXX10001"第2行数据

lcd_wcmd(0x42);//"01000010"第3行地址

lcd_wdat(0x15);//"XXX10101"第3行数据

lcd_wcmd(0x43);//"01000011"第4行地址

lcd_wdat(0x11);//"XXX10001"第4行数据

lcd_wcmd(0x

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

当前位置:首页 > 法律文书 > 调解书

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

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