您的当前位置:首页正文

电子技术课程设计

来源:筏尚旅游网


电子技术课程设计

题 目: 数字式电子时钟课程设计

学生姓名 马 超 专 业_ 电子科学与技术 学 号 22200732272043 班 级_ 2007 级 2班 指导教师 丁 珠 玉 成 绩_

工程技术学院

2010 年 11 月

目 录

1 引言………………………………………………………………………… …………1

1.1 课程设计要求与目的……………………………………………………………1

1.1.1 基本设计要求与原则……………………………………………………5 1.1.2 设计的基本目的…………………………………………………………5 1.2 设计构思…………………………………………………………………………7 1.2.电子时钟简介………………………………………………………………7

1.2.2时钟的功能………………………………………………………………7

2 电路设计…………………………………………………………………………… …8

2.1 总体设计框架……………………………………………………………………8

2.1.1 总体设计思路……………………………………………………………8 2.1.2 总体流程图………………………………………………………………8 2.2 部分设计细节………………………………………………………………… 10

2.2.1 各部分的设计思路及电路图………………………………………… 10

3 时钟各功能分析及图解………………………………………………………………14

3.1 时钟运行图…………………………………………………………………… 14 3.2 秒表运行图…………………………………………………………………… 14 4 电路控制C语言程序…………………………………………………………………16 5 程序调试过程及相关问题……………………………………………………………17

5.1 调试中已解决问题…………………………………………………………… 17 5.2 相关分析……………………………………………………………………… 19 5.3 方案存在的问题……………………………………………………………… 30 5.4 调试心得体会………………………………………………………………… 35 6 小结……………………………………………………………………………………40

附录……………………………………………………………………………………… 42

参考文献………………………………………………………………………………… 44 致谢………………………………………………………………………………………48

数字电子时钟课程设计

马 超

西南大学 工程技术学院 07级(2)班 电子科学与技术 重庆北碚400716

1 引言

随着电子技术的迅猛发展,数字电路应用广泛,电子技术深入各个领域。通过数字时钟这一电子技术课程设计来让我们熟悉理论知识与实践相结合的综合训练,从而达到对我们运用能力进行检查和综合素质的培养。

1.1课程设计要求与目的

1.1.1基本设计要求与原则

本次课程设计的题目是数字电子时钟与简易水温控制系统。我们小组选择的是数字电子时钟。

基本要求:

1、能够根据设计任务和指标要求,综合运用电子技术课程中所学到的理论知识与实践技能独立完成一个设计课题。

2、根据课题需要选择参考书籍,查阅手册、图表等有关文献资料。要求通过独立思考、深入钻研课程设计中所遇到的问题,培养自己分析、解决问题的能力。

3、进一步熟悉常用电子器件的类型和特性,掌握合理选用的原则。

4、学会电子电路的安装与调试技能,掌握常用仪器设备的正确使用方法。利用“观察、判断、实验、再判断”的基本方法,解决实验中出现的问题。

5、1、2班独立设立小组,每小组2个成员。起止时间为:2010年10月28号开始至2010年11月12日结束。

基本原则:

1,小组团队设计不能从网上下载,自己动手编排电路,流程图,编写程序。 2,电路图必须采用PROTEL软件绘制,用multisim或者proteus软件仿真,并提交程序及结果、课程论文电子版。 (有违以上原则,取消课程成绩)

1.1.2 设计的基本目的

1.课程设计是教学中必不可少的重要环节,通过课程设计巩固、深化和扩展学生的理论知识与初步的专业技能,提高综合运用知识的能力,逐步增强实际工程训练的能力。

2.注重培养学生正确的设计思想,掌握课程设计的主要内容、步骤和方法。 3.培养学生获取信息和综合处理信息的能力、文字和语言表达能力以及协作工作能力。

4.提高学生运用所学的理论知识和技能解决实际问题的能力及其基本工程素质。

5.在知识传授与能力和素质培养的关系上,树立注重素质教育,融传授知识、培养能力与提高素质为一体。在理论与实践的关系上,树立理论联系实际,提高综合能力为目的。

1.2 设计构思

1.2.1 电子时钟简介

1957年,ventura发明了世界上第一个电子表,从而奠定了电子钟的基础,电子时钟开始迅速发展起来。现代的电子时钟是基于点偏激的一种计时工具,采用延时程序残生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分进一,满二十四小时清零。从而达到计时的功能,是人民日常生活不可缺少的工具。

