基于单片机设计的万年历Word格式.docx

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

基于单片机设计的万年历Word格式.docx

《基于单片机设计的万年历Word格式.docx》由会员分享,可在线阅读,更多相关《基于单片机设计的万年历Word格式.docx(33页珍藏版)》请在冰点文库上搜索。

基于单片机设计的万年历Word格式.docx

它是利用单片机的部的定时/计数器工作与定时方式,对机器周期计数形成基准时间(如10ms)然后用另外一个计数器或软件计数的形式对基准时间进行计数形成秒(如对10ms计数100次),“秒”计数60次“分”,“分”计数60次形成“时”,“时”计数24次形成“日”,“日”计数为28(或29或30或31)次形成“月”,“月”计数12次形成“年”,年计数999次就清零,然后通过译码器,数码管把他们的容在相应的位置显示出来。

在具体的设计时定时器采用中断方式工作,对时钟的形成在终中断序中实现,在主程序只是对定时/计数器的定义初始化,调用显示程序和控制程序的初始化。

另外为了使用的方便,也设计了按键,可以通过按键对时分秒进行调整,这样程序就加了按键程序。

1.3电路总体原理框图

本次设计时钟电路,使用了ATC89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的年、月、日、时、分、秒,同时使用汇编语言程序来控制整个时钟显示,使得编程变得更容易,这样通过三个模块:

键盘、芯片、LCD液晶屏显示即可满足设计要求。

总设计原理框图如下图所示:

1.4实现时钟计时的基本方法

利用STC系列单片机的可编程定时/计数器、中断系统来实现时钟计数。

(1)计数初值计算:

把定时器设为工作方式1,定时时间为50ms,则计数溢出20次即得时钟计时最小单位秒,而100次计数可用软件方法实现。

假设使用T/C0,方式1,50ms定时,fosc=12MHz。

则初值X满足(216-X)×

1/12MHz×

12μs=50000μs

X=15536→10000→3CB0H

(2)采用中断方式进行溢出次数累计,计满20次为秒计时(1秒);

(3)从秒到分、从分到时、从时到日、从日到月、从月到年的计时是通过累加和数值比较实现。

1.5总体方案

1.5.1计时方案

利用STC89C51单片机部的定时/计数器进行中断时,配合软件延时实现年、月、日、时、分、秒的计时。

该方案节省硬件成本,且能使读者在定时/计数器的使用、中断及程序设计方面得到锻炼与提高,对单片机的指令系统能有更深入的了解,从而对学好单片机技术这门课程起到一定的作用。

1.5.2控制方案

STC89C51的P0口和P1口外接由八个LED数码管(LED8~LED1)构成的显示器,用P0口作LED的段码输出口,P1口作八个LED数码管的位控输出线,P3口外接五个按键A、B、C、D、E构成键盘电路。

STC89C51是一种低功耗,高性能的CMOS8位微型计算机。

它带有8KFlash可编程和擦除的只读存储器(EPROM),该器件采用ATMEL的高密度非易失性存储器技术制造,与工业上标准的80C51和80C52的指令系统及引脚兼容,片Flash集成在一个芯片上,可用与解决复杂的问题,且成本较低。

简易电子钟的功能不复杂,采用其现有的I/O便可完成,所以本设计中采用此的设计方案。

2设计

2.1硬件电路设计原则

在性价比满足应用系统要求的情况下,选择更可靠,更熟悉的单片机缩短研制周期。

尽可能选择自己较为熟悉的应用电路,以提高系统的可靠性。

单片机部的资源与外部的扩展资源应在满足系统设计的基础上留有余地,为进一步的升级和扩展提供方便。

应充分的结合软件方案考虑硬件的结构,通常硬件功能较完善,其相应的软件程序就简单,但硬件的成本较高,而功能较低,其相应的软件就复杂,其实际常用软件代替硬件来降低成本。

整个系统相关的器件尽可能的做到性能相匹配。

充分的考虑系统的抗干扰性,如具有抗干扰的单片机并充分的帅选芯片与器件,在电路中采取隔离或屏蔽的措施等。

2.2单片机的最小系统

2.2.1芯片介绍

MCS-51单片机是标准的40引脚双列直插式集成电路芯片,其各引脚功能如下:

VCC:

+5V电源。

VSS:

接地。

RST:

复位信号。

当输入的复位信号延续两个机器周期以上的高电平时即为有效,用完成单片机的复位初始化操作。

XTAL1和XTAL2:

外接晶体引线端。

当使用芯片部时钟时,此二引线端用于外接石英晶体和微调电容;

当使用外部时钟时,用于接外部时钟脉冲信号。

P0口:

P0口为一个8位漏极开路双向I/O口,当作输出口使用时,必须接上拉电阻才能有高电平输出;

当作输入口使用时,必须先向电路中的锁存器写入“1”,使FET截止,以避免锁存器为“0”状态时对引脚读入的干扰。

P1口:

P1口是一个部提供上拉电阻的8位双向I/O口,它不再需要多路转接电路MUX;

因此它作为输出口使用时,无需再外接上拉电阻,当作为输入口使用时,同样也需先向其锁存器写“1”,使输出驱动电路的FET截止。

