单片机课程设计报告

更新时间:2023-10-21 02:12:01 阅读量: 综合文库 文档下载

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

论文(设计)题目:基于AT89S52的电子

万年历设计

系 别:电子信息工程 专 业:电子信息工程 年 级:??. 姓 名:??.. 指导老师:??.

学 号:………..

目录

摘要???????????????????????????..3 关键字??????????????????????????..3 一、 设计任务与要求???????????????????3 二、 方案设计与论证???????????????????3

方案一????????????????????????.. 3 方案二????????????????????????...4 方案三????????????????????????...4 三、 硬件单元电路设计 ?????????????????..5

1. 主控制系统?????????????????????.5 2. 时钟震荡电路????????????????????.6 3. 复位电路??????????????????????.6 4. DS1302时钟电路??????????????????...7 5. DS18B20温度电路??????????????????8 6. 按键电路??????????????????????.8 7. LCD显示电路????????????????????9 8. 蜂鸣器电路?????????????????????.9 四、 软件设计与流程图??????????????????10 五、 总原理图及原件清单?????????????????15

1. 总原理图??????????????????????.15 2. PCB板图??????????????????????16 3. 元件清单??????????????????????.17 六、 安装与调试

1. 电路安装??????????????????????18 2. 电路调试??????????????????????18 3. 软件调试??????????????????????18 七、 性能设计与分析??????????????????...18 八、 结论与心得????????????????????...19 九、 参考文献?????????????????????...19 十、 致谢???????????????????????...19 十一、 程序清单?????????????????????...19

摘要

随着社会的快速发展,时间的流逝,从观察太阳、摆钟到现在的单片机电子钟,人类不断研究,不断创造新纪录,单片机电子万年历已成为当今人类准确、快速获取时间信息的重要工具之一。本设计的电子万年历以AT89S52单片机为控制核心,采用Dallas公司的DS1302实时时钟构成时钟电路,能够实现时间和日期的显示,还增加了闹钟报时的功能,此外还增加了DS18B20温度传感器,用于读取每时刻的温度。设计详细地分析设计原理和制作的全过程。

关键词:AT89S52单片机 实时时钟DS1302 实时温度传感器DS18B20

一、 设计任务与要求

基本要求:

1. 能够现实年、月、日、时、分、秒 2. 可以人为校正年、月、日、时、分、秒

创新扩展:

1. 能够显示实时温度 2. 能够显示当年所属生肖

3. 具有闹钟功能并能实现闹钟时、分、秒校正 4. 具有整点报时功能

2

二、 方案设计与论证

方案一:

按照系统设计的功能的要求,初步确定系统由主控模块、时钟模块、温度模块、显示模块各键盘接口模块共5个模块组成,电路系统构成框图如图1所示。主控芯片使用52系列AT89S52单片机,时钟芯片使用美国DALLAS公司推出的一款高性能、低功耗、带RAM的实时时钟DS1302。采用DS1302作为计时芯片,可以做到计时准确。更重要的是,DS1302可以在很小电流的后备电源(2.5V--5.5V电源,在2。5V时耗电小于300nA)下继续计时,而且DS1302可以编程选择多种充电电流来对后备电源进行慢速充电,可以 保证后备电源基本功不耗电。显示模块采用普通的共阳LED数码管,键输入采用查询法实现功能调整。

时钟电路

(DS1302) 主控模块 AT89S52

键盘扫描电路LED显示电路 图1 电子万年历电路系统构成框图

方案二:

按照系统设计的要求和功能,将系统分为主控模块、时钟电路模块、按键扫描模块,LCD显示模块,电源电路、复位电路、晶振电路几个模块,系统框图如图2所示。主控模块采用AT89S52单片机,按键模块用四个按键,用于调整时间和设定闹钟,显示模块采用LCD12864,时钟电路模块采用DS1302实时时钟实现对时间,日期的操作。

复位电路 晶振电路 按键扫描模块 主控模块 AT89S52 时钟电路 (DS1302) LCD12864显示模块

图2 基于AT89S52单片机的电子万年历系统框图

方案三:

3