1.2.2 时钟的功能

本次设计的时钟,以AT89C51单片机芯片为中心的控制电路。单片机控制电路省去很多复杂电路,使得电路得到简化。用C语言程序来控制时钟显示,更加简化了时钟的设计。由于单片机和C语言的控制能力较强,使得时钟的功能有所提高。通过调整时间,秒表,时钟暂停,返回时钟五个按键可以完成两个成套的功能:时钟调整、秒表。

表1 详细元件列表

器件名 单片机芯片 八位共阳电 容 称 数目 规格

1 AT89C51 数码管 1 7SED 5 104 电 阻 欧姆电 欧姆电 阻 阻 5 100 5 10k 8 560

2 电路设计

单片机控制电路省去很多复杂电路,使得电路得到简化。用C语言程序来控制时钟显示,更加简化了时钟的设计。电路构思也比较简单,用框架来描述分三个部分。 每个部分的详细设计用流程图来展现。

2.1 总体设计框架

此设计原理图如图所示,包括三个部分:单片机,键盘,显示电路。

AT89C51 独 立 键 盘 单片机芯片 控制系统 显 示 系 统

图1 总体构思

2.1.1 总体设计思路

设计的电路有三个模块组成:单片机控制电路,显示电路和校正电路。

整个设计是由单片机为中心,单片机实现时钟的运行,进制,循环,中断,初始化等等。软件程序从开始执行,先通过初始化各个寄存器,时钟正常运行,经过扫描按键来决定是否设定参数来执行相应功能的程序,进而在数码管上显示。

2.1.2 总体流程图

开 始 定时器及中断定时器初始化 Y 是否设定参数 执行时钟秒表设定程序 N 执行显示程序

图2 总体流程

2.2 部分设计细节

1.单片机发送的信号通过程序控制最终在数码管上显示出来。通过寄存器里存储的数据通过P2和P3端口来达到显示在数码管上的效果。

2.单片机通过输出各种电脉冲信号来驱动控制各部分正常工作。单片机自带的晶振电路使得单片机有很稳定的脉冲信号输出。

3.为使时钟走时与标准时间一致,校时电路时必不可少的,按键输入的数据存入寄存器后与时钟正常的时间数据相加来调节时间,键盘用来校正数码管上显示的。

3452.2.1各部分计思路及电路图 U28X7SEG主控制ABCDEFGDPU10102030405060708123456781312+5V151431191891716P10P11P12P13P14P15P16P17INT1INT0T1T0EA/VPX1X2RESETRDWR8051RXDTXDALE/PPSEN1011302912345678S1C1104C2104C3104C4104C5104R710kR810kR910kR1010kR1110kP00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P2739383736353433322122232425262728abcdefgdpR17R21R14R16R18R20R15R19560560560560560560560560显示控制12345678abcdefgdp+5v键盘控制01020304调时R1100S2调分R2100S3秒表R3100S4暂停R4100 图3 电路图 设计采用C语言程序编程,使单片机控制数码管显示时、分、秒,当秒计数计满60时就向分进位,分计数器计数满60后向时计数器进位,小时计数器按“23到0”规律计数,从0到23循环。时、分、秒的计数结果经过数据处理可以直接送显示器里显示。当计时发生误差时可以校时电路进行校正。设计采用的是时、分、秒显示,Title单片机对数据进行处理同时在数码管上显示。 SizeBNumberDate:10-Nov-2010(1)各个控制键的功能:可对时钟时、分进行校准调节(只可累计加1);加时File:D:\\PROTEL99SE\\MyDesign1.ddb1234567805S5R5100返回时钟Sheet of Drawn By:51、加分1键实在校准时间时对小时数或分钟数调节而设置的;按下秒切换键就进入秒表模式,同时秒表开始计时,按下秒表暂停,复位键就暂停、归零,如果要从新对秒表计时则可以按秒表开始、复位;

(2)AT89C51单片机,通过编写程序对数码显示进行控制。 (3)八个7段数码管显示时钟和秒表信号。

34

3 时钟各功能分析及图解 3.1 时钟运行图

图4

图5

