单片机课程设计多功能数字电子钟设计

更新时间:2023-04-09 21:47:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

吉林建筑大学

电气与电子信息工程学院

单片机原理与应用设计课程设计报告

设计题目:多功能数字电子钟设计

专业班级:信工111

学生姓名:夏纯

学号:10211134

指导教师:许亮张玉红

设计时间:2014.03.03-2014.03.14

一、内容摘要

传统的数字电子时钟采用了较多的分立元器件,不仅占用了很大的空间而且利用率也比很低,随着系统设计复杂度的不断提高,用传统时钟系统设计方法很难满足设计需求。单片机是集CPU、RAM、ROM、定时器/计数器和多种接口于一体的微控制器。它体积小、成本低、功能强,广泛应用于智能产品和工业自动化上。而51系列的单片机是各单片机中最为典型和最有代表性的一种。STC 公司生产的IAP15F2K61S2单片机是最新设计的一种单片机,本文设计的电子时钟就是是基于IAP15F2K61S2单片机,同时使用C语言为程序设计语言,从而克服传统电子时钟的弊端。本设计拟实现的基本功能为单片机计时显示功能。能够体现单片机电子时钟的可扩展优越性,加入时间调整程序,使用按钮,调整年月日及时间等功能。

二、设计内容及要求

1)设计内容

利用单片机定时器制作数字时钟并可以实现时钟的控制。制作数字时钟显示系统,显示部分用LCD12864,第一行显示年月日,第二行显示时分秒,第三行显示星期。如果时间不对的话可以校准时钟。

2)设计要求

1.掌握单片机控制多功能数字电子钟系统的电路原理图;

2.熟知单片机的工作原理;

3.掌握用对单片机简单程序的理解和应用;

4.调试要求:

1)LCD显示当前的时间等信息值;

3)三个个按钮,P3.0用作选项的设定,P3.1用做调加、P3.2用作调减;

5.独立完成课程设计报告(必须有完整的源程序)

三、电路工作原理

单片机由运算器、控制器、存储器、输入输出设备构成。单片机自动完成赋予它的任务的过程,也就是单片机执行程序的过程,即一条条执行的指令的过程,所谓指令就是把要求单片机执行的各种操作用的命令的形式写下来,这是在设计人员赋予它的指令系统所决定的,一条指令对应着一种基本操作;单片机所能执行的全部指令,就是该单片机的指令系统,不同种类的单片机,其指令系统亦不同。为使单片机能自动完成某一特定任务,必须把要解决的问题编成一系

列指令(这些指令必须是选定单片机能识别和执行的指令),这一系列指令的集合就成为程序,程序需要预先存放在具有存储功能的部件——存储器中。存储器由许多存储单元(最小的存储单位)组成,就像大楼房有许多房间组成一样,指令就存放在这些单元里,单元里的指令取出并执行就像大楼房的每个房间的被分配到了唯一一个房间号一样,每一个存储单元也必须被分配到唯一的地址号,该地址号称为存储单元的地址,这样只要知道了存储单元的地址,就可以找到这个存储单元,其中存储的指令就可以被取出,然后再被执行。程序通常是顺序执行的,所以程序中的指令也是一条条顺序存放的,单片机在执行程序时要能把这些指令一条条取出并加以执行,必须有一个部件能追踪指令所在的地址,这一部件就是程序计数器PC(包含在CPU中),在开始执行程序时,给PC赋以程序中第一条指令所在的地址,然后取得每一条要执行的命令,PC在中的内容就会自动增加,增加量由本条指令长度决定,可能是1、2或3,以指向下一条指令的起始地址,保证指令顺序执行。

四、硬件系统框图

硬件系统框图如图1所示

图1

硬件介绍:

(1)单片机:此次课程设计采用的是STC公司最新生产的AP15F2K61S2 芯片。该单片机主要有以下几个特色功能:

①ISP/IAP,在系统可编程/在应用可编程,无需编程器,无需仿真器。

②可当仿真器使用,具有增强型8051CPU,1T,单时钟/机器周期,速

度比普通8051快8-12倍。

③61K字节片内片内Flash程序存储器,擦写次数10万次以上。

④片内大容量2048字节的SRAM。

