欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    电力系统设计作业(共34页).doc

    • 资源ID:14195083       资源大小:1.90MB        全文页数:34页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    电力系统设计作业(共34页).doc

    精选优质文档-倾情为你奉上电子系统设计与实践依据时段可变显示亮度电子钟电气工程学院电气83 张颢 电气83 王攀 摘要 本次设计以AT89C52芯片为中心,加上必要的外部电路,组成了一个依据时段可变显示亮度数字电子时钟。 硬件方面,除单片机外,使用了8个七段LED数码管来进行显示,采用的是动态扫描显示,利用74LS573进行数码管段驱动,利用ULN2803A进行位驱动。通过LED能够比较准确显示时、分、秒以及日期和当前室温。利用几个简单的按键分别实现对时间的调整,年月日显示的切换,以及温度显示切换。时钟日历来源于DS1302芯片。温度测量功能来自DS18BU20芯片。软件方面采用C语言编程,在单片机环境下,加设中断,定时,以完成功能实现。整个电子钟系统能完成时间的显示,调时,定闹及温度显示等功能。关键词: 电子系统设计 电子时钟 温度显示 AT89C52 DS1302 DS18B20目录一、 实验目的及任务、功能、具体工作内容二、 重要硬件简介与相应模块设计三、 主程序设计实现四、 系统框图五、 总体设计系统电路原理图和PCB版图六、 程序流程图七、 系统调试总结八、 实验遇到的问题及改进九、 实验总结及感想十、 参考书目十一、 源程序一 实验目的及任务、功能、具体工作内容1. 目的及任务:(1)通过查阅相关资料,深入了解电子钟的组成结构和工作原理;(2)学习有关动态显示方式及原理;(3)复习“MCS-51单片机原理及C语言程序设计”,掌握其接口扩展,如:显示、键盘等;(4)设计具有报时报温功能电子钟的原理图,构建硬件平台; (5)采用汇编或C语言编写应用程序并调试通过; (6)制作出样机并测试达到功能和技术指标要求;(7) 写出设计报告和答辩PPT。2.设计产品功能 此次设计产品要实现一个依据时段可变显示亮度电子钟,具体如下:1. 能够实现基本时钟的走时,显示范围是00:00:0023:59:59。能够实现时钟的调整,通过按键可以对“时”位和“分”位进行加1调节,并能当加至最大值时能重新归零。2. 能够实现当前室温的测量功能,并在数码管上予以显示。3. 能够实现年月日的显示与切换。4. 能够实现温度的显示与切换。5. 能够实现根据时段自动改变显示亮度。3.具体工作内容:1组建依据时段可变显示亮度电子钟的总体结构框图;2根据题目要求,选择所要使用的主要器件,通过理论分析和计算选择电路参数;3根据操作功能要求,确定键盘控制功能;4按设计要求确定显示位数、指示类型和单位;5采用汇编或C语言编写应用程序并调试通过;6对系统进行测试和结果分析; 7撰写设计报告和答辩PPT。二 重要硬件简介及应用 DS18B20温度传感器,DS1302时钟日历芯片。1、 温度模块该模块使用了芯片DS18B02,该芯片可以检测室温并将温度实时传感至单片机。在本模块中,我们主要采用了书上的程序,在写主函数时做了一点改动。(1)DS18B20主要资料  DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO92小体积封装形式;温度测量范围为 55125,可编程为9位12位A/D转换精度,默认分辨率为12位,测温分辨率可达0.0625,被测温度用符号扩展的16位数字量方式串行输出;其工作电源 既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。以上特点使DS18B20非常适用于远距离多点温度检测系统。  DS18B20 内部结构如图1所示,主要由4部分组成:64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如图2所示,DQ为数字信号输入输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地。图1)DS18B20的内部结构图2DS18B20的管脚排列DS18B20 中的温度传感器完成对温度的测量,用16位符号扩展的二进制补读 数形式提供,以0.0625/LSB形式表达,其中S为符号位。例如125的数字 输出为07D0H,25.0625的数字输出为0191H,25.0625的数字输出FF6FH,55的数字输出为FC90H。(2)DS18B20芯片与单片机之间的数据传输由于DS18B20与单片机之间是通过一个端口进行连接的,故其与单片机之间是采用的是串行通信方式。通过单片机向DS18B20发送命令控制字,然后再接收相应的数值,比如温度值等。下面是单片机向DS18B20读温度值的过程:读温度前的准备:tmwbyte(0xcc);/跳过ROMtmwbyte(0xbe);/开始转换读取温度值:a=tmrbyte();/读取温度低字节b=tmbyte();/读取温度高字节即读温度前单片机要向DS18B20发送两个控制命令字0xcc和0xbe,然后再接收DS18B20送来的温度值,此温度值由两个字节组成,每个字节的单方如下:即低字节的最低位对应于1/16摄氏度,即其分辨率为0.0625。高字节后5位为符号位,当读出的温度值是正值时符号位S=0,反之则S=1。这样当当前温度值为正值时就可以直接把温度值的各个位提出来,而当当前温度值为负值时就必须先把读出来的两字节取补后再提取各位,把提出来的数放在相应的数组中就可以显示。读出温度函数为:unsigned char read_T();此函数把读出的温度值的各位提取出来,分别放在display_buffer8数组的各位中以待显示。动态显示程序能够实时把display_buffer8里面的数通过数码管显示出来。(3)温度模块的设计:温度模块主要有下列几个要素:(1)DS18b20采用一根端口线和CPU传输数据。(2)利用循环移位功能来实现数据的传输。(3)在读取DS1820的温度数据时要注意读取的时序,要严格按照时序表来。(4) 因为时分秒和年月日的显示都是6位,可以利用显示剩下的两个数码管来显示温度(故温度只取到整数)。(5) 设计时,我们考虑用按键的方式来进入温度显示,后考虑再三,采用进入read_T之后延时一段时间,再自动跳回read_time读取时间。具体如下:if(s1=0&s2=1)read_time1();delay1(5000);read_time();2、 日历模块该模块使用了芯片DS1302,该芯片可以向单片机提供时、分、秒以及年、月、日等时间信息。在本模块中,我们仍然主要采用了书上的程序,采用按键的方式实现了时间和日期之间的转换。(1)、DS1302主要资料DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟|日历和31个字节静态RAM,通过简单的串行接口与单片机进行通信,实时时钟|日历电路提供秒、分、日、日期、月、年的信息、每月的天数和闰年的天数可以自动调整,时钟操作可通过AM/PM指示决定采用24小时或12小时格式,DS1302与单片机之间能简单地采用同步的方式进行通信,仅需用到RES复位,I/O数据线、SCLK串行时钟3个口线。对时钟、RAM的读/写。可以采用单字节方式或多达31个字节的字符组方式。DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW。DS1302广泛应用于电话传真、便携式仪器及电池供电的仪器仪表等产品领域中。DS1302的结构及工作原理:.引脚功能及结构 DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc10.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK为时钟输入端。.DS1302的控制字节 DS1302 的控制字如图所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。.数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。.DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见下表。DS1302 内部寄存器CH: 时钟停止位 存器2 的第7 位12/24 小时标志CH=0 振荡器工作允许 bit7=1,12 小时模式CH=1 振荡器停止 bit7=0,24 小时模式WP: 写保护位 寄存器2 的第5 位:AM/PM 定义WP=0 寄存器数据能够写入 AP=1 下午模式WP=1 寄存器数据不能写入 AP=0 上午模式TCS: 涓流充电选择 DS: 二极管选择位TCS=1010 使能涓流充电 DS=01 选择一个二极管TCS=其它 禁止涓流充电 DS=10 选择两个二极管DS=00 或11, 即使TCS=1010, 充电功能也被禁止此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0HFDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 IV.DS1302与单片机之间的通信方式。DS1302与单片机之间也是采用串行的通信方式实现数据的传输。单片机通过向DS1302发送相应的寄存器地址实现相应的功能。单片机向DS1302置入数据的框图如下: 如要把小时数为21时置入DS1302中让其以这个初值开始走时,则需先向DS1302发送写时控制字0x80,然后再把时间0x21向DS1302发送,这样DS1302的小时计数初值就为21时,特别要注意的是此处置入的时间为十六进制的数的一个字节,此字节的高4位为小时的十位,低4位为小时的个位,要置入年月日分秒等也是如此。单片机向DS1302读时间的框图如下:此图为单片机先向DS1302发送寄存器地址,然后再接收DS1302发送来的数据。例如先向DS1302发送读小时寄存器地址0x81,再接收一个字节,接收的字节就为当前的小时数。读年月日秒分星期功能实现也是如此。这样就可以把当前时间和日期等数据读出来放在display_buffer8数组中以待显示。(2)日历模块的设计:日历模块有以下几个要素:(1) DS1302使用单总线和CPU完成数据交换,故利用循环移位功能来实现数据的传输。(2) 和温度的读取一样,在编写程序时,要注意每一位控制字的不同。而与温度模块不同的是,日历模块还牵扯到更改日期的问题,故还要编写关于WRITE的函数部分,而WRITE和READ的控制字在最后一位为反。(WRITE为偶数,READ为奇数)(3) 时间和日历的控制字也不同。(4) 读操作和写操作时要严格遵循时序图。(5)采用按键切换的方式,当S2按下的时候进入日期模式(S2=0时,read_time1();),当S2弹起的时候回到时间显示的函数。设置三个函数:read_time()、read_time1()、read_T(),这三个函数分别把当前的时间、日期、温度值放在display_buffer数组中,通过定时器0的动态显示把这几个数从数码管中显示出来。这样就可以通过按键切换显示,其实现如下:if(s1=0&s2=1)read_time1();delay1(5000);read_time();else if(s1=1&s2=0)read_T();else read_time();在这个程序中,并没有使用多个数组存放数据,而是在同一个display_buffer中,没执行一次读取数据的函数,display_buffer的内容含意会发生变化,并不单独属于哪个模块。4、闹钟模块因为闹钟模块原来所使用的芯片DS25120本次并没有采用,故使用了数码管闪烁的方式代替原来扬声器的功能表现定闹。由动态显示的原理可以知道,当一个周期内每个数码管显示的时间变短,低于人眼视觉暂留现象的极限时,人便可以发现8个LED数码管不断显示的现象。所以我们决定,仍然利用动态显示的原理,编写一个令LED闪烁的程序来完成本模块的功能。仔细考虑之后,我们决定,使用一个判断函数和一个控制闪烁的函数组合完成功能。判断用Judge函数,不断循环检测read_time的内容是否和定闹函数设定的值相等,如果相等,那么执行闪烁函数shanshuo。闪烁函数的内容和动态函数的内容非常相似,只是在函数开始时我们将时间常数改得更大,这样每个周期中LED的点亮时间就会变短,最终决定为7500。当时间到达设定好的闹钟时间时,judge函数会调用闪烁函数,数码管开始闪烁。当这一分钟过去,judge函数会自动检测到和预设的时间不符,则停止执行shanshuo函数,LED停止闪烁。不过这个程序的缺点是,不能手动停止闪烁函数,必须是等程序自己检测。这个程序设计的好处是,闪烁并没有使用中断,实际上闪烁时程序仍在执行read_time,所以此时可以进行调时和显示。值得注意的是,DS1302读出的数是BCD码,CPU运算采用的是十六进制,比较时需要写代码,将其转换。5、 调时模块调时模块的实现主要是依靠按键实现的,这样就牵扯一个按键的分配问题。其中,S2被用来显示日历,S3被用来显示温度。于是我们将S4设为闹钟定时。时间调时:S5设为调时,并采用外部中断的方式。当按下S5的时候,系统进入中断0,flag+1.此时按下S2,分加一。再次按下S5,flag+1,此时按下S2,小时加一。此时再次按下S5,flag=3,此时程序将此时的时分写入display_buffer,跳出调时,回到read_time,同时flag清零。闹钟定时:在时间模式下,按住S4,进入闹钟定时模式,实际上是程序检测到S4=0,调用了tiaoshi函数。此时按住S4,同时按下S2,分加一,按下S1,时加一。当松开S4时,程序检测到S4=1,此时将刚才输入的数字输入judge函数的数组,以备比较。三、总体设计的实现(1)编程语言的选择: 对于本实验所用的单片机AT89C52,汇编语言和C语言都可以实现我们设想的功能。虽然由汇编语言和C语言所编写的程序所生成的机器代码长度完全相同,但C语言毕竟是更高级的语言,更容易掌握,也更具有可读性,而且,它的可移植性也远远优于汇编语言,特别是对于比较大的程序。所以,我们决定采用C语言编写程序。(2) 主程序的编写主程序主要是将几个模块的函数组合起来,使彼此之间不冲突。主函数是通过按键S5引入外部中断调用不同子函数,同时加进七段数码管的动态显示程序,利用定时器0的工作方式1实现显示,同时,由于利用按键实现功能切换,考虑按键很容易抖动,程序中加入防抖函数。(3)亮度显示调节动态显示工作原理:两片74LS373作为7段码和位码驱动锁存器,8个数码管是共阴极数码管,一片ULN2803作为位增强驱动器。段地址为DFFFH、位地址为BFFFH 。定时器1作为定时刷新定时器,定时时间常数为2.5mS。段码虽同时到达 8个LED,但一次仅一个LED被选中。利用“视觉暂留”,每送一个字符并选中相应位线,延时一会儿,再送/选下一个循环扫描即可。每个数码管亮的时序图如下:这样在20ms内每个LED亮2.5ms。如果要对其亮度进行控制。可使每个LED在这20ms内亮的时间更短。实现的时序图如下:从图在可以看出每个数码管的平均点亮时间缩短,故其亮度较前都要暗。故这样就可以通过控制每个数码管亮的平均时间来控制其在动态显示中的平均亮度。四、 系统框图五、 总体设计系统电路原理图和PCB版图六、 程序流程图七、实验遇到的问题及改进(1)切换温度时的问题在能正确切换时间与日期后,当加入温度切换时温度值的读入不正常,总是显示温度之后不能回到原来显示时间的状态。后观察程序,加入了一段代码if(s3=0&s2=1) read_T();delay1(5000);read_time();这样就使压下s3时显示温度,一段时间延时后自动回复显示时间。后来在调试过程中又发现,有时温度会显示“85”,但有时又恢复正常。后来询问了老师,采取了在程序内加入关断总中断的方法,避免了该问题。(2)按键调时的问题在判断是否有键按下时,一般情况下可以直接扫描键盘,有键按下时输入为低电平。然后再执行相应的功能。但是在调时阶段中,由于调时或调分的时候不知要按多少下,因此不能简单地直接用电平来判断是否有键按下,而是可以用边沿触发来判断。这样在键末按下或按下时不执行任何操作,处于等待状态,而在有上升沿或下降沿到来时再执行相应的加时加分工作。(3)日历模块我们使用参考书上的日历程序,只是添加了关于日历的但是遇到的一个问题是,怎么实现既显示时分秒,又显示年月日,只有8位数码管,无法实现将12位的数据写入,向同学请教后决定使用同一个数组Display_buffer,利用S5的按下启用中断,在不同时间将时间或者日期存入数字中。这样只利用6位数码管就足够了。(4) 闹钟模块这是本次实验的缺陷,即没有办法实现闹钟在设闹的时间使LED闪烁。但是可以使LED在初始设定的时间启动闹铃程序。经过分析,我们认为是judge函数的问题,但是经过改正之后仍然无法实现功能。八、实验总结及感想作为电力系统与自动化专业的学生,始终在与强电系统在接触,几乎很少接触弱电编程类的内容,c语言也几乎没有学习。而通过本学期电子系统设计与实践课程的学习以及最终设计的完成,让我们建立了一种新的学习与探究思维的方式,锻炼了我们的编程能力,模块调试能力,动手能力,以及查询资料,阅读文献和自学的能力。做完本次设计之后,我们一致认为,最终设计所包含的内容基本在之前的所有试验当中都有提及,为最终设计的功能实现打下了良好的基础。所以良好的试验态度最终决定设计的质量。拿到题目之后,我们先阅读了系统设计的任务书,了解了我们需要实现的功能,并进行了简单的分工,硬件和软件工作分离开来,将功能分成几个模块,了解了基本元器件与模块的关系,参照书中基本程序和之前基础实验中的程序,逐个进行了模块的调试,经过程序的修改和优化,完成了大部分功能的实现,但是在细节以及一些功能的实现上仍存在问题,之后我们请教了老师并同其他同学进行交流,终于完成了程序的设计,并且基本实现了功能。与此同时,我们花了一天时间进行了电路图的绘制。接下来,我们利用晚上的时间进行了电路板的焊接,在焊接过程中,对各种元器件的封转与引脚排布有了进一步的认识。最后,我们将程序进行了最终优化,分块以及注释,对其中的赘余程序进行了删减。并对温度的显示细节做了一些修改。通过本次单片机系统设计实验,使我们在做课题方面有了一定的认识。促进了小组成员之间的团结、合理分工、互相配合与有效沟通。使得我们的创新与探究学习能力大大加强。当然,对单片机的结构、功能和普通产品的制作流程也有了更清晰的认识。让我们真正感觉到理论与实践的结合,感觉到理论在实际生产生活中的应用。感谢三位老师在我们此次试验的设计、电路板制作与调试中不厌其烦地指导。我们从中获益良多。九、参考书目51系列单片机及C51程序设计 科学出版社 王建校著电子系统设计与实践(修订本) 西安交通大学 王建校 张虹 金印彬著十、源程序#include <at89x52.h>#include <stdio.h>#include <absacc.h>#include <intrins.h>#define SEGMENT XBYTE0x5fff/段码寄存器地址#define BIT_LED XBYTE0x3fff/位码寄存器地 #define fosc 11.0592/晶振频率#define time02800/定时2800uS,显示正常亮度时用#define time1 250#define time3 2800 /显示较暗方式用unsigned char data display_bit,display_buffer8,display_buffer28;unsigned char data time0_h,time0_l,time1_h,time1_l,time3_h,time3_l,TEMP;unsigned int idata time0_times;unsigned int idata time1_times;unsigned int idata time3_times;unsigned int close=0;int h1=0x11;int m1=0x00;unsigned char h,m;unsigned char biaoji=0;unsigned char get_code(unsigned char i);void display(void);void tiaoshi(void);void zoushi(void);void judge1();/ds1302变量及函数定义开始sbit SCL_DS1302 =P20;sbit IO_DS1302 =P21;sbit RST_DS1302 =P22;sbit s1=P10;sbit s2=P11;sbit s3=P12;sbit s4=P13;sbit s5=P32; bit flag_flash=1;int flag=0;unsigned int now;sbit TMDAT = P34;/TMDAT = P10;void dmsec (unsigned int count);/DS18B20函数定义void tmreset (void);void tmstart (void);unsigned char tmrtemp (void);void delay1(unsigned int a)unsigned int i,j;for(i=0;i<a;i+)for(j=0;j<125;j+);void delay(unsigned char a)/延时140usunsigned char i,j;for(i=0;i<a;i+)for(j=0;j<9;j+);unsigned char data display_buffer38;unsigned char bdata data_ds1302;/将该变量定义在可按位寻址的内部数据存贮器中sbit bit_data0=data_ds13020;/有了以上的定义就可以定义bit_data0=data_ds13020sbit bit_data7=data_ds13027;/有了以上的定义就可以定义bit_data7=data_ds13027unsigned char bdata x;sbit x0=x0;sbit x7=x7;void initial_ds1302();/DS1302初始化unsigned char read_ds1302(char command);void open_write_bit();void close_write_bit();void read_time();/读取当前时间void read_time1();/读取当前日期void read_T();/读取当前温度值void alarmmin(void); /调闹铃分void alarmhour(void); /调闹铃时void set_time();/置入时间函数void delay(unsigned char a);/延时函数void minute(void);/调分函数void hour(void);/调时函数void shanshuo();/ds1302变量及函数定义结束main() BIT_LED=0;/关闭LED显示TEMP=TMOD;TEMP=TEMP & 0XF0;TMOD=TEMP | 0X01;TMOD=(TMOD&0x0f)|0x10;/定时器/计数器0定时方式1,定时器/计数器1定时方式1time0_times=65536-time0*fosc/12;time0_h =(time0_times/256 );time0_l =(time0_times%256);time1_times=65536-time1*fosc/12;time1_h =(time1_times/256 );time1_l =(time1_times%256);time3_times=65536-time3*fosc/12;time3_h =(time3_times/256);time3_l =(time3_times%256);TH0=time0_h;TL0=time0_l;/高8位和低8位时间常数TR0=EA=ET0=1;/启动定时器0EX0=1;/启动外部中断INT0PT0=1;/定时器0中断设为最高优先级PX0=0;/外部中断0设为非最优先级IT0=1;/边没激活方式initial_ds1302();/上电启用,否则不走时display_bit=0x01;/从第一个数码管开始显示display_buffer0=0X01;display_buffer1=0X06;display_buffer2=0X05;display_buffer3=0X09;display_buffer4=0X05;display_buffer5=0X05;display_buffer6=0x00;display_buffer7=0x07;display_buffer22=0x01;display_buffer23=0x01;display_buffer24=0x00;display_buffer25=0x05;display_buffer26=0x00;display_buffer27=0x01;display_buffer30=0X00;display_buffer31=0X00;display_buffer32=0X00;display_buffer33=0X00;display_buffer34=0X00;display_buffer35=0X00; set_time();/将数组中的时间置入DS1302 while(1)tiaoshi();void zoushi(void)if(s3=0&s2=1) read_T();delay1(1000);read_time();judge1(); else if(s2=0&s3=1) biaoji=2 , read_time1() ;else read_time();judge1();void time0_int(void) interrupt 1/中断服务子程序now=display_buffer0*10+display_buffer1;if(now>=17|now<7)/如是小时数小于7或大于17则以较暗方式显示close+;if(close=2)close=0;if(close=0)TH0=time3_h;TL0=time3_l;BIT_LED=0;elseTH0=time1_h;TL0=time1_l;display(); elseTH0=time0_h;TL0=time0_l;display(); void int_int(void) interrupt 0/外部中断INT0,进入调时阶段。 flag+; if(flag=3) flag=0;set_time(); void tiaoshi(void) if(s1=0)biaoji=3;alarmhour(); else if(s4=0)biaoji=3;alarmmin(); elsebiaoji=0; switch(flag) case 0: zoushi(); break;/从新的时间开始走时 case 1: minute(); break;/进入调分函数 case 2: hour(); break;/进入调小时函数 default: break; void minute(void)/调分函数if(s2=0)delay(4);if(s2=0) while(!s2);if(display_buffer3=9)display_buffer3=0;if(display_buffer2=5)display_buffer2=0;elsedisplay_buffer2+; elsedisplay_buffer3+; while(s2);void hour(void)/调时函数if(s2=0)delay(4);if(s2=0) while(!s2);if(display_buffer1=9)display_buffer1=0;display_buffer0+;else if(display_buffer1=3&&display_buffer0=2)display_buffer1=0;display_buffer0=0; elsedisplay_buffer1+;while(s2); unsigned char get_code(unsigned char i)unsigned char p; switch (i) case 0: p=0x3F;break;/*0*/ case 1: p=0x06;break;/*1*/ case 2:

    注意事项

    本文(电力系统设计作业(共34页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开