仿真运行开始后,时间显示00-00-00并开始像复位时钟一样一秒跳动一次的运行。如图所示一样,调分键按一次,分钟数个位数值增加一。调时键按一次,小时数个位数值增加一,暂停按键可以让时钟暂停下来,返回时钟是用于进入秒表状态后或暂停后返回时钟界面用的。(图4)

简单操作就是:启动仿真,时钟运行,用调时、调分键校正时间,暂停键用于调秒或秒表,暂停过后想回到时钟界面就点击返回时钟按键。(如图5)

3.2 秒表运行图

图6

当秒表按键被按下后,八位共阳极数码管上显示的是00-00-00,并且最小的跑秒是0.01秒,最后两位(7、8)数字进位不再是60而是100,数码管的4、5的进位是60进1,1、2位则是到60后又返回00的无进位循环。

按键操作:当按动秒表键时,数码管从00-00-00开始计数,六秒后为00-06-48(图6)。这时你按下暂停键时,时间就会一直显示这个时间。返回时钟键有复位的功能,当你按下后,会回到时钟界面,回到你按秒表时的时间。当你再按秒表时又会重复上面的步骤。如(图7)

该数字钟是用一片AT89C51单片机通过编程区去驱动8为数码管显示来实现的。通过5个开关控制,分别为调分、调时、秒表、暂停、返回时钟,控制键分别对应P1.0到P1.4端口。

AT89C51通过P2口和P3口区控制数码管的显示,P2口接数码管的a-g端面试控制输出编码。P3口接数码管的1-8端,是控制动态扫描输出。

U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161756056018XTAL29RSTR710KR810KR910KR1010KR1110K2930VCC31PSENALEEA11234567812345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.780C510102030405060708C1104C21043245C3104C4104C5104R1R2R3R4R5100100100100100调分调时秒表暂停返回时钟

图7

4 电路控制C语言程序

根据实验调试后的最终程序如下:

#include

#define uchar unsigned char #define uint unsigned int

#define delay_ime 3/*宏定义*/

uchar k,dat[]={0,0,0,0,0,0,0,0}; uint tcount, t,u;

0102030405060708R14R15R16R17R18R19R20R21uchar dat1[]={0,0,0,0,0,0,0,0}; uchar dat2[]={0,0,0,0,0,0,0,0};

uchar dis_bit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

uchar code SEG7[11]={0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/ 0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/0xBF,/*-*/ };/*数字显示数组*/ sbit tminute=P1^0; sbit thour=P1^1;

sbit miaobiao1=P1^2; sbit miaobiao2=P1^3;

sbit miaobiao3=P1^4;/*端口定义*/

uchar ms=0; uchar flag=0; uchar sec=0; uchar minit=0;

struct time{uchar second; uchar minute; uchar hour;}time1; uchar n,i;

void init();

//**************************************************** void delay(n) { while(n--) { for(i=120;i>0;i--); }

}/*延时子程序*/

//**************************************************** void modify(void) { EA=0; if(thour==0) { if(flag==0) { dat1[6]++; time1.hour++; delay(280); if(dat1[6]>9) { dat1[6]=0; dat1[7]++; }

else if((dat1[7]>1)&&(dat1[6]>3)) { dat1[7]=0; dat1[6]=0; } } }

// 数码管3、4位(分钟位输出) if(tminute==0) { if(flag==0) { dat1[3]++; time1.minute++; delay(280); if(dat[3]>=9) { dat1[4]++; dat1[3]=0; if(dat1[4]>5) { dat1[4]=0; } } }

} if(miaobiao1==0) { TR0=0; ET0=0; TR1=0; ET1=0; flag=1; dat[0]=0; dat[1]=0; dat[2]=0xbf; dat[3]=0; dat[4]=0; dat[5]=0xbf; dat[6]=0; dat[7]=0; TR0=1; ET0=1;

// minute计数存储 // 按键扫描延迟 //秒表按键设定 TR1=1; ET1=1; } if(miaobiao2==0) { //暂停按键设定 TR0=0; ET0=0; TR1=0; ET1=0; } if(miaobiao3==0) //返回按键设定 { TR0=1; ET0=1; TR1=0; ET1=0; flag=1; ms=0; sec=0; minit=0; } EA=1; }/*按键扫描*/

//**************************************************** void init(void) { TMOD=0x11; TH0=0xDB; TL0=0xFF; TH1=0xDB; TL1=0xFF; ET0=1; ET1=1; TR0=1; tcount=0; ms=0; sec=0; minit=0; EA=1; }/*初始化*/

//**************************************************** void test (void)

{ for(k=0;k<8;k++) { P3=dis_bit[k]; P2=SEG7[dat[k]]; delay(1); P3=0X00; }

}/*数字显示*/

//**************************************************** void main() { init(); delay(10); while(1) { modify(); test(); }

}/*主函数*/

