电子万年历设计.docx

上传人:b****6 文档编号:4826195 上传时间:2022-12-10 格式:DOCX 页数:14 大小:750.58KB
下载 相关 举报
电子万年历设计.docx_第1页
第1页 / 共14页
电子万年历设计.docx_第2页
第2页 / 共14页
电子万年历设计.docx_第3页
第3页 / 共14页
电子万年历设计.docx_第4页
第4页 / 共14页
电子万年历设计.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

电子万年历设计.docx

《电子万年历设计.docx》由会员分享,可在线阅读,更多相关《电子万年历设计.docx(14页珍藏版)》请在冰豆网上搜索。

电子万年历设计.docx

电子万年历设计

 

电子万年历设计(总17页)

电子万年历设计

 

 

指导老师:

耿艳丽

 

郭家旭135561自动化C134

焦大城135583自动化C134

邱锦君135640自动化C134

殷明135723自动化C134

 

课程设计任务书:

电子万年历设计:

利用单片机、时钟芯片DS1302、温度传感器DS18B20、1602液晶等实现日期、时间、温度的显示即一个简单的万年历。

摘要

本次单片机课程设计需要使用的是上课时学习的51单片机,其是对目前所有兼容Intel8031指令系统的单片机的统称。

该系列单片机的始祖是Intel的8031单片机,后来随着Flashrom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。

目前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。

51单片机即是基础入门的一个单片机,还是应用最广泛的一种。

1使用硬件和软件简介……………………………………………3

51单片机…………………………………………………3

使用软件简介……………………………………………4

2设计过程………………………………………………………5

设计流程图………………………………………………5

keil编程…………………………………………………6

protues设计电路图及仿真………………………………7

3心得体会………………………………………………………11

附录………………………………………………………………12

 

万年历显示模块设计

1使用硬件和软件简介

51单片机

单片机,亦称单片微型电脑或单片微型计算机。

它是把中央处理(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/O)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。

计算机的产生加快了人类改造世界的步伐,在人们日常生活中应用广泛,但有时我们并不要求计算机功能强大,而只需要它能在特定的环境下连续不断地完成并不负责的任务,同时又要求它轻便和廉价。

微型计算机就是在这么的情况下产生了。

使用软件简介

本次课程设计要使用2款软件协作完成,即protues完成基本电路构造和keil完成单片机程序设计。

protues介绍

Protues在两次课程设计中都有用到,可见学校对其应用的总是程度。

Protues软件是英国Labcenterelectronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。

它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件,几乎是目前最好的仿真单片机及外围器件的工具。

虽然目前国内的推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。

从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等。

在编译方面,它支持IAR、Keil和MPLAB等多种编译,这次课程设计就是Protues和Keil的协同使用来完成。

软件仿真方面,支持当前的主流单片机,如51系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列、68000系列等。

可以提供软件调试功能,丰富的外围接口器件及其仿真(RAM,ROM,键盘,马达,LED,LCD,AD/DA,部分SPI器件,部分IIC器件)。

这样很接近实际。

此外还具有强大的原理图绘制功能。

keil介绍

这次单片机课程设计中除必要的硬件外,同样离不开软件的支持,所使用的汇编语言或C语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。

机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。

Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。

掌握这一软件的使用对于使用51系列单片机的设计者来说是十分必要的,如果使用C语言编程,那么Keil几乎就是唯一的选择。

即使不使用C语言而仅用汇编语言编程,Keil方便易用的集成环境、强大的软件仿真调试工具也会事半功倍。

 

2设计过程

设计流程图

 

图设计流程图

 

keil编程

根据上述的电路图,可知显示部分采用8位7段数码管的分时显示,利用人眼的视觉暂留现象,在数码管上显示出连续的明显数值。

其中8位数码管的各位开关信号16进制编码如下表:

点亮第几位(从左记)

1

2

3

4

5

6

7

8

相应的16进制编码

0xfe

0xfd

0xfb

0xf7

0xef

0xbf

0xbf

0x7f

图8位数码管开关位编码

相应的2进制数输出转化位7段数码管显示十进制的编码表如下:

显示十进制

0

1

2

3

4

5

6

7

8

9

16进制输出

0x3f

0x06

0x5b

0x4f

0x66

0x6d

0x7d

0x07

0x7f

