使用微控制器實現教學上下課的自動打玲
提示:寫完文章後,目錄可以自動生成,如何生成可參考右邊的幫助檔案
這裡需要基本的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的驅動程式
這個需要很強的知識,需要認真學習微控制器知識,動手能力要強,本人能力還不是很強,還需要繼續學習,如有大神改進就更加完美。