毕业设计论文-基于proteus的单片机实时时钟的仿真设计内容摘要:

0 输出原码,此时 P0 外部必须被拉高。 P1 口: P1 口是一个内部提供上拉电阻的 8 位双向 I/O 口, P1 口缓冲器能 接收输出 4TTL 门电流。 P1 口管脚写入 1 后,被内部上拉为高,可用作输入, P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。 在 FLASH 编程和校验时, P1 口作为第八位地址接收。 P2 口: P2 口为一个内部上拉电阻的 8 位双向 I/O 口, P2 口缓冲器可接收,输 10 出 4 个 TTL 门电流,当 P2 口被写 “1”时,其管脚被内部上拉电阻拉高,且作为输入。 并因此作为输入时, P2 口的管脚被外部拉低,将输出电流。 这是由于内部上拉的缘故。 P2 口当用于外部程序存储器或 16 位地址外部数据存储器进行存取时, P2 口输出地址的 高八位。 在给出地址 “1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时, P2 口输出其特殊功能寄存器的内容。 P2口在 FLASH 编程和校验时接收高八位地址信号和控制信号。 P3 口: P3 口管脚是 8 个带内部上拉电阻的双向 I/O 口,可接收输出 4 个 TTL门电流。 当 P3 口写入 “1”后,它们被内部上拉为高电平,并用作输入。 作为输入,由于外部下拉为低电平, P3 口将输出电流( ILL)这是由于上拉的缘故。 P3 口也可作为 AT89C51 的一些特殊功能口,如下表所示: 口管脚 备选功能 RXD(串行 输入口) TXD(串行输出口) /INT0(外部中断 0) /INT1(外部中断 1) T0(记时器 0 外部输入) T1(记时器 1 外部输入) /WR(外部数据存储器写选通) /RD(外部数据存储器读选通) P3 口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。 当振荡器复位器件时,要保持 RST 脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。 在 FLASH 编程期 间,此引脚用于输入编程脉冲。 在平时, ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的 1/6。 因此它可用作对外部输出的脉冲或用于定时目的。 然而要注意的是:每当用作外部数据存储器时,将跳过一个 ALE 脉冲。 如想禁止 ALE 的输出可在 SFR8EH 地址上置 0。 此时, 11 ALE 只有在执行 MOVX, MOVC 指令是 ALE 才起作用。 另外,该引脚被略微拉高。 如果微处理器在外部执行状态 ALE 禁止,置位无效。 /PSEN:外部程序存储器的选通信号。 在由外部程序存储器取指期间,每个机器周期两次 /PSEN 有效。 但在访问 外部数据存储器时,这两次有效的 /PSEN 信号将不出现。 /EA/VPP:当 /EA 保持低电平时,则在此期间外部程序存储器( 0000HFFFFH),不管是否有内部程序存储器。 注意加密方式 1 时, /EA 将内部锁定为 RESET;当 /EA 端保持高电平时,此间内部程序存储器。 在 FLASH 编程期间,此引脚也用于施加 12V 编程电源( VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 XTAL1 和 XTAL2 分别为反 向放大器的输入和输出。 该反向放大器可以配置为片内振荡器。 石晶振荡和陶瓷振荡均可采用。 如采用外部时钟源驱动器件,XTAL2 应不接。 有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。 整个 PEROM 阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE 管脚处于低电平 10ms 来完成。 在芯片擦操作中,代码阵列全被写 “1”且在任何非空存储字节被重复编程以前,该操作必须被执行。 此外, AT89C51 设有稳态逻辑, 可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。 在闲置模式下, CPU 停止工作。 但 RAM,定时器,计数器,串口和中断系统仍在工作。 在掉电模式下,保存 RAM 的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。 12 LCD1602 液晶屏显示电路 1602 是一种字符型液晶显示模块,专门用于显示字母、数字、符号等点阵式LCD,目前常用 16*1, 16*2, 20*2 和 40*2 行等的模块。 下面以某公司的 1602字符型液晶显示器为例,介绍其用法。 一般 1602 字符型液晶显示器实物如图 图 5 1602 液晶实物图 1602LCD 分为带背光和不带背光两种,基控制器大部分为 HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图 图 6 LCD 背光和不背光尺寸差别 13 1602LCD 采用标准的 14 脚(无背光)或 16 脚(带背光)接口,各引脚接口说明如下: 第 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 端由高电平跳变成低电平时,液晶模块执行命令。 第 7~ 14 脚: D0~ D7 为 8 位双向数据线。 第 15 脚:背光源正极。 第 16 脚:背光源负极 输出控制电路 将 PB 口用于单片机和 LCD 显示器的数据传输通道,如下图所示,通过控制 LCD 的读写控制端将 1302 的数据显示出来。 14 图 7 整体布局 8软件设计设计 地址空间及端口分配 _Bool rs @PC_ODR:1。 //PC 作为 LCD 的控制端,设置为输入 _Bool rw @PC_ODR:2。 _Bool en @PC_ODR:3。 _Bool sclk @PA_ODR:4。 //串行时钟,输入输出控制 _Bool dio @PA_ODR:5。 //三线接口时的数据线 _Bool id @ PA_IDR:5。 _Bool ce @ PA_ODR:6。 //作为复位端口 _Bool ID1 @ PG_IDR:0。 //将 PD6 引脚设置为外部中断的输入引脚 总体架构说明 该时钟程序设计思路如下: ( 1)、在程序头将设计中的一些 IO 口进行分配并注释。 15 ( 2)、初始化程序,对单片机的 IO 口设置为输入输出等,对 1302, 1602 的参数进行设置,如设定时钟运行为 24 小时制。 将一些未到时钟设计功能 的功能端口关闭等。 ( 3)开始主程序进行程序扫描,先扫初始化字子程序初始化 DS1302 和LCD1602,启动时钟芯片进行计时,初始化 1602 的显示方式,将分配好的时分秒等数字调入到显示子程序中。 ——显示子程序通过分配的空间对应口将DS1302 时钟芯片的数据显示相应的时分秒,年月日等。 ——进入按键扫描,判断按键是否有变动,若有就根据设计程序对相应的按键按入次数而进行实现相应的功能。 如进入时间调整,中断进入、退出等。 ——最后返回主程序头重新依次扫描。 显示过程设有消隐,按键通过软件去斗。 ( 4)、子程序部分。 在主程序的调用下依据不同的子程序工能而编写子程序,有多级嵌套。 这些子程序包括显示子程序、延时子程序、时间计数子程序、按键处理子程序、调时间子程序等。 各子程序功能 显示子程序:将时钟芯片 1302 内的时钟数据送入单片机进行处理再送入LCD1602 内进行显示,显示格式为:年 /月 /日 /时 /分 /秒 /星期。 延时子程序:该子程序是为了实现 1302 及 1602 在读写过程中的上升下降沿让芯片有足够的读写时间,以及字符有足够的显示时间,同时作为按键开关扫描去抖的延迟时间。 时间计数子程序:该程序功能是调动 DS1302 的 初始化程序、读写程序,并将其内部数据送入单片机内进行处理。 DS1302 选择 24 小时工作方式,秒计数,走到 59 后进位分,后变 00 从新开始计时,分走到 59 后进位时,分从新开始 00计时,时走到 23,分走到 59,秒走到 59 后进入从新日期周期计时。 按键处理子程序:该程序进行按键处理的功能判断分别对时分秒、年月日等进行调整已经中断的进入与退出等。 程序清单 include uchar n1,n2,n3。 uchar u0,u1,u2,u3。 16 uchar table[]={20 }。 uchar table1[]={ : : }。 uchar table2[]={39。 039。 ,39。 139。 ,39。 239。 ,39。 339。 ,39。 439。 ,39。 539。 ,39。 639。 ,39。 739。 ,39。 839。 ,39。 939。 }。 uchar table3[]={MonTueWedThuFriSatSun}。 uchar table4[]={ Happy birthday }。 //16 个字符 uchar table5[]={to you}。 define uint unsigned int define uchar unsigned char define PB PB_ODR define Write_second 0X80 //秒写寄存器地址 define Write_minute 0X82//分写寄存器地址 define Write_hour 0X84//时写寄存器地址 define Write_day 0X86//日写寄存器地址 define Write_month 0X88//月写寄存器地址 define Write_week 0X8A//周写寄存器地址 define Write_year 0X8C//年写寄存器地址 define Write_protect 0X8E//写保护字节写寄存器地址 define Write_chongdian 0x90 //慢充电寄存器地址 define Read_second 0X81//秒读寄存器地址 define Read_minute 0X83//分读寄存器地址 define Read_hour 0X85//时读寄存器地址 define Read_day 0X87//日读寄存器地址 define Read_month 0X89//月读寄存器地址 define Read_week 0X8B//周读寄存器地址 define Read_year 0X8D//年读寄存器地址 _Bool rs @PC_ODR:1。 //pc 作为 lcd 的控制端,设置为输入 _Bool rw @PC_ODR:2。 _Bool en @PC_ODR:3。 17 _Bool sclk @PA_ODR:4。 //串行时钟,输入输 出控制 _Bool dio @PA_ODR:5。 //三线接口时的数据线 _Bool id @ PA_IDR:5。 _Bool ce @ PA_ODR:6。 //复位 _Bool da_od @ PA_DDR:5。 _Bool da_CR1 @ PA_CR1:5。 _Bool da_CR2 @ PA_CR2:5。 _Bool ID1 @ PG_IDR:0。 //将 Pd6 引脚设置我外部中断的输入引脚 _Bool ID2 @ PD_IDR:5。 _Bool ID3 @ PG_IDR:1。 _Bool ID4 @ PD_IDR:6。 //键盘的输入 // shfm_key(void) { uchar lshi。 uchar an=0,n=0。 do { if(!ID1) { delay(6)。 if(!ID1) { while(!ID1)。 lshi=1。 an++。 if(an==1) { Write_ds1302(Write_second,0x80)。 //先暂停时钟秒 u2=Read_ds1302(Read_second )。 18 u2=((u2amp。 0x70)4)*10+(u2amp。 0x0F)。 write_sfm(6,u2)。 lcd_w(0x80+0x40+7)。 lcd_w(0x38)。 lcd_w(0x0f)。 //显示功能开,有光标 } if(an==2)。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。