//**************************************************** void diplay () interrupt 1 { ET0=0; TR0=0; TH0=0xDB; TL0=0xff; TR0=1; tcount++; //秒时间 if(tcount==100) { time1.second++; tcount=0; dat1[0]=(time1.second)%10; // dat1显示输出 dat1[1]=(time1.second)/10; }

//分进位循环 if(time1.second==60) { dat1[0]=0; // second显示存储清零 dat1[1]=0; time1.second=0; // second计数存储清零

time1.minute++; dat1[3]=(time1.minute)%10; // second个位显示 dat1[4]=(time1.minute)/10; }

//时进位循环 if(time1.minute==60) { dat1[3]=0; // minute显示存储清零 dat1[4]=0; time1.minute=0; // minute计数存储清零 time1.hour++; dat1[6]=time1.hour%10; // hour个位显示 dat1[7]=time1.hour/10; } // if(time1.hour>23) { dat1[6]=0; // hour显示存储清零 dat1[7]=0; time1.hour=0; // hour计数存储清零 } dat[5]=10; dat[2]=10; dat[0]=dat1[0]; dat[1]=dat1[1]; dat[3]=dat1[3]; dat[4]=dat1[4]; dat[6]=dat1[6]; dat[7]=dat1[7]; flag=0; P0=0x01; ET0= 1; }

//**************************************************** //跑秒

