单片机倒数计数器报告_第1页
单片机倒数计数器报告_第2页
单片机倒数计数器报告_第3页
单片机倒数计数器报告_第4页
单片机倒数计数器报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录一、设计要求3二、设计目的3三、设计方案41系统概述42单元电路设计5 3软件程序设计和调试6 四、实验结论12 五、心得体会13 六、附录13 实验题目 音乐倒数计数器一.设计要求利用AT89C51单片机结合字符型LED显示器设计一个简易的倒数计数器,可用来煮方便面、煮开水或小睡片刻等。做一小段时间倒计数,当倒计数为0时,则发出一段音乐声响,通知倒计数终了,该做应当做的事。定时闹钟的基本功能如下。l 6位LED显示器。l 显示格式为“TIME 分分:秒秒”。用4个按键操作来设置当前想要倒计数的时间。一旦按下键则开始倒计数,当计数为0时,发出一阵音乐声。程序执行后工作指示灯LED闪动,表示

2、程序开始执行,按下操作键K1K4动作如下。l K1可调整倒计数的时间160分钟。l K2设置倒计数的时间为5分钟,显示“0500”。l K3设置倒计数的时间为10分钟,显示“1000”。l K4设置倒计数的时间为20分钟,显示“2000”。复位后LED的画面应能显示倒计时的分钟和秒数,此时按K1键则在LED上显示出设置画面。此时,若: a. 按操作键K2增加倒计数的时间1分钟。 b. 按操作键K3减少倒计数的时间1分钟。 c. 按操作键K4设置完成。 本题目最大难点是实现音乐的播放。作者利用定时计数器,通过载入不同的计数初值,产生频率不同的方波,输入到蜂鸣器(SOUNER)中,使其发出频率不同

3、的声音。本设计中单片机晶振为1.0592MHz,通过计算各音阶频率,可得1、2、3、4、5、6、7共7个音应赋给定时器的初值为64580、64684、64777、64820、64898、64968、65030。在此基础上,可将乐曲的简谱转化为单片机可以“识别”的“数组谱”,进一步加入对音长、休止符等的控制量后,可以实现音乐的播放。二设计目的1.学习单片机定时器时间计时处理、按键扫描、LED显示及音乐旋律演奏的设计方法。2理论结合实际,提高分析解决问题的能力。三.设计方案利用单片机、四段LED数码管和蜂鸣器1.方案总体思路。用单片机8051控制程序执行,通过LED动态扫描来显示倒计时,每次执行中

4、断时判断计时是否继续倒计时。同时通过按键扫描的方式来判断是否有输入更改倒计时的控制信息,通过8051的处理来达到对倒计时的更新,当倒计时结束时,驱动蜂鸣器发出一首音乐。 主程序开始初始化变量及LED接口初始化定时器LED灯闪动表示程序开始执行LED扫描显示器更新倒数时间数据,检查闹铃时间是否到了是否按K1,K2,K3,K4键K1:调整倒数时间K2:倒数计时时间为5MINK3:倒数计时时间为10MINK4:倒数计时时间为20MINYN图1 设计流程图2.单元电路设计 控制电路采用8051进行控制。8051 基本资料如下:图2 8051引脚图在此次实验中,一共用到了单片机的21个管脚,其中P1组用

5、到的P10P13去控制四个按键,P0组用来控制数码管的段码,P24P27用来控制四段数码管的位码,P23用来使蜂鸣器发生,VCC和GND做为电源和复位电路接入端,而单片机的18和19脚则接入晶体整荡器,产生振荡频率。通过输入相应程序对单片机的控制,从而让各个模块能够协调工作,实现一定的功能。 LED数码管 LED数码管分为共阴数码管和共阳数码管两种,本实验采用共阳数码管。共阳数码管就是将数码管七段的阳极连在一起。当这个公共阳极接VCC时,其余的哪段接低电平哪段亮。具体的接线电路见附表SCH图。 图2 数码管的内部结构图,中间为共阴数码管,右边为共阳数码管按键控制按键控制室控制程序执行时数据的输

6、入或是特殊功能的设置及操作,使用8051端口1的4(0至3)条输入口,由程序来控制,平时输入端为高电平,当有按键按下则相对位会呈现低电平,进过轮流扫描判断输入端是否为低电平,便可知道按下的是哪一个按钮。蜂鸣器蜂鸣器的功能是对输入的不同频率的方波进行播放形成音乐,持续送出工作脉冲可以推动喇叭发出哔的声响,当工作频率越高时,声音越清脆,工作频率低时,声音则较低沉。使用8051的P23口进行控制图3. 蜂鸣器接线图3软件程序设计和调试工作方式设计C语言比起汇编语言具有简洁紧凑、灵活方便、语法限制不太严格、程序设计自由度大等特点,本例采用C语言进行程序编写。用到了定时器0和1,初始时开T0而关闭T1。