P2口:

P2口电路比P1口电路多了一个多路转接电路MUX,这又正好与P0口一样。

P2口可以作为通用的I/O口使用,这时多路转接电路开关倒向锁丰存器Q端。

P3口:

P3口特点在于,为适应引脚信号第二功能的需要,增加了第二功能控制逻辑。

当作为I/O口使用时,第二功能信号引线应保持高电平,与非门开通,以维持从锁存器到输出端数据输出通路的畅通。

当输出第二功能信号时,该位应应置“1”,使与非门对第二功能信号的输出是畅通的,从而实现第二功能信号的输出,具体第二功能如表1所示。

表1P3端口引脚兼用功能表

P3引脚

兼用功能

P3.0

串行通讯输入(RXD)

P3.1

串行通讯输出(TXD)

P3.2

外部中断0(INT0)

P3.3

外部中断1(INT1)

P3.4

定时器0输入(T0)

P3.5

定时器1输入(T1)

P3.6

外部数据存储器写选通WR

P3.7

外部数据存储器写选通RD

2.2.1晶振电路

下图所示为时钟电路原理图,在51单片机部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。

而在芯片部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。

时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。

2.2.2复位电路

下图所示为复位电路原理图,任何单片机在工作之前都要进行复位的过程。

只要在单片机的RST引脚上加上高电平(或低电平)持续大概5ms,直至系统电源稳定后,撤销复位信号。

2.3LCD1602显示模块设计

2.3.1主要技术参数

显示容量:

16×

2个字符

芯片工作电压:

4.5—5.5V

工作电流:

2.0mA(5.0V)

模块最佳工作电压:

5.0V

字符尺寸:

2.95×

4.35(W×

H)mm

2.3.1引脚功能说明

1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下表2所示:

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

9

D2

数据

2

VDD

电源正极

10

D3

3

VL

液晶显示偏压

11

D4

4

RS

数据/命令选择

12

D5

5

R/W

读/写选择

13

D6

6

E

使能信号

14

D7

7

D0

数据

15

BLA

背光源正极

8

D1

16

BLK

背光源负极

2.4时钟显示校正电路

本设计利用按键开关来校正时钟显示的数字。

当按钮按下时,将在相应的端口输入一个低电平,通过相应的程序来改变时钟显示。

其中菜单按键开关用来选

择要修改的数字;

下调按键用来增加所选数字的数值;

上调按键用来减小所选数字的数值;

退出按键是退出校正电路。

3系统软件设计

3.1软件设计分析

在编程上,首先进行了初始化,定义程序的的入口地址以及中断的入口地址,在主程序开始定义了一组固定单元用来储存计数的时.分.秒,在显示初值之后,进入主循环。

在主程序中,对不同的按键进行扫描,实现秒表,时间调整,复位清零等功能,系统总流程图如下图:

3.2中断程序

定时器中断时是先检测1秒是否到,1秒如果到,秒单元就加1;

如果没到,就检测1分钟是否到,1分钟如果到,分单元就加1;

如果没到,就检测1小时是否到,1小时如果到,时单元就加1,如果没到,就显示时间。

中断流程图如下:

4系统的调试

首先用万用表对已经焊接好的电路进行测试,以确定电路没有断路或者短路的情况。

在检查的过程中,因为焊接技术不够好,导致出现了断路的问题,重新焊接断路的地方,再用万用表测试,问题得到了解决。

接下来使用Keil软件对程序进行测试,发现程序没有错误。

将程序拷入芯片中,出现预期现象。

5结论

两周的课程设计已经结束了,我有很多的心得体会。

关于单片机,我的理论知识掌握的不够好,再加上已经很久没有复习了,刚拿到题目时,不知道从哪里入手,后来通过对书本的回顾,加深了对单片机知识的记忆。

因为课堂的教学考虑到大多数同学的需求,主要强调“基本”——基本知识、基本理论、基本方法、基本技能。

而这次设计正是为我们提供了一个深入学习、探索的机会,成为课堂教学的有益补充。

我们正面临就业问题,这次课设给了我们一个机会去试验。

单片机理论的学习是为课程的设计作准备的,但有时学习的理论也解决不了实践中的问题。

实践中获得的知识能让我对单片机的知识有更好的认识和理解。

虽然这次的课程设计我参考了一些文献资料,没有做到创新,但在对程序的读写过程中我明白了许多。

这次课程设计的最大收获是只有把理论用到实践中我们才能真正掌握好所学知识。

参考文献

[1]谢自美.电子线路设计·

实验·

测试[M].:

华中理工大学,1992.

[2]何立民.单片机应用系统设计[M].北京:

北京航空航天大学,1993.

[3]楼然笛.单片机开发[M].北京:

人民邮电,1994.

[4]付家才.单片机控制工程实践技术[M].北京:

化学工业2004.3.

[5]光才.单片机课程设计实例指导[M].北京:

北京航空航天大学2004.

[6]朱定华.单片机原理及接口技术实验[M].北京:

北方交通大学2002.11.

[7]湘涛.江世明.单片机原理与应用[M].北京:

电子工业,2006.