void time_2(void) interrupt 3 { EA=0; TR0=0; TH1=0xDB; TL1=0xFF; TR1=1; ms++; dat2[0]=ms%10;

// // }

dat2[1]=ms/10;

if(ms>=100) // 跑秒进制100 { ms=0; sec++; dat2[3]=sec%10; dat2[4]=sec/10; if(sec>=60) { sec=0; minit++; dat2[6]=minit%10; dat2[7]=minit/10; } }

dat[5]=10; dat[2]=10; dat[0]=dat2[0]; dat[1]=dat2[1]; dat[3]=dat2[3]; dat[4]=dat2[4]; dat[6]=dat2[6]; dat[7]=dat2[7]; EA=1;

5 程序调试过程及相关问题

5.1 调试中已解决问题 在调试过程中出现过几个问题。

(1)仿真时,元器件选错了:八位共阳极数码管选成了八位共阴极数码管,结果导入程序后出现的数字不是阿拉伯数字,而是反码。后来在调试程序的过程中,很长一段时间内没发现程序的问题反过头来找到了是元器件的选择错误问题。 (2)时钟按键调整过后,在秒针没有进位(没走满一分钟)时钟显示是正确的,没有任何延迟问题,数字显示正确。但是一旦秒钟走满60后显示的数字就出现问题,调分、调时按键校正的时间根本没有加上去,时钟按照调节前显示的时间在运行和显示。

(3)使用秒表功能时,当键入复位功能键时出现了反码,最后我们的解决方法是将秒表复位键同返回时钟键设置成同一按键,有效地解决了秒表复位问题,也简化了按键数量,节省了开支!

(4)开始编写的程序,用的汇编语言编写的,写得很杂乱没有章法,在时钟调试中出现了问题后不能及时,准确的找到问题的所在,不但暴露出汇编语言学习得不扎实,还暴露出自己在书写程序时,缺少一种系统,规范的方法。

5.2 相关分析

出现以上问题后,经过调试、请教同学、查资料等多种途径基本都能解决问题。 在组员的相互配合下,在同学的探讨帮助下,共同解决了以下问题。

解决方案:(1)换用了共阳极7段数码管解决了原件配备问题。(2)这是由于数码管的计数存储和显示存储的问题,在计数存储的数据里已经计算好并把时钟走的时间和按键校正的时间相加,但是显示存储没相加导致了这个问题。解决办法:把寄存器里的数据与按键校正的数据做加法后再放进数码管里显示出来,添加的语句为:time1.minute++。(3)这是由于按键多余造成,经过按键整合2键合1很好的解决了这个问题。(4)由于用汇编有很大的难处,后来程序用C语言编写,规范的按括号与括号相对,多加注解的方法,在调试中减轻了很大困难,为以后的编程找到了有效的书写模板。

5.3 方案存在的问题

虽说解决了上面的一些问题,但是最重要的,最困难的问题不是解决过的,而是还没解决的。以下三个问题是本次设计依然存在的问题,提出来希望能进一步得到解决。

(1)在秒表复位的电路中,结果是正确的,但是在你运行秒表程序又返回时钟界面后,再进入秒表,上面显示的数字不是00-00-00而是上次按返回时钟键的秒表时间。但是并不是说没复位,因为在1秒钟后秒表又进入正常的开始运行,时间也是与按秒表后的时间一样,在这个过程当中有个延迟,秒表要1秒钟时间去消化上次的数据。这个问题不知道怎么去解决,程序中延迟,中断部分都没什么问题,复位时要1秒钟的延迟来进入下次秒表运行的原因是?

(2)在当初设定单独复位键时出现了一个代码问题,同样的代码0xBF程序中设定为/*-*/出现了不是横线也不是数字的符号,不是反码,怎么修改数码管输出的代码数据都没用,最后只好不设定单独复位键。

(3)最后一个问题,时钟运行时,按秒表键,再按返回时钟键后秒表跑的时间不能加到时钟里,中间丢失了一段时间,经过探讨这是由于单片机只有一个处理器不能同时处理两个问题,所以这个是暂时无法解决的问题。

5.4 调试心得体会

经过近一个星期的单片机电子时钟课程设计,我们组已基本完成课程要求。功能上达到了:时钟的显示,秒表显示,调时功能,秒表暂停及复位功能。精确度完全满足日常生活需要。跑秒功能功能能实现平时精确计时功能功能。硬件条件适合扩充闹钟、整点报时等功能。由于时间,人员,专业技术等一系列限制条件,软件或者硬件都有一定程度的缺陷,例如没能加入闹钟和正点报时功能,还有使用秒表暂停功能时时钟功能停止运行。但我想在以后的课程设计当中可以解决这个难题。

在本次课程设计过程中,我们遇到了许许多多的问题,几乎是没有那次能一次通过,但就是凭借这样一次次程序编写调试在调试让我懂得了要想编写一个相当水平的程序我们还有很长的路要走,编写程序不仅仅要的是专业知识,细心专注更是一个编程人员不可或缺的品质。所以我想我们以后就有了新的目标,俗话说新生活从选定目标开始,我对此深信不疑。更不用说要做出一个好的产品。

通过这次理论与实践的紧密配合而诞生出的产品我和我的组员都有一股由衷的成就感,虽然它,没有特别之处,甚至是普普通通,但它的的确确承载了我们心情的汗水,我也深刻认识到理论知识非常需要实践生产的检验,就像鱼儿需要水的滋养,人类需要氧气的延续,实践是检验一切真理唯一而有效的途径。单片机课程的学习更是需要大量的实践再实践,在实践中总结去摸索去创造。

6小结

本次时钟课程设计得到了丁珠玉老师的细心指导,在此表示我诚挚的谢意。 丁老师在设计前的详尽讲解使我们对时钟设计感到不陌生,不是那样的惧怕,因为老师自身具备深厚的编程能力,讲解起来达到了运用自如,也让我们真正融入到编程的乐趣当中。我们以后将会以丁老师为榜样,做一个专业知识扎实,动手能力极强,极

具个人魅力的一个人。在此也一并感谢我的搭档刘鑫,是他不辞辛苦任劳任怨才有了今天这个成绩。还有伙伴海恩,每次请教他都热情满满,感谢他们在几天的一路相伴,我相信有你们在我会更加坚定的走下去,谢谢你们!

附录 参考文献

丁珠玉. 电子技术课程设计 西南大学 2010.10.28

周兴华. 手把手教你学单片机C语言程序设计 北京航空航天大学出版社 2007.10 邹显春.杜云 C语言程序设计实训教程 西南师范大学出版社 2007.8 李朝青. 单片机原理及接口技术 北京航空航天大学出版社 1999

肖玲妮.袁增贵 Protel99SE印刷电路板设计教程 清华大学出版社 2003.8

指导教师评语: 成绩评定: 指导教师: 年 月 日

因篇幅问题不能全部显示,请点此查看更多更全内容