7、其中定时器0用来控制倒计时的实现,即当时间到达50ms(定时器时间)*20(循环次数)时,执行中断0将显示时间减一,同时判断计时是否减为0,当扫描但定时时间为0时,则关闭定时器0,而打开定时器1,控制音乐的播放。延时时间的计算若定时50ms,则程序为TMOD=0x01; /定时器,方式1TH0=0x4c; /写入初值高8位TL0=0; /写入初值低8位EA=1; / 开总中断ET0=1; / 定时中断允许TR0=1; / 开启定时器计算式为T=(216-4*16+12)*12/(11.0592*106)=50ms然后定义变量待其循环20次后执行中断即可实现1s的定时。有定时器产生各种频率的声音

8、我们可以设定发音的频率来改变声音产生音乐,计时时间长短也是按照发音的频率而定的。由频率值推得定时器计数初值由下关系式得到:T=1/f(us) ;方波宽度Co=(int)t/2 ;定时器所得计数的次数Lo=(8192-co)%32 ;计数初值低字节Hi=(8192-co)/32 ;计数初值高字节具体的程序解释#include#include#define LED_code_port P0 / 段码数据口#define LED_segmnet_port P2 / 位码数据口sbit KEYL3=P15;sbit KEYH1=P10;sbit KEYH2=P11;sbit KEYH3=P12;sbi

9、t KEY1=P33;/四个按键数据口unsigned int flag;unsigned char time_data3=00,10,0;unsigned char code table=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E ;/段码数组unsigned char n=0; / n为节拍常数变量 unsigned char code music_tab = 0x18, 0x30, 0x1C , 0x10, /格式为 频率常数, 节拍常数, 频率常数, 节拍常数, 0x20

10、, 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

11、, 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

12、, 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

13、, 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 ; sbit S=P22; void delay (unsigned ch

14、ar m) / 控制频率延时 unsigned char i=3*m; while(-i); void delayms(unsigned char a) / 毫秒延时子程序 while(-a); / 采用while(-a) 不要采用while(a-); void KILL() /播放音乐函数 unsigned char p,m; / m为频率常数变量 unsigned char i=0; TMOD =0x10; TH1=0xd8;TL1=0xef; ET1=1;EA=1;ES=1; play: while(1) a: p=music_tabi; if(p=0x00) i=0, delayms(

15、1000); goto play; / 如果碰到结束符,延时1秒,回到开始再来一遍 else if(p=0xff) i=i+1;delayms(100),TR1=0; goto a; / 若碰到休止符,延时100ms,继续取下一音符 else m=music_tabi+, n=music_tabi+; / 取频率常数 和 节拍常数 TR1=1; / 开定时器1 while(n!=0) S=S,delay(m); /等待节拍完成, 通过P1口输出音频(可多声道哦!) TR1=0; /关定时器1 void delay_ms(unsigned int x) / 延时毫秒级unsigned int a

16、=0,b=0,c=0;for(a=x;a0;a-)for(b=5;b0;b-)for(c=128;c0;c-);void LED_display(unsigned char seg_code,unsigned char shuju)if(seg_code4) seg_code=1;if(shuju15) shuju=15;LED_segmnet_port=(LED_segmnet_port|0xf0)&_crol_(0xef,seg_code-1); / 送入位码LED_code_port=tableshuju; / 送入段码delay_ms(2); / 保持显示2毫秒LED_segmnet_

17、port=LED_segmnet_port|0xf0; / 关掉所有数码管void display_time()LED_display(1,time_data0/10);LED_display(2,time_data0%10);LED_display(3,time_data1/10);LED_display(4,time_data1%10);void time_initial()TMOD=0x01; /定时器,方式1TH0=0x4c; /写入初值高8位TL0=0; /写入初值低8位EA=1; / 开总中断ET0=1; / 定时中断允许TR0=1; / 开启定时器void int0() inte

18、rrupt 3 / 采用中断1 控制节拍 TH1=0xd8; TL1=0xef; n-; void main()time_initial();TR1=0;while(1)KEYL3=0;display_time();if(time_data0=0)&(time_data1=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)

19、 time_data0+;display_time();/标志位置1情况下,如果按键2按下,分钟加1 if(KEYH3=0) delay_ms(5); if(KEYH3=0) time_data0-;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)

20、; time_data0=05;time_data1=00;display_time();/按下2键,显示“0500” if(KEYH3=0) delay_ms(5); if(KEYH3=0) while(!KEYH3); time_data0=10;time_data1=00;display_time();/按下3键,显示“1000” if(KEY1=0) delay_ms(5); if(KEY1=0) time_data0=20;time_data1=00;display_time();/按下4键,显示“2000” void timer0() interrupt 1 /中断TH0=0x4c; /重新写入初值TL0=0;time_data2+;if(time_data2=20)time_data2=0;time_data1-;/秒数减一if(time_data1=0xf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论