按照系统设计的要求和功能,将系统分为主控制器模块、显示模块、按键开关模块、蜂鸣器电路模块。系统框图如图3所示,主控制模块采用AT89S52单片机为控制中心,显示模块采用液晶LCD12864显示,计时使用AT89S52单片机自带的定时器功能,实现对时间、日期的操作,通过按键盘开关实现对时间、日期的调整。

复位电路 按键电路 晶振电路 单片机 AT89S52 LCD1602显示模块 蜂鸣器电路 图3 基于AT89S52单片机的电子万年历总体设计框图

方案论证:上面提到的三个方案中,在电路原理方面大致相同,都能够达到设计任务与要求,在方案一款方案二中使用外部的时钟芯片DS1302来实现日期和时间的操作,方案三中则利用了单片机自身的定时器功能;在方案二和方案三在显示模块上都使用液晶显示屏LCD12864作为显示,方案一则使用LED数码管作为显示,采用LED数码管动态扫描,数码管的价格适中,对于显示数字较好,而且使用单片机的端口也较少;采用LCD1602液晶显示屏,液晶显示屏的显示功能强大,可以显示大量文字、图形,显示多样性,清晰可见,价格相对LED数码管来说要昂贵些,但是基于本设计显示的东西较多,若采用LED数码管的话,所需数码管较多,价格也相应的会提高,而且不利于控制,对于LCD12864,随着现在制造的发展,价格也在下降,同时它所使用的端口也不很多,能够清晰的显示,比较适合显示大量的数字,因此选择LCD12864作为显示模块。DS1302是一款高性能的实时时钟芯片,以计时准确、接口简单、使用方便、工作电压范围宽和低功耗等优点,得到广泛的应用,同时可以对秒、时、分、日、月、年以及润年补偿的年进行计数,而且在掉电时能够在外部纽扣电池的供电下继续工作,不会因为掉电后,其时间就要重新设置,方案三中使用定时器的功能,当在掉电的时候就会使时间和日期回到原来设定的初始值,同时直接采用单片机定时计数提供秒信号,使用程序实现年时间和日期,采用此种方案,节约成本,但是实现的时间误差较大,所以不采用这种方案。

通过对上述方案的论证分析,本次设计选择方案二,采用AT89S52作为主控制系统,DS1302提供时钟,LCD12864液晶作为显示模块。

三、 硬件单元电路设计

4

1. 主控制系统

单片机中央处理系统的方案设计,我们选用具有ATMEL公司的AT89C52单片机作为中央处理器,如图4所示。该单片机除了拥有MCS-51系列单片机的所有优点外,内部还具有8K的在系统可编程FLASH存储器,低功耗的空闲和掉电模式,极大的降低了电路的功耗,还包含了定时器、程序存储器、数据存储器等硬件,其硬件能符合整个控制系统的要求,不需要外接其他存储器芯片和定时器件,方便地构成一个最小系统。整个系统结构紧凑,抗干扰能力强,性价比高。是比较合适的方案。

图4 AT89S52主控制系统

2. 时钟振荡电路

时钟振荡电路图5所示,时钟振荡电路用于产生单片机正常工作时所需要的时钟信号,电路由两个22pF的瓷片电容和一个12MHz的晶振组成,并接入到单片机的XTAL1和XTAL2引脚处,使单片机工作于内部振荡模式。此电路在加电后延迟大约10ms振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率决定。电路中两个电容C1、C2的作用使电路快速起振,提高电路的运行速度,对于AT89S52其工作频率为0至33MHz,在这个范围内单片机能够正常的工作。

图5 AT89S52时钟振荡电路

3. 复位电路

5

温度传感器 排座 LCD 排针 电源Vcc DS18B20 间距2.54mm LCD12864 间距2.54mm +5V 1 20 1 2 1 温度电路 显示电路 显示电路 电源接口 提供+5V电源

六、 安装与调试

1、电路安装

用DXP6.9 画好PCB后,并做出相应的电路板,测试过电路板没有短路和断路后,对照DXP6.9中的PCB板图将相应的元件插到电路板上,首先将矮的电子元件先插上,然后将其焊在电路板上,依照高矮,将剩余的元件安装在电路板上,并依次焊接好.当焊接完成后.剪去引脚,并测试电路焊接后是否有短路.

2、电路调试