⑤具有大容量片内EEPROM,擦写次数10万次数以上。

⑥共8通道10位高速ADC,速度可达30万次/秒,3路PWM还可当3路D/A

使用。

⑦共3通道捕获/比较单元(CCP/PWM/PCA)。

⑧内部高可靠复位,8级可选复位门槛电压,彻底省掉外部复位电路,

而且其内部高精度R/C时钟。

⑨内部时钟从5MHz~35MHz可选,相当于普通8051的60MHz~420MHz。

⑩两组高速异步串行通信端口(可同时使用),可在5组管脚之间进行切换,分时复用可当5组串口使用。

?一组高速异步串行通信端口SPI。

?各种接口扩展齐全。

?一根优质USB线实现系统供电、程序下载、通信功能。

(2)LCD12864液晶显示屏

①基本特性:

1.低电源电压(VDD:+3.0--+5.5V)

2.显示分辨率:128×64 点

3. 内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)

4.内置 128 个16×8 点阵字符

5.2MHZ 时钟频率

6.显示方式:STN、半透、正显

7. 驱动方式:1/32DUTY,1/5BIAS

8.视角方向:6 点

9. 背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10

10. 通讯方式:串行、并口可选

11. 内置 DC-DC 转换电路,无需外加负压

12.无需片选信号,简化软件设计

13.工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃

②模块接口:表1所示

③显示:LCD12864液晶显示屏每屏可显示4行8 列共32 个16×16

点阵的汉字,每个显示RAM 可显示1 个中文字符或 2 个16×8 点

阵全高ASCII码字符,即每屏最多可实现32 个中文字符或64 个 ASCII 码字符的显FYD12864-0402B 内部提供128×2 字节的字符显示RAM缓冲区(DDRAM)。字符显示是通过将字符显示编码写入该

字符显示RAM 实现的。根据写入内容的不同,可分别在液晶屏上显

示CGROM(中文字库)、HCGROM(ASCII码字库)及CGRAM(自定义

字形)的内容。三种不同字符/字型的选择编码范围为: 0000~0006H

(其代码分别是0000、0002、0004、0006共4 个)显示自定义字

型,02H~7FH显示半宽ASCII码字符,A1A0H~F7FFH显示8192 种

GB2312 中文字库字形。字符显示RAM 在液晶模块中的地址80H~9FH。

字符显示的RAM 的地址与32 个字符显示区域有着一一对应的关系,

其对应关系如表2所示。

表1

忙标志:BF

BF 标志提供内部工作情况.BF=1 表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0 时,模块为准备状态,随时可接受外部指令和数据.利用STATUS RD 指令,可以将BF 读到DB7 总线,从而检验模块之工作状态.

①字型产生 ROM(CGROM)

字型产生ROM(CGROM)提供8192个此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY ON),DDRAM的内容就显示在屏幕上,DFF=0 为关显示(DISPLAY OFF)。DFF 的状态是指令DISPLAY ON/OFF和RST信号控制的。

②显示数据RAM(DDRAM)

模块内部显示数据RAM 提供64×2 个位元组的空间,最多可控制4 行16 字(64 个字)的中文字型显示,当写入显示数据RAM 时,可分别显示CGROM 与CGRAM 的字型;此模块可显示三种字型,分别是半角英数字型(16*8)、CGRAM 字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在0000H—0006H的编码中(其代码分别是0000、0002、0004、0006 共4 个)将选择CGRAM 的自定义字型,02H—7FH 的编码中将选择半角英数字的字型,至于A1 以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5(A140—D75F),GB(A1A0-F7FFH)。

③字型产生 RAM(CGRAM)

字型产生RAM 提供图象定义(造字)功能, 可以提供四组16×16点的自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM 中,便可和CGROM中的定义一样地通过DDRAM 显示在屏幕中。

④地址计数器 AC

地址计数器是用来贮存DDRAM/CGRAM 之一的地址,它可由设定指令暂存器来改变,之后只要读取或是写入DDRAM/CGRAM 的值时,地址计数器的值就会自动加一,当RS 为“0”时而R/W 为“1”时,地址计数器的值会被读取到DB6——DB0中。

⑤光标/闪烁控制电路

