饮水机循环定时器的设计(编辑修改稿)内容摘要:

大学本科生毕业设计(论文) 13 在对 Flash 存储器编程期间,该引脚还用于输入编程脉冲( PROG )。 如果需要的话,通过对专用寄存器( SFR)区中 8EH 单元的 D0位置数,可禁止 ALE操作。 该位置数后,只有在执行一条 MOVX 或 MOVC 指令期间, ALE 才会被激活。 另外,该引脚会被微弱拉高,单片机执行外部程序时,该设定禁止 ALE 位无效。 PSEN (Pin29) 外部存储器读选通信号 当 AT89C51 由外部程序存储器取指令(或常数)时,每个机器周期两次 PSEN 有效(即输出两个脉冲)。 但在此期间内,每当访问外 部数据存储器时,这两次有效的 PSEN 信号将不出现。 EA /Vpp(Pin31) 外部访问允许端。 要使 CPU 只访问外部程序存储器(地址为0000HFFFFH),则 EA 端必须保持低电平(接到 GND 端)。 然而要注意的是,如果保密位 LB1 被编程,复位时在内部会锁存 EA 端的状态。 当 Flash 存储器编程期间,该引脚也用 于施加 12V 的编程允许电源 Vpp(如果选 用 12V 编程)。 /输出引脚 ~ 、 ~ 、 ~ 、 ~ PO口( Pin39~ Pin32): 8位双向 I/O口线,名称为 ~ P1口( Pin1~ Pin8): 8 位准双向 I/O 口线,名称为 ~ P2口( Pin21~ Pin28): 8位准双向 I/O 口线,名称为 ~ P3口( Pin10~ Pin17): 8位准双向 I/O 口线,名 称为 ~ P0 端口( ~ ) P0 是一个 8 位漏极开路型双向 I/O 端口。 作为输出口用时,每位能以吸收电流的方式驱动 8 个 TTL 输入,对端口写 1 时,又可作高阻抗输入端用。 在访问外部程序和数据存储器时,它是分时多路转换的地址(低 8 位) /数据总线,在访问期间激活了内部的上拉电阻。 在 Flash 编程时, P0 端口接收指令字节;而早验证程序时,则输出指令字节。 验证时,要求外接上拉电阻。 P1 端口( ~ ) P1 是一个带有内部上拉电阻的 8 位双向 I/O 端口。 P1 的输出缓冲器可驱动( 吸收或输出电流方式) 4 个 TTL 输入。 对端口写 1 时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。 作输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流( I)。 大学本科生毕业设计(论文) 14 在对 Flash 编程和程序验证时, P1 接收低 8 位地址。 P2端口( ~ ) P2 是一个带有内部上拉电阻的 8 位双向 I/O 端口。 P2 的输出缓冲器可驱动(吸收或输出电流方式) 4 个 TTL 输入。 对端口写 1 时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。 P2 作输入口使用时,因为有内部的上拉电阻,那些被外部信号 拉低的引脚会输出 一个电流( I)。 在访问外部程序存储器和 16 位地址的外部数据存储器(如执行 MOVX @DPTR 指令)时, P2送出高 8 位地址。 在访问 8 位地址的外部数据存储器(如执行 MOVX @R1指令)时, P2口引脚上的内容(就是专用寄存器( SFR)区中 P2 寄存器的内容),在整个访问期间不会改变。 在对 Flash 编程和程序验证期间, P2 也接收高位地址和一些控制信号。 P3 端口( ~ ) P3 口是一组带有内部上拉电阻的 8位双向 I/O 口。 P3 口输出缓冲级可驱动 (吸收或输出电流 )4 个 TTL 逻辑门 电路。 对 P3 口写入“ 1”时,它们被内部上拉电阻拉高并可作为输入端口。 作输入端时,被外部拉低的 P3口将用上拉电阻输出电流 (I)。 P3口一除了作为一般的 I/0 口线外,更重要的用途是它的第二功能,如下表 2所示 : 端口引脚 第二功能 RXD TXD INT0 INT1 T0 T1 WR RD (表 1) P3 口还可用于接收一些 Flash 闪速存储器编程和程序校验的控制信号。 大学本科生毕业设计(论文) 15 第四章 饮水机定时器的软件设计 一 系统软件设计要求 该定时器主要是由 4 部分组成:按键电路、时钟电路、显示电路和继电器电路组成。 对于定时器的软件设计要求能够准确,不能因为外界的条件变化或是自身的某些原因而出现偏差:还要能够具有较高的灵活性,在编写程序的时候,采用自顶向下的分析方法,将整个软件系统划分城若干个子系统,可以针对每一个子程序编写程序。 如果需要修改现有功能或添加功能,只需要修改或添加相应的程序即可。 另外还要尽量做到设 置最少的控制端,能够实现最多的功能,做到既实用又方便。 二 软件设计所需实现的功能 ( 1)正常模式下数码管正确显示时间,显示时间的时和分。 ( 2)定时模式下能利用按键进行正常模式与定时模式能相互切换,能够利用按键组合设置 2 个定时时间。 ( 3)定时设置还可设置成单次定时和循环定时 2 个设置。 ( 4)正常显示时间时,若连续十分钟没有进行任何按键操作,则数码管会自动熄灭,而当按下任意按键时,数码管则会再次点亮并显示当前的时间。 三 定时器软件设计的流程图 大学本科生毕业设计(论文) 16 (图 10)软件设计流程图 程序如下: void ScanKey() { P1_0=1。 //端口赋 1,以保证正确扫描按键 if(P1_0==0 ) //有键按下 { delay(80)。 P1_0=1。 //端口赋 1,以保证正确扫描按键 判断按键是否响应 初始化时间设置 DS1302 初始化 读出 DS1302 中的时分秒 数码管显示 是否已设定时间 定时 2 是否显示 定时 1 是否显示 按键处理 负载电路断开 负载电 路导通 YES YES YES No No No No YES YES 开始 大学本科生毕业设计(论文) 17 if(P1_0==0) //去抖动 { wait()。 if(mark==1) {mark=0。 minute=min。 second=sec。 } else if(P1_0==1) {flag[0]=1。 minute=min。 second=sec。 } //按键值 else {flag[0]=2。 minute=min。 second=sec。 } } } P1_3=1。 //端口赋 1,以保证正确扫描按键 if(P1_3==0) //有键按下 { delay(80)。 P1_3=1。 if(P1_3==0) { P1_3=1。 while(P1_3==0)。 if(mark==1) {mark=0。 minute=min。 second=sec。 } else { flag[3]=!flag[3]。 LED=!LED。 minute=min。 second=sec。 } } } } 大学本科生毕业设计(论文) 18 void ScanKey1(void) { P1_1=1。 if(P1_1==0) { delay(80)。 P1_1=1。 if(P1_1==0) { wait()。 if(P1_1==1) {flag[1]=1。 minute=min。 second=sec。 } else{flag[1]=2。 minute=min。 second=sec。 } } } else flag[1]=0。 P1_2=1。 if(P1_2==0) { delay(80)。 P1_2=1。 if(P1_2==0) { wait()。 if(P1_2==1) {flag[2]=1。 minute=min。 second=sec。 } else {flag[2]=2。 minute=min。 second=sec。 } } 大学本科生毕业设计(论文) 19 } else flag[2]=0。 } ( 1)如图 10 其中初始化时间设置是对 DS1302 时钟芯片的初始化的前提,其设置办法是用两个按键分别调节时和分,将时和分调节到需要调节的当前时间后,将该数据写入 DS1302 中,此时, DS1302 中的内部时钟则以刚刚设定的数据为起点,然后再通过读操作把时间读出来并显示即可。 ( 2)按键处理包括了定时时间的设置和已经设置好了定时时间,按模式切换按键可以用来查看刚才设置好的时间。 ( 3)整个软件程序的编写时本课题的一个大工程,占毕业设计比例最大,花费时间最多的。 其结构比较复杂,需要仔细编写,思路要清晰,程序要编写 准确可行。 大学本科生毕业设计(论文) 20 四 上电后设置流程图 如下图 11是对定时器接通 +5V电源后通电时按键处理操作流程的说明。 (图 11) 程序如下: void DealWith() 结束 初始化时间 按键 2 控制时,按键 3控制分,调整完后按住按键 2 进行意识确认 启动时钟芯片显示正常的时间 按下按键 1 按键 2 控制数码管位移,按键 3 控制加 1 按住按键 3 一会,定时 1 设置完成 显示正常时间 按下按键 1 不马上松开 按键 2 控制数码管位移,按键 3 控制加 1 定时时间 2 设置 按住按键 3 一会,定时 1 设置完成 显示正常时间 开始 大学本科生毕业设计(论文) 21 { uchar i=0。 while(flag[0]==1) //设置定时时间 1 { ScanKey()。 ScanKey1()。 if(flag[0]==2) {flag[0]=0。 wait()。 //等待 } P0=sel[i]。 P2=table[timer1[i]]。 if(flag[1]==1) { P0=sel[++i]。 } if(i==4) i=0。 if(flag[2]==1) { timer1[i]=timer1[i]+1。 //闪烁位加 1 if(timer1[i]==10) timer1[i]=0。 P2=table[timer1[i]]。 } if(timer1[0]2) { timer1[0]=0。 } if(timer1[2]5) { timer1[2]=0。 } if(timer1[0]==2 amp。 amp。 timer1[1]4) { timer1[1]=0。 } if(flag[2]==2) { FF1=1。 while(moment) { display(timer1)。 } flag[0]=0。 } } while(flag[0]==2) //设置定时。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。