在测试中遇到LCD12864不能够显示出时间和日期,经过检查才发现是LCD12864的背光没有调好,通过调节接在LCD12864上3脚上的滑动变阻器,改变所给的电压,可以清晰地看见了LCD能够显示。

对于DS1302在测试过程中发其上电不久就发热,在检查电路过程中,不是因为发现芯片短路,最终检查发现原来是DS1302的引脚接法不正确,给+5V的应该是芯片的脚,给后备电池的是1脚,当换过来之后,芯片就不发热了,而且可以正常显示出我们要显示的时间和日期,检查温度显示,当出现乱码时,或是不出现显示,则应该检查电路的同时还要检查程序。

3、软件调试

在软件调试过程中,当按下按键调节时间和日期后,时间不能继续在加,后来分析了程序才发现,是在设置好时间和日期时我们暂停了时钟,在设置完后没有启动时钟,所以时间和日期就不能够继续走,在那里停止了,发现这个原因后,我在设置完时间后就开启时钟,时间和日期就能够正确显示了。刚开始温度显示不出来,后来检查出来,原来是程序错误,显示不在对的位置,以至于出现乱码或是不显示,经改正后,能正常读取温度并显示于LCD上。

七、 性能测试及分析

上电测试,LCD12864能够正确显示时间和日期,第一次menu按钮,开始设置年,再按menu,开始设置月,再次按下menu,开始设置日,依次按下menu,依次设置时、分、秒。直到第八次退出设置,又开始计时。当中如有按下add键,则进行加一,如果按下dec,则进行减一。如果没有按下menu,按下keynz键,则开始对闹钟设置,开始设置闹钟时,

16

再次按下keynz键,开始设置闹钟分,再次按下keynz键,对闹钟秒进行设置。直到按下第三次退出闹钟设置,如果当中如有按下add键,则进行加一,如果按下dec,则进行减一。

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

八、 总结与心得

在这学期的课程序设计中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、 动手制作的能力,在各种其它能力上也都有了提高。更重要的是,在课程序设计里,我们学会了很多学习的方法。而这是以后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。同时在与老师和同学的交流过程中,互动学习,将知识融会贯通,提高自己与人交流的能力,提高自己的团队意思。老师给我们提出了许多革新非常的好,让我们能够有更多的发挥空间,提高了自己开发创新的能力。

九、 参考文献

[1] 李广弟兄 朱月秀 冷祖祁,单片机基础(第3版):北京航航天大学出版社 [2] 华成英 童诗白, 模拟电子技术基础(第四版):高等教育出版社 [3] 康华光,电子技术基础 数字部分(第五版):高等教育出版社 [4] 赵建领 薛园园 ,零基础学单片机C语言程序设计:机械工业出版社 [5] 楼然苗 李光飞. 单片机课程设计指导:北京航航天大学出版社 [6] 李凤霞. C语言程序设计教程(第二版):北京理工大学出版社 [7] 赵亮 侯国锐. 单片机C语言编程与实例:人民邮电出版社

[8] 张义和 王敏男 许宏昌 余春长 . 例说5单片机(C语言版):人民邮电出版社

十、致谢

感谢本课程给我提供了一个展现自己的舞台,给我一次难得煅炼的机会,使得我的动手能力和专业技能都有了很大的提高,对本专业的东西有了更进一步的了解。同时,在做作品的日子里得了老师的悉心指导,在此向我的指导教师致以诚挚的谢意,感谢提供相关技术帮助的老师和同学,你们的支持和鼓励使我对这次的作品完全有了信心和动力,也给了我很多无私的帮助和支持,我在此深表谢意。

十一、程序清单

程序清单如下: #include #include

17

#define uchar unsigned char #define uint unsigned int sbit DQ=P3^4;

sbit dat=P1^4;//数据口 sbit res=P1^3; sbit clk=P1^7; sbit rs=P1^0; sbit rw=P1^1; sbit en=P1^2; sbit beer=P3^6;

sbit keynz=P3^3; //闹钟调整控制按键 sbit menu=P3^0; //菜单 sbit add=P3^1; //加一 sbit dec=P3^2;

//减一

sbit acc0=ACC^0; //移位时的第0位 sbit acc7=ACC^7; //移位时用的第7位 uint tem,flag1,flag2,lfen,lshi,shi,fen,year1,year2; uchar tflag,ReadValue;

