单片机.docx

上传人:b****5 文档编号:5328846 上传时间:2022-12-15 格式:DOCX 页数:16 大小:125.87KB
下载 相关 举报
单片机.docx_第1页
第1页 / 共16页
单片机.docx_第2页
第2页 / 共16页
单片机.docx_第3页
第3页 / 共16页
单片机.docx_第4页
第4页 / 共16页
单片机.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

单片机.docx

《单片机.docx》由会员分享,可在线阅读,更多相关《单片机.docx(16页珍藏版)》请在冰豆网上搜索。

单片机.docx

单片机

单片机接口课程设计

题目音乐倒数计时器

专业光信息科学与技术

院系应用科学学院

学号200918010115

姓名李鹏斌

指导教师邱选兵

 

目录

一、设计要求……………………………………………3

二、设计目的……………………………………………3

三、设计方案……………………………………………4

1系统概述…………………………………………4

2单元电路设计……………………………………5

3软件程序设计和调试……………………………6

四、实验结论……………………………………………12

五、心得体会……………………………………………13

六、附录…………………………………………………13

 

实验题目音乐倒数计数器

一.设计要求

利用AT89C51单片机结合字符型LED显示器设计一个简易的倒数计数器,可用来煮方便面、煮开水或小睡片刻等。

做一小段时间倒计数,当倒计数为0时,则发出一段音乐声响,通知倒计数终了,该做应当做的事。

定时闹钟的基本功能如下。

●6位LED显示器。

●显示格式为“TIME分分:

秒秒”。

用4个按键操作来设置当前想要倒计数的时间。

一旦按下键则开始倒计数,当计数为0时,发出一阵音乐声。

程序执行后工作指示灯LED闪动,表示程序开始执行,按下操作键K1~K4动作如下。

●K1—可调整倒计数的时间1~60分钟。

●K2—设置倒计数的时间为5分钟,显示“0500”。

●K3—设置倒计数的时间为10分钟,显示“1000”。

●K4—设置倒计数的时间为20分钟,显示“2000”。

复位后LED的画面应能显示倒计时的分钟和秒数,此时按K1键则在LED上显示出设置画面。

此时,若:

a.按操作键K2—增加倒计数的时间1分钟。

b.按操作键K3—减少倒计数的时间1分钟。

c.按操作键K4—设置完成。

本题目最大难点是实现音乐的播放。

作者利用定时计数器,通过载入不同的计数初值,产生频率不同的方波,输入到蜂鸣器(SOUNER)中,使其发出频率不同的声音。

本设计中单片机晶振为1.0592MHz,通过计算各音阶频率,可得1、2、3、4、5、6、7共7个音应赋给定时器的初值为64580、64684、64777、64820、64898、64968、65030。

在此基础上,可将乐曲的简谱转化为单片机可以“识别”的“数组谱”,进一步加入对音长、休止符等的控制量后,可以实现音乐的播放。

二.设计目的

1.学习单片机定时器时间计时处理、按键扫描、LED显示及音乐旋律演奏的设计方法。

2.理论结合实际,提高分析解决问题的能力。

三.设计方案

—利用单片机、四段LED数码管和蜂鸣器

1.方案总体思路。

用单片机8051控制程序执行,通过LED动态扫描来显示倒计时,每次执行中断时判断计时是否继续倒计时。

同时通过按键扫描的方式来判断是否有输入更改倒计时的控制信息,通过8051的处理来达到对倒计时的更新,当倒计时结束时,驱动蜂鸣器发出一首音乐。

2.单元电路设计

控制电路

采用8051进行控制。

8051基本资料如下:

图28051引脚图

在此次实验中,一共享到了单片机的21个管脚,其中P1组用到的P1^0~P1^3去控制四个按键,P0组用来控制数码管的段码,P2^4~P2^7用来控制四段数码管的位码,P2^3用来使蜂鸣器发生,VCC和GND做为电源和复位电路接入端,而单片机的18和19脚则接入晶体整荡器,产生振荡频率。