0x6f

图7段数码管显示编码

根据以上数据和单片机的各端口功能分布,可以大略得出程序的流程图。

程序开始前,可以先进行一些预处理,使编程过程简化。

程序预处理

首先,讲头文件中包含的单片机的各对应引脚定义为较容易书写的格式,同时定义十进制到7段数码管显示对应的8位2进制数转化的数组序列。

然后,定义全局变量(同时初始化初值),方便在各函数间调用和改变年月日时分秒的具体数值,避免使用指针带来的语言复杂性。

最后,对要用到的函数进行统一声明(也可以直接先写函数),防止编程时不合理的调用函数。

主函数流程

最重要的主函数流程可归纳如下:

先将2输出端置零,使得显示屏清空。

后建立一永久循环H,表示程序一直运行。

循环的开始再建立一设定好次数的循环J,用来做单片机分频用,其中调用键盘扫描程序,看是否有键按下,以此判定下一步动作。

由于日历的要求控制键不多,课程设计的要求为可切换显示,故最少应有2个控制键来切换日期和时间的显示。

若按下的为显示日期/时间,则对日期/时间相关数据进行处理,由其中一个输出端输出,由另一输出端控制显示在8位数码管的哪一位上,后延时实现一段时间。

最后再次执行键盘扫描函数,看指令是否变化。

固定循环J结束,判断是否按下其他操作键,对时间日期的数据进行人为修改;若无则向下执行,进行时间/日期的溢出判断和正常增加计数。

最后运行至无限循环H底部,再跳至开头进行上述步骤。

相关子函数

键盘检测程序:

由于操作键较少,所以不必使用多重键盘,只需使用单片机一个端口就可以有8个按键供使用。

检测哪个端口有电位变化,就可判断按下的是哪个按键。

延时函数:

就一设定好次数的循环,用以消耗指令周期,循环中可以为空语句,或者为检测、显示语句以确定按键、固定示数。

程序总流程图

根据上述文字表达,可以得出程序总流程图如下:

图程序总流程图

根据课程设计的要求和设计流程,结合设计出的电路图,可以设计相应的C语言程序,见附录。

protues设计电路图及仿真

根据所编的程序,可以设计出相应的电路图。

显示部分采用8位7段数码管,虽然年月日/时分秒只用带6位左右,但是为了分隔便于观察,所以增加2位空格显示。

其中将P1口做输入端,用来和8个接地按键相连,构成键盘电路。

P2口做输出口,用来输出时间日期的8位2进制数表达。

P0口做控制端,控制P2输出的信号显示在具体哪个数码管上。

此外,需要提供相应的外部时钟输入XLAT1和XLAT2,再对RET和EA端口赋予相应的电位,使得单片机能够正常工作。

综上,利用protues元件库,可以设计出满足上述条件的显示电路,如下所示:

图仿真电路图

由于对于Protues的晶振元件不是很熟悉,无法设定合适的电路使其起振,故在此用一周期脉冲源替代晶振作为外部时钟。

基本电路完成,将编程生成的hex文件导入到仿真单片机中:

图导入hex文件

按下仿真键,即可开始仿真:

图仿真实时图(显示日期)

图仿真实时图(显示时间)

虽然电路比较简陋,但是基本可以实现对年月日和时分秒的分别显示,且具有清零和更改设置时间的功能。

由于没有采用4×4键盘,只和P1端口直接链接,所以只有8个操作键,实现显示6个时间和2个更新时间的操作。

由于选用的的数码管最多只能找到8位的,所以就没有增加显示星期的功能。

也因为,我觉得星期本身就是在日期上多加一个限制在7内的计数单元,没有太多的必要,所以就没有设计这个功能。

 

3心得体会

本次单片机课程设计是一个使用Protues设计工具、协同使用Keil编程软件制作小万年历的题目。

解题过程中,我更加感到这不是一个特别简单的事情,单片机的的C语言表示法很多语法与之前学过的C语言不同,特别是单片机的存储结构和指令计数方式是从前没有学好。

不过时间紧迫,只能临时抱佛脚啃啃教材。

在整个过程中,我深刻地感受并理解到C语言的简便性和丰富性。

不管是从实现功能的角度看还是从数据类型、架构上,都可以看出C语言是一个十分优秀的程序开发语言。