此模块提供硬体光标及闪烁控制电路,由地址计数器的值来指定DDRAM中的光标或闪烁位置。

五、完整的电路图

见附录一

六、系统软件设计框图

如图2所示

七、各部分程序的详细设计步骤流程图

如图3、图4、图5、图6所示

八、参考文献

[1]《单片机原理及其应用》,张毅刚,高等教育出版社,2004年

[2]《单片机原理及应用设计》,张毅刚,电子工艺出版社,2008年

[3]《单片机控制实习与专题制作》,蔡朝洋,北京航空航天大学出版社2006年

[4] 《51单片机技术与应用系统开发》,江志红,清华大学出版社, 2008

[5] 《单片机原理及接口技术》,陈连坤,北京交通大学出版社2010年

图2 系统软件设计框图

图3 程序流程图

图4 显示程序框图 图5 定时器程序框图

图6 键盘函数框图

九、设计中的问题及解决方法

在本次单片机课程设计过程中,遇着的很多很多的问题,我把这些问题分为两大类,硬件问题跟软件问题:

(1)硬件问题:

在焊接这个单片机板子之前,看了一下我们的板子跟原理图,但是发

现这两个都不怎么衔接,最典型的一个就是键盘的8个300Ω电阻的问题,原理图中,这8个300Ω电阻是放一起的,但是在板子上,根本就找不着有8个300Ω电阻一起的地方,板子上面还没有写全了,很多封装之后都没有标上到底是焊电阻呢还是电容或者其他的,没有办法啊,后来只有找老师了,在老师的帮助下,看了看这个板子的PCB图,后来慢慢的才吧这些电阻的位置找着。然后就是在焊接的时候,我们焊接技太差,很多根本就焊不上去锡,估计焊锡也有问题,刚被电烙铁烫化就被氧化了,起了个球,这没办法啊,通过反复的联系,总结经验,总算是把我们所需要的东西都焊上了。还有一个问题就是由于我们焊接技术有限,不能一次性的焊接成功,有些地方缺焊什么的太多,后来经过检查摸索,用万用边测这又测那的,总算是检查出问题的根源所在的,然后通过测试总算是好使了。

(2)软件问题:

在软件设计这上面,遇着的问题是最多的,因为我们上学期学才学的单片机这门课,书本里面用的是汇编的语言,但是我感觉那个太复杂语句太多还不易理解,然后通过查相关资料学习C语言单片机编程,从流水灯小程序开始慢慢摸索,然后学习LCD12864,学到很多东西,感觉C语言比汇编好理解多了。刚开始做了些应用的小程序,通过仿真,实验,一步一步的学习。最后就做这个课程设计的程序。虽然这程序不是很麻烦,但是对于我来说也是很难的。设计里面用的是12864液晶显示屏,这个显示屏得通过特定的程序才能达到想要显示的目的,然后就只有先查看资料,找了很多12864的资料,里面一个很重要的东西就是它的接线跟时序图什么的,时序图实在看不懂,最后只有看看例程,相关视频之后稍微能理解点。然后在程序中写出来之后屏幕终于能显示了。

然后程序弄完之后就是硬件跟软件结合,刚开始在显示的时候有点瑕疵,比如显示不出来或者按键不好使的什么都有。最后综合来个大检查,程序就是有些地方冲突了什么的,按键的问题还是焊接没焊好,虚焊比较多,最后的最后,总算是好事了。

十、总结

在本次的课程设计中,我学会了很多东西,比如之前不会C语言编程,虽然学了C语言那门课,但是这种应用性的懂西更容易去理解一点。还学会的protel画图的一些简单的操作,能看懂PCB图了,这是电子专业必须要会的一个软件,也学会了怎么往单片机里下载程序之内的东西。在做课程设计的过程中,我虽然做的是电子钟,但是我想在以后的时间里,在这个程序的基础上做成万年历,不在只是显示这么简单的功能了,但是那个程序肯定比这个复杂得多,还得更进一步的去学习。就我个人而言,跟上理论课比起来我还是喜欢做课程设计,课程设计主要是动手做东西,我很乐意整这些东西,非常的感兴趣。