uchar miao,minute,hour,day,month,year,week,count=0,flag3=0,flag4=0; uchar read[7]={0,0,0,0,0,0,0};//时间日期缓存 uchar read1[]={0,0,0};//闹钟缓存

uchar code write1[]={0x10,0x59,0x23};//闹钟初始化

uchar code write[7]={0x30,0x58,0x23,0x31,0x12,0x07,0x13};//时间日期初始化 uchar code table1[]=\年00月00日%uchar code table4[]=\周日 23时58分00%uchar code table2[]={\闹铃: 00时00分00%uchar code table3[]=\温度:00.0℃\

uchar code table5[]={\欢迎界面 uchar code table6[]={\欢迎界面 uchar code table55[]={\欢迎-_- -_- 欢迎%uchar code table66[]={\快乐每一天\

uchar code yearout0[]={0,12,24,36,48,60,72,84,98}; //龙 uchar code yearout1[]={1,13,25,37,49,61,73,85,99}; //蛇 uchar code yearout2[]={2,14,26,38,50,62,74,86}; //马 uchar code yearout3[]={3,15,27,39,51,63,75,87}; //羊 uchar code yearout4[]={4,16,28,40,52,64,76,88}; //猴 uchar code yearout5[]={5,17,29,41,53,65,77,89}; //鸡

18

uchar code yearout6[]={6,17,30,42,54,66,78,90}; //狗 uchar code yearout7[]={7,19,32,43,55,67,79,91}; //猪 uchar code yearout8[]={8,20,33,44,56,68,80,92}; //鼠 uchar code yearout9[]={9,21,34,45,57,69,81,93}; //牛 uchar code yearout10[]={10,22,35,46,58,70,82,94,96};//虎 uchar code yearout11[]={11,23,36,47,59,71,83,95,97};//兔 uchar code year1out0[]={\龙\蛇%uchar code year1out2[]={\马\

uchar code year1out3[]={\羊\猴%uchar code year1out5[]={\鸡\

uchar code year1out6[]={\狗\猪%uchar code year1out8[]={\鼠\

uchar code year1out9[]={\牛\虎%uchar code year1out11[]={\兔\

uchar code table7[]={\一\二%uchar code table9[]={\三\四%uchar code table11[]={\五\六%uchar code table13[]={\日\void delayms(uint i)//毫秒 { }

void delayus(uint i) {

while(i--); }

void didi() {

beer=0;delayms(100);beer=1;delayms(100); }

void write_command(uchar com)//写指令函数 { rs=0; rw=0;

19

uint j,k; for(j=i;j>0;j--) for(k=144;k>0;k--);

P2=com; delayms(2); en=1; delayms(3); en=0; }

void write_data(uchar dat)//写数据函数 { rs=1; rw=0; P2=dat; delayms(2); en=1; delayms(3); en=0; }

void LCD_init()//对1602初始化 {

write_command(0x01);//清屏 write_command(0x38);//

write_command(0x80);//初始地址

write_command(0x0c);//开显示,光标不显示 write_command(0x06);//地址指针自动加1 }

void displaystart(void) //显示欢迎界面 {

uchar i ;

write_command(0x80); for(i=0;i<15;i++) { write_data(table5[i]);} write_command(0x88); for(i=0;i<16;i++) { write_data(table6[i]);} write_command(0x90);

for(i=0;table55[i]!='\\0';i++) { write_data(table55[i]);} write_command(0x98);

20

for(i=0;table3[i]!='\\0';i++) write_data(table3[i]);

write_command(0x8c); // write_data(0x3a); write_command(0x8e); //write_command(0x9d); // write_data(0xfd); // write_data(0x34);

// write_data(0x3a);

SetTime(); ds1820disp();

naozhong_start(); while(1) { }

naozhong(); time_zhengshi();

if((flag1==0)&&(flag2==0))

dis1302();shi=ReadSet1302(0x85);fen=ReadSet1302(0x83); }

naozhong(); key_scan(); display2(read[5]); display3();

{

miao=ReadSet1302(0x81);year1=ReadSet1302(0x8d);year2=(year1/16*10+year1);

ds1820disp();

}

46

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

Top