虽然汇编有程序段短小的巨大优势,不过对于我这样新手而言,能用C语言完成这个题目已经很不容易了。

这次作业让我了解怎么从不同的角度去分析同一个问题,让我们有更多更广的思路去处理解题时遇到的难点和要点。

从解决问题的过程中也可以熟悉和了解C语言和Protues程序的不同用法和功能,而各种原有的模板使得我可以用高效,简洁的思路、观点来解题。

这样的探索过程也是很愉悦的,特别是看到自己也能编写一个起码有点样子的仿真程序的时候。

虽然我所完成的作业本身就是很简单的一个基本应用,但在这过程中我所学到的东西令我终生受用。

在这段时间中因为我们组成员的共同努力才能有所成就,更有老师和同学们的共同指导和帮助,这次也让我认识到只有平时扎实知识才能用的时候信手拈来,不用临时抱佛脚。

我以后会更加努力希望老师给予评分。

最后,我完成了这次作业,望老师指正。

 

附录

#include<>

#include<>

#defineucharunsignedchar

#defineuintunsignedint

Unsignedcharcodediscode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsignedinti=0,j,m=32,f=25,s=10,r=21,y=7,n=05;

sbitP1_0=P1^0;

sbitP1_1=P1^1;

sbitP1_2=P1^2;

sbitP1_3=P1^3;

sbitP1_4=P1^4;

sbitP1_5=P1^5;

sbitP1_6=P1^6;

sbitP1_7=P1^7;

sbitP0_0=P0^0;

sbitP0_1=P0^1;

sbitP0_2=P0^2;

sbitP0_3=P0^3;

sbitP0_4=P0^4;

sbitP0_5=P0^5;

sbitP0_6=P0^6;

voiddelays(void);

ucharkbscan(void);

ucharinkbscan(void);

voiddisplay(void);

/******************************下面是主程序*************************/

voidmain(void)

{P0=0;P2=0;

while

(1)

{

kbscan();//键盘扫描程序

delays();//延时程序

for(j=600;j>0;j--)

{if(j>290&&j<550)

{if(i==0)//showday

{P0=0xfe;P2=discode[n/10];delays();

P0=0xfd;P2=discode[n%10];delays();

P0=0xf7;P2=discode[y/10];delays();

P0=0xef;P2=discode[y%10];delays();

P0=0xbf;P2=discode[r/10];delays();

P0=0x7f;P2=discode[r%10];delays();

}

if(i==1)//showtime

{P0=0xfe;P2=discode[s/10];delays();

P0=0xfd;P2=discode[s%10];delays();

P0=0xf7;P2=discode[f/10];delays();

P0=0xef;P2=discode[f%10];delays();

P0=0xbf;P2=discode[m/10];delays();

P0=0x7f;P2=discode[m%10];delays();

}

kbscan();//键盘扫描程序

}

}

if(i==2){n++;i=0;}//yearadd1

if(i==3){y++;i=0;}//yuefenadd11

if(i==4){r++;i=0;}//dayadd1

if(i==5){s++;i=1;}//houradd1

if(i==6){f++;i=1;}//minadd1

if(i==7){n=0;y=1;r=1;s=0;f=0;m=0;i=0;}//allbe0

{m++;//秒计数进行

if(m>59)

{f++;m=0;}

if(f>59)

{s++;f=0;}

if(s>23)

{r++;s=0;}

if(r>30)

{y++;r=1;}

if(y>12)

{n++;y=1;}

if(n>99)

{n=2;}

}

}

}

voiddelays(void)//延时程序

{

into;

for(o=80;o>0;o--);

}

 

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

{

if((P1&0xff)!

=0xff)

{

delays();

if((P1&0xff)!

=0xff)

{

if(P1_0==0)i=0;

if(P1_1==0)i=1;

if(P1_2==0)i=2;

if(P1_3==0)i=3;

if(P1_4==0)i=4;

if(P1_5==0)i=5;

if(P1_6==0)i=6;

if(P1_7==0)i=7;

display();//数码管显示程序

}

}

return(i);

}

 

voiddisplay(void)//数码管显示程序

{

P2=discode[i];

delays();

}

 

此程序可以正常进行编译,生成相应的hex,说明基本语法没有错误。

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

当前位置:首页 > 小学教育 > 数学

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

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