已阅读5页,还剩106页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉纺织大学电子与电气工程学院 电子91班单片机液晶lcd时钟 摘 要我们设计的lcd时钟温度系统是由中央控制器、温度检测器、时钟系统、报警系统,显示器及键盘部分组成。控制器采用单片机at89c52,温度检测部分采用ds18b20温度传感器,时钟系统用时钟芯片ds1302,用lcd液晶12864作为显示器,用蜂鸣器及发光二极管构成声光报警器。单片机通过时钟芯片ds1302获取时间数据,对数据处理后显示时间;温度传感器ds18b20采集温度信号送该给单片机处理;单片机再把时间数据和温度数据送液晶显示器12864f显示,12864f还可以显示汉字;键盘是用来调时和温度查询的。关键字:单片机 lcd液晶 ds18b20 ds1302 12864f一、 引言随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。本设计是数据采集及处理,键盘控制,显示系统及报警系统与单片机有效结合,本设计是通过在“单片机原理及应用”课堂上学习的知识的综合应用,以及查阅资料,培养一种自学的能力。并且引导一种创新的思维,把学到的知识应用到日常生活当中。在设计的过程中,不断的学习,思考和同学间的相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合。全能提高个人系统开发的综合能力,开拓了思维,为今后能在相应工作岗位上的工作打下了坚实的基础。二、方案设计及方案论证1.时钟温度的总体设计思路按照系统的设计功能要求,本时钟温度系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟、温度的调整及显示。获得时钟温度数据信息,单片机对其进行一系列的处理,最后通过液晶显示出来。2.时钟温度系统方案论证2.1时钟系统方案选择方案1:通过单片机内部的定时器/计数器,用软件实现,直接用单片机的定时器编程以实现时钟;方案2:用专门的时钟芯片实现时钟的记时,再把时间数据送入单片机,由单片机控制显示。虽然用软件实现时钟硬件线路简单,但是程序运行的每一步都需要时间,多一步或少一步程序都会影响记时的准确度,对定时器定时也不是十分准确,时钟精度很低,对于我们实现所需要的功能造成软件编程非常复杂。用专用时钟芯片硬件成本相对较高,但它的精度很高,软件编程很简单。综上所述,选择方案2。2.2单片机的选择对于单片机的选择,如果用8031系列,由于它没有内部ram,系统又需要大量内存存储数据,因而不可用;51系列单片机的rom为4k,对于我们设计的系统可能有点小;54系列单片机与51系列的结构一样,而rom扩大为16k,对我们设计系统提供充足的空间进行功能的扩展。再有51系列单片机与52系列的单片机价格差不多。因此,我们选择52系列的单片机。 2.3 显示系统的方案比较 方案1:用数码管或led显示。 方案2:用液晶1602显示。方案3:用液晶12864显示。 时钟和温度的显示可以用数码管或led,而且价格便宜。但是数码管的只能显示简单的设计的系统,与我们设计要求也不相符。有很多东西需要显示,还是用显示功能更好的液晶显示器比较好,它能显示更多的数据,用1602液晶显示数据有限,显示数据的可读性不好,用可以显示汉字的12864液晶显示器还可以增加显示信息的可读性,让人看起来会很方便。 2.4 报警系统的方案比较 方案1:用长鸣的蜂鸣器实现闹钟铃声及温度超限报警。 方案2:用喇叭加语音芯片实现闹钟铃声及温度超限报警。 用喇叭加语音芯片成本很高,但声音还不错,再有喇叭体积庞大。用蜂鸣器,成本低,电路结构简单,而且体积小。限于设计所需要的功能,用蜂鸣器是最佳选择。所以我们采用方案1.2.5 温度系统方案选择方案1:用热敏电阻等测温元件测出电压,再转换成对应的温度。需要比较多的外部元件支持,且硬件电路复杂,制作成本相对较高。方案2:用ds18b20直接测温。ds18b20温度传感器是美国dallas半导体公司最新推出的一种改进型智能温度传感器,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。经比较,我们选择方案2。温度实现只能通过外部的温度传感器来实现。经上网查阅及市场考察,ds18b20体积小,只有3只脚,电路接法简单。内部含有寄存器为我们设计实现上下限报警功能提供保障。精度为0.5c,也符合我们设计的要求。ds18b20也是我们通常使用的型号,因此温度传感器用ds18b20。2.6 键盘控制方案选择方案1:购买集成键盘,采用矩阵形式连接。方案2:购买单个复位开关做成键盘。虽然集成键盘美观,与单片机的接口少,但是它的成本比较高。单片机的io口对于我们的设计绰绰有余。通常我们选用价格便宜单个复位开关做成键盘。3. .时钟温度系统总体设计初步确定设计系统由单片机主控模块、时钟模块、测温模块、报警模块、显示模块、键盘接口模块共6个模块组成,电路系统框图如图(1)所示。 主控器件at89r54db1820 温度采集系统ds1320时间采集系统12864显示系统蜂鸣器led报警系统键盘控制系统二硬件设计部分1 单片机最小系统电路设计1.1 单片机芯片选择单片机采用52系列单片机。由atmel公司生产的at89c52是一种低功耗、高性能cmos8位微控制器,具有8k 在系统可编程flash 存储器。使用atmel 公司高密度非易失性存储器技术制造,与工业80c51 产品指令和引脚完全兼容。在单芯片上,拥有灵巧的8 位cpu 和在线系统可编程flash,使得at89c52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。at89c52具有以下标准功能: 8k字节flash,256字节ram,32 位i/o 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。空闲模式下,cpu停止工作,允许ram、定时器/计数器、串口、中断继续工作。掉电保护方式下,ram内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。而且,它还具有一个看门狗(wdt)定时/计数器,如果程序没有正常工作,就会强制整个系统复位,还可以在程序陷入死循环的时候,让单片机复位而不用整个系统断电,从而保护你的硬件电路。at89c52有40个引脚,32个外部双向输入/输出(i/o)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,片上flash允许程序存储器在系统可编程,亦适于常规编程器。其将通用的微处理器和flash存储器结合在一起,特别是可反复擦写的flash存储器可有效地降低开发成本。其芯片外观及引脚图如下: 图1.1_1 图1.1_21.2 单片机管脚说明vcc:供电电压。gnd:接地。p0口:p0口为一个8位漏级开路双向i/o口,每脚可吸收8ttl门流。当p1口的管脚第一次写1时,被定义为高阻输入。p0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在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口也可作为at89c52的一些特殊功能口,如下表所示:管脚备选功能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)。xtal1:反向振荡放大器的输入及内部时钟工作电路的输入。xtal2:来自反向振荡器的输出。1.3 单片机最小系统 单片机最小系统主要由复位电路,晶振电路,电源等几部分组成。1) 复位电路复位电路有两种方式:上电复位和按钮复位,我们主要用按钮复位方式。如下图所示: 2) 晶振电路晶振电路原理图如3-2:3-2晶振模块原理图 选取原则:电容选取30pf,晶振为12mhz。3) 电源at89c52单片机的供电电源是5v的直流电,为了使电源稳定使用了7805稳压芯片是电源稳定,主电源电路如下:考虑到时钟的供电问题,应用了主电源和备用电源方案,当主电源掉电之后,备用电源启动,使时钟继续工作,电路如下:4) ea非/vpp 脚我们没有用外部扩展rom,因此ea非/vpp为高电平,即接+5v电源或是悬空,为了简化电路将这个引脚悬空。2 时钟系统电路设计2.1 时钟芯片选择我们采用具有涓细电流充电能力的低功耗实时时钟电路ds1302。它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能。它采用主电源和备用电源双电源供电。它的工作电压范围2.05.5v,在2.2v时,小于300na。它内部含有31个字节的静态ram,可提供用户访问。 ds1302可以对年、月、日、周日、时、分、秒进行计时,可以达到我们设计的基本的要求。内部的寄存器为我们调时,闹钟定时提供了寄存空间。备用用电源也实现了当系统断电后,时钟仍然可以保持。而且它是串行接口,与单片机通信所需要的接口少。不像ds12887等芯片并行通信需要很多io口。2.2 ds1302管脚及寄存器说明(1)ds1302的引脚排列vcc1为后备电源,vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。ds1302由vcc1或vcc2两者中的较大者供电。当vcc2大于vcc10.2v时,vcc2给ds1302供电。当vcc2小于vcc1时,ds1302由vcc1供电。因此,我们vcc1用3v的纽扣电池作为备用电源,vcc2用系统电源作为主电源。x1和x2是振荡源,外接32.768khz晶振。rst是复位/片选线,通过把rst输入驱动置高电平来启动所有的数据传送。rst输入有两种功能:首先,rst接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,rst提供终止单字节或多字节数据的传送手段。当rst为高电平时,所有的数据传送被初始化,允许对ds1302进行操作。如果在传送过程中rst置为低电平,则会终止此次数据传送,i/o引脚变为高阻态。上电运行时,在vcc2.5v之前,rst必须保持低电平。只有在sclk为低电平时,才能将rst置为高电平。i/o为串行数据输入输出端(双向)。sclk为时钟输入端。 (2)ds1302的寄存器说明ds1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为bcd码形式。此外,ds1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与ram相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 ds1302与ram相关的寄存器分为两类:一类是单个ram单元,共31个,每个单元组态为一个8位的字节,其命令控制字为c0hfdh,其中奇数为读操作,偶数为写操作;另一类为突发方式下的ram寄存器,此方式下可一次性读写所有的ram的31个字节,命令控制字为feh(写)、ffh(读)。 2.3 ds1302时钟电路ds1302时钟电路如下图所示:ds1302与单片机的连接仅需3条线:时钟线sclk、数据线i/o和复位线rst。时钟线sclk与p2.4相连,数据线i/o与p2.5相连,复位线rst与p2.6相连。由于ds1302是靠涓细电流充电来实现串行输入输出的,因此,在sclk 、i/o、 rst线上要加上拉电阻,其中,它们的电流应该在500u1ma之间,若电源为5v,则r约为5k,因此,我们的电阻r=4.7k。但是经过查阅有关资料知道如果ds1302不是接p0口可以不接上拉电阻,为了节省成本,所以没有接上拉电阻。 在单电源与电池供电系统中,vcc1提供低电源并提供低功率的备用电源。vcc2提供高电源作为芯片供电的主电源。因此,这里vcc1用3v纽扣电池,vcc2用5v的系统电源。晶振为32.768khz接入x1、x2引脚。3 温度系统电路 3.1 温度芯片的选择温度实现只能通过外部的温度传感器来实现。经上网查阅资料及市场考察,ds18b20体积小,只有3只脚,电路接法简单。它能够直接读出被测温度。内部含有寄存器为我们设计实现上下限报警功能提供保障。用户可定义的非易失性温度报警设置;报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;精度为0.5c,也符合我们设计的要求。ds18b20也是我们通常使用的型号,因此温度传感器用ds18b20。3.2 ds18b20内部结构描述ds18b20温度传感器的内部存储器还包括一个高速暂存ram和一个非易失性的可电擦除的eeram。高速暂存ram的结构为8个字节的存储器,结构如图4.1所示。头两个字节包含测得的温度信息,第三和第四字节是th和tl的拷贝,是易失的,每次上电复位时被刷新。第五个字节为配置寄存器,它的内容用于确定温度值的数字转换分辨率。ds18b20工作时按此寄存器中的分辨率将温度转换为相应精度的数值。该字节各位的定义如图4.2所示。低5位一直为1,tm是测试模式位,用于设置ds18b20在工作模式还是在测试模式。温度 lsb温度 msbth 用户字节1tl 用户字节2配置寄存器保留保留保留 crc图 4.1高速暂存ram结构图1字节2字节 3字节 4字节 5字节6字节 7字节 8字节9字节eeromth 用户字节1tl 用户字节2tmr1r011111图 4.2 配置寄存器3.3 ds18b20温度系统电路 ds18b20系统电路如下:ds18b20有两种接法:一是单线接法即只接qt。这种方法应用它内部的寄生电源,因此在qt上要用一个mosfet把i/o线只接拉到电源上。二是从vdd脚加上电源。方法一适合于远距离温度监控,不需要本地电源。而我们只是设计测温系统,选择方法二就行了,还有mosfet极容易烧,我们不用它。vdd接5v电源,vss接地,qt与p3.4相连。4 键盘控制系统设计按键需要4个,分别实现为时间调整、时间的加、时间的减、退出四个功能。用单片机的4个i/o口接收控制信号,其电路图如下:4个按键的一端与地相连,另一端分别与p2.3、p2.2、 p2.1、p2.0相连。这时当按键按下就输入低电平。5 报警电路系统设计报警电路由蜂鸣器、三极管、电阻 、led等构成电路图如下:它们与单片机的接口分别是p2.7。6 液晶显示系统设计6.2 12864液晶显示电路 现在流行低碳生活,节能减排已成为人们处理事情首先想到的问题,所以这个显示的时候背光控制时间为10s左右,同时关背光的时候关掉显示器的电源,降低功耗。三、软硬件调试部分 1) 软件调试 软件调试,我是在keil软件平台和单片机学习板上来完成的。当我写部分程序在keil软件经过调试,开始出现很多错误和警告。通过逐个错误排错及修改。得出下列经验,(1)调用函数最好在头文件中进行申明,主函数写在最后;(2)特别注意一些字母的大小写,一般要用英语文字写,不要用中文汉写,这是最不容易检查的,如我在检查液晶显示程序时,时钟没检查到错误,最后我删掉此行重新写,错误排除了,据我分析可能是中英文变换时出现问题。 经过一系列排错,最后文件没有错误但还有警告。由于c语言中有警告是没关系的,我将hex文件下在到单片机竟显示一些乱码。我有回到文件,经过对警告的分析及上网查阅。将程序稍微修改警告慢慢被排除,最后没有错误和警告了,下载到单片机,发现乱码竟然还出现,还有多个界面叠加显示,里面还有一些乱码。经过分析,叠屏现象是没有对液晶清平所致。于是我又在不同界面程序前加入调用填充空格函数(void clrram_lcd ()),然后又下载,结果与前面一样,崩溃啊!经过几个小时后,无意间我去掉 调用函数前void。结果叠屏现象解决。但是显示还是乱码。谢天谢地啊!有进步! 又经过几天,排错,上网查阅与参考程序对照。最后在void r1302()函数中ds1302inputbyte(ucaddr|0x01);掉了|0x01,加上生成hex文件,下载到单片机中。能够正常显示了。界面的闪烁不能闪烁。呵呵!又进一步! 经过一段时间,我发现界面程序中的a=1与功能设置中a重赋值(a=0)相冲突,最后将if()语句中a=1改为a=0 。相应的问题也解决了。 最后对程序进行相应的扩展完善,由于按键不灵敏我们加上声音程序。加上另一个闹钟实现设计需求。 通过单片机学习板对照,程序基本实现我所预期的要求,但是界面显示闹钟1,闹钟2闪烁时,液晶竟然出现显示淡化。据分析,可能使程序的问题。由于这部分显示复杂,用了多个if语句,可能出现语句冗余。我只有请教高手啰! 2)硬件调试 硬件调试,我们用万用表,单片机学习板来完成的。首先,我们调试lcd1602显示。我将液晶显示程序下载到单片机内,连好所有的线,通电后,观察显示结果。唉!液晶竟然不显示。我们用万用表测试各连线是否导通及某些点的电压,发现没问题。最后在网上发现我的p0口竟然没接上拉电阻,通过计算电阻应该去5k至10k,我们选用4.7k的电阻。由于没准备多的电阻,我在以前买的电阻找到了4.7k的电阻。开始布局没有为上拉电阻留下空间,我们在单片机插槽里插电阻,解决一些连线的复杂度。后来在调试液晶能够显示了。 然后,我们调试ds1302时钟芯片。连上按键模块,液晶显示模块,单片机最小系统,时钟系统,温度系统,连接所有线,通上电源后,我们观察到液晶显示 20858585 85:85:85 20.125c 温度能正常显示,时钟不能正常显示。我们还是用万用表检查所用线路,对照电路原理图,最后发现时钟上拉电阻没焊上电源。接上电源后,时钟能够正常显示,按键也能控制。 但是温度要求精确到0.5度,我们查阅了大量的资料,发现别人的都只是精确到0.1,并没有精确到0.5的程序可以查考,于是我就在想,我可不可以通过一个有返还值的子函数来实现小数位的数字与5的比较返还0或是5来实现,然后看到c语言上的条件运算符,眼睛突然一亮,可以用条件运算符,这样程序就更简单了,调好程序下载到单片机里,怀着激动的心情接通电源,终于好了,太兴奋了! 整个硬件调试才完成。 虽然整个硬件都以做好了,但是看看我们的作品,那叫个惨不忍睹,上面因为各种修改,线路连的很不好看,于是我们换了一块板子,经过精心的设计各种器件的放置地方,然后为了尽量使板子布线美观,我们又修改了各种器件的接口,使焊好的板子尽量美观,使布线尽量的少,做好后的实物图如下: 五总结与体会在拿到课题以后,我们小组先召开了一个小会议,讨论整个过程如何实施及如何分工,以及选择哪个课题进行设计。在初步方案确定好后,我们开始研究所需的器材,在列出初稿后,我们小组挑了一个下午去广播屯买器材,并在电子市场请教老板器材选取等问题。老板很细心的边挑边帮我们讲解有关的知识,让我们受益匪浅。经过一下午的时间,买好器材后便进入了设计阶段。经过将近一个月的设计,反复地讨论各个环节,反复调试,反复模拟仿真,终于完成lcd液晶时钟设计。虽然达到设计要求,并完成了一定发挥部分,但单片机的资源并没完全得到应用。但毕竟这是我们第一次设计,能把实物做出来,我们心底还是很高兴的。这是不用单片机学习板,自己动手制作出来的作品。在本次设计的过程中,我发现很多的问题,首先最大的问题就是单片机课程我们并没有开始学,因此要完成这么繁琐的编程与设计,我们不得不自己先自学单片机。在此我们小组先花了近一周时间自学单片机,通过书本和视频的学习,对单片机有了初步的掌握以后再开始着手设计。单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法。这次设计是液晶,单片机,键盘控制的综合应用,其间,遇到许多困难。特别到最后,程序在protues软件模拟当中能正常工作,等做出实物来后显示屏居然没有显示。反复找,反复请教老师与学长都没解决,以致一度都想放弃。但最终还是坚持下来,并成功将问题解决。从这次的课程设计中,我真真正正的意识到,在写程序时,逻辑思维要清晰,要有耐心。在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次设计中的最大收获。 虽然我们设计的时钟没有实现温度上下限报警的功能,但是我们不断的改进我们的程序,终于经过一个多月的努力我们的时钟做好了,它可以显示年月日星期温度,可以设置两个闹铃,且闹铃的铃声不是单调的“滴滴”声,而是爱情转移等。可以实现掉电保护,具有贪睡功能,且贪睡时间可以设置,具有跑表功能,可以实现背光长亮或是自动控制背光亮的时间。参考文献:1.郭天祥单片机学习板配套资料2.c语言程序设计 尹业安,白燕主编 国防科技大学出版社3.单片机原理与应用及c51程序设计 谢维成 杨加国 主编 清华大学出版社lcd液晶时钟设计原理电路图#include#include#define soundspace 3/4 unsigned char sec,min,hour,day,month,year,cen,week; /秒,分,小时,公历日期,月份,年份,世纪,星期unsigned char lunarmonth,lunarday,lunaryear; /阴历日期,月份,年份bit c_moon; /大小月标志位 bit cenbit=0; /世纪标志,为1,则表示20世纪,为0,则表示21世纪 bit w; /调时状态标志位unsigned char next,flag=0,light_flag=0,tem_flag=0;int count=0;/*定义lcd12864的数据线和相关函数*/sbit lcd_rs=p27; /模式位,低电平输入指令,高电平输入数据sbit lcd_rw=p26; /读写位,低电平读,高电平写sbit lcd_e=p25; /lcd12864使能位,低电平无效,高电平使能sbit lcd_back_light=p24; /背光控制#define lcd_data p0 /lcd12864的8位数据总线,单片机的p0端口void writedatalcd(unsigned char wdlcd); /给lcd12864写数据void writecommandlcd(unsigned char wclcd); /给lcd12864写指令void lcdinit(void); /lcd12864初始化void lcdclear(void); /lcd12864清屏 void checkbusy(void); /忙检测void lcdsendword(unsigned char *p); /向lcd发送一个字符串void lcdtestword(bit i,unsigned char word);void displaysec(void); /在lcd上显示秒钟void displaymin(void); /在lcd上显示分钟void displayhour(void); /在lcd上显示小时void displayday(void); /在lcd上显示日期void displayyear(void); /在lcd上显示年份void displaymonth(void); /在lcd上显示月份 void displayweek(void); /在lcd上显示星期void holidays(void); /在lcd上显示节日/*定义时间芯片ds1302的数据线及相关函数*/sbit ds1302_clk=p10; /ds1302的时钟信号线 sbit ds1302_io=p11; /ds1302的数据端口线sbit ds1302_rst=p12; /ds1302的片选信号线void writeds1302byte(unsigned char temp); /给ds1302写一个字节void writeds1302(unsigned char address,unsigned char dat); /给ds1302写入时间,先确定地址,再确定要写入的数据unsigned char readds1302(unsigned char address); /读取ds1302的数据void initds1302();/*定义温度传感器ds18b20的数据线和相关函数*/sbit ds18b20=p16; /ds18b20的数据线int temp;void ds18b20init(void); /ds18b20初始化函数int gettemp(void);void tempwritebyte(unsigned char dat);unsigned char tempread(void);bit tempreadbit(void); void delayb(unsigned int count);void tempchange(void);void conversion(bit cen_m,unsigned char year,unsigned char month,unsigned char day);bit getmoonday(unsigned char month_p,unsigned int tableaddr);void displayshengxiao(void);void delayms(unsigned int a);void delay(unsigned char num);/*定义开关按键,及蜂鸣器的数据线*/sbit setkey=p23; /按键功能:设置sbit surekey=p20; /按键功能:确认sbit pluskey=p22; /按键功能:加sbit reducekey=p21; /按键功能:减void key(void);#define fosc 12000000 /定义晶振频率12000000hz#define jiepai 3/4 /定义普通音符演奏的长度分率,/每4分音符间隔sbit speaker=p14; /定义输出管脚unsigned int code fretab12=262,277,294,311,330,349,369,392,415,440,466,494; /c调歌曲12个半音的频率unsigned char code posittab7=0,2,4,5,7,9,11; /17在频率表中的位置unsigned char code lengthtab7=1,2,4,8,16,32,64; unsigned char soundtempth0,soundtemptl0; /音符定时器初值暂存unsigned char soundtempth1,soundtemptl1; /音长定时器初值暂存void speakerdidi(void);void speakerdidi(void) unsigned char i; for(i=0;i3;i+) speaker=0; delayms(100); speaker=1; delayms(100); delayms(500); for(i=0;i3;i+) speaker=0; delayms(100); speaker=1; delayms(100); delayms(500); for(i=0;i2;i+) speaker=0; delayms(500); speaker=1; delayms(100); void initialsound(void) speaker=1; soundtempth1=(65535-(1/1200)*fosc)/256; /计算tl1应装入的初值 (10ms的初装值) soundtemptl1=(65535-(1/1200)*fosc)%256; /计算th1应装入的初值 th1=soundtempth1; /装入初值 tl1=soundtemptl1; tmod|=0x11; /定时器1、2都工作在定时器模式,工作方式1 et0=1; /定时器0开中断 et1=0; /定时器1关中断 tr0=0; /不启动定时器 tr1=0; /不启动定时器 ea=1; /开启cpu中断void speakertimer(void) interrupt 1 /音符发生中断 speaker=!speaker; /取反 th0=soundtempth0; /定时器0重新装初值 tl0=soundtemptl0;void playmusic(unsigned char *soundname,unsigned char diaohao,unsigned shengjiang,unsigned int speed) /soundname为演奏歌曲歌名 diaohao是指乐曲升多少个半音演奏 /shengjiang 1:降八度, 2:不升不降, 3:升八度; speed歌曲演奏速度 unsigned int newfretab12; /新的频率表 unsigned char i,j; unsigned int point,yinfuchang,yipai,ldiv1,ldiv2,sifenyifu,currentfre,tempcounter,soundlength; /point 指针索引值 ldiv 音符演奏的长度(多少个10ms) yipai 1分音符的长度(几个10ms)即一个节拍 /sifenyifu 4分音符的长度 currentfre 查出对应音符的频率 soundlength歌曲长度 tempcounter计算计数器初值 unsigned char yindiao,length,yinfu,shengban,gaodi,slen,leixing,fudian; /yindiao音调 length音长 yinfu音符 gaodi高低音 shengban是否升半 leixing音符类型(0普通1连音2顿音) for(i=0;i11) j=j-12; newfretabi=fretabj*2; /频率翻倍速 else newfretabi=fretabj; if(shengjiang=1) newfretabi=2; /如果是降调 则频率除以2 else if(shengjiang=3) newfretabi=2; /如果是升调 则频率翻倍速 soundlength=0; while(soundnamesoundlength!=0x00) /计算歌曲长度 以0x00结尾 soundlength+=2; point=0; yindiao=soundnamepoint; /第一个字节为音符音调 length=soundnamepoint+1; /第二个字节为音符时值 yipai=12000/speed; /算出一个节拍的长度(单位是10ms) sifenyifu=yipai/4; /算出4分音符的长度 si
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 晋教版七年级地理下册-第八章-认识亚洲-单元检测试题
- 农业技术推广体系效率评价研究意义
- 雹灾救援要落实受伤人员救治安全防范措施
- 家庭洗衣机槽清洗指南
- SJG 229-2026 内掺自修复防水混凝土应用技术规程
- 2026年天津市宁河区部分学校中考英语二模试卷(含详细答案解析)
- 2026年上半年教师资格考试小学教育教学知识与能力测试试卷与参考答案
- 2026年机动车智能钥匙系统维修技术考试题库
- 2026年海南省纪委监委机关公开遴选公务员考试(职位业务水平测试)全真冲刺试题及答案
- 2026初级会计职称考试真题模拟卷(附答案解析)
- DB5301∕T 23-2019 园林绿化工程验收规范
- 肺功能进修生汇报课件
- GJB827B--2020军事设施建设费用定额
- -2025年浙江省衢州市开化县重点高中自主招生 数学 试卷 (学生版+解析版)
- 导演思维基础知识培训课件
- 走出奥米勒斯城的人
- 碳排放核算员模拟考试题及答案(五)
- 2024-2025学年辽宁省大连市甘井子区八年级下学期期末数学检测试卷
- 2025年小学科学教师招聘考试测试卷及参考答案(共三套)
- soap病历培训课件
- 塔吊安装、顶升、附着及拆卸培训讲义培训课件
评论
0/150
提交评论