课程设计的目的是让同学们将理论与实践相结合,是一个学习新知识、巩固加深所学课本理论知识的过程,它培养了我们综合运用知识的能力,独立思考和解决问题的能力。它不仅加深了我对电子技术课程的理解,还让我感受到了设计电路的乐趣。在这次设计中,我一点也不怕麻烦,反复设计、绘图与修改,就是希望能把这次课程设计做好。因此对我来说,这次课程设计是非常有意义的。

两周的课程设计结束了,在此感谢我们的许老师,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次课程设计的每个实验细节和每个数据,都离不开老师您的细心指导。而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。

由于本人的设计能力有限,在设计过程中难免出现错误,恳请老师们多多指教,我十分乐意接受你们的批评与指正,本人将万分感谢。

附录二:源程序

#include

#define uchar unsigned char

#define uint unsigned int

uchar code tab[]={"一,二,三,四,五,六,日"};

uchar nian,yue,ri,xingqi,miao,shi,fen,

uchar naolingshi,naolingfen,naolingmiao,kaiguan; uchar count=0,num,num1;

uchar table[]="20";

uchar table1[]="星期";

uchar table2[]=":";

uchar table3[]="年";

uchar table4[]="月";

uchar table5[]="日";

uchar table7[]="闹钟" ;

sbit rs=P2^7;

sbit rw=P2^6;

sbit e=P2^5;

sbit psb=P2^2;

sbit s1=P3^0;

sbit s2=P3^1;

sbit s3=P3^2;

sbit s4=P3^3;

sbit s5=P3^6;

sbit s6=P3^7;

sbit beep=P3^6;

void delay_ms(uint x)

{

uint j;

while(x--)

for(j=0;j<115;j++);

}

void com(uchar com)

{

rs=0;

rw=0;

P0=com;

delay_ms(5);

e=1;

delay_ms(5);

e=0;

}

void dat(uchar dat)

{

rs=1;

rw=0;

P0=dat;

delay_ms(5);

e=1;

delay_ms(5);

e=0;

}

void write_sfm( uchar add,uchar num) {

uchar shi,ge;

shi=num/10;

ge=num%10;

com(0x80+add);

dat(0x30+shi);

dat(0x30+ge);

}

void init()

{

nian=14;

yue=3;

ri=10;

xingqi=1;

naolingshi=0;

naolingfen=0;

naolingmiao=0;

kaiguan=0;

fen=59;

shi=23;

miao=50;

count=0;

num=0;

num1=0;

psb=1;

com(0x30);

delay_ms(5);

com(0x0f);

delay_ms(5);

com(0x01);

delay_ms(5);

com(0x06);

delay_ms(5);

com(0x0c);

delay_ms(5);

com(0x80);

delay_ms(5);

com(0x9b);

dat(':') ;

com(0x9d);

dat(':') ;

write_sfm(0x01,nian);

delay_ms(2);

write_sfm(0x03,yue);

delay_ms(2);

write_sfm(0x05,ri);

delay_ms(2);

write_sfm(0x0c,xingqi);

delay_ms(2);

write_sfm(26,naolingshi); delay_ms(2);

write_sfm(28,naolingfen); delay_ms(2);

write_sfm(30,naolingmiao); delay_ms(2);

write_sfm(15,kaiguan); delay_ms(2);

write_sfm(0x14,miao);

delay_ms(2);

write_sfm(0x12,fen);

delay_ms(2);

write_sfm(0x10,shi);

TMOD=0X01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void disp()

{

uchar i;

com(0x80);

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

{

dat(table[i]);

delay_ms(4);

}

com(0x82);

for(i=0;i<2;i++) {

dat(table3[i]);

delay_ms(4);

}

com(0x84);

for(i=0;i<2;i++) {

dat(table4[i]);

delay_ms(4);

}

com(0x86);

for(i=0;i<2;i++) {

dat(table5[i]);

delay_ms(4);

}

com(0x88);

for(i=0;i<6;i++) {

dat(table1[i]);

delay_ms(4);

}

com(0x91);

for(i=0;i<2;i++) {

dat(table2[i]);

delay_ms(4);

}

com(0x93);

for(i=0;i<2;i++) {

dat(table2[i]);

delay_ms(4);

}

com(0x98);

for(i=0;i<4;i++) {

dat(table7[i]);

delay_ms(4);

}

}

void t0()interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

count++;

if(count==20)

{

count=0;

miao++;

if(miao==60)

{

miao=0;

fen++;

if(fen==60)

{

fen=0;

shi++;

if(shi==24)

{

shi=0;

ri++;

xingqi++;

if(ri==31)

{

ri=1;

yue++;

if(yue==12)

{

yue=1;

nian++;

write_sfm(0x01,nian);

}

write_sfm(0x03,yue);

}

write_sfm(0x05,ri);

write_sfm(12,xingqi);

}

write_sfm(0x10,shi);

}

write_sfm(0x12,fen);

}

write_sfm(0x14,miao);

}

}

