




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 毕业(论文)说明书题 目: 系 别: 专 业: 指导老师:学生姓名: 学 号: 题目类型: 理论研究 实验研究 工程设计 工程技术研究 软件开发2014年 7 月 18日一毕业设计(论文)内容与要求一、主要研究内容1、8051单片机硬件结构。2、C语言程序设计基础内容。3、单片机C语言程序设计的方法。4、DS18B20温度传感器的使用方法。5、DS1302时钟芯片的用法。6、12864LCD液晶屏的编程使用方法。二、要求1、能够以指针的形式在LCD12864上显示当前时间的小时和分钟和秒。2、能够以数字加汉字的形式在LCD12864上显示当前时间的小时和分钟和秒。3、能够以数字加汉字的形式在
2、LCD12864上显示当前年月日。4、能够以数字加汉字的形式在LCD12864上显示当前星期。5、时间采用时钟芯片DS1302控制。6、温度采用DS18B20温度传感器检测当前温度。7、所有功能在LCD12864当中同步显示。8、采用AT89S52或者STC89C52RC单片机控制。三、引言随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。本设计是数据采集及处理,显示系统与单片机有效结合,本设计是通过在“单片机原理及应用”课堂上学习
3、的知识的综合应用,以及查阅资料,培养一种自学的能力。并且引导一种创新的思维,把学到的知识应用到日常生活当中。在设计的过程中,不断的学习,思考和同学间的相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合。全能提高个人系统开发的综合能力,开拓了思维,为今后能在相应工作岗位上的工作打下了坚实的基础。四、方案设计及方案论证1.时钟温度的总体设计思路按照系统的设计功能要求,本时钟温度系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合ds1302和ds18b20来控制时钟和温度的调整显示。获得
4、时钟温度数据信息,单片机对其进行一系列的处理,最后通过液晶显示出来。2222、时钟温度系统方案论证2.12.12.12.1时钟系统方案选择方案1111:通过单片机内部的定时器/计数器,用软件实现,直接用单片机的定时器编程以实现时钟;方案2222:用专门的时钟芯片(DS1302)实现时钟的记时,再把时间数据送入单片机,由单片机控制显示。虽然用软件实现时钟硬件线路简单,但是程序运行的每一步都需要时间,多一步或少一步程序都会影响记时的准确度,对定时器定时也不是十分准确,时钟精度很低,对于我们实现所需要的功能造成软件编程非常复杂。用专用时钟芯片硬件成本相对较高,但它的精度很高,软件编程很简单。综上所述
5、,选择方案2。2.22.22.22.2单片机的选择对于单片机的选择,如果用8031系列,由于它没有内部RAM,系统又需要大量内存存储数据,因而不可用;51系列单片机的ROM为4K,对于我们设计的系统可能有点小;52系列单片机与51系列的结构一样,而ROM扩大为8K,对我们设计系统提供充足的空间进行功能的扩展。再有51系列单片机与52系列的单片机价格差不多。因此,我们选择52系列的单片机。2.32.32.32.3显示系统的方案比较方案1:用数码管或点阵LED显示。方案2:用液晶1602显示。方案3:用液晶12864显示。时钟和温度的显示可以用数码管或LED,而且价格便宜。但是数码管的只能显示简单
6、的设计的系统,与我们设计要求也不相符。有很多东西需要显示,还是用显示功能更好的液晶显示器比较好,它能显示更多的数据,用1602液晶显示数据有限,1602不能够显示指针时钟,只能够显示一些基本的西文字符,显示数据的可读性不好,用可以显示汉字的12864液晶显示器还可以增加显示信息的可读性,用12864的绘图功能即可绘制出指针时钟的框架,至于指针的转动则才用12864加ds1302同步控制,让人看起来会很方便。虽然它们在价格上差距很大,但是1602不能够实现我们的要求,12864.是我们唯一的选择。2.42.42.42.4温度系统方案选择方案1:用热敏电阻等测温元件测出电压,再转换成对应的温度。需
7、要比较多的外部元件(A/D转换)支持,且硬件电路复杂,制作成本相对较高。方案2:用DS18B20直接测温。DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。经比较,我们选择方案2。温度实现只能通过外部的温度传感器来实现。经上网查阅及市场考察,DS18b20体积小,只有3只脚,电路接法简单。内部含有寄存器为我们设计实现上下限报警功能提供保障。精度为0.5C,也符合我们设计的要求。DS18B20也是我们通常使用的型号,因此温度传感器用DS18B20。五、时钟温度系统总体设计初步
8、确定设计系统由单片机主控模块、时钟模块ds102、测温模块ds18b20、显示模块12864、共5个模块组成,电路系统框图。如下图所示六、硬件设计部分1、单片机最小系统电路设计1.1单片机芯片选择单片机采用52系列单片机。由ATMEL公司生产的AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。在单芯片上,拥有灵巧的8位CPU和在线系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。AT89S52具有以下标准功能:8k字节Fl
9、ash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。而且,它还具有一个看门狗(WDT)定时/计数器,如果程序没有正常工作,就会强制整个系统复位,还可以在程序陷入死循环的时候,让单片机复位而不用整个系统断电,从而保护你的硬件电路。AT89S52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个
10、16位可编程定时计数器,2个全双工串行通信口,片上Flash允许程序存储器在系统可编程,亦适于常规编程器。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写图1.1_1图1.1_2的Flash存储器可有效地降低开发成本.其芯片外观及引脚图如1.1_2:1.2单片机管脚说明VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉
11、高。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”时
12、,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89S52的一些特殊功能口,如下表所示:管脚备选功能P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2/INT0(外部中断0)P3.3/INT1(外部中断1)P3.4T0(记时器0外部输入)P3.
13、5T1(记时器1外部输入)P3.6/WR(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,AL
14、E只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工
15、作电路的输入。XTAL2:来自反向振荡器的输出。1.3单片机最小系统单片机最小系统主要由复位电路,晶振电路,电源等几部分组成。1)复位电路复位电路有两种方式:上电复位和按钮复位,我们主要用按钮复位方式。如下图所示:2)晶振电路晶振电路原理图如3-2:3-2晶振模块原理图选取原则:电容选取22pF,晶振为12MHz。3)电源AT89S52单片机的供电电源是5V的直流电。4)EA非/Vpp脚我们没有用外部扩展ROM,因此EA非/Vpp为高电平,即接+5V电源。2、时钟系统电路设计2.1时钟芯片选择我们采用具有涓细电流充电能力的低功耗实时时钟电路DS1302。它可以对年、月、日、周日、时、分、秒进行
16、计时,且具有闰年补偿等多种功能。它采用主电源和备用电源双电源供电。它的工作电压范围2.05.5V,在2.2V时,小于300nA。它内部含有31个字节的静态RAM,可提供用户访问。DS1302可以对年、月、日、周日、时、分、秒进行计时,可以达到我们设计的基本的要求。内部的寄存器为我们调时,闹钟定时提供了寄存空间。备用用电源也实现了当系统断电后,时钟仍然可以保持。而且它是串行接口,与单片机通信所需要的接口少。不像DS12887等芯片并行通信需要很多IO口。2.2DS1302管脚及寄存器说明1、DS1302的引脚排列Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。
17、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置为低电
18、平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向)。SCLK为时钟输入端。2、DS1302的寄存器说明DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令
19、控制字为C0HFDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。2.3DS1302时钟电路DS1302时钟电路如下图所示:DS1302与单片机的连接仅需3条线:时钟线SCLK、数据线I/O和复位线RST。时钟线SCLK与P1.4相连,数据线I/O与P1.5相连,复位线RST与P2.2相连。由于DS1302是靠涓细电流充电来实现串行输入输出的,因此,在SCLK、I/O、RST线上要加上拉电阻,其中,它们的电流应该在500u1mA之间,若电源为5V,则R约为5k,因此,我们的电阻R=4.7
20、K。在单电源与电池供电系统中,vcc1提供低电源并提供低功率的备用电源。Vcc2提供高电源作为芯片供电的主电源。因此,这里vcc1用10uf的电容做电池,vcc2用5V的系统电源。晶振为32.768KHz接入X1、X2引脚。3、温度系统电路 3.1温度芯片的选择温度实现只能通过外部的温度传感器来实现。经上网查阅资料及市场考察,DS18b20体积小,只有3只脚,电路接法简单。它能够直接读出被测温度。内部含有寄存器为我们设计实现上下限报警功能提供保障。用户可定义的非易失性温度报警设置;报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;精度为0.5C,也符合我们设计的要求。DS18B20
21、也是我们通常使用的型号,因此温度传感器用DS18B20。3.2DS18B20内部结构描述DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8个字节的存储器,结构如图4.1所示。头两个字节包含测得的温度信息,第三和第四字节是TH和TL的拷贝,是易失的,每次上电复位时被刷新。第五个字节为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时按此寄存器中的分辨率将温度转换为相应精度的数值。该字节各位的定义如图4.2所示。低5位一直为1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。3.3DS1
22、8b20温度系统电路DS18B20系统电路如下:DS18B20有两种接法:一是单线接法即只接QT。这种方法应用它内部的寄生电源,因此在QT上要用一个MOSFET把I/O线只接拉到电源上。二是从vdd脚加上电源。方法一适合于远距离温度监控,不需要本地电源。而我们只是设计测温系统,选择方法二就行了,还有MOSFET极容TMR1R011111图4.2配置寄存器温度LSB温度MSBTH用户字节1TL用户字节2配置寄存器保留保留保留CRC图4.1高速暂存RAM结构图1字节2字节3字节4字节5字节6字节7字节8字节9字节EEROMTH用户字节1TL用户字节2易烧,我们不用它。Vdd接5V电源,vss接地,
23、QT与P3.5相连。因为DS18B20的工作电流约为1MA,因此Qt端还要加上拉电阻为其提供电流。若用5V电源,则R=5/1MA=5k。R取4.7K。6.112864F简介带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为12864,内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示84行1616点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的
24、图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。6.212864F引脚说明管脚号管脚名称电平管脚功能描述1VSS0V电源地2VCC3.0+5V电源正3V0-对比度(亮度)调整4RS(CS)H/LRS=“H”,表示DB7DB0为显示数据RS=“L”,表示DB7DB0为显示指令数据5R/W(SIDH/LR/W=“H”,E=“H”,数据被读到DB7DB0)R/W=“L”,E=“HL”,DB7DB0的数据被写到IR或DR6E(SCLK)H/L使能信号7DB0H/L三态数据线8DB1H/L三态数据线9DB2H/L三态数据线10DB3H/L三
25、态数据线11DB4H/L三态数据线12DB5H/L三态数据线13DB6H/L三态数据线14DB7H/L三态数据线15PSBH/LH:8位或4位并口方式,L:串口方式(见注释1)16NC-空脚17/RESETH/L复位端,低电平有效(见注释2)18VOUT-LCD驱动电压输出端19AVDD背光源正端(+5V)(见注释3)20KVSS背光源负端(见注释3)12864F液晶显示电路设计中采用LCD12864液晶显示。它一般串口、并口两种方式显示,而我们一般采用并口显示。12864的4、5、6、15、17脚分别与单片机的P3.0P3.4相连。714脚与单片机的P0口相连。1、20号脚接地,2号脚接电源
26、,19号脚背光灯正端串一个电阻与电源相连,电阻起限流的作用,我们取R=10K。3号脚是对比度(亮度)调整,这里要用一个滑动变阻器来调整亮度,这里我们取电位器大小为10K。LCD12864显示电路如下图所示:总体硬件系统设计总体硬件设计框图如下本系统的软件系统主要分为主程序、时钟程序、温度程序、液晶显示程序。#includereg52.h#includeintrins.h#includemath.h#include#defineio_LCD12864_DATAPORTP0#defineucharunsignedchar#defineuintunsignedint#defineshujuio_LC
27、D12864_RS=1;#definezhilinio_LCD12864_RS=0;#defineduio_LCD12864_RW=1;#definexieio_LCD12864_RW=0;#defineSET_ENio_LCD12864_EN=1;#defineCLR_ENio_LCD12864_EN=0;sbitP25=P25;sbitP36=P36;sbitP37=P37;sbitDQ=P35;/定义DS18B20通信端口sbitT_CLK=P14;/*实时时钟时钟线引脚*/sbitT_IO=P15;/*实时时钟数据线引脚*/sbitT_RST=P22;/*实时时钟复位线引脚*/sbit
28、ACC0=ACC0;sbitACC7=ACC7;sbitio_LCD12864_RS=P17;/位定义12864通信端口sbitio_LCD12864_RW=P16;sbitio_LCD12864_EN=P23;ucharcodemun_to_char=0123456789;/*数字转换为ASCII字符码*/ucharcodeWeek1_to_char=一;ucharcodeWeek2_to_char=二;ucharcodeWeek3_to_char=三;ucharcodeWeek4_to_char=四;ucharcodeWeek5_to_char=五;ucharcodeWeek6_to_ch
29、ar=六;/*星期数字转换为汉字的ASCII码*/ucharcodeWeek7_to_char=日;ucharhanzi_buff1=10/08/23;ucharhanzi_buff2=星期三;ucharhanzi_buff3=12:00:00;ucharhanzi_buff4=温度25.0;uchardatatime_data_buff7=0x30,0x24,0x13,0x23,0x08,0x03,0x10;/格式为:秒分时日月星期年DATA为直接访问内部数据存储器,访问速度最快floatcodepointer_mark602=/时钟刻度处的坐标,共60个,采用浮点形,指针坐标运算的时候更加
30、精确31,4,34,2,37,2,40,2,43,2,46,4,49,4,52,7,55,10,58,13,59,16,61,19,61,22,61,25,61,28,59,31,61,34,61,37,61,40,61,43,59,46,59,49,56,52,53,55,50,58,46,59,43,61,40,61,37,61,34,61,31,59,28,61,25,61,22,61,19,61,16,59,13,58,10,55,7,52,4,49,4,46,2,43,2,40,2,37,2,34,4,31,2,28,2,25,2,22,2,19,4,16,4,13,7,10,10,
31、7,13,4,16,4,19,2,22,2,25,2,28,2;voidv_DelayMs_f(unsignedintnDelay)/用于12864,DS1302延时unsignedinti;for(;nDelay0;nDelay-)for(i=125;i0;i-);/以下是DS18B20驱动程序/延时函数voiddelay(unsignedinti)while(i-);/DS18B20初始化函数Init_DS18B20(void)unsignedcharx=0;DQ=1;/DQ复位delay(8);/稍做延时DQ=0;/单片机将DQ拉低delay(80);/精确延时大于480usDQ=1;/
32、拉高总线delay(14);x=DQ;/稍做延时后如果x=0则初始化成功x=1则初始化失败delay(20);/DS18B20读一个字节ReadOneChar(void)unsignedchari=0;unsignedchardat=0;for(i=8;i0;i-)DQ=0;/给脉冲信号dat=1;DQ=1;/给脉冲信号if(DQ)dat|=0x80;delay(4);return(dat);/DS18B20写一个字节WriteOneChar(unsignedchardat)unsignedchari=0;for(i=8;i0;i-)DQ=0;DQ=dat&0x01;delay(5);DQ=1
33、;dat=1;/读取DS18B20温度intReadTemperature(void)unsignedchara=0;unsignedcharb=0;unsignedintt=0;floattt=0;Init_DS18B20();WriteOneChar(0xCC);/跳过读序号列号的操作WriteOneChar(0x44);/启动温度转换Init_DS18B20();WriteOneChar(0xCC);/跳过读序号列号的操作WriteOneChar(0xBE);/读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();b=ReadOneChar();t=b;t0;
34、i-)T_IO=ACC0;/*相当于汇编中的RRC*/T_CLK=1;T_CLK=0;ACC=ACC1;/*函数名:RTOutputByte()功能:实时时钟读取一字节说明:从DS1302读取1Byte数据(内部函数)入口参数:无返回值:ACC设计:zhaojunjie日期:2002-03-19修改:日期:*/ucharRTOutputByte(void)uchari;for(i=8;i0;i-)ACC=ACC1;/*相当于汇编中的RRC*/ACC7=T_IO;T_CLK=1;T_CLK=0;return(ACC);/*函数名:W1302()功能:往DS1302写入数据说明:先写地址,后写命令
35、/数据(内部函数)调用:RTInputByte(),RTOutputByte()入口参数:ucAddr:DS1302地址,ucData:要写的数据返回值:无设计:zhaojunjie日期:2002-03-19修改:日期:*/voidW1302(ucharucAddr,ucharucDa)T_RST=0;T_CLK=0;T_RST=1;RTInputByte(ucAddr);/*地址,命令*/RTInputByte(ucDa);/*写1Byte数据*/T_CLK=1;T_RST=0;/*函数名:R1302()功能:读取DS1302某地址的数据说明:先写地址,后读命令/数据(内部函数)调用:RTI
36、nputByte(),RTOutputByte()入口参数:ucAddr:DS1302地址返回值:ucData:读取的数据设计:zhaojunjie日期:2002-03-19修改:日期:*/ucharR1302(ucharucAddr)ucharucData;T_RST=0;T_CLK=0;T_RST=1;RTInputByte(ucAddr);/*地址,命令*/ucData=RTOutputByte();/*读1Byte数据*/T_CLK=1;T_RST=0;return(ucData);/*函数名:Set1302()功能:设置初始时间说明:先写地址,后读命令/数据(寄存器多字节方式)调用:
37、W1302()入口参数:pClock:设置时钟数据地址格式为:秒分时日月星期年7Byte(BCD码)1B1B1B1B1B1B1B返回值:无设计:zhaojunjie日期:2002-03-19修改:日期:*/voidSet1302(uchar*pClock)uchari;ucharucAddr=0x80;EA=0;W1302(0x8e,0x00);/*控制命令,WP=0,写操作?*/for(i=7;i0;i-)W1302(ucAddr,*pClock);/*秒分时日月星期年*/pClock+;ucAddr+=2;W1302(0x8e,0x80);/*控制命令,WP=1,写保护?*/EA=1;/*
38、函数名:Get1302()功能:读取DS1302当前时间说明:调用:R1302()入口参数:ucCurtime:保存当前时间地址。当前时间格式为:秒分时日月星期年7Byte(BCD码)1B1B1B1B1B1B1B返回值:无设计:zhaojunjie日期:2002-03-19修改:日期:*/voidGet1302(ucharucCurtime)uchari;ucharucAddr=0x81;EA=0;for(i=0;i7;i+)ucCurtimei=R1302(ucAddr);/*格式为:秒分时日月星期年*/ucAddr+=2;EA=1;/以下是12864驱动程序voidv_Lcd12864Ch
39、eckBusy_f(void)/忙检测函数unsignedintnTimeOut=0;zhilinduCLR_ENSET_ENwhile(io_LCD12864_DATAPORT&0x80)&(+nTimeOut!=0);CLR_ENzhilinduvoidv_Lcd12864SendCmd_f(unsignedcharbyCmd)/发送命令v_Lcd12864CheckBusy_f();zhilinxieCLR_ENio_LCD12864_DATAPORT=byCmd;_nop_();_nop_();SET_EN_nop_();_nop_();CLR_ENduzhilinvoidv_Lcd1
40、2864SendData_f(unsignedcharbyData)/发送数据v_Lcd12864CheckBusy_f();shujuxieCLR_ENio_LCD12864_DATAPORT=byData;_nop_();_nop_();SET_EN_nop_();_nop_();CLR_ENduzhilinunsignedcharu8_Lcd12864ReadByte_f(void)/读端口数据unsignedcharbyReturnValue;v_Lcd12864CheckBusy_f();io_LCD12864_DATAPORT=0xff;/先把端口执为1shujuduCLR_ENS
41、ET_ENbyReturnValue=io_LCD12864_DATAPORT;/v_DelayMs_f(1);CLR_ENreturnbyReturnValue;/*画点函数*/voidv_Lcd12864DrawPoint_f(unsignedcharx,unsignedchary,unsignedcharflag)unsignedcharx_Dyte;unsignedcharx_byte;unsignedchary_Dyte;unsignedchary_byte;unsignedcharhbit;unsignedcharlbit;x_Dyte=x/16;/计算在16个字节中的那一个,范围
42、在07x_byte=x&0x0f;/计算在该字节中的哪一位,/x_byte=x%16;/与上一条语句同一个意思y_Dyte=y/32;/确定它是在上半屏,还是在下半屏,0为上,1为下y_byte=y&0x1f;/相当于y_byte=y%32,确定它在第几行v_Lcd12864SendCmd_f(0x36);/扩充指令集v_Lcd12864SendCmd_f(0x80+y_byte);/写入垂直坐标地址确定在第几行v_Lcd12864SendCmd_f(0x80+x_Dyte+8*y_Dyte);/8*y_Dyte表示确认上半屏还是下半屏u8_Lcd12864ReadByte_f();/空读一次
43、hbit=u8_Lcd12864ReadByte_f();/读取高字节lbit=u8_Lcd12864ReadByte_f();/读取低字节/读操作会改变AC的值,所以要重新设置一次地址v_Lcd12864SendCmd_f(0x80+y_byte);v_Lcd12864SendCmd_f(0x80+x_Dyte+8*y_Dyte);/重新找到地址if(flag=1)/说明是要点亮该点if(x_byte8)/判断是在高8位还是在低8位,小于8说明是在高8位v_Lcd12864SendData_f(hbit|(0x01(7-x_byte);/写入修改后的高8位数据到GDRAM区v_Lcd1286
44、4SendData_f(lbit);/写入没有修改的低8位数据到GDRAM区else/说明是低8位v_Lcd12864SendData_f(hbit);/写入没有修改的高8位数据到GDRAM区v_Lcd12864SendData_f(lbit|(0x01(15-x_byte);/写入修改后的低8位数据到GDRAM区else/说明是要熄灭该点if(x_byte8)/判断其在高八位,还是低八位v_Lcd12864SendData_f(hbit&(0x01(7-x_byte);/显示GDRAM区高八位v_Lcd12864SendData_f(lbit);/显示GMRAM区低八位elsev_Lcd12
45、864SendData_f(hbit);v_Lcd12864SendData_f(lbit&(0x01X1)/交换X0,X1的位置Temp=X1;X1=X0;X0=Temp;for(;X0Y1)/交换Y0,Y1的位置Temp=Y1;Y1=Y0;Y0=Temp;for(;Y0=0)/X的方向是增加的s1=1;else/X的方向是降低的s1=-1;dy=y1-y0;/判断Y的方向是增加还是降到的if(dy=0)/y的方向是增加的s2=1;else/y的方向是降低的s2=-1;Dx=abs(x1-x0);/计算横坐标增加值的绝对值Dy=abs(y1-y0);/计算纵坐标增加值的绝对值/纵坐标增加的多直线偏向Y轴,横坐标增加的多偏向X轴if(DyDx)/以45度角为分界线,靠进Y轴是status=1,靠近X轴是status=0temp=Dx;/交换DX,DY,的值Dx=Dy;Dy=temp;status=1;/靠近Y轴elsestatus=0;/靠近X轴status表示直线的形状/*Bresenham算法画任意两点间的直线*/sub=Dy+Dy-Dx;/第1次判断下个点的位置for(i=0;i=0)if(status=1)/在靠近Y轴区,x值加1x0+=s1;else/在靠近X轴区,y值加1y0+=s2;sub
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《七 小小运动会:7、6加几》(教案)-一年级上册数学 青岛版
- 五年级下册数学教案-4.2 分数加减法的简算 ︳西师大版
- 劳动合同管理台账(2025年版)
- 二年级下册数学教案-4.1 《长方形和正方形的特征》 ︳西师大版
- 一年级上册数学教案-4 14,15减几 ︳西师大版
- 二年级下册数学教案-租船3 北师大版
- 模拟试卷一(原卷版+解析版)-三年级语文上学期期末全真模拟卷(部编版五四制)
- 人教版三年级上册期末考试数学试卷-
- 《十一月四日风雨大作》历年中考古诗欣赏试题汇编(截至2023年)
- 2025届黑龙江佳木斯一中高三上学期五调地理试题及答案
- 客家童谣活动课件
- 四川省成都市2023年中考道德与法治真题试卷(含答案)
- 【初中生物】病毒课件2024-2025学年人教版生物七年级上册
- 企业愿景和未来三年规划
- 发酵馒头课件教学课件
- YAMAHA(雅马哈)贴片机编程培训教材
- JGJ162-2014建筑施工模板安全技术规范-20211102195200
- 公司解散清算的法律意见书、债权处理法律意见书
- 2024-2025学年初中信息技术(信息科技)七年级下册苏科版(2023)教学设计合集
- 中华小厨神(教学设计)-五年级下册劳动人教版1
- 世界建筑史学习通超星期末考试答案章节答案2024年
评论
0/150
提交评论