单片机倒数计数器报告1

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

目录一、设计要求……………………………………………3二、设计目的……………………………………………3三、设计方案……………………………………………41系统概述…………………………………………42单元电路设计……………………………………53软件程序设计和调试……………………………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的处理来达到对倒计时的更新,当倒计时结束时,驱动蜂鸣器发出一首音乐。图1设计流程图2.单元电路设计○1控制电路采用8051进行控制。8051基本资料如下:主程序开始初始化变量及LED接口初始化定时器LED灯闪动表示程序开始执行LED扫描显示器更新倒数时间数据,检查闹铃时间是否到了是否按K1,K2,K3,K4键K1:调整倒数时间K2:倒数计时时间为5MINK3:倒数计时时间为10MINK4:倒数计时时间为20MINYN图28051引脚图在此次实验中,一共用到了单片机的21个管脚,其中P1组用到的P1^0~P1^3去控制四个按键,P0组用来控制数码管的段码,P2^4~P2^7用来控制四段数码管的位码,P2^3用来使蜂鸣器发生,VCC和GND做为电源和复位电路接入端,而单片机的18和19脚则接入晶体整荡器,产生振荡频率。通过输入相应程序对单片机的控制,从而让各个模块能够协调工作,实现一定的功能。○2LED数码管LED数码管分为共阴数码管和共阳数码管两种,本实验采用共阳数码管。共阳数码管就是将数码管七段的阳极连在一起。当这个公共阳极接VCC时,其余的哪段接低电平哪段亮。具体的接线电路见附表SCH图。图2数码管的内部结构图,中间为共阴数码管,右边为共阳数码管○3按键控制按键控制室控制程序执行时数据的输入或是特殊功能的设置及操作,使用8051端口1的4(0至3)条输入口,由程序来控制,平时输入端为高电平,当有按键按下则相对位会呈现低电平,进过轮流扫描判断输入端是否为低电平,便可知道按下的是哪一个按钮。abcdegGNDfdpGNDabcefgd·dpabcdefgdpdpgfedcba+5V(a)(b)○4蜂鸣器蜂鸣器的功能是对输入的不同频率的方波进行播放形成音乐,持续送出工作脉冲可以推动喇叭发出哔的声响,当工作频率越高时,声音越清脆,工作频率低时,声音则较低沉。使用8051的P2^3口进行控制图3.蜂鸣器接线图3软件程序设计和调试○1工作方式设计C语言比起汇编语言具有简洁紧凑、灵活方便、语法限制不太严格、程序设计自由度大等特点,本例采用C语言进行程序编写。用到了定时器0和1,初始时开T0而关闭T1。其中定时器0用来控制倒计时的实现,即当时间到达50ms(定时器时间)*20(循环次数)时,执行中断0将显示时间减一,同时判断计时是否减为0,当扫描但定时时间为0时,则关闭定时器0,而打开定时器1,控制音乐的播放。○2延时时间的计算若定时50ms,则程序为TMOD=0x01;//定时器,方式1TH0=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的定时。○3有定时器产生各种频率的声音我们可以设定发音的频率来改变声音产生音乐,计时时间长短也是按照发音的频率而定的。由频率值推得定时器计数初值由下关系式得到:T=1/f(us);方波宽度Co=(int)t/2;定时器所得计数的次数Lo=(8192-co)%32;计数初值低字节Hi=(8192-co)/32;计数初值高字节○4具体的程序解释#includereg52.h#includeintrins.h#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;//开定时器1while(n!=0)S=~S,delay(m);//等待节拍完成,通过P1口输出音频(可多声道哦!)TR1=0;//关定时器1}}voiddelay_ms(unsignedintx)//延时毫秒级{unsignedinta=0,b=0,c=0;for(a=x;a0;a--)for(b=5;b0;b--)for(c=128;c0;c--);}voidLED_display(unsignedcharseg_code,unsignedcharshuju){if(seg_code1||seg_code4)seg_code=1;if(shuju15)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;//定时器,方式1TH0=0x4c;//写入初值高8位TL0=0;//写入初值低8位EA=1

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功