通过输入相应程序对单片机的控制,从而让各个模块能够协调工作,实现一定的功能。

LED数码管

LED数码管分为共阴数码管和共阳数码管两种,本实验采用共阳数码管。

共阳数码管就是将数码管七段的阳极连在一起。

当这个公共阳极接VCC时,其余的哪段接低电平哪段亮。

具体的接线电路见附表SCH图。

图2数码管的内部结构图,中间为共阴数码管,右边为共阳数码管

 

按键控制

按键控制室控制程序执行时数据的输入或是特殊功能的设置及操作,使用8051端口1的4(0至3)条输入口,由程序来控制,平时输入端为高电平,当有按键按下则相对位会呈现低电平,进过轮流扫描判断输入端是否为低电平,便可知道按下的是哪一个按钮。

蜂鸣器

蜂鸣器的功能是对输入的不同频率的方波进行播放形成音乐,持续送出工作脉冲可以推动喇叭发出哔的声响,当工作频率越高时,声音越清脆,工作频率低时,声音则较低沉。

使用8051的P2^3口进行控制

图3.蜂鸣器接线图

3软件程序设计和调试

工作方式设计

C语言比起汇编语言具有简洁紧凑、灵活方便、语法限制不太严格、程序设计自由度大等特点,本例采用C语言进行程序编写。

用到了定时器0和1,初始时开T0而关闭T1。

其中定时器0用来控制倒计时的实现,即当时间到达50ms(定时器时间)*20(循环次数)时,执行中断0将显示时间减一,同时判断计时是否减为0,当扫描但定时时间为0时,则关闭定时器0,而打开定时器1,控制音乐的播放。

延时时间的计算

若定时50ms,则程序为

TMOD=0x01;//定时器,方式1

TH0=0x4c;//写入初值高8位

TL0=0;//写入初值低8位

EA=1;//开总中断

ET0=1;//定时中断允许

TR0=1;//开启定时器

计算式为T=(2^16-4*16+12)*12/(11.0592*10^6)=50ms

然后定义变量待其循环20次后执行中断即可实现1s的定时。

有定时器产生各种频率的声音

我们可以设定发音的频率来改变声音产生音乐,计时时间长短也是按照发音的频率而定的。

由频率值推得定时器计数初值由下关系式得到:

T=1/f(us);方波宽度

Co=(int)t/2;定时器所得计数的次数

Lo=(8192-co)%32;计数初值低字节

Hi=(8192-co)/32;计数初值高字节

具体的程序解释

#include

#include

#defineLED_code_portP0//段码数据口

#defineLED_segmnet_portP2//位码数据口

sbitKEYL3=P1^5;

sbitKEYH1=P1^0;

sbitKEYH2=P1^1;

sbitKEYH3=P1^2;

sbitKEY1=P3^3;//四个按键数据口

unsignedintflag;

unsignedchartime_data[3]={00,10,0};

unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,

0x99,0x92,0x82,0xF8,

0x80,0x90,0x88,0x83,

0xC6,0xA1,0x86,0x8E

};//段码数组

unsignedcharn=0;//n为节拍常数变量