void key()

{

if(s1==0)

{

delay_ms(5);

if(s1==0)

{

num++;

while(!s1);

if(num==1)

{

TR0=0;

com(0x94);

com(0x0f);

}

if(num==2)

com(0x92);

if(num==3)

com(0x90);

if(num==4)

com(0x85);

if(num==5)

com(0x83);

if(num==6)

com(0x81);

if(num==7)

com(0x8c);

if(num==8)

{

num=0;

com(0x0c);

TR0=1;

}

}

}

if(num!=0)

{

if(s2==0)

{

delay_ms(5);

if(s2==0)

{

while(!s2);

if(num==1)

{

miao++;

if(miao==60)

miao=0;

write_sfm(0x14,miao);

com(0x94);

}

if(num==2)

{

fen++;

if(fen==60)

fen=0;

write_sfm(0x12,fen);

com(0x92);

}

if(num==3)

{

shi++;

if(shi==24)

shi=0;

write_sfm(0x10,shi);

com(0x90);

}

if(num==4)

{

ri++;

if(ri==32)

ri=1;

write_sfm(0x05,ri);

com(0x85);

}

if(num==5)

{

yue++;

if(yue==13)

yue=1;

write_sfm(0x03,yue);

com(0x83);

}

if(num==6)

{

nian++;

if(nian==100)

nian=0;

write_sfm(0x01,nian);

com(0x81);

}

if(num==7)

{

xingqi++;

if(xingqi==8)

xingqi=1;

write_sfm(12,xingqi);

com(0x8c);

}

}

}

if(s3==0)

{

delay_ms(5);

if(s3==0)

{

while(!s3);

if(num==1)

{

miao--;

if(miao==-1)

miao=59;

write_sfm(0x14,miao);

com(0x94);

}

if(num==2)

{

fen--;

if(fen==-1)

fen=59;

write_sfm(0x12,fen);

com(0x92);

}

if(num==3)

{

shi--;

if(shi==-1)

shi=23;

write_sfm(0x10,shi);

com(0x90);

}

if(num==4)

{

ri--;

if(ri==0)

ri=31;

write_sfm(0x05,ri);

com(0x85);

}

if(num==5)

{

yue--;

if(yue==0)

yue=12;

write_sfm(0x03,yue);

com(0x83);

}

if(num==6)

{

nian--;

if(nian==-1)

nian=99;

write_sfm(0x01,nian);

com(0x81);

}

if(num==7)

{

xingqi--;

if(xingqi==0)

xingqi=7;

write_sfm(12,xingqi);

com(0x8c);

}

}

}

}

if(s4==0)

{

delay_ms(5);

if(s4==0)

{

num1++;

while(!s4)

if(num1==1)

{

TR0=0;

com(0x9e);

com(0x0f);

}

if(num1==2)

com(0x9c);

if(num1==3)

com(0x9a);

if(num1==4)

com(0x8f);

if(num1==5)

{

num1=0;

TR0=1;

com(0x0c);

}

}

}

if(num1!=0)

{

if(s2==0)

{

delay_ms(5);

if(s2==0)

{

while(!s2);

if(num1==1)

{

naolingmiao++;

if(naolingmiao==60)

naolingmiao=0;

write_sfm(0x9e,naolingmiao);

com(0x9e);

}

if(num1==2)

{

naolingfen++;

if(naolingfen==60)

naolingfen=0;

write_sfm(0x9c,naolingfen);

com(0x9c);

}

if(num1==3)

{

本文来源:https://www.bwwdw.com/article/43bl.html

Top