基于at89s52的电子时钟和计算器的设计毕业论文_第1页
基于at89s52的电子时钟和计算器的设计毕业论文_第2页
基于at89s52的电子时钟和计算器的设计毕业论文_第3页
基于at89s52的电子时钟和计算器的设计毕业论文_第4页
基于at89s52的电子时钟和计算器的设计毕业论文_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计基于AT89S52的电子时钟和计算器的设计The Design of Electronic Clock And Calculator Based on AT89S52院 系 物理与信息科学系 专 业 电子信息科学与技术 学 生 班 级 姓 名 学 号 指导教师单位 物理与信息科学系 指导教师姓名 摘要 本系统以AT89S52为控制核心,将DS1302和LM386结合,实现时钟与闹铃功能,并通过LCD1602显示,同时用4*4矩阵键盘实现时钟的调整功能。 DS1302是美国Dallas公司生产的,将实时时钟/日历和31字节的静态RAM集成于一体的专用芯片。实时时钟/日历提供秒、分、时、日、周、月等信息。对于小于31天的月和月末的日期自动进行调整,还包括闰年校正的功能。单片机通过读取其RAM的值,并通过相应的电路,把时间值通过LCD显示。 经过以美国国家半导体公司生产的LM386为核心的音频功放电路驱动扬声器来实现单片机实现播放音乐作为时钟闹铃。关键字:AT89S52 电子时钟DS1302 LCD1602 LM386 4*4键盘Abstract:This system to AT89S52 as control core, will DS1302 and LM386 combination, realize the clock with alarm functions, and through LCD1602 display, but also use 4 * 4 matrix keyboard realize clock adjusting functions. DS1302 is the Dallas company production, the real-time clock/calendar and 31 bytes of static RAM integration in one of the special chip. Real-time clock/calendar provides seconds, points, when, day, week, month and other information. For less than 31 days at the end of the month and date automatically adjust, still include to leap year correction function. SCM by reading the RAMs value, and through the corresponding circuits, the time value through LCD display. Through national semiconductor company produces the LM386 as the core of the audio power amplifier circuit drive the speaker to achieve microcontroller is broadcast music as a clock alarm. Key words: AT89S52 electronic clock DS1302 LCD1602 LM386 4 * 4 matrix keyboard目录1、引言52、方案选择与论证62.1、单片机选择与论证62.2、时钟实现的选择与论证62.3、音频功放的选择与论证62.4、显示的选择与论证73、系统方案选择及其工理731、系统工作原理73.2、系统结构图74、系统硬件设计与实现84.1、主控芯片AT89S52单片机最小系统原理图84.2、时钟模块电路原理图84.3、LM386音频功放电路原理图94.4、LCD1602原理图94.5、4*4矩阵键盘105、程序设计115.1、时钟模块115.2、音频模块115.3、总程序流程12参考文献13附件141、引言 电子时钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许多场合可以看到数字电子钟。在城市的主要营业场所、车站、码头等公共场所使用LCD数字电子钟已经成为一种时尚。本系统基于AT89S52单片机为核心的万年历设计方案,本方案以AT89S52单片机为主控核心,与时钟芯片DS1302、矩阵键盘、LCD1602显示、LM386等模块组成硬件系统。在硬件系统中设有矩阵键盘和LCD显示器,能显示丰富的信息,根据使用者的需要可以随时随地对时间进行校准、定时、闹铃。返回2、方案选择与论证2.1、单片机选择与论证方案一:用MSP430系列单片机控制。MSP430系列单片机具有功耗超低、处理能力强大、片内外设丰富、系统工作稳定、开发环境便捷等特点。但MSP430系列单片机价格较高。方案二:采用80C51系列单片机。Atmel公司的AT89S52单片机是一种低功耗、高性能CMOS8位微控制器,它内存较大,具有 8K 在系统可编程Flash 存储器,比AT89C51要多4K,它可在线编程,可在线仿真功能,且价格比较便宜。本系统功能比较简单,用AT89S52单片机完全可以实现。综上所述,我们选择了第二个方案,即AT89S52。2.2、时钟实现的选择与论证 方案一:利用51单片机的定时器设计时钟,外围电路少,可以节省硬件。可是用定时器设计时钟的话,掉电或晶振的误差都会造成时间的错乱,并且,若完全用程序设计时钟还会占用大量的系统资源,从而严重影响系统的其他功能。方案二:使用时钟芯片设计时钟,采用DS1302是美国Dallas公司生产的,将实时时钟/日历和31字节的静态RAM集成于一体的专用芯片。实时时钟/日历提供秒、分、时、日、周、月等信息。对于小于31天的月和月末的日期自动进行调整,还包括闰年校正的功能。价格也比较便宜。综上所述,我们选择了第二种方案,即使用时钟芯片DS1302。2.3、音频功放的选择与论证方案一:基于三极管的音频功放。基于三极管的功放电路虽然价格比较便宜,但其供电电源提供的功率除了消耗在负载上,其余部分基本消耗在放大管上。因而对功放电路的要求较高,调试不方便。方案二:采用LM386集成芯片,价格虽比三极管高,但电路设计比较简单,而且效率高,失真度低。综上所述,我们选择了第二种方案,即使用采用LM386集成芯片。2.4、显示的选择与论证 方案一:采用LCD12864显示,带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为12864, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示84行1616点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。但12864价格偏高,会增加系统造价负担。方案二:采用LCD1602显示,LCD1602内置192种字符(160个5*7点阵字符和32跟5*10点阵字符),具有64个字节的自定义字符RAM,可自定义8个5*8点阵字符或四个5*11点阵字符。其价格远比LCD12864便宜,且其功能以满足本系统需求。综上所述,我们选择了第二种方案,即使用采LCD1602。返回3、系统方案选择及其工理31、系统工作原理本系统本系统以AT89S52芯片为核心,DS1302、LM386作为外围芯片,分别实现实时时钟和音频功放功能并通过LCD1602来显示时间。利用单片机AT89S52对时钟芯片进行读取数据,然后通过程序进行计算处理,最后送到LCD显示模块进行显示出日期、星期、时间。用LM368驱动扬声器实现单片机播放音乐来作为时钟闹钟。当时间与当前时间不符时,可用键盘来手动调整时间。也可用键盘来设置闹钟提醒。3.2、系统结构图单 片 机AT89S52LCD1602显示日期、时间、闹钟LM386音频闹铃提醒单片机播放音乐DS1302独立按键矩阵键盘返回4、系统硬件设计与实现4.1、主控芯片AT89S52单片机最小系统原理图Atmel公司的AT89S52单片机是一种低功耗、高性能CMOS8位微控制器,它内存较大,具有 8K 在系统可编程Flash 存储器,不需要外扩展存储器,是硬件设计简单化。此小系统中三个独立键盘实现功能模式转换;KEY18KEY19KEY20音乐模式时钟模式时间调节模式4.2、时钟模块电路原理图DS1302是美国Dallas公司生产的,将实时时钟/日历和31字节的静态RAM集成于一体的专用芯片。实时时钟/日历提供秒、分、时、日、周、月等信息。对于小于31天的月和月末的日期自动进行调整,还包括闰年校正的功能。单片机通过取其存储器中数据实现时钟功能4.3、LM386音频功放电路原理图LM386是美国国家半导体公司生产的音频功率放大器,其静态功耗低,外围元件少,电压增益可调,本系统将LM386的1脚和8脚两脚悬空,电压增益为20V,电源脚接+5V供电。用单片机编码音乐,用LM386将音频信号放大,实现单片机播放音乐功能作为时钟的闹铃。4.4、LCD1602原理图LCD1602内置192种字符(160个5*7点阵字符和32跟5*10点阵字符),具有64个字节的自定义字符RAM,可自定义8个5*8点阵字符或四个5*11点阵字符。本系统用其来显示年月日、星期、24小时制的时间,闹钟以及计算数值及计算结果。4.5、4*4矩阵键盘本系统通过4*4矩阵键盘来实现实时时钟的调整,可分别实现年上调和下调,月上调,日上调等功能。功能表如下:闹钟分上调秒上调星期上调年上调秒下调小时上调年下调闹钟小时上调分钟上调月上调闹钟分上调分钟下调日上调返回5、程序设计5.1、时钟模块开始 否KEY19键是否按下取当前数据进行调整并存回1302 是调整键盘是否按下 是 否 初始化,赋初值 写入命令数据读1302中的数据读秒分时日月年星期并显示定时器0服务子程序开始5.2、音频模块KEY18键是否按下重设定时器否 是 初始化,开中断P00反相,产生输出脉冲取音乐简谱结束TR0=0是否取到结束码 是 否设置T0的计算初值并启动5.3、总程序流程开始 返回变量定义主程序延时计算处理模式转换音频模块LCD1602显示键盘输入实时时钟程序见附件返回参考文献1郭天祥编著. 新概念51单片机C语言教程. 北京:电子工业出版社,2009.12刘坤 宋戈 赵洪波 张宪栋编著.51单片机C语言应用开发技术大全.北京:人民邮电出版社,2008.93李全利主编.单片机原理及接口技术.北京:高等教育出版社.2009.14黄智伟编著.全国大学生电子设计竞赛制作实训.北京:北京航天航空大学出版社5杨素行主编.模拟电子技术简明教程(第三版).北京:高等教育出版社,2009.36谭浩强著.C语言程序设计(第三版).北京:清华大学出版社,2005.7返回附件#include#include#define uchar unsigned char #define uint unsigned int#define LCDIO P2/1602数据命令输入sbit rs=P05; /1602选择输入sbit rd=P06;/读写控制端sbit lcden=P07;/使能端sbit Output=P00;sbit keyy=P30; /音乐键sbit keys=P31;sbit keyt=P32;sbit SCLK=P02; /1302串行数据输入端sbit DATA=P03; /sbit RST=P04; /复位/片选uchar second,minute,hour,day,month,year,week;uchar clkhour=14,clkminute=20; uchar ReadValue,num,time;uchar BTH0,BTL0;uchar time,flag;uchar codetable0= 2010-11-30 TUE;uchar code table1= 18:43:30 14:20;uchar code table2= SUNMONTUEWESTHUFRISAT;/音乐音符的编码uchar code table=6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2,6,2,1, 5,2,1, 6,2,4, 3,2,2, 5,2,1,6,2,1, 5,2,2, 3,2,2, 1,2,1, 6,1,1,5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1,5,2,2, 5,2,1, 6,2,1, 3,2,2, 2,2,2,1,2,4, 5,2,3, 3,2,1, 2,2,1, 1,2,1,6,1,1, 1,2,1, 5,1,6, 0,0,0;uchar code THO=0XF2,0XF3,0XF5,0XF5,0XF6,0XF7,0XF8,0XF9,0XF9,0XFA,0XFA,0XFB,0XFB,0XFC,0XFC,0XFC,0XFD,0XFD,0XFD,0XFD,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE;uchar code TLO=0X42,0XC1,0X17,0XB6,0XD0,0XD1,0XB6,0X21,0XE1,0X8C,0XD8,0X68,0XE9,0X5B,0X8F,0XEE,0X44,0X6B,0XB4,0XF4,0X2D,0X47,0X77,0XA2,0XB6,0XDA,0XFA,0X16;/延时void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void delay1(uint z)for(;z0;z-);void delay2(uchar t)uchar t1;unsigned long t2;for(t1=0;t1t;t1+)for(t2=0;t28000;t2+);void sing()TH0=BTH0;TL0=BTL0;TR0=1;delay2(time);void time0_int() interrupt 1TR0=0;Output=Output;TH0=BTH0;TL0=BTL0;TR0=1;void yinyue() /运行显示音乐模式uchar k,i;i=0;if(flag=1)while(flag=1)if(tablei=0)i=0;else if(tablei!=0)k=tablei+7*tablei+1-1;BTH0=THOk;BTL0=TLOk;time=tablei+2;i=i+3;sing(); if(keys=0)EA=0;ET0=0; TR0=0;flag=2; /*1602写命令*/void write_com(uchar com)rs=0;rd=0;lcden=0;P2=com;delay(5);lcden=1;delay(5);lcden=0;/*1602写数据*/void write_date(uchar date)rs=1;rd=0;lcden=0;P2=date;delay(5);lcden=1;delay(5);lcden=0;/*初始化1602*/void init()uchar num;lcden=0;write_com(0x38); /设置16*2显示,5*7点阵,8位数据接口write_com(0x0c); /设置开显示,不显示光标write_com(0x06);write_com(0x01); /显示清零,数据指针清零write_com(0x80);delay(5);write_com(0x80);for(num=0;num15;num+)write_date(table0num);delay(5);write_com(0x80+0x40);for(num=0;num16;num+)write_date(table1num);delay(5); void Write1302(uchar dat) /将数据写入1302 uchar i; SCLK=0; /拉低SCLK,为脉冲上升沿写入数据做好准备 delay1(2); /稍微等待,使硬件做好准备 for(i=0;i=1; /将dat的各数据位右移1位,准备写入下一个数据位 void WriteSet1302(uchar Cmd,uchar dat) /命令数据写入1302 RST=0; /禁止数据传递 SCLK=0; /确保写数居前SCLK被拉低 RST=1; /启动数据传输 delay1(2); /稍微等待,使硬件做好准备 Write1302(Cmd); /写入命令字 Write1302(dat); /写数据 SCLK=1; /将时钟电平置于已知状态 RST=0; /禁止数据传递 uchar Read1302(void) /读1302中的数据 uchar i,dat; delay(2); /稍微等待,使硬件做好准备 for(i=0;i=1; /将dat的各数据位右移1位,因为先读出的是字节的最低位 if(DATA=1) /如果读出的数据是1 dat|=0x80; /将1取出,写在dat的最高位 SCLK=1; /将SCLK置于高电平,为下降沿读出 delay1(2); /稍微等待 SCLK=0; /拉低SCLK,形成脉冲下降沿 delay1(2); /稍微等待 return dat; /将读出的数据返回 uchar ReadSet1302(uchar Cmd) uchar dat; RST=0; /拉低RST SCLK=0; /确保写数居前SCLK被拉低 RST=1; /启动数据传输 Write1302(Cmd); /写入命令字 dat=Read1302(); /读出数据 SCLK=1; /将时钟电平置于已知状态 RST=0; /禁止数据传递 return dat; /将读出的数据返回void Init_DS1302(void) WriteSet1302(0x8E,0x00); /根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,(30/10)4|(30%10); /根据写秒寄存器命令字,写入秒的初始值 WriteSet1302(0x82,(43/10)4|(43%10); /根据写分寄存器命令字,写入分的初始值 WriteSet1302(0x84,(18/10)4|(18%10); /根据写小时寄存器命令字,写入小时的初始值 WriteSet1302(0x86,(30/10)4|(30%10); /根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,(11/10)4|(11%10); /根据写月寄存器命令字,写入月的初始值 WriteSet1302(0x8c,(10/10)4|(10%10); /年 WriteSet1302(0x8a,(2/10)4|(2%10);void DisplaySecond(uchar x) /显示秒 uchar i,j; i=x/10; j=x%10; write_com(0xc8); write_date(0x30+i); write_date(0x30+j); void DisplayMinute(uchar x)/显示分 uchar i,j; i=x/10; j=x%10; write_com(0xc5); write_date(0x30+i); write_date(0x30+j); void DisplayHour(uchar x)/显示时 uchar i,j; i=x/10; j=x%10; write_com(0xc2); write_date(0x30+i); write_date(0x30+j); void DisplayDay(uchar x) /显示日 uchar i,j; i=x/10; j=x%10; write_com(0x89); write_date(0x30+i); write_date(0x30+j); void DisplayMonth(uchar x) /显示月 uchar i,j; i=x/10; j=x%10; write_com(0x86); write_date(0x30+i); write_date(0x30+j); void DisplayYear(uchar x) /显示年 uchar i,j; i=x/10; j=x%10; write_com(0x83); write_date(0x30+i); write_date(0x30+j); void DisplayWeek(uchar x)/显示周 uchar i; x=x*3; write_com(0x8c); for(i=0;i4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x83); minute=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x85); hour=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x87); day=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x89); month=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x8d); year=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue=ReadSet1302(0x8b); /读星期 week=ReadValue&0x07; DisplaySecond(second); DisplayMinute(minute); DisplayHour(hour); DisplayDay(day); DisplayMonth(month); DisplayYear(year); DisplayWeek(week); void turn_val(char newval,uchar flag1,uchar newaddr,uchar s1num) newval=ReadSet1302(newaddr); /读取当前时间 newval=(newval&0x70)4)*10+(newval&0x0f); /将bcd码转换成十进制 if(flag1) /判断是加一还是减一 newval+; switch(s1num) case 1:if(newval99) newval=0;DisplayYear(newval); break; case 2:if(newval12) newval=1;DisplayMonth(newval); break; case 3:if(newval31) newval=1;DisplayDay(newval); break;case 4: if(newval6) newval=0;DisplayWeek(newval); break; case 5: if(newval23) newval=0;DisplayHour(newval); break; case 6: if(newval59) newval=0;DisplayMinute(newval); break; case 7: if(newval59) newval=0;DisplaySecond(newval); break; default:break; else newval-;switch(s1num) case 1: if(newval=0) newval=99; DisplayYear(newval); break; case 6: if(newval0) newval=59; DisplayMinute(newval); break; case 7: if(newval0) newval=59; DisplaySecond(newval); break; default:break; WriteSet1302(newaddr-1),(newval/10)4)|(newval%10); /将新数据写入寄存器 /键盘扫描程序/*void key_scan(void)if(flag=3)uchar temp,key; P1=0x0f; /列置零,行置一temp=P1;if(temp!=0x0f) /扫描是否有按键按下delay(60); /延时去抖key=P1;if(temp=key)/确定有按键按下key=0xef;/扫描每一行 doP1=key;if(key!=P1)switch(P1)/第一行case 0xee:write_com(0x84);year=ReadSet1302(0x8d); /上调年year+;turn_val(year,1,0x8d,1);break;case 0xde:write_com(0x84);year=ReadSet1302(0x8d);year-; /下调年turn_val(year,0,0x8d,1);break;case 0xbe:write_com(0x87);month=ReadSet1302(0x89); /上调月month+;turn_val(month,1,0x89,2);break;case 0x7e:write_com(0x8a); /上调日day=ReadSet1302(0x87);day+;turn_val(day,1,0x87,3); break;/第二行case 0xed:write_com(0x8e);week=ReadSet1302(0x8b);week+; /上调星期turn_val(week,1,0x8b,4);break;case 0xdd:write_com(0x80+0x40+3);hour=ReadSet1302(0x85); /上调时hour+;turn_val(hour,1,0x85,5);break;case 0xbd:write_com(0x80+0x40+6);minute=ReadSet1302(0x83);minute+; /上调分turn_val(minute,1,0x83,6);break;case 0x7d:write_com(0x80+0x40+6);minute=ReadSet1302(0x83);minute-;turn_val(minute,0,0x83,6);break;/第三行case 0xeb:write_com(0x80+0x40+9);second=ReadSet1302(0x81); /上调秒second+;turn_val(second,1,0x81,7);break;case 0xdb:write_com(0x80+0x40+9);second=ReadSet1302(0x81);/下调秒second-;turn_val(second,0,0x81,7);break;case 0xbb:clkhour+;delay(60);if(clkhour=24)clkhour=0;Displayclkhour(clkhour);break;case 0x7b:clkminute+;delay(60);if(clkminute=60)clkminute=0;Displayclkminute(clkminute);break;/第四行case 0xe7:clkminute-; delay(60);Displayclkminute(clkminute);if(clkminute=0)clkminute=60;break;case 0xd7:P0=0x33;break;case 0xb7:P0=0xaa;break;case 0x77:P0=0x55;break;key=_crol_(key,1);/移位,进入下一行扫描 while(key!=0xfe);if(keys=0)flag=2;void shizhong() /运行显示时钟模式if(flag=2)while(flag=2) read_date();if(hour=clkhour)&(minute=clkminute)&(second=0)flag=1;EA=1; /音乐模式ET0=1;TMOD=0X01;yinyue();if(keyt=0)flag=3;if(keyy=0)flag=1;void main()init(); /初始化1602Init_DS1302(); /初始化1302flag=2;while(1) if(flag=1)EA=1; /音乐模式ET0=1;TMOD=0X01;yinyue();if(flag=2)shizhong();if(flag=3)key_scan(); 附件目 录大学本科生毕业论文(设计)管理规定 (2013年11月修订)1大学本科毕业论文(设计)格式和打印要求17大学本科毕业论文(设计)封面及表格27大学本科毕业论文(设计)指导教师职责47大学本科毕业论文(设计)管理人员职责50大学校级优秀本科毕业论文(设计)评选的有关规定51大学关于本科生到校外做毕业论文(设计)的有关规定5642大学本科生毕业论文(设计)管理规定二一三年十一月修订本科生毕业论文(设计)【以下简称毕业论文(设计)】是实现高等学校人才培养目标的重要教学环节,是培养学生创新意识和创新能力的重要手段,是理论学习与社会实践相结合的重要体现。为进一步规范毕业论文(设计)管理,提高毕业论文(设计)质量,提高我校人才培养工作水平,特制定本规定。本规定适用于我校对全校全日制本科生毕业论文(设计)的管理,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论