智能电子产品设计与制作-电子钟的设计与制作.doc_第1页
智能电子产品设计与制作-电子钟的设计与制作.doc_第2页
智能电子产品设计与制作-电子钟的设计与制作.doc_第3页
智能电子产品设计与制作-电子钟的设计与制作.doc_第4页
智能电子产品设计与制作-电子钟的设计与制作.doc_第5页
免费预览已结束,剩余16页可下载查看

下载本文档

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

文档简介

电气与电子信息工程学院智能电子产品设计与制作设计题目: 电子钟的设计与制作 专业班级: 电子信息工程2008级(2)班 学号: 姓 名: 指导教师: 设计时间: 2010/5/232011/6/10 设计地点: k2高频实验室 智能电子产品设计与制作课程设计成绩评定表姓 名学 号专业班级电子信息工程2008级(2)班课程设计题目:智能电子产品设计与制作课程设计答辩或质疑记录:1、2、成绩评定依据:实物制作(40):课程设计考勤情况(20):课程设计答辩情况(20):完成设计任务及报告规范性(20):最终评定成绩(以优、良、中、及格、不及格评定) 指导教师签字: 2011年 6 月 10 日 电子钟的设计与制作目录1设计任务及要求-12设计方案-13硬件设置-13.1 at89c51单片机简介-13.2单片机型号的选择-63.3数码管显示工作原理-64程序设计-6 4.1程序模块及介绍-65仿真调试-15 5.1 keil调试-15 5.2 protues仿真-15 5.3仿真结果分析-166小结-167参考书目-17附录-18181 设计任务与要求1. 设计一个电子时钟,并且能够实现日期,星期和时分秒的现实和调节。2. 设计出硬件电路。 3. 设计出软件编程方法,并写出源代码。4. 用proteus进行仿真。5用汇方式实现目的。6利用查表,中断等清楚,有序。7系统的各功能模块要编语言编实现程序设计。2 设计方案本设计主要设计了一个基于at89c51单片机的电子时钟。并在液晶屏上显示相应的时间,日期和星期。并通过一个控制键用来实现时间的调节。应用proteus的isis软件实现了单片机电子时钟系统的设计与仿真。该方法仿真效果真实、准确,节省了硬件资源。该设计的硬件部分主要包括89c51多功能接口芯片用于开发电子时钟芯片、液晶显示器用于显示时间。3 硬件设计3.1 at89c51单片机简介at89c51单片机是一种低功耗,高性能的片内含有4kb可编程/擦除只读存储器(fperomflash programmable and erasable read only memory)的8位coms微控制器,使用高密度,非易失存储技术制造,并且与at89c51引脚和指令系统完全兼容。芯片上的fperom允许在线编程或采用通用的非易失存储编程器对存储器重复编程。3.1.1 单片机的构成at89c51单片机是在一块芯片中集成了cpu、ram、rom、定时器/计数器和多种功能的i/o线等一台计算机所需要的基本功能部件,at89c51单片机单片机内包含下列几个部件:(1) 一个8位cpu;(2)一个片内振荡器及时钟电路;(3)4k字节rom程序存储器;(4)128字节ram数据存储器;(5)两个16位定时器/计数器;(6)可寻址64k外部数据存储器和64k外部程序存储器空间的控制电路;(7)32条可编程的i/o线(四个8位并行i/o端口);(8)一个可编程全双工串行口;(9)具有五个中断源、两个优先级嵌套中断结构。其内部机构框图如图3.1所示: 图3.1 mcs-51单片机内部机构框图3.1.2 at89c51单片机性能及特点(1)与mcs-51微控制器产品系列兼容。(2)片内有4kb可在线重复编程的快闪擦写存储器(flash memory)。(3)存储器可循环写入/擦除1000次。(4)存储数据保存时间为10年。(5)工作电压范围:vcc可为2.7v6v。(6)全静态工作:可从0hz到16mhz。(7)程序存储器具有3级加密保护。(8)1288位内部ram。(9)32条可编程i/o线。(10)两个16位定时器/计数器。(11)中断结构具有5个中断源和2个优先级。(12)可编程全双工串行通道。(13)空闲状态维持低功耗和掉电状态保存存储内容。3.1.3 振荡器特性xtal1和xtal2分别为反向放大器的输入和输出,该反向放大器可以配置为片内振荡器。3.1.4 at89c51单片机的引脚说明at89c51是一种带4k字节闪烁可编程可擦除只读存储器(fperomfalsh programmable and erasable read only memory)的低电压,高性能cmos8位微处理器,俗称单片机。at89c2051是一种带2k字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用atmel高密度非易失存储器制造技术制造,与工业标准的mcs-51指令集和输出管脚相兼容。由于将多功能8位cpu和闪烁存储器组合在单个芯片中,atmel的at89c51是一种高效微控制器。图3.3 at89c51单片机引脚图at89c51单片机的内部硬件结构中除了程序存储器由fperom取代了87c51单片机的eprom外,其余部分完全相同,其管脚说明如下:(1)vcc:供电电压(2)gnd:接地(3)时钟电路 xtal1(19脚)芯片内部振荡电路(单级反相放大器)输入端。 xtal2(18脚)芯片内部振荡电路(单级反相放大器)输出端。 (4)控制信号rst(9脚)复位信号:时钟电路工作后,在此引脚上将出现两个机器周期的高电平,芯片内部进行初始复位,p0口p3口输出高电平,将初值07h写入堆栈指针。ale(30脚)地址锁存信号:当访问外部存储器时,p0口输出的低8位地址由ale输出的控制信号锁存到片外地址锁存器,p0口输出地址低8位后,又能与片外存储器之间传送信息。另外,ale可驱动4个ttl门。(29脚)片外程序存储器读选通:低电平有效,作为程序存储器的读信号,输出负脉冲,将相应的存储单元的指令读出并送到p0口,可驱动8个ttl门。/vpp(30脚):当为高电平且pc值小于0fffh时,cpu执行内部程序存储器程序;当为低电平时,cpu仅执行外部程序存储器程序。(5)i/o接口p0口(p0.0p0.7,3932脚)三态双向口:p0口结构包括一个输出锁存器、两个三态缓冲器、一个输出驱动电路和一个输出控制端。p1口(p1.0p1.7,18脚)准双向口:p1口做通用i/o接口使用,p1口的每一位口线能独立地作用于输入线,p1口可驱动4个ttl门。p2口(p2.0p2.7,2128脚)通用i/o接口:它做通用i/o接口使用时,是一个准双向口,此时转换开关mux倒向左边,输出极与锁存器相连,引脚可作为用户i/o口线使用,输入/输出操作与p1口完全相同,p2口做地址总线使用。p3口(p3.0p3.7,1017脚)双功能口:p3口做通用i/o接口使用,输出功能控制线为高电平,与非门的输出取决于锁存器的状态,此时锁存器q端的状态与其引脚状态是一致的。p3口也可作为at89c51的一些特殊功能口使用如:p3.0 rxd(串行输入口);p3.1 txd(串行输出口);p3.2 /int0(外部中断0);p3.3 /int1(外部中断1);p3.4 t0(记时器0外部输入);p3.5 t1(记时器1外部输入);p3.6 /wr(外部数据存储器写选通);p3.7 /rd(外部数据存储器读选通);3.2 单片机型号的选择 通过对多种单片机性能的分析,最终认为89c51是最理想的电子时钟开发芯片。89c51是一种带4k字节闪烁可编程可擦除只读存储器的低电压,高性能cmos8位微处理器,器件采用atmel高密度非易失存储器制造技术制造,与工业标准的mcs-51指令集和输出管脚相兼容。由于将多功能8位cpu和闪烁存储器组合在单个芯片中,atmel的89c51是一种高效微控制器,而且它与mcs-51兼容,且具有4k字节可编程闪烁存储器和1000写/擦循环,数据保留时间为10年等特点,是最好的选择。3.3 数码管显示工作原理数码管是一种把多个led显示段集成在一起的显示设备。有两种类型,一种是共阳型,一种是共阴型。共阳型就是把多个led显示段的阳极接在一起,又称为公共端。共阴型就是把多个led显示段的阴极接在一起,即为公共商。阳极即为二极管的正极,又称为正极,阴极即为二极管的负极,又称为负极。通常的数码管又分为8段,即8个led显示段,这是为工程应用方便如设计的,分别为a、b、c、d、e、f、g、dp,其中dp 是小数点位段。4 程序设计4.1 程序模块及介绍#include#define uchar unsigned char /宏定义#define uint unsigned int /宏定义sbit rs=p35; /液晶数据/指令选择端:1-数据,0-指令sbit lcden=p34; /液晶使能控制端:1-有效,0-无效sbit shift_key=p32;/位置移动键sbit up_key=p33;/增加键uchar temp=0;/定义定时器溢出计数变量,每隔50ms产生1次溢出,temp加1uint year=2011;/定义年变量并赋初值2011年uchar month=06,day=01,week;/定义月、日、星期变量,并赋初值5月23日uchar hour=23,minute=59,second=58;/定义时、分、秒变量,并赋初值12时00分00秒uchar code week_string74=mon,tue,wed,thu,fri,sat,sun;/定义星期英文缩写表uchar data month_day12=31,0,31,30,31,30,31,31,30,31,30,31;/定义每月天数表/*-定时计数器t0及中断初始化函数-*/ void init(void) tmod=0x01;/设置定时器0为工作方式1 th0=(65536-50000)/256;/16位计数初值除以256得到高8位初值 tl0=(65536-50000)%256;/16位计数初值除以256的余数得到低8位初值 ea=1;/开总中断 et0=1;/开启定时器0中断 ex0=1;/开启外部中断,外部中断用于调整时间 pt0=1;/将定时器0中断设置高优先级,调整时间期不停止计时 tr0=1;/启动定时器0/*-1ms延时函数-*/void delay(uint n) uint i,j; for(i=n;i0;i-) for(j=114;j0;j-);/*-lcd1602写指令函数-*/void lcd1602_write_com(uchar com) rs=0;/rs=0,置指令输入状态 p0=com;/输出指令码 delay(1);/延时1ms lcden=1;/lcden=1,使能端有效 delay(1);/延时1ms lcden=0;/lcden=0,使能端无效/*-lcd1602写数据函数-*/void lcd1602_write_dat(uchar dat) rs=1;/rs=1,置数据输入状态 p0=dat; /输出待显示字符的字符码(ascii码) delay(1);/延时1ms lcden=1;/lcden=1,使能端有效 delay(1);/延时1ms lcden=0;/lcden=0,使能端无效 /*公历平年的2月只有28天,公历闰年的2月有29天。判断公历闰年的算法:、普通年能被4整除且不能被100整除的为闰年。 如:2011年不是闰年,2012年是闰年.2100年也不是闰年。、世纪年能被400整除的是闰年。 如:2000年是闰年,1900年不是闰年。*/void leapyear() /判断某年是否闰年函数 if (0) month_day1=29;/闰年2月29天 else month_day1=28;/平年2月28天 /*由年、月、日计算星期的算法(基姆拉尔森计算公式): w= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7公式中d表示日期中的日数,m表示月份数,y表示年数。注意:计算时要将一月和二月看成是上一年的十三月和十四月。例:2012-1-10需要换算成2011-13-10来代入公式计算。*/uchar caculateweek(int y,char m, char d)/由年、月、日计算星期函数 uchar w; if(m=1)m=13;y=y-1; else if(m=2)m=14;y=y-1; w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; return w;/*定时计数器中断程序,每当定时计数器溢出时触发中断,执行该程序*/void time0() interrupt 1 th0=(65536-50000)/256;/重装初值 tl0=(65536-50000)%256; if(temp=19)/为了加快仿真速度,将temp设为1,实际应为20 temp=0; if(second=59)/为了加快仿真速度,将second设为2,实际应为59 second=0; if(minute=59)/为了加快仿真速度,将minute设为2,实际应为59 minute=0; if(hour=23)/为了加快仿真速度,将hour设为2,实际应为23 hour=0; leapyear();/闰、平年计算 if(day=month_daymonth-1)/判断日期是否到了每月最后一天 day=1; if(month=12) month=1; year+; else month+; else day+; else hour+; else minute+; else second+; else temp+; week=caculateweek(year,month,day);/根据年月日计算星期void int0() interrupt 0/外部中断函数,当按下setup键时产生外部中断进入调整状态 bit flag; uchar setup_bit=0;/setup_bit用于计数移位次数 ex0=0;/关闭中断函数 do/循环 if(shift_key=0)/判断移位键是否按下 delay(1);/延时消抖 if(shift_key=0)/确认移位键是否按下 while(!shift_key);/等待移位键释放 if(setup_bit=10)/共12位 setup_bit=0; /移位计数值返回0 lcd1602_write_com(0x0c);/设置不显示光标模式 else setup_bit+;/移位计数值加1 lcd1602_write_com(0x0e);/设置显示光标模式 switch(setup_bit)/判断调整哪位,从而确定光标显示位置 case 1: lcd1602_write_com(0x80+0x44+4);/光标设置到分个位显示位置 break; case 2: lcd1602_write_com(0x80+0x44+3);/光标设置到分十位显示位置 break; case 3: lcd1602_write_com(0x80+0x44+1);/光标设置到时个位显示位置 break; case 4: lcd1602_write_com(0x80+0x44+0);/光标设置到时十位显示位置 break; case 5: lcd1602_write_com(0x80+0x01+9);/光标设置到日个位显示位置 break; case 6: lcd1602_write_com(0x80+0x01+8);/光标设置到日十位显示位置 break; case 7: lcd1602_write_com(0x80+0x01+6);/光标设置到月个位显示位置 break; case 8: lcd1602_write_com(0x80+0x01+5);/光标设置到月十位显示位置 break; case 9: lcd1602_write_com(0x80+0x01+3);/光标设置到年个位显示位置 break; case 10: lcd1602_write_com(0x80+0x01+2);/光标设置到年十位显示位置 break; case 11: lcd1602_write_com(0x80+0x01+1);/光标设置到年百位显示位置 break; case 12: lcd1602_write_com(0x80+0x01+0);/光标设置到年千位显示位置 break; default: break; if(up_key=0)/判断增加键是否按下 delay(1);/延时消抖 if(up_key=0)/确认增加键是否按下 while(!up_key);/等待增加键释放 flag=1;/增加键已按动 else flag=0;/增加键未按动 else flag=0;/增加键未按动 if(flag)/若增加键按动 switch(setup_bit)/判断是哪位,从而调整哪位 case 1: if(minute%10=9)/若分个位为9 minute=minute-9;/则分个位清零 else minute+;/否则分个位加1 /lcd1602_write_com(0x80+0x44+4);/分个位显示位置 lcd1602_write_dat(0x30+minute%10);/写入1602 break; case 2: if(minute/10=5)/若分十位为5 minute=minute-50;/则分十位清零 else minute=minute+10;/否则分十位加1 /lcd1602_write_com(0x80+0x44+3);/分十位显示位置 lcd1602_write_dat(0x30+minute/10);/写入1602 break; case 3: if(hour%10=9) hour=hour-9; else hour+; /lcd1602_write_com(0x80+0x44+1);/时个位显示位置 lcd1602_write_dat(0x30+hour%10);/写入1602 break; case 4: if(hour/10=2) hour=hour-20; else hour=hour+10; /lcd1602_write_com(0x80+0x44+0);/时十位显示位置 lcd1602_write_dat(0x30+hour/10);/写入1602 break; case 5: if(day%10=9) day=day-9; else day+; /lcd1602_write_com(0x80+0x01+9);/日个位显示位置 lcd1602_write_dat(0x30+day%10);/写入1602 break; case 6: if(day/10=3) day=day-30; else day=day+10; /lcd1602_write_com(0x80+0x01+8);/日十位显示位置 lcd1602_write_dat(0x30+day/10);/写入1602 break; case 7: if(month%10=9) month=month-9; else month+; /lcd1602_write_com(0x80+0x01+6);/月个位显示位置 lcd1602_write_dat(0x30+month%10);/写入1602 break; case 8: if(month/10=1) month=month-10; else month=month+10; /lcd1602_write_com(0x80+0x01+5);/月十位显示位置 lcd1602_write_dat(0x30+month/10);/写入1602 break; case 9: if(year%10=9) year=year-9; else year+; /lcd1602_write_com(0x80+0x01+3);/年个位显示位置 lcd1602_write_dat(0x30+year%10);/写入1602 break; case 10: if(year%100/10=9) year=year-90; else year=year+10; /lcd1602_write_com(0x80+0x01+2);/年十位显示位置 lcd1602_write_dat(0x30+year%100/10);/写入1602 break; default: break; while(setup_bit!=0);/若所有位未调整完则返回,否则退出调整模式 ex0=1;/重新打开外部中断/*-lcd1602初始化函数-*/void lcd1602_init() lcd1602_write_com(0x38); /设置液晶显示方式:16x2行,5x7点阵,8位数据总线 lcd1602_write_com(0x0c); /设置字符显示开关及光标显示模式:开启字符显示,不显示光标 lcd1602_write_com(0x06); /设置数据指针及显示屏移动模式:数据指针增(即光标右移),显示屏不移 lcd1602_write_com(0x01); /液晶屏幕清屏/*-主函数-*/void main() init();/定时计数器t0及中断初始化 lcd1602_init();/lcd1602初始化 while(1) uchar i; lcd1602_write_com(0x80+0x01); /设置第1行显示首地址01 lcd1602_write_dat(0x30+year/1000);/输出年千位的字符码 lcd1602_write_dat(0x30+(year%1000)/100);/输出年百位的字符码 lcd1602_write_dat(0x30+(year%100)/10);/输出年十位的字符码 lcd1602_write_dat(0x30+year%10);/输出年个位的字符码 lcd1602_write_dat(-);/输出-字符码 lcd1602_write_dat(0x30+month/10);/输出月十位的字符码 lcd1602_write_dat(0x30+month%10);/输出月个位的字符码 lcd1602_write_dat(-);/输出-字符码 lcd1602_write_dat(0x30+day/10);/输出日十位的字符码 lcd1602_write_dat(0x30+day%10);/输出日个位的字符码 lcd1602_write_dat();/输出(字符码 for (i=0;i3;i+) lcd1602_write_dat(week_stringweeki);/输出星期英文缩写字符码 lcd1602_write_dat();/输出)字符码 lcd1602_write_com(0x80+0x40+0x04); /设置第2行显示首地址04 lcd1602_write_dat(0x30+hour/10);/输出小时十位的字符码 lcd1602_write_dat(0x30+hour%10);/输出小时个位的字符码 lcd1602_write_dat(:);/输出:字符码 lcd1602_write_dat(0x30+minute/10);/输出分十位的字符码 lcd1602_write_dat(0x30+minute%10);/输出分个位的字符码 lcd1602_write_dat(:);/输出:字符码 lcd1602_write_dat(0x

温馨提示

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

评论

0/150

提交评论