




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
四川师范大学成都学院电子工程专业综合设计目 录1.总体设计方案11.1 设计方案11.1.1 时钟生成方案11.1.2 显示模块方案11.1.3 键盘模块方案21.2 时钟功能初定22.单元模块设计22.1 模块介绍22.1.1 芯片简介22.1.2 最小系统52.1.3 时钟电路52.1.4复位电路62.1.5 键盘接口72.1.6 显示电路83.系统软件设计93.1 软件流程图93.2时钟程序设计123.3 显示程序设计123.3.1 LCD忙检测133.3.2 LCD数据/命令写入133.3.3 LCD初始化143.3.4 LCD显示字符串143.4秒表程序设计153.5闹铃程序设计163.5.1铃声信息初步163.5.2铃声播放程序设计173.6 键盘扫描程序设计183.7 主程序设计194.系统调试与存在的问题234.1 Keil软件中的程序调试234.2 Pretous软件中的仿真调试254.3 发现的问题与不足265. 设计总结276.参考文献2829前 言20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。 目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。下面是单片机的主要发展趋势。 单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。 单片机模块中最常见的是数字时钟,数字时钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。 数字时钟是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字时钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字时钟及扩大其应用,有着非常现实的意义1.总体设计方案1.1 设计方案图1 系统总体设计框图本次设计时钟电路,主要使用已熟悉的ATC89C51单片机芯片作为控制器芯片,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,用扬声器来进行定时提醒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘输入模块、主控芯片(ATC89C51)及其外围电路、扬声器模块、显示模块即可满足设计要求。1.1.1 时钟生成方案方案:使用单片机内部的可编程定时器。利用单片机内部的定时计数器进行中端定时,配合软件延时实现时、分、秒的计时。1.1.2 显示模块方案对于实时时钟而言,显示显然是另一个重要的环节。通常对于这样的小系统有LED显示和LCD液晶显示两种。就LED而言,有静态显示和动态显示两种,LED静态显示占有I/O口线多,硬件开销大,电路复杂;LED动态显示硬件连接简单,但动态扫描的显示方式需要占有CPU较多的时间,在单片机没有太多实时测控任务的情况下可以采用。编程较为复杂。且除数字外,无法显示其他字符。LCD显示器除能显示较多的字符,无需CPU实时扫描更新数据,采用写命令加写数据的方法操作显示,准确,简单。本程序中含有较多功能,需要有提示性语句知道使用者该进行何种操作,所以本程序优先选用LCD1602为显示器件。1.1.3 键盘模块方案设计要求能实现以下按键:功能菜单选择键(MENU),调时时用到的时加(+)、时减(-),用于清零/返回/关断闹钟的附加功能键。故选用四个键即可完成设计要求,键盘扫描方式如下:方案:键盘电路采用独立按键的方式,共4个按键,需要4个接口线,只须占用二分之一个I/O口资源。1.2 时钟功能初定根据上述已定模块,结合51单片机强大的控制运算能力,本时钟可以准确的做到显示时钟,指示秒动作,键盘作为人机交互的重要借口,可以让我们的时钟随时响应使用者的各种请求,包括校准时间,秒表计时(显示需达到10ms级更新一次),闹钟等功能。闹钟应采用优雅的音乐作为背景,更加人性化。由于是多功能简易时钟,无需要求记录到年月日和星期方面的内容,重要的是通过课程设计,学会团队合作,学会用自己得双手去解决一些实际操作中遇到的难题,并体会到电子设计的乐趣,增强自己对学习的学习兴趣,加强自主学习的能力。所以暂时做到以上功能。 2.单元模块设计2.1 模块介绍2.1.1 AT89C51芯片简介AT89C51单片机是由深圳宏晶公司代理销售的一款MCU,是由美国设计生产的一种低电压、高性能CMOS 8位单片机,片内含8kbytes的可反复写的FlashROM和128bytes的RAM,2个16位定时计数器5。 AT89C51单片机内部主要包括累加器ACC(有时也简称为A)、程序状态字PSW、地址指示器DPTR、只读存储器ROM、随机存取存储器RAM、寄存器、并行I/O接口P0P3、定时器/计数器、串行I/O接口以及定时控制逻辑电路等。这些部件通过内部总线联接起来,构成一个完整的微型计算机。其管脚图如图2所示。VCC:电源。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程 序数据存储器,它可以图2 AT89C51单片机管脚结构图被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作 输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻 拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存 储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器 的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示:表1 STC89C52主要功能主要功能特性兼容MCS51指令系统8K可反复擦写Flash ROM32个双向I/O口256x8bit内部RAM3个16位可编程定时/计数器中断时钟频率0-24MHz2个串行中断可编程UART串行通道2个外部中断源共6个中断源2个读写中断口线3级加密位低功耗空闲和掉电模式软件设置睡眠和唤醒功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器 时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。EA/VPP:当/EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时, /EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。2.1.2 单片机最小系统单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。主控芯片选取STC89C52RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。晶振选取11.0592MHz,晶振旁电容选取30pF。采用按键复位电路,电阻分别选取100和10K,电容选取10F。以下为单片机最小系统硬件电路图。图3 单片机最小系统原理图2.1.3 时钟电路STC89C52内部有一个用于构成振荡器的高增益反相放大器,引脚RXD和TXD分别是此放大器的输入端和输出端。时钟可以由内部方式产生或外部方式产生。内部方式的钟电路如图4(a) 所示,在RXD和TXD引脚上外接定时元件,内部振荡器就产生自激振荡。定时元件通常采用石英晶体和电容组成的并联谐振回路。晶体振荡频率可以在1.212MHz之间选择,电容值在530pF之间选择,电容值的大小可对频率起微调的作用。外部方式的时钟电路如图4(b)所示,RXD接地,TXD接外部振荡器。对外部振荡信号无特殊要求,只要求保证脉冲宽度,一般采用频率低于12MHz的方波信号。片内时钟发生器把振荡频率两分频,产生一个两相时钟P1和P2,供单片机使用。RXD接地,TXD接外部振荡器。对外部振荡信号无特殊要求,只要求保证脉冲宽度,一般采用频率低于12MHz的方波信号。片内时钟发生器把振荡频率两分频,产生一个两相时钟P1和P2,供单片机使用。(a)内部方式时钟电路 (b)外部方式时钟电路图4 时钟电路2.1.4复位电路复位是单片机的初始化操作。其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。除PC之外,复位操作还对其他一些寄存器有影响,它们的复位状态如表2所示。表2一些寄存器的复位状态寄存器复位状态寄存器复位状态PC0000HTCON00HACC00HTL000HPSW00HTH000HSP07HTL100HDPTR0000HTH100HP0-P3FFHSCON00HIPXX000000BSBUF不定IE0X000000BPCON0XXX0000BTMOD00HRST引脚是复位信号的输入端。复位信号是高电平有效,其有效时间应持续24个振荡周期(即二个机器周期)以上。若使用颇率为11.592MHz的晶振,则复位信号持续时间应超过5us才能完成复位操作。整个复位电路包括芯片内、外两部分。外部电路产生的复位信号(RST)送至施密特触发器,再由片内复位电路在每个机器周期的S5P2时刻对施密特触发器的输出进行采样,然后才得到内部复位操作所需要的信号。产生复位信号的电路逻辑如图5所示:图5 复位信号的电路逻辑图复位操作有上电自动复位相按键手动复位两种方式。上电自动复位是通过外部复位电路的电容充电来实现的,其电路如图6(a)所示。这佯,只要电源Vcc的上升时间不超过1ms,就可以实现自动上电复位,即接通电源就成了系统的复位初始化。按键手动复位有电平方式和脉冲方式两种。其中,按键电平复位是通过使复位端经电阻与Vcc电源接通而实现的,其电路如图6(b)所示;而按键脉冲复位则是利用RC微分电路产生的正脉冲来实现的,其电路如图6(c)所示。本计算器主要设计了上电复位和手动复位操作。(a)上电复位 (b)按键电平复位 (c)按键脉冲复位图6 复位电路2.1.5 键盘接口电路时钟所需按键有:菜单/确定、调时(+)/开始、调时(-)/停止、选择/清零共需要四个按键,分别接在P1口0,1,2,3引脚,另一端共同接在地上,扫描P1端口对应的引脚是否为低电平就可判断是否有相应按键按下,得到按键值后根据按键作出相应操作回应,从而完成人机交互的功能。如下键盘示意图:图7 键盘仿真示意图2.1.6 LCD1602显示电路1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。 1602采用标准的16脚接口: 第1脚:VSS为电源地第2脚:VDD接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时 图8 LCD1602引脚图可以通过一个10K的电位器调整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端。第714脚:D0D7为8位双向数据端。第1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如A。以下是1602的16进制ASCII码表地址:读的时候,先读左边那列,再读上面那行,如:感叹号!的ASCII为0x21,字母B的ASCII为0x42(前面加0x表示十六进制)图9 LCD1602的16进制ASCII码表3.系统软件设计3.1 软件流程图本软件系统主要包括main.c主控程序、LCD1602.h(驱动lcd1602的一系列函数集合)、TIME.h(时间处理的一系列函数集合)、STOPWATCH.h(秒表初始化、开始、停止、清零等相关函数)、RING.h(包含带电子音乐、闪灯的闹玲相关函数)、TIMER.h(初始化函数)等文件。首先是系统初始化状态,包括初始化液晶显示,初始化Timer0 、Timer1,时钟计时初始化,重要标志等复位。然后根据相应按钮进行状态间的转换,实现人机交互,将多种功能呈现在使用者的面前。状态控制标志用state来确定,共有START、SHOW_TIME、SET、STOP_WATCH、SET_RING 等五种状态,分别实现系统初始化、显示时间、调整时间、秒表计时、设定闹钟等功能。结合LCD送显提示,呈现丰富多彩的时钟功能!下面是程序状态转换图(图10)和软件设计流程图(图11)。图10 程序状态转换图图11 软件设计流程图3.2时钟程序设计时钟程序需要实时更新时钟显示,为了准确控制时钟,我们将Timer0作为系统时钟的专用计数器。定时器0为加计数器,即计数从初值开始逐渐自加1,一直到65535后再装入初值,由于系统晶振为12MHz,记满65536也不能满足计时1秒的需求。故我们采用计数50000次,共计50ms,再用一个全局变量K计数Timer0计时个数的方法来记录时间。即在Timer0的中断服务程序中,将K自加1。加到20(20 x 50ms = 1000ms = 1s)就将sec自加1,并通过将isTimeChanged置1的方法通知外部,时间已经更新。sec满59就清零,并讲min自加1;min计满59就清零并将hour自加1。整个过程都在Timer0的中断服务程序中完成。当需要完成时钟显示的时候就讲hour,min,sec的值读出并送显即可!相关程序如下:/-/计时器0中断服务程序/-void Timer0() interrupt 1 using 1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; k+; if(k = 20) k=0; sec+;if(sec 59) min+; sec=0; if(min 59) min=0; hour+; if(hour 23) hour=0; isTimeChanged = 1; /-3.3 显示程序设计本次显示设备是采用的LCD1602,它采用写命令,写数据到显示器即可完成显示任务,为了方便的显示提示字符串和时间值,我们只需要写好相关程序供其他程序调用即可。3.3.1 LCD忙检测因为LCD采用HD44780芯片作为控制芯片,为准确无误的写入数据或者命令,首先需要对LCD进行读忙测试,如果正在忙碌,则稍等再写入数据。忙检测函数如下:/- / 测忙函数 /- bit lcdBusy() / 测试LCD忙碌状态 bit result; RS = 0; RW = 1; EN = 1; delay_ms(1); result = (bit)(DATA_PORT & 0x80);/判断P07是一还是零.屏蔽掉其它位0x80.强制转换位bit型数据。在返回给result。 EN = 0; return result; /- 3.3.2 LCD数据/命令写入要完成对LCD的初始化,和显示控制、正确显示数据,需要为其写入命令和数据,命令和数据由LCD的RS(数据/命令写入模式选择)、RW(读/写控制)、EN(EN的上升沿命令/数据开始写入)等控制位确定。操作时我们只需要将奖数据送到与之连接的端口(P0口),然后改变RS、RW、EN(P2.0 、 P2.1 、 P2.2)等的值就可讲P0口的数据/命令写入LCD1602中。/- / 写命令函数 /- void writeCom(char com) while(lcdBusy(); RS=0; RW=0; DATA_PORT=com; delay_ms(1); EN=1; delay_ms(1); EN=0; /- / 写数据函数 /- void writeData(char dat) while(lcdBusy(); RS=1; /数据 RW=0; /写 DATA_PORT=dat; /把数据送到P0口 delay_ms(1); EN=1; delay_ms(1); EN=0; /-3.3.3 LCD初始化LCD显示器需要初始化后才能正常工作和显示我们想要的数据。为此,在显示前必须要对其进行初始化操作,包括LCD复位,开显示,关光标,设置读写位置等。只要初始化完成,我们就可以让它显示我们想要的数据。/- / 1602初始化函数 /- void lcdInit() RW=0; RS=0; writeCom(0x36); /set text home address writeCom(0x0c); /开显示,隐藏光标,卜闪烁 writeCom(0x38); writeCom(0x06); /设置写数据后光标自动+1 writeCom(0x01); /清屏 writeCom(0x80); /设定写位置为0x80 /-3.3.4 LCD显示字符串因为写数据函数只能将其数据一个一个的写入,外界调用起来很不方便,为了方便操作,可以专门写一个字符串函数供外界调用。方法很简单,就是将传过来的字符串首地址拿到,然后一个一个的写入LCD中。还可以根据传入的位置实现按指定位置精确显示。使其更好操作。函数如下;/- / 显示字符串函数 /- void outPrint(uchar* str,uchar index) uint i;writeCom(index); for(i=0;stri!=/0;i+) writeData(stri); /- 3.4秒表程序设计秒表主要用到单片机中的已有资源Timer1,因为单片机资源有限,Timer1还被用于闹铃程序中,故在进行秒表显示之前需要对Timer1重新初始化,并将用途控制标志位is_sing置0。Timer1仍然采用16位工作方式,因为要将计时精确到10ms,所以计数选择10000次中断一次,即计时为10ms。然后更新显示即可。要暂停秒表,将Timer1的开始停止位TR1置0即可,继续秒表TR1置1。相关程序如下:/- / 初始化秒表 /- void watchInit(void)STOP_MIN = 0;STOP_SEC = 0;STOP_10MS = 0;TH1=(65536-10000)/256;TL1=(65536-10000)%256;/- / 启动秒表 /-void watchStart(void)TR1=1;/- / 暂停秒表 /-void watchStop(void)TR1=0;/- / 清空秒表 /-void watchClear(void)watchStop();STOP_MIN = 0;STOP_SEC = 0;STOP_10MS = 0;/- / 计时器1中断服务程序 /-void Timer1() interrupt 3 using 2 if(is_sing) TR1 = 0; /先关闭T1 speaker = speaker; /输出方波, 发音 TH1 = t1h; /下次的中断时间, 这个时间, 控制音调高低 TL1 = t1l; TR1 = 1; else TH1=(65536-10000)/256; TL1=(65536-10000)%256;STOP_10MS+;if(100 = STOP_10MS)STOP_10MS = 0; STOP_SEC +;if(60 = STOP_SEC)STOP_SEC = 0; STOP_MIN +;if(60 = STOP_MIN)STOP_MIN = 0; 3.5闹铃程序设计3.5.1铃声信息初步闹钟闹铃要想响铃,必须要有的两个要素是响铃的音调(频率)和时长。因此要有一个乐谱,记录下这些铃声的各个音符的音调和时长信息。闹铃时间到时依次用程序将这些信息读入,控制喇叭发声即可。以下是收集到的歌曲世上只有妈妈好的单片机乐谱:/*世上只有妈妈好*/uchar code sszymmh = 6,2,6, 5,2,2, 3,2,4, 5,2,4, 1,3,4, 6,2,2, 5,2,2, 6,2,8, 3,2,4, 5,2,2, 6,2,2, 5,2,4, 3,2,4, 1,2,2, 6,1,2, 5,2,2, 3,2,2, 2,2,8, 2,2,6, 3,2,2, 5,2,4, 5,2,2, 6,2,2, 3,2,4, 2,2,4, 1,2,8, 5,2,6, 3,2,2, 2,2,2, 1,2,2, 6,1,2, 1,2,2, 5,1,16, 0,0,0;/一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以1/4拍为单位)。/1, 3, 4 分别代表:, 高音, 4个1/4拍;/低音为1,中音为2,高音为3,超高音为4;/-八度,就是控制响铃频率段,说白了就是控制响铃的时间(如果你无需让你的音乐动听,就卜需要根据把八度谱来发声,都按一个八度发声,只是难听点的点)。以下是八度谱:/ 频率-半周期数据表 Timer1高八位数据 共保存了四个八度的28个频率数据uchar code FREQH = 0x01, /0的时候没有音符 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, /低音1234567 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,/1,2,3,4,5,6,7,i 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, /高音 234567 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF; /超高音 1234567/-/ 频率-半周期数据表 Timer1低八位uchar code FREQL = 0x01, /0的时候没有音符 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, /低音1234567 0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, /1,2,3,4,5,6,7,i 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, /高音 234567 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16; /超高音 1234567/-3.5.2铃声播放程序设计由于单片机无法并行运行,所以要想在响铃的同时,还要完成走时、显示、扫描键盘,响应用户请求等,所以无需一次把整首歌唱完,每次只需吟唱一个音符。写出一个音符发声程序即可:/- / 演奏节拍延时 /- void songDelay(uchar t) /延时程序,控制发音的时间长度120ms(1/4拍) uchar a,b,c; while(t-) /四重循环, 共延时t个1/4拍 for(c=193;c0;c-) for(b=114;b0;b-) for(a=1;a0;a-); /延时期间, 可进入T1中断去发音 TR1 = 0; /关闭T1, 停止发音/- / 演奏函数 /-void singChar(uchar th,uchar tl,uchar time) /演奏一个音符 TR1=0;t1h = th;t1l = tl; TH1 = th; /控制音调 TL1 = tl; TR1 = 1; /启动T0, 由T0输出方波去发音 songDelay(time); /控制时间长度即 节拍/-3.6 键盘扫描程序设计由于此次键盘只用到四个键,所以无需用到翻转扫描等键盘扫描方法,只需逐一判定按键是否按下,如果有按键按下,则返回按键码,如果没有按键按下,返回无效码即可。程序如下:/-/ 键盘扫描程序/-uchar getKey() KEYS=0xff;/送高电平if (0 = key1)/是否按下 delay(5);/延时 if (0 = key1) /二次判键是否按下 while(0 = key1); /松手有效 return (1); /返回有效键值 else if (0 = key2) delay(5); if (0 = key2) while(0 = key2); return (2); else if (0 = key3) delay(5); if (0 = key3) while(0 = key3); return (3); else if (0 = key4) delay(5); if (0 = key4) while(0 = key4); return (4); else KEYS = 0xff; return (5); /返回无效码/-3.7 主程序设计由于程序要完成各种不同功能间的切换,所以用到了类似于状态机一样的东西来控制单片机目前工作在何种状态下,以实现不同操作。其主要有START、SHOW_TIME、SET、STOP_WATCH、SET_RING 等五种状态,分别实现系统初始化、显示时间、调整时间、秒表计时、设定闹钟等功能。程序如下:#include#include /包含lcd1602的驱动函数#include /包含关于时间处理的函数#include/包含秒表初始化、开始、停止、清零等相关函数#include/包含带电子音乐、闪灯的闹玲相关函数#include /timer 初始化函数#define uchar unsigned char#define uint unsigned int#define START 1;/状态机状态宏定义#define SHOW_TIME 2;#define SET 3;#define STOP_WATCH 4;#defineSET_RING 5;bit is_sing = 0;sbit speaker = P30;/音乐播放端,接扬声器void main() uchar RING_HOUR = 0,RING_MIN = 0;/存储闹鈡响铃时间uchar k,sing_index,song_time;/主程序用到的相关变量uchar seth,setm;/调时状态下用于临时存储的变量bit is_set_h,is_set_time,is_ring_key_stop = 0;/重要标志位uchar key,state = START;sing_index = 0; while(1)if(1 = state) /START 初始化状态lcdInit();outPrint(Welcome!,0x80);outPrint(Please wait.,0xc0);INT0_Int();INT1_Int();clock_Int();watchInit();is_sing = 0;while(sec 5);writeCom(0x01);state = SHOW_TIME;else if(2 = state)/SHOW_TIME 显时状态key = getKey();if(1 = key)state = SET;writeCom(0x01); /清显示outPrint(Set Time:,0x80); outPrint(New:,0xc4);seth = hour;setm = min;outChar(seth/10,0xc9);outChar(seth%10,0xca);writeData(:);outChar(setm/10,0xcc);outChar(seth%10,0xcd); writeCom(0xca);writeCom(0x0f); /开显示 开光标 光标闪烁is_set_time = 1;is_set_h = 1;else if(isTimeChanged) refreshTime();outPrint(Now Time:,0x80);outPrint(time,0xc4);isTimeChanged = 0;if(RING_HOUR=hour&RING_MIN=min& !is_ring_key_stop )is_sing = 1;elseis_sing = 0; if(4 = key)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 五年级上册道德与法治教学设计-13《探访古代文明》(第二课时) 人教部编版(五四制)
- 中核二三培训考试题及答案解析
- 网络安全培训就业情况课件
- 图层蒙版说课稿-2025-2026学年中职专业课-图形图像处理-计算机类-电子与信息大类
- 网络安全培训发文课件
- 1.1多种多样的区域 教学设计-2024-2025学年高中地理人教版(2019)选择性必修2
- 幼儿安全培训心得课件
- 社工征文比赛活动方案
- 矿区烧烤活动方案
- 幼儿园教学教案设计:不玩塑料袋
- 贵阳出租车驾驶员从业资格证(区域)考试总题库(含答案)
- 2023年中国银行信息科技运营中心招聘考试真题
- 第4课 用联系的观点看问题 第一框
- 教师节师德演讲师者以德而耕师德的践行与提升课件
- Z20名校联盟(浙江省名校新高考研究联盟)2025届高三第一次联考 物理试卷(含答案详解)
- 胖东来运营管理-管理人员规划
- 幽门螺杆菌知识健康讲座
- 哈尔滨建筑课件
- 中学生英才计划面试常见问题
- 奶油风家装方案
- 微波与卫星通信(第二版)微波通信系统设计
评论
0/150
提交评论