北交单片机课设电子时钟Word文档格式.docx
- 文档编号:21539816
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:28
- 大小:324.48KB
北交单片机课设电子时钟Word文档格式.docx
《北交单片机课设电子时钟Word文档格式.docx》由会员分享,可在线阅读,更多相关《北交单片机课设电子时钟Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
频率
262
294
330
349
392
440
494
523
X
F921
F9E1
FA8C
FAD8
FB68
FBE9
FC5B
FC8F
注:
频率以HZ为单位
表1音调和发音频率及定时器初值X的对应
每个音节相应的定时器初值x可按下法计算。
其中,f是音调频率,晶振fosc=11.0592Mhz。
2定时器的使用及时间延迟
首先对定时器进行初始化
图1TMOD控制寄存器
各控制位说明如下:
GATE:
门控位
GATE=0,TR=1启动计数(软件启动);
GATE=1,TR=1且INT=1启动计数(硬件启动)。
C/T:
定时或计数方式选择位。
C/T=0,定时工作方式;
C/T=1,计数工作方式。
M1M0:
工作方式选择位。
M1M0=00,方式0:
13位计数(TL0-4、TH0-7)
M1M0=01,方式1:
16位计数(TL0-7、TH0-7)
M1M0=10,方式2:
8位计数,有自动装入功能。
M1M0=11,方式3:
T0分为两个8位计数器,TL0可工作为定时或计数方式,TH0只能工作为定时方式。
图2SCON控制寄存器
SCON各控制位说明如下:
TR0/TR1:
启动计数。
1启动计数;
为0停止计数。
TF0/TF1:
计数溢出。
计数结束时为1。
曲调值
DELAY
调4/4
125ms
调3/4
187ms
调2/4
250ms
表2各节拍延时时间对应关系
3蜂鸣器电路
蜂鸣器有交流和直流两种。
直流蜂鸣器驱动简单,一旦在引脚上加入直流电源它就会发出一定频率的声音,此时声音的音调和音量是固定的;
而交流蜂鸣器在这方面则显得较灵活,输入声音信号的频率和音长是可控的,因此输出的声响将更逼真、更悦耳。
本实验仪有一个交流蜂鸣器,由于一般I/O口的驱动能力有限,因此不用它直接驱动蜂鸣器,它与P87C52X2的连接方式如下图所示。
Buzzer通过一个跳线与P1.7相连,P1.7输出不同频率的方波信号,蜂鸣器就会发出不同的声音。
如果控制输出信号的频率和音长,蜂鸣器则会发出悦耳的音乐。
图3(交流)蜂鸣器驱动电路
六、软件设计流程及描述
1、计时模块
利用单片机定时器0完成计时功能。
定时器0计时中断程序每隔1ms中断一次并当作一个计数,每中断一次计数加1,当计数1000次时,则表示1s到了,秒变量加1。
当秒变量达到60时,秒变量清零同时分变量加1。
分变量达到60时,分变量清零同时时变量加1。
当时变量达到24时,时变量清零。
由于实验要求由LED闪动做秒显示,因此每隔0.5s即计数500次时,P1.1(驱动LED灯)取反一次,从而实现LED灯闪动一次为1s,秒变量加1。
该模块流程图如下:
2、显示模块
为在各位LED上分别显示不同的字符,需要采用循环扫描显示的方法,即在某一时刻只选通一条位选线,并输出该位的字段码,其余位则处于关闭状态。
可见,各位LED显示的字符并不是同时出现的,但由于人眼的视觉暂留及LED的余辉,可以达到同时显示的效果。
程序流程图如下:
采用动态显示时,需要确定LED各位显示的保持时间。
由于LED从导通到发光有延时,时间太短会造成发光微弱,显示不清晰;
如果显示时间太长,则会占用较多的CPU时间。
3、按键判断及处理程序
按键的闭合与否,反映在电压上就是呈现出高电平或低电平。
由于机械触点的弹性作用,在闭合及断开的瞬间,电压信号伴随有一定时间的抖动,抖动时间与按键的机械特性有关,一般是5~10ms。
为了保证CPU确认一次按键动作,既不重复也不遗漏,必须消除抖动的影响。
通过软件消除抖动的方法为:
在程序执行过程中检测到有按键按下时,调用一段延时(约10ms)子程序,然后判断该按键的电平是否仍然保持在闭合状态,如果是,则确认有键按下。
按键判断流程图如下:
按键处理流程图如下:
4、主函数流程图
七、实验源程序
C语言:
#include"
reg52.h"
#defineucharunsignedchar
sbitCE573=P2^5;
sbitBUZZER=P2^4;
sbitKEY1=P3^2;
sbitKEY2=P3^3;
sbitKEY3=P3^4;
sbitKEY4=P3^5;
codeunsignedchardigseg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//0123456789
codeunsignedcharsegsel[]={0xfe,0xfd,0xfb,0xf7};
//数码管段选
intsum=0;
ints=40;
//当前时间秒
intmi=0;
//当前时间分
inth=0;
//当前时间时
inta;
intb;
intk;
intx,y,z,x1,x2;
intswt=1;
intswt2=1;
intmin=1;
//闹钟分
inthour=0;
//闹钟时
intm=1;
unsignedcharbeat;
codeunsignedsong[]={0X54,0XC4,0X12,0X32,0X34,0X52,0X52,0X52,0X52,0X42,0X32,
0X34,0XC1,0XC2,0X52,0XC2,0X12,0X32,0X34,0X11,0X12,0X31,0X12,0XC2,0X78,0X72,
0X52,0X52,0X42,0X32,0X42,0X52,0X11,0XC1,0XC4,0XC1,0XC1,0XC1,0XC1,0X12,0X32,//音乐宁夏
0X32,0X12,0X42,0X42,0X44,0XC2,0X12,0X32,0X42,0X52,0X72,0X72,0X82,0X41,0X51,
0X42,0X48,0X42,0X12,0X3C,0X72,0X62,0X3C,0X72,0X62,0X3C,0X72,0X62,0x21,0x31,
0x41,0x51,0x61,0x71,0x81,0x91,0x61,0x71,0x81,0x91,0X3F,0X3F,0X54,0XC2,0XC2,
0X42,0XC2,0XC4,0X34,0X32,0X42,0X52,0XC2,0XC4,0XD2,0XC2,0X12,0X22,0X38,0X12,
0X22,0X32,0X42,0X48,0xFF};
codeintnote[]={0x0000,0xFB03,0xFB8E,0xFC0B,0xFC43,0xFCAB,0xFD08,0xFD32,0xFD81,0xFDC7,0xFE05,0xFE21,0xFE55,0xFE83,0xFE99,0xFEC0};
unsignedcharhi_note,low_note;
voiddelay();
voidinitmpu(void)
{
TMOD=0x11;
//定时器0和1都以方式一计数
TL0=0xff;
TH0=0xdb;
TL1=0xFF;
TH1=0xDB;
PCON=0x00;
IE=0x8f;
//开放所有中断
}
voidDelay(intm)//延时程序
while(--m);
voidDelay1(intm)//延时程序用来播放音乐
{intgg,mm;
for(;
m>
0;
m--)
{for(gg=180;
gg>
gg--)
for(mm=125;
mm>
mm--);
voidprt(inthour,intmin)//数码管显示子程序
inta,b,c,d;
a=hour/10;
b=hour%10;
c=min/10;
d=min%10;
{
P2=segsel[0];
P0=digseg[a];
Delay(100);
P2=segsel[1];
P0=digseg[b];
P2=segsel[2];
P0=digseg[c];
P2=segsel[3];
P0=digseg[d];
}
voidtest_beep(charn)//测试蜂鸣器
chari;
for(i=0;
i<
n;
i++)
BUZZER=0;
Delay(10000);
BUZZER=1;
Delay(5000);
}
charcheck_K3(void)//按键去抖
if(KEY3==0)
Delay(2000);
{
if(KEY3==0)
{
return1;
}
}
return0;
charcheck_K4(void)//按键去抖
if(KEY4==0)
if(KEY4==0)
charkey1_flag=0;
charkey2_flag=0;
voidext_int0()interrupt0//外部中断0
{
EA=0;
Delay(4000);
key1_flag=1;
EA=1;
voidext_int1()interrupt2//外部中断1
key2_flag=1;
voidtime()interrupt1//计时器0计数器中断程序,用于确定当前时间
EA=0;
x1++;
TR0=0;
swt=1;
//一秒
TR0=1;
if(x1==100)
{x1=0;
s++;
if(P1==0xfe)//LED闪烁表示一秒
P1=0xff;
else
P1=0xfe;
if(s==60)
s=0;
m=1;
mi++;
if(mi==60)
mi=0;
h++;
if(h==24)
h=0;
EA=1;
voidtime2()interrupt3//计数器1中断程序,用于播放音乐
TR1=0;
TL1=low_note;
TH1=hi_note;
TR1=1;
BUZZER=~BUZZER;
voidsinging()
unsignedchartemp;
intii=0;
while
(1)
prt(h,mi);
//显示当前时间
temp=song[ii];
//读出乐谱的一个byte
if(temp==0)
{//如果是0就表示音乐结束
TR1=0;
//停止计时计数器1
return;
//返回
}
beat=temp&
0x0f;
//取出低阶的4位,这是拍子
temp=(temp>
>
4)&
//取出高阶4位当成音符的频率
if(temp==0)
//如果拍子是0就表示休止符
else{
hi_note=note[temp]>
8;
//根据音符的频率得到Timer1计数值
low_note=note[temp]&
0x00FF;
TR1=1;
//启动计时计数器1
Delay1(beat);
//延迟拍子的时间
TR1=0;
//计时器1停止计数
BUZZER=1;
ii++;
if(key2_flag)//按2键退出闹铃
{
key2_flag=0;
P2=0xff;
m=0;
BUZZER=1;
break;
main()
initmpu();
TR0=1;
//定时器0开始工作
while
(1)//不断刷新程序
prt(h,mi);
//显示当前时间
if(key1_flag)//以中断方式响应按键,秒表
key1_flag=0;
//去除外部中断1标志位
P2=0xff;
test_beep
(1);
//驱动蜂鸣器
a=0;
b=0;
while
(1)//不断刷新程序
prt(0,0);
if(check_K3())
{
P2=0xff;
break;
//key3再次按下,开始计时
}
while
(1)
{
if(swt&
&
swt2)
swt=0;
a++;
if(a==60)
a=0;
b++;
prt(b,a);
if(key1_flag==1)//key1再次按下停止计数
key1_flag=0;
test_beep
(1);
swt2=0;
if(check_K3())//按下key3再次计数
swt2=1;
if(check_K4())//按下key4跳出程序
Delay(8000);
}
if(key2_flag==1)
key2_flag=0;
b=0;
}
elseif(key2_flag)//调整当前时间
key2_flag=0;
test_beep(3);
prt(h,mi);
if(check_K3())//调时
h++;
if(h==24)
h=0;
Delay(10000);
if(check_K4())//调分
mi++;
if(mi==60)
{
mi=0;
}
if(key2_flag)//再按2键退出调时
test_beep(3);
}
elseif(check_K3())//设置闹钟时间
prt(hour,min);
//显示当前闹铃时间
hour++;
if(hour==24)
hour=0;
elseif(check_K4())
min++;
if(min==60)
min=0;
hour++;
if(key2_flag)//按2键退出
test_beep(5);
elseif(check_K4())//观看当前秒单位
k=1000;
while(k--)
prt(0,s);
P1=0xff;
}
if((h==hour)&
(min==mi))//响铃
{
while(m)
{
singing();
}
}
汇编:
ORG0000H
AJMPMAIN;
ORG000BH
AJMPT0INT;
ORG0013H
CJNER5,#00H,SAL;
stopthealarm
AJMPEXINT1;
SAL:
AJMPST;
ST:
MOV43H,#01H;
ORG001BH
AJMPT1INT;
ORG0050H
MAIN:
MOV79H,#00H;
MOV7AH,#00H;
MOVSP,#60H;
MOVDPTR,#DESG;
MOVR2,#20D;
MOVR4,#00H;
MOVR5,#00H;
MOV45H,#00H;
MOV46H,#02H;
SETBEA;
SETBEX1;
SETBET0;
SETBET1;
SETBIT1;
MOVTMOD,#61H;
T0astimer,T1ascounter
MOVTL1,#0FFH;
MOVTH1,#0FFH;
SETBTR1;
ACALLADJ;
-------------------------------------------------clockinitialize
ACALLBEEP;
ACALLALADJ;
-----------------------------------------------alarminitialize
ACALLEXC;
MOVR5,#01H;
marktheendofaladj;
MOVTL0,#00H;
MO
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 电子 时钟