使用单片机实现教学上下课的自动打玲
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
这里需要基本的c语言基础,单片机应用知识,熟练的使用仿真软件如keil和proteus
提示:以下是本篇文章正文内容,下面案例可供参考
proteus是一高效的电路仿真软件,可以有效解决利用仿真就可以完成一些设计。
以学校白天上课、下课及午休时间为依据,设计51单片机为核心的自动打铃器。假定学校作息时间如下所示: 第1节课 8:00——8:45 第2节课 8:55——9:40 第3节课 10:10——10:55 第4节课 11:05——11:50 第5节课 14:00——14:40 第6节课 14:55——15:40 第7节课 16:10——16:55 第8节课 17:05——17:50 根据此作息时间表,每到上课或下课时控制电铃接通,接通1分钟后电铃断开。结合万年历,可自动排除节假日和星期六星期日打铃操作,亦可手工按键设置打铃时间,修正节假日作息时间。 设计内容及要求:用Proteus仿真软件搭建仿真硬件电路图,用keil编写验证软件,并完成综合调试。
下面展示一些 内联代码片。
// #include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit SPK=P3^7;//喇叭 bit bell_time=0;//打铃的时间标志 uchar temp=0;//记录电子中的技术次数 uint time_cout=0;//记录大龄时间的计数次数 char miao,fen,shi;//记录时间秒,分,时 uchar miaos,fens,shis; uchar miaou,fenu,shiu; uchar flag1,flag2,flag3,t; uint code disl[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; uint code dis[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar bell_shi[]={8,8,8,9,10,10,11,11,14,14,14,15,16,16,17,17,0}; uchar bell_fen[]={0,45,55,40,10,55,5,50,0,40,55,40,10,55,5,50,0}; char lr; uchar flag=0; uchar lr1=0; uchar flag4=1; uchar ff=0; uchar key_code; char chance,t1; uchar setflag=0; uchar updataflag=0; uchar kk=0; void delay(uint tt) { uchar i,j; for(i=0;i<tt;i++) for(j=0;j<30;j++); } void show() { if(lr>=1){lr=0;flag=1;} else{ if(flag==1&&flag4==1)lr=1; if(flag==1&&flag4==1&&ff==1)lr=1; } P0=dis[0]; P2=disl[miao%10]; if(lr1==1)delay(7); else delay(40); P0=dis[1]; P2=disl[miao/10]; if(lr==1)delay(7); else delay(40); P0=dis[2]; P2=disl[10]; delay(10); P0=dis[3]; P2=disl[fen%10]; if(lr==3)delay(7); else delay(40); P0=dis[4]; P2=disl[fen/10]; if(lr==4)delay(7); else delay(40); P0=dis[5]; P2=disl[10]; delay(40); P0=dis[6]; P2=disl[shi%10]; if(lr==6)delay(7); else delay(40); P0=dis[7]; P2=disl[shi/10]; if(lr==7)delay(7); else delay(40); } void bellTime()interrupt 3 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; SPK=!SPK; if(++time_cout==400){time_cout=0;bell_time=0;} } void time() interrupt 1 { uchar i; flag1=0;flag2=0;flag3=0; TH0=(65536-50000)/256; TL0=(65536-50000)%256; if(temp>19) { temp=0; miao++; if(miao>59){miao=0;fen++; if(fen>59){fen=0;shi++; if(shi>23)shi=0; } } } else temp++; if(miao==0)flag1=1; if(t==0){ for(i=t;i<23;i++){ if(fen==bell_fen[i]) flag2=1; if(shi==bell_shi[i]) flag3=1; if(flag2==1&&flag3==1){break;} }} if(t>0){ if(bell_fen[t]==0&&bell_shi[t]==0)kk=1; if(fen==bell_fen[t])flag2=1; if(shi==bell_shi[t]) flag3=1; } if(flag1==1&&flag2==1&&flag3==1&kk==0){ t++;bell_time=1;flag1=0;flag2=0;flag3=0;} if(kk==1) t=0; } void set(){ TR0=0;lr1=1; miaos=miao;fens=fen;shis=shi; } void updata(){ TR0=0; miaou=miao;fenu=fen;shiu=shi; shi=bell_shi[chance];fen=bell_fen[chance];miao=0; } void add(){ if(setflag>0){ if(lr==0){ miao++; if(miao>=60) miao=0; } if(lr==1){ miao=miao+10; if(miao>=60) miao=0; } if(lr==3){ fen++; if(fen>=60) fen=0; } if(lr==4){ fen=fen+10; if(fen>=60)fen=0; } if(lr==6){ shi++; if(shi>=24)shi=0; } if(lr==7){ shi=shi+10; if(shi>=24)shi=0; }} } void reduce(){ if(setflag>0){ if(lr==0){miao--;if(miao<0)miao=0;} if(lr==1){miao=miao-10;if(miao<0)miao=0;} if(lr==3){fen--;if(fen<0)fen=0;} if(lr==4){fen=fen-10;if(fen<0)fen=0;} if(lr==6){shi--;if(shi<0)shi=0;} if(lr==7){shi=shi-10;if(shi<0)shi=0;} } } void save(){ TR0=1;if(setflag>0){lr1=0;lr=0;flag4=0;} if(t1>0){bell_shi[chance]=shi;bell_fen[chance]=fen; miao=miaou;fen=fenu;shi=shiu;} } void cancel(){ TR0=1;if(setflag>0){ if((miaos!=miao)||(fens!=fen)||(shis!=shi)) {miao=miaos;fen=fens;shi=shis;} lr=0;lr1=0;flag4=0;} if(t1>0){miao=miaou;fen=fenu;shi=shiu;} } void main(){ uchar i; P0=0x00; P2=0x3f; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;ET0=1;TR0=1;ET1=1; miao=50;fen=59;shi=7; flag1=0;flag2=0;flag3=0;t=0; key_code=P1; lr=0;chance=0;t1=0; while(1){ show(); if(bell_time)TR1=1; else TR1=0; P1=0xff;key_code=P1; if(key_code!=0xff)for(i=0;i<30;i++) show(); switch(key_code){ case 0xfe:setflag++;updataflag=0;lr=0;set();break; case 0xfd:add();break; case 0xfb:reduce();break; case 0xf7:if(setflag>0){lr++;if(lr>7)lr=0;} if(updataflag>0) {chance++;shi=bell_shi[chance];fen=bell_fen[chance];miao=0;if(chance>23)chance=0;} break; case 0xef:if(setflag>0){lr++;if(lr<0)lr=7;} if(updataflag>0) {chance--;shi=bell_shi[chance];fen=bell_fen[chance];miao=0;if(chance<0)chance=23;} break; case 0xdf:cancel();setflag=0;updataflag=0;t1=0;break; case 0xbf:save();setflag=0;updataflag=0;t1=0;break; case 0x7f:updataflag++;lr=0;t1=1;updata();break; } } }然后用keil将从、文件转化为hex文件用于proteus的驱动程序
这个需要很强的知识,需要认真学习单片机知识,动手能力要强,本人能力还不是很强,还需要继续学习,如有大神改进就更加完美。