电子设计制作任务总结分析报告小组成员:林苗苗郑梦静史旭浩一、设计任务1.1设计任务一LCD电子定时闹钟设计:功能说明:定时闹钟的时间显示和设置1.LCD显示屏的显示格式为“SETTIME时时:分分:秒秒”,并且能够修改时钟时间的时、分、秒。2.操作键K1:当前时间状态的设置按钮;3.操作键K2:闹钟设定时间的显示按钮;4.操作键K3:设置闹钟时间按钮;5.操作键K4:闹铃ON/OFF状态设置,设为ON时连续三次发出哗的一声,设为OFF时发出哗的一声;6.当设置现在的时间或闹铃时间时,操作键K1:调整时;操作键K2:调整分;操作键K3:设置完成。7.定时时间到时发出一阵声响,按下K4键可以停止声响。1.2设计任务二带有LCD显示的音乐倒数定时器设计:功能说明:倒数定时器的时间设置、显示及音乐的播放1.使用文字型LCD(16×2)来显示目前倒数的时间,显示格式为“TIME时时:分分:秒秒”2.具有4个按键操作来设置现在想要倒数的时间:操作键K1:设置定时时间的开启和关闭;操作键K1+操作键K2:调整时;操作键K1+操作键K3:调整分;操作键K1+操作键K4:时间调整完成。3.一旦按键后则开始倒数计时,当计时为0时则发出一阵生日快乐歌的音乐声响;4.重置后内定倒数计时时间为5min,显示“00:05:00”。二、关于两个设计任务的硬件部分说明2.151单片机:51单片机是对目前所有兼容Intel8031指令系统的单片机的统称。它广泛应用于工业测控系统之中。8位CPU·4kbytes程序存储器(ROM)(52为8K),256bytes的数据存储器(RAM)(52有384bytes的RAM),32条I/O口线·111条指令,大部分为单字节指令,21个专用寄存器,2个可编程定时/计数器,5个中断源,2个优先级(52有6个),片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振荡频率为12M。本次实验采用的是11.0592MHZ。图189C51单片机各引脚情况图289C51单片机内部结构2.2LCD显示:LCD1602是通过16字x2行的5x7点阵图形来显示字符的典型液晶显示器,一般采用的标准的16引脚接口,各引脚情况如表1所示。其功能是负责将设置的时间数据显示出来,方便实验者观察。而且,采用的LCD1602是点阵字符型LCD液晶显示,可以显示数字与阿拉伯字母等字符,随着半导体技术的发展,LCD的液晶显示越来越广泛的应用于各种显示场合。并且液晶显示可以工作在低电压、低功耗下,显示界面友好、内容丰富。数码管显示驱动简单,但是不能显示高精度数位。LCD1602可以显示2行16个字符,有8位数据总线D0-D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节和背光。表1LCD1602各引脚情况图3LCD1602各引脚的连线情况2.3蜂鸣器:蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”表示。本次设计任务采用压电式蜂鸣器。图4压电式蜂鸣器图5蜂鸣器驱动原理图2.4其他小部件元件三极管、电容、继电器、电阻、LED灯、按钮等等。2.5电路设计完成图设计方案一:设计方案二:经选择分析,设计方案二更优。2.6电路连接完成图三、关于两个设计任务的软件部分说明3.1任务一——LCD电子定时闹钟设计任务3.1.1总体框架流程图3.1.2按键检测流程图3.1.3蜂鸣器的流程图3.1.4子程序的模块划分(完整程序见附录)写指令函数子程序写数据函数子程序写时间函数子程序显示时间初始化延时函数子程序蜂鸣器子程序设置当前时间子程序设置闹钟时间子程序显示闹钟函数子程序按键扫描函数子程序LCD1602初始化子程序中断服务子程序3.2任务二——带有LCD显示的音乐倒数定时器设计3.2.1总体框架流程图3.2.2蜂鸣器流程图3.2.3按键扫描流程图3.2.4子程序的模块划分(完整程序见附录)写指令函数子程序写数据函数子程序写时间函数子程序显示时间初始化延时函数子程序蜂鸣器子程序LCD1602初始化子程序设置倒计时时间子程序按键扫描函数子程序显示时间初始化中断服务子程序(与任务一相比增加选择程序,加入生日快乐歌)四、关于两个设计任务的测试部分说明4.1任务一——LCD电子定时闹钟设计任务4.1.1设置当前时间4.1.2显示当前时间4.1.3设置闹钟时间4.1.4显示闹钟时间4.2任务二——带有LCD显示的音乐倒数定时器设计4.2.1电源开启后,倒数定时器的初始化界面4.2.2设置倒数定时器时间4.2.3倒数定时结束时的界面五、附录:关于两个设计任务的程序代码5.1任务一——LCD电子定时闹钟设计任务#includereg52.h#defineuintunsignedint#defineucharunsignedcharucharcodetable[]=NOWTIME:;ucharcodetable1[]=SETNOWTIME:;ucharcodetable2[]=SETALARMTIME:;ucharcodealarm[]=ALARMTIME:;ucharcodealarmoff[]=ALARMTIME:OFF;ucharcodealarmon[]=ALARMTIME:ON;sbitlcdrs=P2^0;sbitlcdrw=P2^1;sbitlcden=P2^2;sbitK1=P2^3;//k1调时,k2调分.sbitK2=P2^4;//sbitK3=P2^5;//sbitK4=P2^6;//sbitbeep=P3^4;ucharflag,num,count,k1num,k2num,k3num,k4num;charmiao,shi,fen,ashi,afen;//延时函数voiddelay(uintz){uintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}//蜂鸣器子程序voiddi(){beep=0;delay(100);beep=1;}//写命令函数voidwrite_com(ucharcom){lcdrs=0;lcdrw=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}//写数据函数voidwrite_date(uchardate){lcdrs=1;lcdrw=0;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}//写时间函数voidwrite_sfm(ucharadd,uchardate){ucharshi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}//显示时间初始化voidTimeInit(){write_com(0x01);write_com(0x80);for(num=0;num9;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40+6);write_date(':');delay(5);write_com(0x80+0x40+9);write_date(':');delay(5);write_sfm(4,shi);write_com(0x80+0x40+4);write_sfm(7,fen);write_com(0x80+0x40+7);write_sfm(10,miao);write_com(0x80+0x40+10);}//设置当前时间voidSetNowTime(){if(K1==0){delay(5);if(K1==0){while(!K1);di();shi++;if(shi==24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4);}}if(K2==0){delay(5);if(K2==0){while(!K2);di();fen++;if(fen==60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7);}}if(K3==0){delay(5);if(K3==0){while(!K3);di();k1num=0;TR0=1;TimeInit();}}}//设置闹钟时间voidSetAlarmTime(){flag=0;if(K1==0){delay(5);if(K1==0){while(!K1);di();ashi++;if(ashi==24)ashi=0;write_sfm(4,ashi);write_com(0x80+0x40+4);}}if(K2==0){delay(5);if(K2==0){while(!K2);di();afen++;if(afen==60)afen=0;write_sfm(7,afen);write_com(0x80+0x40+7);}}if(K3==0){delay(5);if(K3==0){while(!K3);di();k3num=0;EA=1;flag=1;TimeInit();}}}//显示闹钟函数voidDisplayAlarmTime(){write_com(0x01);write_com(0x80);for(num=0;num11;num++){write_date(alarm[num]);delay(5);}write_com(0x80+0x40+6);write_date(':');delay(5);write_sfm(4,ashi);write_com(0x80+0x40+4);write_sfm(7,afen);write_com(0x80+0x40+7);}//键盘扫描函数voidkeyscan(){if(K1==0){delay(5);if(K1==0){TR0=0;while(!K1);di();k1num++;}}if(k1num!=0){write_com(0x80);for(num=0;num13;num++){write_date(table1[num]);delay(5);}SetNowTime();}else{if(K2==0){delay(5);if(K2==0){while(!K2);di();k2num++;}}if(k2num==1){EA=0;DisplayAlarmTime();k2num=2;}if(k2num==3){k2num=0;EA=1;TimeInit();}else{if(K3==0){delay(5);if(K3==0){while(!K3);di();k3num++;write_com(0x01);}}if(k3num==1){EA=0;write_com(0x80);for(num=0;num15;num++){write_date(table2[num]);delay(5);}write_com(0x80+0x40+6);write_date(':');delay(5);write_sfm(4,ashi);write_com(0x80+0x40+4);write_sfm(7,afen);write_com(0x80+0x40+7);SetAlarmTime();}else{if(K4==0){delay(5);if(K4==0){while(!K4);di();k4num++;}}if(k4num==1){di();k4num=2;flag=0;}if(k4num==3){k4num=0;di();delay(500);di();delay(500);di();flag=1;}}}}if(flag==1&&shi==ashi&&fen==afen){beep=~beep;delay(500);}if(K4==0&&flag==1){delay(5);if(K4==