unsignedcharcodemusic_tab[]={

0x18,0x30,0x1C,0x10,//格式为频率常数,节拍常数,频率常数,节拍常数,

0x20,0x40,0x1C,0x10,

0x18,0x10,0x20,0x10,

0x1C,0x10,0x18,0x40,

0x1C,0x20,0x20,0x20,

0x1C,0x20,0x18,0x20,

0x20,0x80,0xFF,0x20,

0x30,0x1C,0x10,0x18,

0x20,0x15,0x20,0x1C,

0x20,0x20,0x20,0x26,

0x40,0x20,0x20,0x2B,

0x20,0x26,0x20,0x20,

0x20,0x30,0x80,0xFF,

0x20,0x20,0x1C,0x10,

0x18,0x10,0x20,0x20,

0x26,0x20,0x2B,0x20,

0x30,0x20,0x2B,0x40,

0x20,0x20,0x1C,0x10,

0x18,0x10,0x20,0x20,

0x26,0x20,0x2B,0x20,

0x30,0x20,0x2B,0x40,

0x20,0x30,0x1C,0x10,

0x18,0x20,0x15,0x20,

0x1C,0x20,0x20,0x20,

0x26,0x40,0x20,0x20,

0x2B,0x20,0x26,0x20,

0x20,0x20,0x30,0x80,

0x20,0x30,0x1C,0x10,

0x20,0x10,0x1C,0x10,

0x20,0x20,0x26,0x20,

0x2B,0x20,0x30,0x20,

0x2B,0x40,0x20,0x15,

0x1F,0x05,0x20,0x10,

0x1C,0x10,0x20,0x20,

0x26,0x20,0x2B,0x20,

0x30,0x20,0x2B,0x40,

0x20,0x30,0x1C,0x10,

0x18,0x20,0x15,0x20,

0x1C,0x20,0x20,0x20,

0x26,0x40,0x20,0x20,

0x2B,0x20,0x26,0x20,

0x20,0x20,0x30,0x30,

0x20,0x30,0x1C,0x10,

0x18,0x40,0x1C,0x20,

0x20,0x20,0x26,0x40,

0x13,0x60,0x18,0x20,

0x15,0x40,0x13,0x40,

0x18,0x80,0x00

};

sbitS=P2^2;

voiddelay(unsignedcharm)//控制频率延时

{

unsignedchari=3*m;

while(--i);

}

voiddelayms(unsignedchara)//毫秒延时子程序

{

while(--a);//采用while(--a)不要采用while(a--);

}

voidKILL()//播放音乐函数

{unsignedcharp,m;//m为频率常数变量

unsignedchari=0;

TMOD=0x10;

TH1=0xd8;TL1=0xef;

ET1=1;EA=1;ES=1;

play:

while

(1)

{

a:

p=music_tab[i];

if(p==0x00)

{i=0,delayms(1000);gotoplay;}//如果碰到结束符,延时1秒,回到开始再来一遍

elseif(p==0xff)

{i=i+1;delayms(100),TR1=0;gotoa;}//若碰到休止符,延时100ms,继续取下一音符

else

{m=music_tab[i++],n=music_tab[i++];}//取频率常数和节拍常数

TR1=1;//开定时器1

while(n!

=0)S=~S,delay(m);//等待节拍完成,通过P1口输出音频(可多声道哦!

TR1=0;//关定时器1

}

}

 

voiddelay_ms(unsignedintx)//延时毫秒级

{

unsignedinta=0,b=0,c=0;

for(a=x;a>0;a--)

for(b=5;b>0;b--)

for(c=128;c>0;c--);

}

voidLED_display(unsignedcharseg_code,unsignedcharshuju)

{

if(seg_code<1||seg_code>4)seg_code=1;

if(shuju>15)shuju=15;

LED_segmnet_port=(LED_segmnet_port|0xf0)&_crol_(0xef,seg_code-1);//送入位码

LED_code_port=table[shuju];//送入段码

delay_ms

(2);//保持显示2毫秒

LED_segmnet_port=LED_segmnet_port|0xf0;//关掉所有数码管

}

voiddisplay_time()

{

LED_display(1,time_data[0]/10);

LED_display(2,time_data[0]%10);

LED_display(3,time_data[1]/10);

LED_display(4,time_data[1]%10);

}

voidtime_initial()

{

TMOD=0x01;//定时器,方式1

TH0=0x4c;//写入初值高8位

TL0=0;//写入初值低8位

EA=1;//开总中断

ET0=1;//定时中断允许

TR0=1;//开启定时器

}

voidint0()interrupt3//采用中断1控制节拍

