单片机钟表论文.docx
- 文档编号:30728679
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:19
- 大小:144.81KB
单片机钟表论文.docx
《单片机钟表论文.docx》由会员分享,可在线阅读,更多相关《单片机钟表论文.docx(19页珍藏版)》请在冰豆网上搜索。
单片机钟表论文
单片机钟表
指导老师:
田开坤老师
一、功能介绍:
1.可调整时间的24小时时钟;
2.可设定到时间报警的功能,有LED闪烁;
3.带启动/停止/复位的秒表,精度是1/100秒,最大计时时间为1小时;
4.在显示当前时间模式下,按下任意一个调整键(即中间两个键),会显示闹钟的小时或分钟;
4.在任意模式下,按下面板上第四个键,可以显示“LICHAO”字样,并有流水灯效果;
二、使用说明:
模式1:
时间显示,此时按下按键二,显示定时的小时时间,按下按键三,显示定时的分时间;
模式2:
秒表功能,按键二启动或者暂停秒表,按键三复位秒表;
模式3:
时间分调整,按键二分增加,按键三分减少;
模式4:
时间小时调整,按键二小时增加,按键三小时减少;
模式5:
显示定时时间,按键二和按键三无效;
模式6:
定时分调整,按键二分增加,按键三分减少;
模式7:
定时小时调整,按键二小时增加,按键三小时减少;
三、基本原理框图和程序流程图
四、电路图
电路中在P1口接8个发光二极管,做指示和报警效果用;由于P0口高电平驱动能力较差,故需接74ls245,用来驱动LED;P2口接74ls138(既作译码使用,同时它也有较好的低电平驱动能力)作扫描,既节约了P2口资源减少连线,同时也提高了系统的稳定性;P3口接4个按键和蜂鸣器。
五、程序模块:
子函数(包括中断服务程序):
voidtime(void)interrupt1using1//定时器0中断服务程序,实现时钟计数
voidcounter(void)interrupt3using2//定时器1中断服务程序,实现秒表计数
voidInit(void)interrupt0using3//外部中断服务程序,实现模式计数
voiddisplay(void)//数码管显示子函数
voidDelayx1ms(ucharcount)//延时函数,延时时间=count*1ms
voidLed(void)//LED流水的子函数
voidScankey(void)//按键扫描延时子函数
voidAlarms(void)//闹钟报警模块
程序解释(特色模块):
1.按键扫描延时子函数(实现按键的人性化)
Scankey();
该函数既解决了按键的去抖动读取问题,又解决了当按键按住不动时,变量自动连续改变的问题(改变的快慢由i值的大小来决定),而且解决延时的本身就是将数据读出并显示出来。
也就是在两次读按键期间,单片机是去多次显示上一次的时间数据(包括由上一次按键改变后的数据),这样就不会因为单纯的延时而导致占用系统资源。
2.外部中断服务程序(模式选择的实现)
voidInit(void)interrupt0using3//外部中断0服务程序,实现模式计数
由于按键在按下和弹起的时候都会产生抖动,使得达不到预期的效果,但是采用延时的方法会占用大量的系统资源,而采用上述方法显然也不太合适,所以最好采用中断的方法,当进入中断后,马上关闭中断,然后在程序执行一段时间后(相当于延时),再去打开中断,检测是否有中断的产生,这样就可以避开抖动的影响,而且不会占据系统资源。
六、参考文献
1.单片机应用系统开发实例导航靳达编著
2.单片机原理及应用李建忠编著
3.基于单片机8051的嵌入式开发指南胡大可李培宏方路平编著
附:
源程序
#include
#defineucharunsignedchar
//P3_0是第三个按键,P3_1是第二个按键,P3_2是第一个按键,P3_3是接SPEAKER,P3_4是第四个按键
uchardataBUFFER[3]={0,0,0};//定义显示缓冲区
chardataCLOCK[4]={0,0,0,0};//定义时间变量缓冲
uchardatasecond[3]={0,0,0};//定义秒表变量缓冲
chardataalarm[2]={0,12};//定义存放定时时间变量
uchardataSTATE=0;//定义全局变量:
模式设定变量
uchardatakk=30;//SPEAKER响声频率设定常数
bitdatasign1=0;//SPEAKER关闭标志位
bitdatasign2=0;//闹钟LED标志位
voidAlarms(void);
voidLed(void);
voidScankey(void);
voiddisplay(void);
voidDelayx1ms(ucharcount);
voidmain(void)
{bitdatasign=0;//秒表启动/停止标志位
uchardatakk1=2;//去抖动延时设定常数
P3=0xff;//初始化P3口
TMOD=0x11;//采用定时器0,1模式1
IE=0x8b;//允许定时器0,1,外部中断0中断
IT0=0;//设置外部中断为低电平触发方式
TH0=-(10000/256);
TL0=-(10000%256);//定时器初值加载,定时时间为10ms
TH1=-(10000/256);
TL1=-(10000%256);
for(;;)//一直循环执行程序
{if(P3_4==0)//特殊显示模块,显示LICHAO,并有流水灯
{
BUFFER[0]=138;
BUFFER[1]=154;
BUFFER[2]=176;
Led();
}
kk1-=1;//外部中断的去抖动模块
if(P3_2==1&&kk1==0)
{EX0=1;
kk1=2;
}
Alarms();//闹钟子程序
switch(STATE)//模式选择
{case0:
//模式1,正常时钟运行
{TR0=1;
TR1=0;
if(sign2==0)
P1=0xfe;
BUFFER[0]=CLOCK[1];
BUFFER[1]=CLOCK[2];
BUFFER[2]=CLOCK[3];
if(P3_1==0)//若按下按键二,则显示闹钟的小时时间
{BUFFER[0]=122;
BUFFER[1]=113;
BUFFER[2]=alarm[1];
}
if(P3_0==0)//若按下按键三,则显示闹钟的分时间
{BUFFER[0]=122;
BUFFER[1]=alarm[0];
BUFFER[2]=131;
}
}break;
case1:
//模式2,秒表模式
{if(sign2==0)
P1=0xfd;
if(P3_1==0)
{Delayx1ms(80);
if(P3_1==1)
sign=!
sign;
}
if(sign==0)//位为0,暂停秒表
{TR1=0;
BUFFER[0]=second[0];
BUFFER[1]=second[1];
BUFFER[2]=second[2];
}
elseif(sign==1)//位为1,启动秒表
{TR1=1;
BUFFER[0]=second[0];
BUFFER[1]=second[1];
BUFFER[2]=second[2];
}
if(P3_0==0)//按键三按下,则复位秒表
{second[0]=0;
second[1]=0;
second[2]=0;
BUFFER[0]=second[0];
BUFFER[1]=second[1];
BUFFER[2]=second[2];
}
}break;
case2:
//模式3,调节时间分
{TR1=0;
if(sign2==0)
P1=0xfb;
if(P3_1==0)//按下第二个按键,变量加一
{Scankey();
CLOCK[2]+=1;
if(CLOCK[2]>=60)
CLOCK[2]=0;
}
if(P3_0==0)//按下第三个按键,变量减一
{Scankey();
CLOCK[2]-=1;
if(CLOCK[2]<0)
CLOCK[2]=59;
}
BUFFER[0]=122;
BUFFER[1]=CLOCK[2];
BUFFER[2]=101;
}break;
case3:
//模式4,时间的小时调整
{TR1=0;
if(sign2==0)
P1=0xf7;
BUFFER[0]=122;
BUFFER[1]=110;
if(P3_1==0)//按下第二个按键,变量加一
{Scankey();
CLOCK[3]+=1;
if(CLOCK[3]>=24)
CLOCK[3]=0;
}
if(P3_0==0)//按下第三个按键,变量减一
{
Scankey();
CLOCK[3]-=1;
if(CLOCK[3]<0)
CLOCK[3]=23;
}
BUFFER[2]=CLOCK[3];
}break;
case4:
//模式5,显示闹钟时间
{TR1=0;
if(sign2==0)
P1=0xef;
BUFFER[0]=alarm[0];
BUFFER[1]=alarm[1];
BUFFER[2]=131;
}break;
case5:
//模式6,闹钟分调整
{TR0=1;
TR1=0;
if(sign2==0)
P1=0xdf;
if(P3_1==0)//按下第二个按键,变量加一
{Scankey();
alarm[0]+=1;
if(alarm[0]>=60)
alarm[0]=0;
}
if(P3_0==0)//按下第三个按键,变量减一
{Scankey();
alarm[0]-=1;
if(alarm[0]<0)
alarm[0]=59;
}
BUFFER[0]=122;
BUFFER[1]=alarm[0];
BUFFER[2]=131;
}break;
case6:
//模式7,闹钟小时调整
{TR0=1;
TR1=0;
if(sign2==0)
P1=0xbf;
if(P3_1==0)//按下第二个按键,变量加一
{Scankey();
alarm[1]+=1;
if(alarm[1]>=24)
alarm[1]=0;
}
if(P3_0==0)//按下第三个按键,变量减一
{Scankey();
alarm[1]-=1;
if(alarm[1]<0)
alarm[1]=23;
}
BUFFER[0]=122;
BUFFER[1]=113;
BUFFER[2]=alarm[1];
}break;
}
display();
}
}
voidtime(void)interrupt1using1//定时器0中断服务程序,实现时钟计数(10ms中断)
{TH0=-(10000/256);
TL0=-(10000%256);
CLOCK[0]=CLOCK[0]+1;
if(CLOCK[0]==100)
{CLOCK[1]=CLOCK[1]+1;
CLOCK[0]=0;
if(CLOCK[1]==60)
{CLOCK[2]=CLOCK[2]+1;
CLOCK[1]=0;
if(CLOCK[2]==60)
{CLOCK[3]=CLOCK[3]+1;
CLOCK[2]=0;
if(CLOCK[3]==24)
CLOCK[3]=0;
}
}
}
}
voidcounter(void)interrupt3using2//定时器1中断服务程序,实现秒表计数(10ms中断)
{TH1=-(10000/256);
TL1=-(10000%256);
second[0]=second[0]+1;
if(second[0]==100)
{second[1]=second[1]+1;
second[0]=0;
if(second[1]==60)
{second[2]=second[2]+1;
second[1]=0;
if(second[2]==60)
second[2]=0;
}
}
}
voidInit(void)interrupt0using3//外部中断服务程序,实现模式计数
{EX0=0;
STATE+=1;
if(STATE==7)
STATE=0;
}
voiddisplay(void)//LED显示数据
{uchari,disp;
ucharj=0;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x78,0x40,0x00,0x77,0x76,
0x39,0x30,0x38,0x3f};
//10是t,11是—12是熄灭,13是A,14是H,15是C,16是1,17是L
for(i=0;i<=2;i++)
{if(BUFFER[i]>100)
disp=BUFFER[i]%10+10;//大于100的取个位和十位
elsedisp=BUFFER[i]%10;
P0=table[disp];
P2=j;
Delayx1ms
(1);
j++;
disp=BUFFER[i]/10;
P0=table[disp];
P2=j;
Delayx1ms
(1);
j++;
}
}
voidDelayx1ms(ucharcount)//延时函数,延时时间=count*1ms
{uchari,k;
for(i=0;i for(k=0;k<120;k++) ; } voidScankey(void)//按键扫描子函数 {uchari; for(i=0;i<80;i++) display(); } voidLed(void)//LED流水灯的子函数 { uchari,j,k; {for(i=0x01;i>0;i=i<<1)//一直循环 {P1=~i; for(k=0;k<=50;k++) display(); } for(j=0x40;j>1;j=j>>1)//一直循环 {P1=~j; for(k=0;k<=50;k++) display(); } } } voidAlarms(void)//闹钟报警模块 {if(alarm[0]==CLOCK[2]&&alarm[1]==CLOCK[3]) {kk-=1; if(kk==0&&sign1==0) {P3_3=! P3_3;//SPEAKER发声 sign2=1; kk=30; if(P3_3==0) P1=0x55;//LED闪烁 else P1=0xaa; } elseif(sign1==0) sign2=1; if(P3_0==0||P3_1==0||P3_2==0)//按下任意一个键,停止报警 {sign1=1; P3_3=1; sign2=0; } } else {P3_3=1; sign1=0; sign2=0; } } 物理系0203班 李超 2004.11.15
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 钟表 论文