使用单片机实现教学上下课的自动打玲
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
这里需要基本的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
#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的驱动程序
这个需要很强的知识,需要认真学习单片机知识,动手能力要强,本人能力还不是很强,还需要继续学习,如有大神改进就更加完美。