电子设计竞赛设计报告电压表_第1页
电子设计竞赛设计报告电压表_第2页
电子设计竞赛设计报告电压表_第3页
电子设计竞赛设计报告电压表_第4页
电子设计竞赛设计报告电压表_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

鲁东大学电子设计大赛LduEDC大学生电子设计竞赛课题名称:简易电压表(F题)设计时间:2015年5月院部:信息与电气工程学院班级:电气本1302姓名:TOC\o"1-5"\h\z目录1一、方案论证2\o"CurrentDocument"1.1任务2\o"CurrentDocument"1.2背景2\o"CurrentDocument"1.3要求2\o"CurrentDocument"1.4设计思路2\o"CurrentDocument"1.5设计方案2\o"CurrentDocument"二、理论分析与计算3\o"CurrentDocument"STC89C52简介3\o"CurrentDocument"A/D转换模块简介5DS12C887简介8\o"CurrentDocument"LCD1602简介10\o"CurrentDocument"三、电路设计(含电路图)12\o"CurrentDocument"3.1单片机最小系统12\o"CurrentDocument"USB供电13\o"CurrentDocument"LCD显示模块13\o"CurrentDocument"A/D转换模块14-5V至到+5V测量电压输入电路140V到+20V测量电压输入电路15\o"CurrentDocument"TL431稳压电路15\o"CurrentDocument"3.8实时时钟电路163.9蜂鸣器电路17\o"CurrentDocument"3.10DS18B20温度电路173.11电源模块173.12总电路18\o"CurrentDocument"四、测试方案与测试结果19\o"CurrentDocument"附录20\o"CurrentDocument"1、PCB图20\o"CurrentDocument"2、软件程序设计20\o"CurrentDocument"总结36一、方案论证1.1任务设计并制作一个简易电压表,可以测量数字系统电平。1.2背景数字电压表(DigitalVoltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字电压表,由精度高、抗干扰能力强,可扩展性强、集成方便,可与PC进行实时通信。目前,由各种单用/D转换器构成的数字电压表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。与此同时,由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。本章重点介绍单片A/D转换器以及由它们构成的基于单片机的数字电压表的工作原理。1.3要求1.3.1基本要求(1)仪器可测量0V—5V电压,精确度不低于0.1V。(2)将所测电压值实时显示在显示器上(云。\数码管)。1.3.2发挥部分(1)在显示器上同时显示年月日等信息。(2)仪器可测量负电压。(3)其它。1.4设计思路基本部分:(1)本作品以STC89C52单片机作为主控芯片,使用12MHZ晶振(2)A/D转换采用TLC1543实现,与单片机的接口为P1口的第五位引脚。(3)实时时钟采用DS12C887+实现。(4)LCD1602显示输出信息。(5)运用OP07提供运放电路。拓展部分:(6)蜂鸣器进行通断信息确认。(7)按键换档位测0到20V电压。(8)DS1602采集温度显示。(9)采样输出精确到小数点后三位。1.5设计方案

硬件电路设计由10个部分组成;STC89C52单片机系统,A/D转换电路,实时时钟电路,LCD1602显示系统,晶振电路,复位电路,-5V至到+5V测量电压输入电路,0V到+20V测量电压输入电路,蜂鸣器电路,DS18B20温度电路,TL431稳压电路。系统框图如下::、理论分析与计算2.1STC89C52简介外观STC89C52是8位的单片机,功能很强大。此外,它还具有品种全、兼容性强、软硬件资料丰富等特点。因此,STC89C52应用非常广泛,直到现在STC89C52仍是单片机中的主流机型。1、中央处理器中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。2、数据存储器STC89C52内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。3、程序存储器STC89C52共有4K的ROM,最大可扩展64K字节,用于存放用户程序,原始数据或表格。4、定时/计数器STC89C52有两个16位的可编程定时计数器,以实现定时或计数产生中断用于控制程序转向。5、中断系统STC89C52具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。6、STC89C5单片机的引脚

STC89C52单片机内部总线是单总线结构,即数据总线和地址总线是公用的.STC89C52有40条引脚,与其他51系列单片机引脚是兼容的.这40条引脚可分为I/O接口线、电源线、控制线、外接晶体线4部分.STC89C52单片机为双列直插式封装结构,如图所示PI.0P\Ai=PI.2匚PI.3tPI.4=Pl5PI.0P\Ai=PI.2匚PI.3tPI.4=Pl5匚Pl.fiUP].7cR5Tc(RXDJPm匚([XDJP1Ic(TNT0)P3.2c(TQ)P3.4c(T1)P3.5匚(WK1P3.6匚(EP)P3.7eKTAL2cXTALEcGND亡o12r45.67S9On11-J.m3Xu7D_n-—1I1-IBI-■1InII1-7^fl-Q--8.765432100.-87654321+?3333333332Z22222Z3PO.O(ADO)=f().2(AD2)=P03(AD3)=iP0.4(AJJ4)-Pfl.5(AD5)=iPO顶AJJ切3P0.7(AD7)=■EA?F^=>ALE/FROC]3PSEN3F2.7(A15)3P2.G(A14}3P2.5(A13)•:』P2.4(AI2)3P23(AJ1)=■r2.2(Al«)3P2,1(A5>)F2.0(A8j能把模拟量转化成数字量的器件称为模/数转换器(A/D转换器),A/D转换器是单片机数据采集系统的关键接口电路,按照各种A/D芯片的转化原理可分为逐次逼近型,双重积分型等等。双积分式A/D转换器具有抗干扰能力强、转换精度高、价格便宜等优点。与双积分相比,逐次逼近式A/D转换的转换速度更快,而且精度更高,比如ADC0809、TLC1543等,它们可以与单片机系统连接,将数字量送到单片机进行分析和显示。一个n位的逐次逼近型A/D转换器只需要比较n次,转换时间只取决于位数和时钟周期,逐次逼近型A/D转换器转换速度快,因而在实际中广泛使用。这里选用的是高精度的TLC1543。1、逐次逼近型A/D转换器原理逐次逼近型A/D转换器是由一个比较器、A/D转换器、存储器及控制电路组成。它利用内部的寄存器从高位到低位一次开始逐位试探比较。转换过程如下:开始时,寄存器各位清零,转换时,先将最高位置把数据送入A/D转换器转换,转换结果与输入的模拟量比较如果转换的模拟量比输入的模拟量小则1保留,如果转换的模拟量比输入的模拟量大,则不保留,然后从第二位依次重复上述过程直至最低位,最后寄存器中的内容就是输入模拟量对应的二进制数字量。其原理框图如图所示:

逐次逼近式第D转换器原理2、逐次逼近式第D转换器原理TLC1543美国TI司生产的多通道、低价格的模数转换器。采用串行通信接口,具有输入通道多、性价比高、易于和单片机接口的特点,可广泛应用于各种数据采集系统。TLC1543为20脚DIP装的CMOS10位开关电容逐次A/D逼近模数转换器,引脚排列如图所示。其中A0〜A10(1〜9、11、12脚)为11个模拟输入端,REF+(14脚,通常为VCC)和REF-(13脚,通常为地)为基准电压正负端,CS(15脚)为片选端,在CS端的一个下降沿变化将复位内部计数器并控制和使能ADDRESS、I/OCLOCK(18脚)和DATAOUT(16脚)。ADDRESS(17脚)为串行数据输入端,是一个1的串行地址用来选择下一个即将被转换的模拟输入或测试电压。DATAOUT为A/D换结束3态串行输出端,它与微处理器或外围的串行口通信,可对数据长度和格式灵活编程。I/OCLOCK数据输入/输出提供同步时钟,系统时钟由片内产生。芯片内部有一个14通道多路选择器,可选择11个模拟输入通道或3个内部自测电压中的任意一个进行测试。片内设有采样-保持电路,在转换结束时,EOC(19脚)输出端变高表明转换完成。内部转换器具有高速(10吓转换时间),高精度(10分辨率,最大±1LSB不可调整误差)和低噪声的特点。1口刘2K31(41751(61571481;9121011A0[GNDt引脚排列I'fcC]EOC]I/OCLOCK]ADDRESSIDWAOUT]CS]RER-]REFL]A10]A93、TLC1543的工作时序、参考电压1口刘2K31(41751(61571481;9121011A0[GNDt引脚排列TLC1543工作时序如下图所示,其工作过程分为两个周期:访问周期和采样周期。工作状态由CS使能或禁止,工作时CS必须置低电平。CS为高电平时,I/OCLOCK、ADDRESS被禁止,同时DATAOUT为高阻状态。当CPU使CS变低时,TLC1543开始数据转换,I/OCLOCK、ADDRESS使能,DATAOUT脱离高阻状态。随后,CPU向ADDRESS提供4位通道地址,控制14个模拟通道选择器从11个外部模拟输入和3个内部自测电压中选通1路送到采样保持电路。同时,I/OCLOCK输入时钟时序,CPU从DATAOUT端接收前一次A/D转换结果。I/OCLOCK从CPU接收10时钟长度的时钟序列。前4个时钟用4位地址从ADDRESS端装载地址寄存器,选择所需的模拟通道,后6个时钟对模拟输入的采样提供控制时序。模拟输入的采样起始于第4个I/OCLOCK下降沿,而采样一直持续6个I/OCLOCK周期,并一直保持到第10个I/OCLOCK下降沿。转换过程中,CS的下降沿使DATAOUT引脚脱离高阻状态并起动一次I/OCLOCK工作过程。CS上升沿终止这个过程并在规定的延迟时间内使DATAOUT引脚返回到高阻状态,经过两个系统时钟周期后禁止I/OCLOCK和ADDRESS端。参考电压:ad转换时的参考电压是内部T行网络的标准电压,参考电压可以认为是你的最高上限电压(不超过电源电压),当信号电压较低时,可以降低参考电压来提高分辨率。改变参考电压后,同样二进制表示的电压值就会不一样,最大的二进制(全1)表示的就是你的参考电压,在计算实际电压时,就需要将参考电压考虑进去。参考电压的稳定性对你的系统性能有很大的影响。附表模拟输入通道逃押输入寄夺器地址(2进制)A0UUOOA1DUD1A21)1)10A3UDI1A.5A6UI10A7DiliA8A9:1)1)1AHi内部测试电压迭押输入地址愉出雄果(16罐制)(VruE+Vn;r_)/210112UU11(1(1DUDVre:11(11::.rr.3LDS12887I简介31花F+端的电压,腿「切1瑚EF.端的电压DS12887是8位串行接口并自带RAM的实时日历时钟芯片,内部有14个时钟控制寄存器,包括10个时标寄存器,4个状态寄存器和114bit作掉电保护用的低功耗RAM。CPU通过读DS12887的内部时标寄存器得到当前的时间和日历,也可通过选择二进制或BCD码初始化芯片的10个时标寄存器,其4个状态寄存器用来控制和指出DS12887的当前工作状态,114bit非易失性静态RAM可在掉电时保存一些重要数据。1、引脚功能

motHNCHNCEADO口ADIHADJ叵AD3H仰4区AD5[?AD6叵AD7叵GND112GND:接地端VCC:直流电源+5V电压。当5V电压在正常范围内时,数据可读写;当VCC低于4.25V,读写禁止,计时功能仍继续;当VCC下降到3V以下时,RAM和计时器被切换到内部锂电池。MOT(模式选择):MOT引脚接到VCC时,选择MOTOROLA时序,当接到GFND时,选择INTEL时序。SQW(方波信号输出):SQW引脚能从实时时钟内部15级分频器的13个抽头中选择一个作为输出信号,其输出频率可通过对寄存器A编程改变。AD0〜AD7(双向地址/数据复用线):总线接口,可与MOTOROLA微机系列和INTEL微机系列接口。AS(地址选通输入):用于实现信号分离,在AD/ALE的下降沿把地址锁入DS12887。DS(数据选通或读输入):DS/RD有2种操作模式,取决于MOT引脚的电平,当使用MOTOROLA时序时,DS是一正脉冲,出现在总线周期的后段,称为数据选通;在读周期,DS指示DS12887驱动双向总的时刻;在写周期,DS的后沿使DS12887锁存写数据。选择INTEL时序时,DS称作(RD),RD与典型存储器的允许信号(OE)的定义相同。R/W(读/写输入):也有两种操作模式。选MOTOROLA时序时,是一电平信号,指示当前周期是读或写周期,DSO为高电平时,高电平指示读周期,低电平指示写周期;选INTEL时序,信号是一低电平信号,称为WR。在此模式下,R/W与通用RAM的写允许信号(WE)的含义相同。/CS(片选输入):在访问DS12887的总线周期内,片选信号必须保持为低。IRQ(中断申请输入):低电平有效,可作微处理的中断输入。没有中断条件满足时,IRQ处于高阻态。IRQ线是漏极开路输入,要求外接上接电阻。RESET(复位输出):当保持低电平时间大于200ms,保证DS12887有效复位。DS12887的内部地址分配:地址00H和03H单元取值范围是00H〜3BH(十进制为0〜59);04H〜05H单元按12小时制取值范围是上午(AM)01H〜0CH(十进制为1〜12),下午(PM)51H〜5CH(十进制为81〜92),按24小时制取值范围是00H〜17H(十进制为0〜23);06H单元的取值范围是01H〜07H(十进制为1〜7);07H单元取值范围O1H〜1FH(十进制为1〜31);08H单元取值范围是01H〜0CH(十进制为1〜12);09H单元取值范围是00H〜63H(十进制为0〜99)。LCD1602简介1602液晶显示模块,是点阵字符型液晶显示模块,可以用来显示字母,符号,数字以及简单的汉字和图案等信息。“1602”的含义是这类液晶显示模块每行能够显示16个字符,一共可以显示两行。该液晶显示模块,分为带背光和不带背光两类,两者在应用过程中功能基本类似,只是带背光的模块更厚一些。1602液晶显示模块的主要技术参数如下:(1)显示容量,为16个字符X两行,即每行最多显示32个字符;(2)模块工作电压,在4.5-5V之间,模块的最佳工作电压为5V;(3)模块工作电流,再最佳工作电压5V式,工作电流是2mA;1、1602液晶模块的管脚介绍第1脚:GND为电源地,接GND。第2脚:VCC接5V正电源。第3脚:VO为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为指令寄存器或数据寄存器的选择。高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。第6脚:E端为读或写操作的使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7〜14脚:D0〜D7为8位双向数据线。第15脚:BGVCC背光电源正极(+5V)输入引脚。第16脚:BGGND背光电源负极,接GND。三电路设计(含电路图)、3.1单片机最小系统设计MCUGNDGND3.4心.61pppppPj.O/R.XDEA/VppP3.I/TXRILF,PROGP3.2/TNTOPSFNP33/[NT1P2.7P34TOP2.6P3.5,'T]P2.5P3.6/WRP2.4P3.7/RDP2.3XTAL2PZ?XTALIP2.1(JNDP2.089C5239io.o38PO.l37P0.236P0.335P0.434P0.533lJ0.632P0.7Pl.QVCCP1.1P0.0Pl.2POJ3029LUDE28Y)RD26WR25P2.424P2323P2.2P2.121P2.0采用STC89C52单片机作为主控芯片,有复位电路和晶振电路。3.2USB供电USBTYPEA利用USB采用5V供电。3.3LCD显示电路3.4A/D转换模块3.5-5V到+5V测量电压输入电路上图为一个用OP07搭的加法电路,+5V为TL431稳压所得,J1为外接电压采集端,电源模块为OP07提供正负12V电压。相加后的电压进行分压取一半送到A/D的信号输入端。3.60V到+20V测量电压输入电路采样电压取四分之一输入到A/D采样输入端。3.7TL431稳压电路

电源模块输出的正12V为其输入电压,输出的5V为A/D芯片提供基准电压,同时为测量电压输入电路的OP07提供5V电压输入。3.8实时时钟电路GNDP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7MOTVCCNCSQWNCNCADONCADINCAD2IRQGNDP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7MOTVCCNCSQWNCNCADONCADINCAD2IRQAD3RESETAD4DSAD5NCAD6R/WAD7ASGNDCSJJ22423~~n16Pl.7‘14PI.613PI.5P3.0卜5V3.9蜂鸣器电路3.10DS18B20温度电路3.11电源模块输入5¥输出正负12V,为。?07提供正负工作12V电压,给TL431稳压电路输入12V。3.11总电路本系统总电路如图所示。四、测试方案与测试结果LCD1602模块:在LCD1602上能够显示当前时间、温度、所测电压。蜂鸣器模块:蜂鸣器能够检测通断路状态,发出报警。

A/D转换模块:电压范围在-5V到+5V。误差在0.1V范围内,基本准确。-5V到I+5V输入测量误差3.625V3.603V0.022V-3.620V-3.641V0.021V0V到+20V输入测量误差3.625V3.710V0.085V10.732V10.542V0.19V

附录1、PCB图2、软件程序设计#include<reg52.h>#include"DS12887.H”#include"TLC1543.H”#include"temp.h”intflagl;sbitADzf=P3A4;sbitADz=P3A5;voidLcdDisplay(int);voidADzhengfu(uint);voidADdazheng(uint);voidkeyscan();voidDelay10ms(unsignedintc)〃误差0us{unsignedchara,b;//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//for(;c>0;c--){for(b=38;b>0;b--){for(a=130;a>0;a--);}}}voidmain(){EA=1;//开总中断EX1=1;//开外部中断1IT1=1;//外部中断下降沿触发init();while(1){year=read_ds(0X09);month=read_ds(0X08);day=read_ds(0X07);//week=read_ds(0X06);shi=read_ds(0X04);fen=read_ds(0X02);miao=read_ds(0X00);write_sfm(6,miao);write_sfm(3,fen);write_sfm(0,shi);//write_week(week);write_nyr(2,year);write_nyr(5,month);write_nyr(8,day);LcdDisplay(Ds18b20ReadTemp());temp=ADC(port);ADzhi=temp*Vdd*(0.9765625);numm=ADzhi;keyscan();}3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/********************************************************************************函数名:LcdDisplay()*函数功能:LCD显示读取到的温度*输入:v*输出:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个voidLcdDisplay(inttemp)//led显示{unsignedchardatas[]={0,0,0};//定义数组floattp;tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量〃如果温度是正的那么,那么正数的原码就是补码它本身temp=tp*0.0625*100+0.5;〃留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就//算加上0.5,还是在小数点后面。datas[0]=temp%10000/1000;datas[1]=temp%1000/100;datas[2]=temp%100/10;write_cmd(0x80+11);〃写地址80表示初始地址write_dat('0'+datas[0]);//百位write_cmd(0x80+12);〃写地址80表示初始地址write_dat('0'+datas[1]);〃十位write_cmd(0x80+13);〃写地址80表示初始地址write_dat('.');write_cmd(0x80+14);〃写地址80表示初始地址〃显示‘.’write_dat('0'+datas[2]);//个位write_cmd(0x80+15);write_dat('C');}voidkeyscan(){if(flag1==0){ADzf=1;ADz=0;ADzhengfu(numm);}else{ADzf=0;ADz=1;ADdazheng(numm);}}voidADzhengfu(uintnum){uintj,k;ADzf=1;ADz=0;if(num>=0&&num<2500){num=num*2;DianYaF[0]='-';DianYaF[1]='0'+((5000-num)/1000)%10;DianYaF⑵='.';DianYaF[3]='0'+(5000-num)/100%10;DianYaF[4]='0'+(5000-num)/10%10;DianYaF[5]='0'+(5000-num)%10;DianYaF[6]='v';write_cmd(0x80+0X49);for(j=0;j<7;j++){write_dat(DianYaF[j]);Delay10ms(17);}}elseif(num>=2500&&num<=5000){num=num*2;DianYaZ[0]='0'+(num-5000)/1000%10;DianYaZ[1]='.';DianYaZ[2]='0'+(num-5000)/100%10;DianYaZ[3]='0'+(num-5000)/10%10;DianYaZ[4]='0'+(num-5000)%10;DianYaZ[5]='v';write_cmd(0x80+0X4A);for(k=0;k<6;k++){write_dat(DianYaZ[k]);Delay10ms(17);}}}voidADdazheng(uintnum){uintk;ADzf=0;ADz=1;num=num*4;DianYaDZ[0]='0'+(num/10000%10);DianYaDZ[1]='0'+(num/1000%10);DianYaDZ[2]='.';DianYaDZ[3]='0'+(num/100%10);DianYaDZ[4]='0'+(num/10%10);DianYaDZ[5]='0'+(num%10);DianYaDZ[6]='v';write_cmd(0x80+0X49);for(k=0;k<7;k++){write_dat(DianYaDZ[k]);Delay10ms(17);}}voidkey_scan()interrupt2//使用了外部中断1的键盘扫描子函数{EX1=0;flag1=!flag1;EX1=1;3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/********************************************************************************函数名:LcdDisplay()*函数功能:LCD显示读取到的温度*输入:v*输出:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个voidLcdDisplay(inttemp)//lcd显示{unsignedchardatas[]={0,0,0};//定义数组floattp;tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量〃如果温度是正的那么,那么正数的原码就是补码它本身temp=tp*0.0625*100+0.5;〃留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就//算加上0.5,还是在小数点后面。datas[0]=temp%10000/1000;datas[1]=temp%1000/100;datas[2]=temp%100/10;write_cmd(0x80+11);〃写地址80表示初始地址write_dat('0'+datas[0]);//百位write_cmd(0x80+12);〃写地址80表示初始地址write_dat('0'+datas[1]);〃十位write_cmd(0x80+13);〃写地址80表示初始地址write_dat('.');write_cmd(0x80+14);〃写地址80表示初始地址〃显示‘.’write_dat('0'+datas[2]);//个位write_cmd(0x80+15);write_dat('C');/**************************************************************DS12887+程序Music14/06/11**************************************************************/#ifndef__DS12887_H__#define__DS12887_H__#include<intrins.h>#include"LCD1602.H”#defineuintunsignedint#defineucharunsignedcharsbitdscs=P1A5;sbitdsas=P1A6;sbitdsrw=P1A7;sbitdsds=P3A0;charmiao,shi,fen,year,month,day,week;voidwrite_ds(uchar,uchar);ucharread_ds(uchar);voidset_time();voidinit(){ucharnum;rw=0;dsds=0;dsas=0;week=1;//write_ds(0x0A,0x20);//打开振荡器//write_ds(0x0B,0x86);//设置24小时模式,数据二进制格式,开启闹铃中断//write_ds(0x0B,0x02);//write_ds(0x0B,0x26);//set_time();//设置上电默认时间,调试的时候?lcdint();write_cmd(0x80);for(num=0;num<14;num++)write_dat(table[num]);write_cmd(0xc0);for(num=0;num<8;num++)write_dat(table1[num]);voidwrite_ds(ucharadd,uchardate)//写12c887函数dscs=0;dsas=1;dsds=1;dsrw=1;P0=add;〃写地址dsas=0;dsrw=0;P0=date;〃写数据dsrw=1;dsas=1;dscs=1;ucharread_ds(ucharadd)〃读12c887uchards_date;dscs=0;dsas=1;dsds=1;dsrw=1;P0=add;dsas=0;dsds=0;P0=0xff;ds_date=P0;dsds=1;dsas=1;dscs=1;returnds_date;voidset_time()//初始化write_ds(0x0b,0x86);〃设置寄存器Bwrite_ds(0x00,0);//秒write_ds(0x01,10);//秒闹铃write_ds(0x02,13);//分钟write_ds(0x03,34);//分钟闹铃write_ds(0x04,14);〃小时write_ds(0x05,21);〃小时闹铃write_ds(0x06,6);//星期write_ds(0x07,23);//日write_ds(0x08,5);〃月write_ds(0x09,15);//年write_ds(0x0b,0x06);}#ifndef__LCD1602_H_#define__LCD1602_H_#defineuintunsignedint#defineucharunsignedcharsbitlcdrs=P2A6;sbitrw=P2A5;sbitlcden=P2A7;charcodetable[]="2007-08-05M";//20--ucharcodetable1[]="00:00:00";//::voiddelayms(uintz)//延时毫秒的程序{uintx,y;for(x=z;x>0;x--)for(y=112;y>0;y--);}voidwrite_cmd(ucharcmd){lcden=0;lcdrs=0;P0=cmd;_nop_();lcden=1;delayms(1);lcden=0;_nop_();}voidwrite_dat(uchardat){lcden=0;lcdrs=1;P0=dat;_nop_();lcden=1;delayms(l);lcden=0;_nop_();}voidlcdint(){lcden=0;write_cmd(0x38);//显示模式设置write_cmd(0x0c);〃开显示,不显示光标,不闪烁write_cmd(0x06);〃写一个字符后地址加1,屏幕不移write_cmd(0x01);//清屏delayms(1);}voidwrite_sfm(ucharadd,chardate)〃写时间,2位一起写{charshi,ge;shi=date/10;ge=date%10;write_cmd(0xc0+add);write_dat(0x30+shi);write_dat(0x30+ge);}voidwrite_nyr(ucharadd,chardate)//年月曰{charshi,ge;shi=date/10;ge=date%10;write_cmd(0x80+add);write_dat(0x30+shi);write_dat(0x30+ge);}voidwrite_week(charwe)//星期{write_cmd(0x80+11);switch(we){case1:write_dat('M');write_dat('O');write_dat('N');break;case2:write_dat('T');write_dat('U');write_dat('E');break;case3:write_dat('W');write_dat('E');write_dat('D');break;case4:write_dat('T');write_dat('H');write_dat('U');break;case5:write_dat('F');write_dat('R');write_dat('I');break;case6:write_dat('S');write_dat('A');write_dat('T');break;case7:write_dat('S');write_dat('U');write_dat('N');break;}#ifndef__TLC1543_H_#define__TLC1543_H_#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineport0x04〃对Chanel4采样#defineVdd4.98//定义参考电压为9.99V//--定义全局变量--//unsignedcharDianYaZ[5];unsignedcharDianYaF[6];uintADzhi;uinttemp;uintnum;sbitAD_eoc=P1A0;sbitAD_clk=P1A1;sbitAD_add=P1A2;sbitAD_dat=P1A3;sbitAD_cs=P1A4;〃定义实际转换后的AD值//AD转换完成eoc信号//AD时钟//AD输入地址//AD转换完成的数据//AD片选信号/*******************************************************函数名:AD采样函数voidADC(ucharchn1)参数:chn1返回值:ADresult功能描述:将AD采样的电压值送出*******************************************************/uintADC(ucharchn1){uchari;ucharaddr8;uintADresult;〃选用AD转换芯片的模式一//通道地址〃转换码AD_cs=1;_nop_();AD_eoc=1;AD_cs=0;_nop_();addr8=chn1;addr8<<=4;//CPU向addr8提供4位通道地址for(i=0;i<10;i++)〃发送地址数据{AD_clk=0;_nop_();addr8<<=1;//addr8最高位移入PSW寄存器的CY位AD_add=CY;//将CY位赋给AD_add//_nop_();AD_clk=1;_nop_();}AD_clk=0;_nop_();AD_cs=1;while(!AD_eoc);//查询到转换结束_nop_();ADresult=0;AD_cs=0;//CSfallingedge开始传数据for(i=0;i<10;i++)〃传输采样结果{AD_clk=0;_nop_();AD_clk=1;ADresult*=2;//左移一位CY=AD_dat;//把采样的二进制数的一位移入CYADresult+=(uint)CY;}AD_clk=0;_nop_();AD_clk=1;return(ADresult);}#ifndef__TEMP_H_#define__TEMP_H_#include<reg51.h>//---重定义关键词---//#ifndefuchar#defineucharunsignedchar#endif#ifndefuint#defineuintunsignedint#endif//--定义使用的IO口--//sbitDSPORT=P3A1;

//--声明全局函数--//voidDelay1ms(uint);ucharDs18b20Init();voidDs18b20WriteByte(ucharcom);ucharDs18b20ReadByte();voidDs18b20ChangTemp();voidDs18b20ReadTempCom();intDs18b20ReadTemp();/*******************************************************************************函数名函数功能输入输出Delaylms延时函数函数名函数功能输入输出Delaylms延时函数无无uintx;for(;y>0;y--){for(x=110;x>0;x--);}}/********************************************************************************函数名:Ds18b20Init*函数功能:初始化*输入:无*输出:初始化成功返回1,失败返回0“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个ucharDs18b20Init(){uchari;DSPORT=0;//将总线拉低480us~960usi=70;while(i--);//延时642usDSPORT=1;//然后拉高总线,如果DS18B20做出反应会将在15us〜60us后总线拉低i=0;while(DSPORT)//等待DS18B20拉低总线{i++;if(i>5)//等待>5MS{return0;//初始化失败}Delay1ms(1);}return1;//初始化成功}/********************************************************************************函数名:Ds18b20WriteByte*函数功能:向18B20写入一个字节*输入:com*输出:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个voidDs18b20WriteByte(uchardat){uinti,j;for(j=0;j<8;j++){〃每写入一位数据之前先把总线拉低1usDSPORT=0;i++;DSPORT=dat&0x01;〃然后写入一个数据,从最低位开始i=6;while(i--);//延时68us,持续时间最少60usDSPORT=1;//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值dat>>=1;}}/*******************************************************************************函数名函数功能输入输出Ds18b20ReadByte读取一个字节com无“““““““““““““““““““““““““““““““““““““““““““““““

温馨提示

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

评论

0/150

提交评论