定时控制马达启动姓名:莫远华班级:11计科C1学号:20114822858一、硬件部分元件选择原件名所在库个数AT89C51MCS805117SEG-MPX6-CADISPLAY110WATT4K7RESSISTORS5BUTTONACTIVE5CRYSTALXTAL181AVX0402NP010PCAP102FZT651ZETEX1MOTOR1BATTERY1led4系统原理设计AT89C51单片机简介AT89C51是一款单片封装的微控制器,适合于许多要求高集成度、低成本的场合。可以满足多方面的性能要求。AT89C51采用了高性能的处理器结构,指令执行时间只需2到4个时钟周期。6倍于标准51单片机器件。AT89C51集成了许多系统级的功能,这样可大大减少元件的数目和电路板面积并降低系统的成本。AT89C51单片机内部主要有以下部件:8031CPU、振荡电路、总线控制部件、中断AT89C51数码驱动按键段码驱动晶振马达6位数码管Led灯控制部件、片内Flash存储器、并行I/O接口、定时器和串行I/O接口。键盘电路的设计键盘采用4个独立按键配以4个上拉电阻实现对时钟和闹钟的设定及修改由于通过数码管公共及的电流较大且避免过多地使用分立元件,采用了一片74LS245来驱动段码,用P3口作位码驱动本LCD电子闹钟设计是采用内部时钟方式,用一个12MHz晶振和两个30Pf瓷片电容组成,为单片机提供标准时钟,其中两个瓷片电容起微调作用.其电路图如下:XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51X1CRYSTALC1220pC2220p图4:时钟电路之所以采用高性能的振荡电路,因为:1.单片机电子钟的计时脉冲基准是由外部晶振的频率经过12分频后提供,采用内部的定时/计数器来实现计时功能。所以,外接晶振频率精确度直接影响电子钟计时的准确性。2.单片机电子钟利用内部定时/计数器溢出产生中断(12M晶振一般为50ms)再乘以相应的倍率来实现秒、分、时的转换。大家都知道从定时/计数器产生中断请求到响应中断需要3-8个机器周期,定时中断子程序中的数据入栈和重装定时/计数器的初值还需要占用数个机器周期,还有从中断入口转到中断子程序也要占用一定的机器周期。马达驱动电路二、软件部分设计1.主程序2中断程定时器数字电子钟设计中主要使用定时器T0中断ET0,利用ET0中断进行计时时间的自增,从而实现计时功能。AT89C51有两个通用定时/计数器。两者均可配置为定时器或事件计数器。另外增加了定时器T0/T1,溢出时T0/T1脚自动翻转的功能选项。用作“定时器”功能时,每经过一个机器周期,寄存器值加1。用作“计数器”功能时,寄存器在对应的外部输入管脚T0/T1上每发生一次1到0的跳变时加1。使用该功能时,外部输入每个机器周期被采样一次开始初始化设置扫描定时器显示时间键盘扫描定时子函数计时函数计时函数部分,主要是通过单片机定时中断来计时,复产生一次中断标志位flag加1,当flag加满20次为1秒,然后把flag清0把秒存储单元加1。然后再依次判马达启动TO中断定时一到?定时二到?显示时间马达开启马达关闭YYN断分、时。其流程图如下图3-11。键盘扫描函数这些函数主要是判断是否有按键按下,并根据相应按键按下的情况调用相关函数执行,其相关流程图如下图3-12键盘扫描S1按下Cnt2(cnt2+1)%5;Cnt2=1?Cnt2=2?Cnt2=3?Cnt2=4?YNNNCnt=1,定时一设置Cnt=4,定时二设置Cnt=10,时间显示Cnt=7,时钟校时YYYY三、实验结果此定时启动马达设计是利用Proteus仿真软件进行仿真,基本上实现了课程设计要求实现的功能。硬件部分设置了的5个按键S1、S2、S3、S4、S5。当按键S1第一次按下时,停止计时进入时钟的的设置(第一个小数点变亮),当按键S1第二次、第三次按下时,分别进入定时一的设置(第二个小数点变亮)和定时二(第三个小数点变亮)设置,当按S1第四次按下时进入时钟计时界面(第三个小数点灭),在S1按下的各阶段,可用按键S2、S3进行时间和闹铃时间的时、分、秒进行加减设置;用按键S4调节向左,S5调节向右。当第一次显示的时间和定时设置的时间一致时,马达开始转动(独显数码管出现字母R),继续计时,当显示的时间和定时S2键按下?S3键按下?S4键按下?S5键按下?调用加函数调用减函数向左移动向右移动定时判断NNNNYYYY二的时间一致时,马达停止转动(独显数码管出现字母T)。测验数据:初始时间时间校准:定时一时间:定时二时间实验结果1.马达开始转动:2.马达停止由于是截图,无法显示转动。请看仿真。实验结果,实验成功源代码#includereg51.h#includestdio.h#includemath.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsbitkey1=P1^0;sbitkey2=P1^1;sbitkey3=P1^2;sbitkey4=P1^3;sbitkey5=P1^4;sbitfmq=P2^0;sbitled1=P2^1;sbitled2=P2^2;sbitled3=P2^3;sbitled4=P2^4;sbitled5=P2^5;sbitled6=P2^6;sbitled7=P2^7;ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x80,0x0ff};voidjia();voidjian();uchartable1[8],table2[8],table3[8],table4[8];ucharshi=0,fen=0,miao=1;ucharshi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;ucharshi4,fen4,miao4;ucharflag,flag1,wss,cnt,cnt1,cnt2,alm1,alm2;uintflag2;voiddelay(uchari){ucharx,y;for(x=i;x0;x--)for(y=120;y0;y--);}//初始化voidinit(){TMOD=0x01;TH0=0x3c;TL0=0x0b0;fmq=0;ET0=1;EA=1;TR0=1;led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1;}//校准时间voiddisplay(){uchari,j;if(cnt!=7||wss==0){table1[0]=miao%10;table1[1]=miao/10;}else{table1[0]=table1[1]=11;}if(cnt!=8||wss==0){table1[3]=fen%10;table1[4]=fen/10;}else{table1[3]=table1[4]=11;}if(cnt!=9||wss==0){table1[6]=shi%10;table1[7]=shi/10;}else{table1[6]=table1[7]=11;}table1[2]=table1[5]=10;j=0x7f;for(i=0;i=7;i++){P3=j;if(i7)P0=table[table1[i]];else{if(cnt==0||cnt==10){P0=table[table1[i]];}else{P0=table[table1[i]]-0x80;}}delay(10);j=_cror_(j,1);}}voiddisplay3(){uchari,j;if(cnt=10||wss==0){table4[0]=miao4%10;table4[1]=miao4/10;table4[3]=fen4%10;table4[4]=fen4/10;table4[6]=shi4%10;table4[7]=shi4/10;}j=0x7f;for(i=0;i=7;i++){P3=j;P0=table[table1[i]];delay(10);j=_cror_(j,1);}}//定时一voiddisplay1(){uchari,j;if(alm1==0){if(cnt!=1||wss==0){table2[0]=miao1%10;table2[1]=miao1/10;}else{table2[0]=table2[1]=11;}if(cnt!=2||wss==0){table2[3]=fen1%10;table2[4]=fen1/10;}else{table2[3]=table2[4]=11;}if(cnt!=3||wss==0){table2[6]=shi1%10;table2[7]=shi1/10;}else{table2[6]=table2[7]=11;}}elsetable2[0]=table2[1]=table2[3]=table2[4]=table2[6]=table2[7]=10;table2[2]=table2[5]=10;j=0x7f;for(i=0;i=7;i++){P3=j;if(i!=6)P0=table[table2[i]];elseP0=table[table1[i]]-0x80;delay(10);j=_cror_(j,1);}}//定时二voiddisplay2(){uchari,j;if(alm2==0){if(cnt!=4||wss==0){table3[0]=miao2%10;table3[1]=miao2/10;}else{table3[0]=table3[1]=11;}if(cnt!=5||wss==0){table3[3]=fen2%10;table3[4]=fen2/10;}else{table3[3]=table3[4]=11;}if(cnt!=6||wss==0){table3[6]=shi2%10;table3[7]=shi2/10;}else{table3[6]=table3[7]=11;}}elsetable3[0]=table3[1]=table3[3]=table3[4]=table3[6]=table3[7]=10;table3[2]=table3[5]=10;j=0x7f;for(i=0;i=7;i++){P3=j;if(i!=4)P0=table[table3[i]];elseP0=table[table1[i]]-0x80;delay(10);j=_cror_(j,1);}}//计时函数voidshijian(){if(flag=20){wss=~wss;flag=0;if(cnt1!=0){miao4++;if(miao459){miao4=0;fen4++;if(fen459){fen4=0;shi4++;if(shi423)shi4=0;}}}else{miao++;if(miao59){miao=0;fen++;if(fen59){fen=0;shi++;if(shi23)shi=0;}}}}}//键盘扫描函数voidkey_scan(){if(key1==0){while(!key1){if(cnt==1|