{TH1=0xd8;

TL1=0xef;

n--;

}

voidmain()

{

time_initial();TR1=0;

while

(1)

{KEYL3=0;

display_time();

if((time_data[0]==0)&(time_data[1]==0)){TR0=0;TR1=1;KILL();}

display_time();//判断计时是否为0,如为0,播放音乐

if(KEYH1==0)//键盘扫描

{delay_ms(5);//消斗

if(KEYH1==0)//按键1按下,标志位置1

{flag=1;}

}

if(flag==1)

{if(KEYH2==0)

{delay_ms(5);

if(KEYH2==0)

{time_data[0]++;display_time();}//标志位置1情况下,如果按键2按下,分钟加1

}

if(KEYH3==0)

{delay_ms(5);

if(KEYH3==0)

{time_data[0]--;display_time();}//标志位置1情况下,如果按键3按下,分钟减1

}

if(KEY1==0)

{delay_ms(5);

if(KEY1==0)

{flag=0;delay_ms(50);display_time();}

}//标志位置1情况下,如果按键4按下,标志位置0,设置完成

}

if(flag==0)

{

if(KEYH2==0){delay_ms(5);

if(KEYH2==0)

{while(!

KEYH2);time_data[0]=05;time_data[1]=00;display_time();}}//按下2键,显示“0500”

if(KEYH3==0){delay_ms(5);

if(KEYH3==0)

{while(!

KEYH3);time_data[0]=10;time_data[1]=00;display_time();}}//按下3键,显示“1000”

if(KEY1==0){delay_ms(5);

if(KEY1==0)

{time_data[0]=20;time_data[1]=00;display_time();}}//按下4键,显示“2000”

}

}

}

voidtimer0()interrupt1//中断

{

TH0=0x4c;//重新写入初值

TL0=0;

time_data[2]++;

if(time_data[2]==20)

{

time_data[2]=0;

time_data[1]--;//秒数减一

if(time_data[1]==0xff)

{

time_data[1]=59;

time_data[0]--;//秒数减为0,置为59,同时分钟减一

}

}

}

四实验结论

实现的功能:

1.用四位数码管显示格式为“分分秒秒”

2.程序执行后工作指示灯LED闪动,表示程序开始执行,按下操作键K1~K4动作如下。

●K1—可调整倒计数的时间1~60分钟。

●K2—设置倒计数的时间为5分钟,显示“0500”。

●K3—设置倒计数的时间为10分钟,显示“1000”。

●K4—设置倒计数的时间为20分钟,显示“2000”。

复位后LED的画面应能显示倒计时的分钟和秒数,此时按K1键则在LED上显示出设置画面。

此时,若:

a.按操作键K2—增加倒计数的时间1分钟。

b.按操作键K3—减少倒计数的时间1分钟。

c.按操作键K4—设置完成。

3倒计时完时播放音乐《八月桂花》

五.心得体会

这次设计是我第一次独自一人完成从写开题报告、到画原理图、画pcb、然后学习了C并且编写了程序的整个设计过程,虽然没有制板,这也许是个遗憾,但我还是学到了非常多的东西。

比如弄懂了数码管的原理,按键扫描的原理,熟悉了中断的应用以及初步了解了音乐的设计。

在这个设计中,遇到了非常多的问题,最后都通过自己的努力以及老师同学的帮助而获得解决。

也明白了理论要在实践中才能深刻的理解,这也是我以后要努力的方向。

六.附录表

1.组件表

名称

规格

数量(个)

单片机

8051

1

LED

SM410S84

1

三极管

PNP

5

排阻

10K

1

蜂鸣器

0.8Ω

1

电解电容

10uF

1

晶体振荡器

11.0592MHz

1

瓷片电容

30pF

2

电阻

10kΩ

1

电阻

1kΩ

5

电阻

470Ω

4

发光二极管

1

按键

5

2.原理图

 

3.PCB图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1