单片机.docx
- 文档编号:5328846
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:16
- 大小:125.87KB
单片机.docx
《单片机.docx》由会员分享,可在线阅读,更多相关《单片机.docx(16页珍藏版)》请在冰豆网上搜索。
单片机
单片机接口课程设计
题目音乐倒数计时器
专业光信息科学与技术
院系应用科学学院
学号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图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机