基于AT89S52单片机的八路电压巡检系统_第1页
基于AT89S52单片机的八路电压巡检系统_第2页
基于AT89S52单片机的八路电压巡检系统_第3页
基于AT89S52单片机的八路电压巡检系统_第4页
基于AT89S52单片机的八路电压巡检系统_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

基于单片机的八路电压巡检系统电路专业: 08自动化 学号:111111 学生姓名:罗琦 指导教师:恩泽摘 要单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。而51单片机是各单片机中最为典型和最有代表性的一种。 本次设计以AT89S5芯片为核心,辅以必要的外围电路,设计了一个简易的八路电压巡检系统,它由5V直流电源供电。 路输入模拟信号数值显示巡检系统电路可以测量0-5V的8路输入 模拟信号电压值,并在上显示或单路选择显示。按系统功能实现要求,决定控制系统采用AT8952单片机,A/D转换采用ADC0809。系统除能确保实现要求的功能外,还可以方便地进行8路其他A/D转换量的测量、远程测量结果传送等扩展功能,多路数据选,扩展的外围芯片采用usb接口芯片,设计的整个系统体积小,功耗低,有很好的可维护性,和较强的抗干扰性能。此外该系统还添加了电子时钟系统,采用时钟芯片,能完成时间的显示,调时,复位等功能。软件方面,考虑到需要指令的执行速度快,节省存储空间,可读性好,选择了C 语言编程。目录第一章 基于C51系列单片机的八路电压巡检系统电路的概述31.1 熟悉Altium designer08软件绘制电路的原理图和PCB图,keil软件编程单片机C语言,proteus软件仿真31.2硬件介绍31.3软件介绍3第二章设计方案的选择和确定32.1八路电压巡检系统设计过程32.2总体设计42.3硬件设计42.4软件设计52.5总体方案的设计5第三章 系统硬件设计63.1AT89S52单片机最小系统电路63.2ADC0809的资料,DS1302和LCD16026(1)ADC0809 在51 单片机中的应用6(2) DS1302 简介:8(3) LCD1602 液晶显示简介13第四章 系统的软件设计19第五章 性能测试与分析37(1):测试LCD1602显示功能37(2):测试DS130237(3):测试ADC080937(4):最后综合测试37第六章 心得体会38工程训练成绩评定表39附图:1.基于单片机的八路电压巡检系统电路原理图41附图:1.基于单片机的八路电压巡检系统电路图42第一章 基于C51系列单片机的八路电压巡检系统电路的概述1.1 熟悉Altium designer08软件绘制电路的原理图和PCB图,keil软件编程单片机C语言,proteus软件仿真八路电压巡检系统电路的设计和制作首先需要绘制电路的原理图和PCB图,因此制作的过程中需要使用Altium designer软件画图和制作电路板,本次工程训练使用的作图软件是Altium designer08的版本。了解选取元器件和以及如何画元器件,学会画封装,最关键的是学会手工布置PCB图。1.2硬件介绍1. AT89S52单片机的最小系统:由单片机供电电路,振荡电路,复位电路组成。2.改系统由电源电路,1602显示电路,ds1302实时时钟电路以及ADC0809电压转换电路和程序下载接口电路组成。2. 原理图的绘制以及PCB板的制作:电路应有合理的布线,PCB图要手工布线。3. .键盘输入电路:在本次实验中,有四个按键作为输入设备1.3软件介绍1. 学会使用液晶LCD1602,并学会用单片机C语言编程,并编写液晶1602程序,显示出自己的名字和学号。2. 学会使用时钟芯片DS1302,编写DS1302的程序和液晶显示程序,然后显示出来。3. 学会使用芯片ADC0809,编写ADC0809的程序液晶显示程序,然后显示出来。4. 最后编写三个子程序综合程序,并在自己的制作出的八路电压巡检系统电路板上调试成功。第二章 设计方案的选择和确定2.1八路电压巡检系统设计过程 接受任务 明确任务,归并要求 选机,划分软硬件 软件设计硬件设计 调试 排除故障,修改程序 固化程序应用系统独立运行完成2.2总体设计在应用系统进行总体设计时,可根据应用系统提出的各项技术性能指标,拟定出性能价格比最高的方案。首先,应根据任务的繁杂程度和技术指标要求选择机型。目前,常用单片机有CS51系列,ARM单片机,DSP等。在总体方案设计过程中,必须对软件和硬件综合考虑,原则上,能用软件解决的任务就尽可能用软件来完成,以降低硬件的成本,简化硬件结构。总体方案一旦确立,系统的大致规模和软件的基本框架就确定了。2.3硬件设计硬件设计是指应用系统的电路设计,包括主机、控制电路、存储器、I/O口、AD转换电路等。硬件设计时,应考虑拥有充足余量,下面设计应注意以下问题。用系统硬()程序存储器(选容量较大的EPROM芯片,如2764(8KB),27128(16KB),尽量避免用小容量的芯片组合。)(2)数据存储器和I/O口 扩展外部RAM或I/O口,那么RAM芯片可用6264(8KB)或62256(32KB)原则上应尽量减少芯片数量,使译码电路简单,I/O口芯片一般选用8155(带有256KB静态RAM)或8255,这类芯片接口线多,逻辑简单。(3)地址译码电路通常采用全译码,部分译码或线选法。应考虑充分利用存贮空间和简化硬件逻辑方面的问题。(4)总线驱动能力、主要是MCS-51外部扩展能力,4个8位并行口的负载能力有限,P0 口能驱动8个LSTTL。 (5)系统速度匹配以及抗干扰措施等方面。2.4软件设计单片机应用系统的软件设计是研制过程中任务最繁重的一项工作,其难度也比较大,在本实验中要用到C51来编写程序。单片机应用系统的软件主要包括两大部分:即用于管理单片微型计算机工作的监督管理程序和用于执行实际具体任务的功能程序。对于前者,尽可能利用现成微型计算机系统的监控程序。后者要根据应用系统的功能要求来编写程序。计算机应用系统的软件设计千差五别,不存在统一模式,开发一个软件的明智方法是尽可能采用模块化结构。在各个程序模块分别进行设计、编制和调试后,最后再将各个程序模块连接成一个完整的总程序进行调试。(1)系统调试电路故障,包括设计性错误和工艺性故障。通常借助电气仪表进行故障检查。软件调试是利用开发工具进行软件在线仿真调试,在软件调试的过程中也可以发现硬件故障。软件调试可以一个模块一个模块的进行,一个子程序一个子程序的调试最后连起来总调。2.2基于单片机的八路电压巡检电路设计设计出的八路电压巡检电路应具备以下功能:1. 系统功能:电压测量,能够实时显示当前的电压值。2. 通道选择:能够实时选择所需要显示的通道电压值。3. 时钟功能:能作为时钟使用,显示当前时间。4. 时钟设置功能:能够通过按键设定时间,修改当前时间。2.5总体方案的设计设计出的八路电压巡检电路要具有AD转换和时钟的功能。电路所需要的电路模块及元器件为:单片机AT89S51,AD转换ADC0809,显示设备液晶1602,时钟电路DS1302,键盘输入电路,电源电路,以及程序下载接口电路。ADC0809 AT89S52液晶显示LCD1602DS1302 时钟模块键盘输入 程序下载接口电路复位电路 电源电路第三章 系统硬件设计3.1AT89S52单片机最小系统电路单片机的主要功能是负责整个系统的控制,承担复杂的数据处理任务,一个典型的单片机最小系统通常由时钟电路、复位电路、片外RAM、片内ROM、按键、液晶显示器、外部扩展等部分组成,单片机最小系统的结构框图如图:(1)时钟源电路单片机内部具有一个高增益反向放大器,用于构成振荡器,通常在引脚XTAL1和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,可以根据情况选择6MHZ和12MHZ等频率的石英晶体,补偿电容通常选择30PF左右的瓷片电容。(2)复位电路单片机最小系统采用上电自动复位和手动按键复位两种方式实现系统的复位操作,(3)键盘输入电路(4)电源电路用来给系统所有电路供电所用。(5)液晶1602显示电路液晶1602是专门用来显示字母、数字、字符等的点阵型液晶模块,由若干5*7、5*11等点阵字符位组成。3.2ADC0809的资料,DS1302和LCD1602(1)ADC0809 在51 单片机中的应用51 测试网论坛版主/黄海我们在做一个单片机系统时,常常会遇到这样那样的数据采集,在这些被采集的数据中,大部分可以通过我们的I/O 口扩展接口电路直接得到,由于51 单片机大部分不带AD 转换器,所以模拟量的采集就必须靠A/D或V/F 实现。下现我们就来了解一下AD0809与51 单片机的接口及其程序设计。1、AD0809 的逻辑结构ADC0809 是8位逐次逼近型A/D转换器。它由一个8路模拟开关、一个地址锁存译码器、一个A/D 转换器和一个三态输出锁存器组成(见图1)。多路开关可选通8个模拟通道,允许8 路模拟量分时输入,共用A/D 转换器进行转换。三态输出锁器用于锁存A/D 转换完的数字量,当OE 端为高电平时,才可以从三态输出锁存器取走转换完的数据。2、AD0809 的工作原理IN0IN7:8 条模拟量输入通道ADC0809 对输入模拟量要求:信号单极性,电压范围是05V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。地址输入和控制线:4条ALE 为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A, B,C 三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。A,B 和C 为地址输入线,用于选通IN0IN7 上的一路模拟量输入。通道选择表如下表所示。C B A 选择的通道0 0 0 IN00 0 1 IN10 1 0 IN20 1 1 IN31 0 0 IN41 0 1 IN51 1 0 IN61 1 1 IN7数字量输出及控制线:11 条ST 为转换启动信号。当ST 上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D 转换;在转换期间,ST 应保持低电平。EOC 为转换结束信号。当EOC 为高电平时,表明转换结束;否则,表明正在进行A/D 转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE1,输出转换得到的数据;OE0,输出数据线呈高阻状态。D7D0 为数字量输出线。CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ,VREF(),VREF()为参考电压输入。3、ADC0809应用说明(1) ADC0809 内部带有输出锁存器,可以与AT89S51 单片机直接相连。(2) 初始化时,使ST 和OE信号全为低电平。(3) 送要转换的哪一通道的地址到A,B,C 端口上。(4) 在ST 端给出一个至少有100ns 宽的正脉冲信号。(5) 是否转换完毕,我们根据EOC 信号来判断。(6) 当EOC变为高电平时,这时给OE 为高电平,转换的数据就输出给单片机了。4、AD0809 的应用了解完A/D 转换芯片,下面我们以图2 为例来完成它的程序设计。电路说明:电路见图(2),主要由AD 转换器AD0809,频率发生器SUN7474,单片机AT89S51及显示用数码管组成。AD0809的启动方式为脉冲启动方式,启动信号START启动后开始转换,EOC 信号在START 的下降沿10us后才变为无效的低电平。这要求查询程序待EOC无效后再开始查询,转换完成后,EOC 输出高电平,再由OE 变为高电平来输出转换数据。我们在设计程序时可以利用EOC 信号来通知单片机(查询法或中断法)读入已转换的数据,也可以在启动AD0809 后经适当的延时再读入已转换的数据。AT89S51的输出频为晶振频的1/6(2MHZ),AT89S1 与SUN7474连接经与7474的ST脚提供AD0809 的工作时钟。AD0809 的工作频范围为10KHZ-1280KHZ,当频率范围为500KHZ 时,其转换速度为128us。AD0809 的数据输出公式为:Dout=Vin*255/5=Vin*51,其中Vin为输入模拟电压,Vout为输出数据。当输入电压为5V 时,读得的数据为255 再乘以2,得510。我们用510*98%得499,再将百位数码管的小数点点亮,显示为.99V,显示值与输入值基本吻合。软件设计思路及程序流程编程思路:(1) 向AD0809 写入通道号并启动转换(2) 延时1ms 后等待EOC 出现高电平(JNB EOC,$)(3) 给OE 置高并读入转换数据存入数据地址或数组中。(4) 显示(2) DS1302 简介: DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.55.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如图1所示及内部结构如图2所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。 各引脚的功能为: Vcc1:主电源;Vcc2:备份电源。当Vcc2Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc20; i- ) /循环8次移位 SCLK = 0; temp = addr; DIO = (bit)(temp&0x01); /每次传输低字节 addr = 1; /右移一位 SCLK = 1; /发送数据 for ( i=8; i0; i- ) SCLK = 0; temp = dat; DIO = (bit)(temp&0x01); dat = 1; SCLK = 1; CE = 0; /数据读取子程序unsigned char Read1302 ( unsigned char addr ) unsigned char i,temp,dat1,dat2; CE=0; SCLK=0; CE = 1; /发送地址 for ( i=8; i0; i- ) /循环8次移位 SCLK = 0; temp = addr; DIO =(bit)(temp&0x01); /每次传输低字节 addr = 1; /右移一位 SCLK = 1; /读取数据 for ( i=8; i0; i- ) ACC_7=DIO; SCLK =1; ACC=1; SCLK = 0; CE=0; dat1=ACC; dat2=dat1/16; /数据进制转换dat1=dat1%16; /十六进制转十进制 dat1=dat1+dat2*10; return (dat1); /初始化DS1302 void Initial(void) Write1302 (WRITE_PROTECT,0X00); /禁止写保护 Write1302 (WRITE_SECOND,0x56); /秒位初始化 Write1302 (WRITE_MINUTE,0x34); /分钟初始化 Write1302 (WRITE_HOUR,0x12); /小时初始化 Write1302 (WRITE_PROTECT,0x80); /允许写保护(3) LCD1602 液晶显示简介液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由MN个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共168=128个点组成,屏上6416个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。字符的显示用LCD显示一个字符时比较复杂,因为一个字符由68或88点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。汉字的显示汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5右边为2、4、6根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节直到32B显示完就可以LCD上得到一个完整汉字。1082 1602字符型LCD简介字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。一般1602字符型液晶显示器实物如图10-53:图10-53 1602字符型液晶显示器实物图108.2.1 1602LCD的基本参数及引脚功能1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图10-54所示:图10-54 1602LCD尺寸图1602LCD主要技术参数:显示容量:162个字符芯片工作电压:4.55.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.954.35(WH)mm引脚功能说明1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极表10-13:引脚接口说明表第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。10823 1602LCD的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L*6置功能00001DLNF*7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容表10-14:控制命令表1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)指令1:清显示,指令码01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H。指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据。指令11:读数据。与HD44780相兼容的芯片时序表如下:读状态输入RS=L,R/W=H,E=H输出D0D7=状态字写指令输入RS=L,R/W=L,D0D7=指令码,E=高脉冲输出无读数据输入RS=H,R/W=H,E=H输出D0D7=数据写数据输入RS=H,R/W=L,D0D7=数据,E=高脉冲输出无表10-15:基本操作时序表读写操作时序如图10-55和10-56所示:图10-55 读操作时序图10-56 写操作时序10824 1602LCD的RAM地址映射及标准字库表液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图10-57是1602的内部显示地址。图10-57 1602LCD内部显示地址例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图10-58所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”图10-58 字符代码与图形对应图10825 1602LCD的一般初始化(复位)过程延时15mS写指令38H(不检测忙信号)延时5mS写指令38H(不检测忙信号)延时5mS写指令38H(不检测忙信号)以后每次写指令、读/写数据操作均需要检测忙信号写指令38H:显示模式设置写指令08H:显示关闭写指令01H:显示清屏写指令06H:显示光标移动设置写指令0CH:显示开及光标设置第四章 系统的软件设计(1)DS1302的显示程序#include #include #include sbit KEY0 = P12;sbit KEY1 = P13;sbit KEY2 = P14;sbit KEY3 = P27;uchar key_operate = 0;uchar timer =0;uchar key_flag=0;uint counter=0;uchar Lcd_t = 0; /LCD刷新间隔uchar flicker = 0; /调时闪烁间隔uchar a11=0;uchar h9=0;uchar m4;uchar num3;uchar code week4=MON,TUS,WEN,THU,FRI,SAT,SUN,;void delayms(uint n)uint i,j;for(i=n;i0;i-)for(j=120;j0;j-);void displaydate()con_1302();a0=2;a1=0;a2=time12;a3=time13;a4=-;a5=time8;a6=time9;a7=-;a8=time6;a9=time7;a10=0;void displaytime()con_1302();h0=time4;h1=time5;h2=:;h3=time2;h4=time3;h5=:;h6=time0;h7=time1;h8=0;void clearscr()num0=32;num1=32;num2=0;void main()TMOD=0x01; TH0 = (65536 - 28000)/256; TL0 = (65536 - 28000)%256;EA=1;ET0=1;lcd_init();delayms(10);Init_ds1302();delayms(10);clearscr();set1302(date);TR0=1;while(1)if(Lcd_t1) Lcd_t=0;if(key_operate = 0) get1302(); else set1302(date);displaydate();displaytime();gotoxy(0,0);print(a);gotoxy(12,0);print(weektime11-48);gotoxy(0,1);print(h); if(flicker22) if(flicker30) flicker=0; switch (key_operate) case 1:/分 gotoxy(3,1);print(num); break; case 2: /小时 gotoxy(0,1);print(num); break; case 3: /星期 gotoxy(12,0); print(num); gotoxy(14,0);print(num); break; case 4: /日期gotoxy(8,0); print(num); break; case 5: /月 gotoxy(5,0); print(num); break; case 6: /年 gotoxy(2,0); print(num); break;/ case 7: /年(高位) / gotoxy(0,0); /print(num); / break; default: break; void Timer_0(void) interrupt 1 using 1 TR0 = 0; TH0 = (65536 - 28000)/256; TL0 = (65536 - 28000)%256; Lcd_t +; flicker +; if(!KEY0)|(!KEY1)|(!KEY2)|(!KEY3)&(key_flag=0) timer=0;/清除不按键计数器 key_flag = 20; while(-key_flag);/延时去抖动 key_flag = 1; if(!KEY0)/Modle键,进入调时模式 if(key_operate=0) key_flag = 0;/允许按键长按 if(counter+30) /Modle键要长按2S生效 key_operate+; key_flag = 1;/不允许按键长安 else key_operate+; if( key_operate 6) key_operate = 1; else if(!KEY1) switch (key_operate) case 1:/分钟 if(timebuf1- =0) timebuf1 = 59; break; case 2:/小时 if(timebuf2- =0) timebuf2 = 23; break; case 3:/星期 if(timebuf5- =0) timebuf5 = 6; break; case 4: /日 if(timebuf3- =1) timebuf3 = 30; break; case 5: /月 if(timebuf4- =1) timebuf4 = 12; break; case 6: /年if(timebuf6- =0) timebuf6 = 99; break; / case 7:if(timebuf7- =0) timebuf7=20;/break; default: break; else if(!KEY2)switch (key_operate) case 1:/分钟 if(+timebuf159) timebuf1=0; break; case 2:/小时 if(+timebuf223) timebuf2=0; break; case 3:/星期 if(+timebuf56) timebuf5 = 0; break; case 4:/日 if(+timebuf330) timebuf3=1; break; case 5:/月 if(+timebuf412) timebuf4=1; break; case 6:/年 if(+timebuf699) timebuf6=0; break; / case 7:if(+timebuf799) timebuf7=20; break;/ default: break; else if(!KEY3) key_operate=0; counter=0; else if(timer+800)/长期不按键,自动回到走钟状态 timer=0; key_operate=0; counter=0; if(KEY0)&(KEY1)&(KEY2)&(KEY3) key_flag = 0;TR0 = 1; (2)ADC0809在液晶上的显示程序#include#define uchar unsigned char#define uint unsigned intuchar LCD_DSY_BUFFER1=VOL:0.00(v) ;uchar code2=12345678;uchar LCD_DSY_BUFFER2=num1;sbit ADDA=P13; sbit ADDB=P22; sbit ADDC=P21;sbit ALE=P20; sbit ST=P24; sbit EOC= P25;sbit OE=P26;void delay_50us(uchar i)uchar a; while(-i!=0) for(a=0;a20;a+); void delay_ms(uchar i)uchar a; while(-i!=0) for(a=0;a125;a+); void set_ad_channel(uchar channel) switch (channel) case 1:ADDA=0;ADDB=0;ADDC=0; break; case 2:ADDA=0;ADDB=0;ADDC=1; break; case 3:ADDA=0;ADDB=1;ADDC=0; break; case

温馨提示

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

评论

0/150

提交评论