附录A源程序

#include<

reg51.h>

#defineucharunsignedchar

#defineuintunsignedint

#defineulongunsignedlong

ucharcodetable[]="

2014:

06:

19000"

;

ucharcodetable1[]="

22:

22:

1021:

48"

ucharcodetable2[]="

0123456789"

sbitlcd_rs=P2^5;

//定义LCD端口

sbitlcd_rw=P2^6;

sbitlcd_en=P2^7;

sbitS1=P3^4;

//菜单键

sbitS2=P3^5;

//加键

sbitS3=P3^6;

//减键

sbitS4=P3^7;

//退出菜单键

sbitss=P3^3;

//秒表键,第一次启动,第二次暂停,第三次清零

sbitFMQ=P2^0;

voidyue31();

//31天的月份函数

voidyue30();

//30天的月份函数

voidyue29();

//29天的月份函数

voidyue28();

//28天的月份函数

voidTiming();

//闹钟设置

voidmiaobiao();

//秒表函数

ucharcount,k1num;

//声明秒的变量

charshi,fen,miao;

//声明时分秒

uintnian,yue,ri,ji=0,mm=0;

//声明年月日,秒表计数,和秒表按键次数

ucharf,s;

//定时器/

voiddelay(ucharz)//延时函数

{

ucharx,y;

for(x=z;

x>

0;

x--)

for(y=110;

y>

y--);

}

voidwrite_(uchar)//lcd写指令

lcd_rs=0;

lcd_rw=0;

lcd_en=0;

P0=;

delay(5);

lcd_en=1;

voidwrite_data(uchardate)//lcd写数据

lcd_rs=1;

P0=date;

voidmiaobiao(charkk)//秒表函数

ucharbiao_bai,biao_shi,biao_ge;

biao_bai=kk/100;

biao_shi=kk%100/10;

biao_ge=kk%100%10;

write_(0x80+13);

write_data(table2[biao_bai]);

write_(0x80+14);

write_data(table2[biao_shi]);

write_(0x80+15);

write_data(table2[biao_ge]);

write_(0x0c);

voidwrite_fsm(ucharadd,uchardate)//计算时分秒位

ucharshi,ge;

shi=date/10;

ge=date%10;

write_(0x80+0x40+add);

write_data(0x30+shi);

write_data(0x30+ge);

voidwrite_nyr(ucharadd,uchardate)//计算月日位

uintshi,ge;

write_(0x80+0x00+add);

voidwrite_nian(ucharadd,uchardate)//计算年位,年是百位

uintbai,shi,ge;

bai=date/100%10;

write_data(0x30+bai);

voidjiaxian()//设置键盘加显

if(k1num!

=0)

{

if(S2==0)

{

delay(10);

if(S2==0)

{

while(!

S2);

//松手检测

if(k1num==1)

{

miao++;

if(miao==60)

miao=0;

write_fsm(8,miao);

//write_(0x0e);

write_(0x80+0x40+8);

}

if(k1num==2)

{

fen++;

if(fen==60)

fen=0;

write_fsm(5,fen);

write_(0x80+0x40+5);

}

if(k1num==3)

shi++;

if(shi==24)

shi=0;

write_fsm(2,shi);

write_(0x80+0x40+2);

if(k1num==4)

ri++;

if(ri==31)

ri=1;

write_nyr(8,ri);

write_(0x80+0x00+8);

if(k1num==5)

yue++;

if(yue>

12)

yue=1;

write_nyr(5,yue);

write_(0x80+0x00+5);

if(k1num==6)

nian++;

if(nian==90)

nian=0;

write_nian(1,nian);

write_(0x80+0x00+1);

if(k1num==7)

s++;

if(s==24)s=0;

write_fsm(11,s);

write_(0x80+0x40+11);

if(k1num==8)

f++;

if(f==59)

f=0;

write_fsm(14,f);

write_(0x80+0x40+14);

}

}

}

voidjianxian()//设置键盘减显

=0)

if(S3==0)//K3设置

if(S3==0)

S3);

if(k1num==1)

miao--;

if(miao==-1)

miao=59;

write_fsm(8,miao);

write_(0x80+0x40+8);

if(k1num==2)

{

delay(5);

fen--;

if(fen==-1)

fen=59;

write_fsm(5,fen);

write_(0x80+0x40+5);

if(k1num==3)

shi--;

if(shi==-1)

shi=23;

write_fsm(2,shi);

write_(0x80+0x40+2);

if(k1num==4)

ri--;

if(ri<

1)

ri=31;

write_nyr(8,ri);

write_(0x80+0x00+8);

yue--;

if(yue<

yue=12;

}

nian--;

if(nian==0)

nian=90;

if(k1num==7)

s--;

if(s==0)

s=23;

f--;

if(f==-1)

f=59;

voidkeyk4()//S4是退出菜单键

if(S4==0)

delay(5);

if(S4==0)

TR0=1;

S4);

k1num=0;

write_(0x0c);

//开显示,不显示光标,光标不闪烁

voidkeyk1()//菜单光标设置

{

if(S1==0)

delay(10);

i

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

当前位置:首页 > 高中教育 > 语文

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

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