单片机实现教学上下课的自动打玲

系列文章目录

使用单片机实现教学上下课的自动打玲


前言

这里需要基本的c语言基础,单片机应用知识,熟练的使用仿真软件如keil和proteus


一、proteus是什么?

proteus是一高效的电路仿真软件,可以有效解决利用仿真就可以完成一些设计。

二、使用步骤

1.设计要求

以学校白天上课、下课及午休时间为依据,设计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编写验证软件,并完成综合调试。

2.c文件代码

// #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的驱动程序

3.电路仿真图

在这里插入图片描述
在这里插入图片描述

总结

这个需要很强的知识,需要认真学习单片机知识,动手能力要强,本人能力还不是很强,还需要继续学习,如有大神改进就更加完美。

  • 3
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值