《单片机应用课程设计说明书基于单片机时钟设计.doc》由会员分享,可在线阅读,更多相关《单片机应用课程设计说明书基于单片机时钟设计.doc(35页珍藏版)》请在三一办公上搜索。
1、YanCheng Institute of Technology 课程设计说明书课程名称 单片机应用设计设计题目基于单片机时钟设计专业M自动化101学生姓名 凌德健 班级 学号1061417120 完成日期2013、12、11 盐城工学院电气学院盐城工学院电气学院课程设计任务书 姓 名: 凌德健 院 (系):电气工程学院 专 业: 自动化 班 号:M自动化101 任务起至日期: 2013年12 月1 日至 2013 年 12 月 11 日 课程设计题目: 已知技术参数和设已知技术参数和设计要求: (1)AT89C51单片机 (2)DS12887定时器 (3)DS1232看门狗 (4)LED液晶
2、显示 (5)市电降压 (6)Altium软件计要求: 预期设计效果: 设计一个基于单片机的电子时钟,要求能够实现时、分、秒。 工作计划安排: 同组设计者及分工: 成绩评定:_ 指导教师签字: _ _ 年 月 日 第1章 电子时钟的工作原理本次设计时钟电路,使用了AT89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,用C语言程序来控制整个时钟的显示,使得编程变得更容易,这样通过五个模块:芯片、显示屏、看门狗、电源、时钟即可满足设计要求。此设计原理图框图如图1-1所示,此电路包括以下五个部分:单片机、时钟电路、看门狗、液晶屏、电源模块、时钟振荡电路。AT89
3、C51主控模块DS12887时钟电路时钟振荡模块DS12887看门狗LED显示模块电源模块图1-1 主电路设计框图本设计采用C语言程序设计,使单片机控制数码管显示年、月、日、时、分、秒,当秒计数满60时就向分进位,分计数器计满60后向时计数器进位,小时计数器按“23翻0”规律计数。时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以用校时电路进行校正。设计采用的是时、分、秒显示,单片机对数据进行处理同时在LED上显示。第2章 系统硬件电路设计及元件2.1 AT89C51芯片AT89C51 是美国ATMEL 公司生产的8 位Flash ROM 单片机。其最突出的优点是片内
4、ROM 为Flash ROM,可擦写1000 次以上,应用并不复杂的通用ROM 写入器就能方便的擦写,读取也很方便,价格低廉,具有片程序ROM 二级保密系统。因此可灵活应用于各种控制领域。AT89C51 包含以下一些功能部件:(1)一个8 位CPU ;(2)一个片内振荡器和时钟电路;(3)4KB Flash ROM ;(4)128B 内RAM;(5)可寻址64KB 的外ROM 和外RAM 控制电路;(6)两个16 位定时/计数器;(7)21 个特殊功能寄存器;(8)4 个8 位并行I/O 口;(9)一个可编程全双工串行口;(10)5 个中断源,可设置成2 个优先级。AT89C51 单片机一般采
5、用双列直插DIP 封装,共40 个引脚,图2-1 为其引脚排列图。40 个引脚大致可分为4 类:电源、时钟、控制各I/O 引脚。图2-1 AT89C51引脚图2.1.1 电源Vcc芯片电源,接+5V;GND接地端。2.1.2 时钟XTAL1、XTAL2晶体振荡电路反相输入端和输出端。2.1.3 控制线控制线共有4 根,其中3 根是复用线。所谓复用线是指具有两种功能,正常使用时是一种功能,在某种条件下是另一种功能。1、ALE/ PROG 地址锁存允许/片内EPROM 编程脉冲。(1)ALE 功能:用来锁存P0 口送出的低八位地址。AT89C51 在并行扩展外存储器时,P0 口用于分时传送低8 位
6、地址和数据信号,且均为二进制数。当ALE 信号有效时,P0 口传送的是低8 位地址信号;ALE 信号无效时,P0 口传送的是低8 位地址信号。在ALE 信号的下降沿,锁定P0 口传送的内容,即低8 位地址信号。需要指出的是,当CPU 不执行访问外RAM 指令,ALE 以时钟振荡频率1/6 的固定频率输出,因此ALE 信号也可作为外部芯片CLK 时钟或其他需要。但是,当CPU 执行MOVX 指令时,ALE 将跳过一个ALE 脉冲。(2) PROG 功能:片内EPROM 的芯片,在EPROM 编程期间,此引脚输入编程脉冲。2、 PSEN 外ROM 读选通信号。89C51 读外ROM 时,每个机器周
7、期内PSEN 两次有效输出。PSEN 可作为外ROM芯片输出允许OE 的选通信号。在读内ROM 或读外RAM 时, PSEN 无效。3、RST/VPD复位/备用电源。(1)正常工作时,RST 端为复位信号输入端,只要在该引脚上连续保持两个机器周期以上高电平,AT89C51 芯片即实现复位操作,复位后一切从头开始,CPU 从0000H 开始执行指令。(2)VPD 功能:在VCC 掉电情况下,该引脚可接上备用电源,由VPD 向片内RAM供电,以保持片内RAM 中的数据不丢失。4、EA /VPP内外ROM 选择/片内EPROM 编程电源。(1) EA 功能:正常工作时, EA 为内外ROM 选择端。
8、AT89C51 单片机ROM 寻址范围为64KB,其中4KB 在片内,60KB 在片外。当EA 保持高电平时,先访问内ROM,但当PC 值超过4KB 时,将自动转向执行外ROM 中的程序。当EA 保持低电平时,则只访问外ROM,不管芯片内有否内ROM。(2)VPP 功能:片内有EPROM 的芯片,在EPROM 编程期间,此引脚用于施加编程电源。2.1.4 I/O引脚AT89C51 有P0、P1、P2、P3 4 个8 位并行I/O 端口,共32 个引脚。P0 口是一组8 位漏级开路型双向I/O 口,也即地址/数据总线复用口。作为输出口用时,每位能以吸收电流的方式驱动8 个TTL 逻辑门电路,对端
9、口写1 时,又可作高阻抗输入端用。在访问外部程序和数据存储器时,它是分时多路转换的地址(低8 位)/数据总线,在访问期间激活了内部的上拉电阻。在Flash 编程时,P0 端口接收指令字节;而在验证程序时,则输出指令字节。验证时,要求外接上拉电阻。P1 口是带内部上拉电阻的双向I/O口,向P1口写入1时P1口被内部上拉为高电平,可用作输入口。当作为输入脚时被外部信号拉低的P1口会因为内部上拉而输出一个电流。Flash编程和程序校验期间,P1接收低8位地址。P2 口是带内部上拉电阻的双向I/O口,向P2口写入1时P2口被内部上拉为高电平可用作输入口,当作为输入脚时被外部拉低的P2口会因为内部上拉而
10、输出电流。在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX DPTR指令)时,P2口送出高8位地址数据,当使用8位寻址方式(MOVXRI)访问外部数据存储器时,P2口发送P2特殊功能寄存器的内容,在整个访问期间不改变。Flash编程和程序校验时,P2也接收高位地址和一些控制信号。P3 口是带内部上拉电阻的双向I/O口,向P3口写入1时P3口被内部上拉为高电平可用作输入口,当作为输入脚时被外部拉低的P3口会因为内部上拉而输出电流。P3口除了作为一般的I/O口线外,更重要的是它的第二功能,如表2-1所示:表2-1 P3端口的特殊功能 端口引脚兼 用 功 能 P3.0RXD 串行输
11、入口 P3.1TXD 串行输出口 P3.2/INT0 外部中断0 P3.3/INT1 外部中断1 P3.4T0 定时器0的外部输入 P3.5T1 定时器1的外部输入 P3.6/WR 外部数据存储器写选通 P3.7/RD 外部数据存储器读选通 2.2 DS1232芯片DS1232是由美国DALLAS公司生产的微处理器监控电路,采用8脚DIP封装,具有看门狗功能的电源监测芯片,在电源上电、断电、电压瞬态下降和死机时都会输出一个复位脉冲。DS1232的的主要特点:(1)在微处理器失控状态下可以停止和重新启动微处理器;(2)具有8脚DIP封装和16脚SOIC贴片封装两种形式,可以满足不同设计要求;(3
12、)微处理器掉电或电源电压瞬变时可自动复位;(4)具有5%或10%的两种电源监测精度。2.3.1 DS1232引脚功能及内部结构DS1232各引脚功能:RESTE:复位键连接引脚,直接连接复位键;TD :看门狗定时器延时设置。如果连接到地,输入给看门狗的脉冲间隔不得大于150毫秒;如果不连接,脉冲间隔不得大于600毫秒;如果连接到电源,脉冲间隔不得大于1.2秒;TOL :选择5%或10%的电源监测精度。如果这个引脚连接到地,当电源下降到4.75V时芯片将输出一个复位脉冲;如果这个引脚连接到5V,只有当电源下降到4.5V时芯片才输出一个复位脉冲;GND :地线;RST:复位高脉冲输出引脚;RST:
13、复位低脉冲输出引脚;ST:看门狗脉冲输入,低脉冲有效;VCC:5V电源。DS1232的引脚如图2-5所示:图2-5 DS1232的引脚图芯片DS1232在系统工作时,必须不间断的给引脚7输入一个脉冲系列,这个脉冲的时间间隔由引脚2设定,如果脉冲间隔大于引脚2的设定值,芯片将输出一个复位脉冲使单片机复位。一般将这个功能称为看门狗,将输入给看门狗的一系列脉冲称为“喂狗”。电压偏差监测环节数字彩排环 节 门电路 (与门)数字延时环 节 按键防抖时间溢出比 复位输出电压传感器 RST图2-6 DS1232内部结构 DS1232的功能 1、电源电压监视 DS1232能够实时监测向微处理器供电的电源电压,
14、当电源电压VCC低于预置值时,DS1232的第5脚和第6脚输出互补复位信号RST和/RST。预置值通过第3脚(TOL)来设定;当TOL接地时,RST和/RST信号在电源电压跌落至4.75V以下时产生;当TOL与VCC相连时,只有当VCC跌落至4.5V以下时才产生RST和/RST信号。当电源恢复正常后,RST和/RST信号至少保持250ms,以保证微处理器的正常复位。 2、按键复位 在单片机产品中,最简单的按键复位电路是由电阻和电容构成的,如果系统扩展存在需要和微处理器同时复位的其他接口芯片,这种简单的阻容复位电路往往不能满足整体复位的要求。DS1232提供了可直接连接复位按键的输入端/PBSE
15、N(第1脚),在该引脚上输入低电平信号,将在/RST和RST端输出至少250ms的复位信号。3、看门狗定时器在DS1232内部集成有看门狗定时器,当DS1232的ST端在设置的周期时间内没有有效信号到来时,DS1232的RST和RST端将产生复位信号以强迫微处理器复位。这一功能对于防止由于干扰等原因造成的微处理器死机是非常有效的。看门狗定时器的定时时间由DS1232的TD引脚确定,见表2-6所示:表2-6 看门狗定时器定时时间设置TD引脚连接至定时时间最小值典型值最大值地(GND)62.5ms150ms250ms浮空250ms600ms1000ms电源(Vcc)500ms1200ms2000m
16、s看门狗定时器的周期输入信号ST可以从微处理器的地址信号、数据信号或控制信号中获得,不论哪种信号都必须能够周期性的访问DS1232,对于MCS51系列单片机,推荐使用ALE信号。2.3.3实时时钟模块时钟模块采用采用带 RAM的时钟芯片DS12887。该芯片可以进行时分秒的计数,具有100年日历,可编程接口,还具有报警功能和掉电保存功能,并且可以对其方便的进行程序控制,能很好的符合要求。其电路如图2-3所示。 图 2-3 DS12887 时钟硬件电路图 时钟芯片DS12887DS12887是美国DALLAS半导体公司最新推出的8位串行接口并自带RAM的实时日历时钟芯片,内部有14个时钟控制寄存
17、器,包括10个时标寄存器,4个状态寄存器和114 bit作掉电保护用的低功耗RAM。CPU通过读DS12887的内部时标寄存器得到当前的时间和日历,也可通过选择二进制或BCD码初始化芯片的10个时标寄存器,其4个状态寄存器用来控制和指出DS12887的当前工作状态,114 bit非易失性静态RAM可在掉电时保存一些重要数据。 DS12887功能强大,应用广泛。DS12C887管脚如图3.2所示。图3、 DS12C887管脚图DS12887引脚功能:GND:接地端VCC:直流电源+5 V电压。当5 V电压在正常范围内时,数据可读写;当VCC低于425 V,读写禁止,计时功能仍继续;当VCC下降到
18、3 V以下时,RAM和计时器被切换到内部锂电池。MOT(模式选择):MOT引脚接到VCC时,选择MOTOROLA时序,当接到GFND时,选择INTEL时序。SQW(方波信号输出):SQW引脚能从实时时钟内部15级分频器的13个抽头中选择一个作为输出信号,其输出频率可通过对寄存器A编程改变。 AD0AD7(双向地址数据复用线):总线接口,可与MOTOROLA微机系列和INTEL微机系列接口。 AS(地址选通输入):用于实现信号分离,在ADALE的下降沿把地址锁入DS12887。 DS(数据选通或读输入):DSRD有2种操作模式,取决于MOT引脚的电平,当使用MOTOROLA时序时,DS是一正脉冲
19、,出现在总线周期的后段,称为数据选通;在读周期,DS指示DS12887驱动双向总的时刻;在写周期,DS的后沿使DS12887锁存写数据。选择INTEL时序时,DS称作(RD),RD与典型存储器的允许信号(OE)的定义相同。 R/W(读写输入):也有两种操作模式。选MOTOROLA时 序时,是一电平信号,指示当前周期是读或写周期,DSO为高电平时,高电平指示读周期,低电平指示写周期;选INTEL时序,信号是一低电平信号,称为WR。在此模式下,RW与通用RAM的写允许信号(WE)的含义相同。CS(片选输入):在访问DS12887的总线周期内,片选信号必须保持为低。IRQ(中断申请输入):低电平有效
20、,可作微处理的中断输入。没有中断条件满足时,IRQ处于高阻态。IRQ线是漏极开路输入,要求外接上接电阻。RESET(复位输出):当保持低电平时间大于200 ms,保证DS12887有效复位。DS12887的内部地址分配:地址00H和03H单元取值范围是00H3BH(十进制为059);04H05H单元按12小时制取值范围是上午(AM)01H0CH(十进制为112),下午(PM)51H5CH(十进制为8192),按24小时制取值范围是00H17H(十进制为023);06H单元的取值范围是01H07H(十进制为17);07H单元取值范围O1H1FH(十进制为131);08H单元取值范围是01H0CH
21、(十进制为112);09H单元取值范围是00H63H(十进制为099)。2.2.1 硬件部分的设计 选择并行方式显示,I/O口通过锁存芯片来扩展,以此来控制LED点阵40个列线,双缓冲寄存器由5片锁存器74LS373来组成,可以驱动LED点阵8组列线,并用3/8译码器74LS138对LED点阵的8行进行扫描。在送每一行的数据到LED点阵时,先把数据分别送到5个74LS373,然后再把数据一起输出到LED点阵列中,送出去的时间数据由AT89C51来控制。电子钟由显示电路、行驱动电路、列驱动电路、中央控制器AT89C51、按键电路和复位电路组成。系统框图如图2-1所示: 图2-1 系统框图 a)
22、显示模块的选择 显示模块采用8*8的点阵LED数码管,它具有低功耗、小体积、高性能、低价格等特点。这种模块由64个发光LED芯片以8*8的形式构成一个正方形模块,然后用两列12针引脚将内部电路接口引出,供驱动电路使用。这种结构是市面上最通用,也是现在应用最为广泛采用的形式。 b) 时钟信号的选择 秒信号由单片机提供,使用程序由时、分、秒计数。采用这种方案的优点在于,它可以有效减少电路的复杂程度,减少多余芯片的使用,节约成本。并可以减少时间误差,以达到设计要求。 c) 总体设计方案 根据以上方案所述本次毕业设计采取的总体方案如下:用锁存芯片来扩展I/O口,控制LED点阵40个列线;5片锁存器74
23、LS373组成双缓冲寄存器,驱动LED点阵8组列线;采用8*8的点阵LED数码管组成显示模块,显示出运行调试 AT89C51 控制器 列驱动电路 行 驱 动 电 路 显 示 电 路 电源电路 复位电路 按键电路 本科生毕业设计说明书(2013) 第3章 系统软件电路设计3.1 系统流程图及源代码设计3.1.1 主程序流程图设计液晶屏通信引脚定义DS12887通信引脚定义数据设定引脚定义开始引脚定义地址定义程序开始初始化液晶屏读取DS12887程序数据分离送显示缓存日历显示子程序数据存储地址显示数据缓冲地址初始化液晶屏幕显示初始画面清液晶屏幕显示空白读DS12887程序分离数据子程序写指令到液晶
24、屏读数据到液晶屏3.1.2程序代码根据各个芯片的操作时序以及指令,结合硬件电路和设计所要实现的功能,编写程序代码如下:#include#define uint unsigned int#define uchar unsigned charsbit beep=P12;sbit s1=P10;sbit s2=P11;sbit s3=P13;sbit s4=P37;sbit rs=P34;sbit lcden=P35;sbit dsas=P14;sbit dsrw=P15;sbit dsds=P16;sbit dscs=P17;bit flag1,flag_ri;/定义两个位置变量uchar cou
25、nt,s1num,flag,t0_num;char miao,shi,fen,year,month,day,week,nmiao,nshi,nfen;uchar code table= 20 - - ; /液晶固定显示内容uchar code table1= : : ;void write_ds(uchar,uchar);void set_alarm(uchar,uchar,uchar) ;void read_alarm();uchar read_ds(uchar);void set_time();void delay(uint z)uint x,y;for(x=z;x0;x-) for(y=
26、110;y0;y-) ;void di() beep=0; delay(100); beep=1;void write_com(uchar com)/写液晶命令函数rs=0;lcden=0;P2=com;delay(3);lcden=1;delay(3);lcden=0;void write_date(uchar date)/写液晶数据函数rs=1;lcden=0;P2=date;delay(3);lcden=1;delay(3);lcden=0;void write_ds(uchar add,uchar date)/写12887函数/dsas=0;delay(2);dscs=0;dsas=1
27、;dsds=1;dsrw=1;delay(2);P0=add;delay(2); /先写地址dsas=0;dsrw=0;delay(2);P0=date; /在写数据delay(2);dsrw=1;dsas=1;dscs=1;uchar read_ds(uchar add)/读12887函数uchar ds_date;/dsas=0;delay(1);dsas=1;dsds=1;dsrw=1;dscs=0;delay(2);P0=add;delay(2);dsas=0;dsds=0;delay(2) ;P0=0xff;delay(2);ds_date=P0;delay(2);dsds=1;ds
28、as=1;dscs=1;return ds_date;/*.*/首次操作12887时给与寄存器的初始化void set_time()write_ds(0x0B, 0x86); /禁止更新,接下来初始化数据,即写入时间,日期等 write_ds(0x00,0x00);write_ds(0x01,0x16);write_ds(0x02,0x00);write_ds(0x03,0x00);write_ds(0x04,0x00);write_ds(0x05,0x00);write_ds(0x06,2);write_ds(0x07,15);write_ds(0x08,1);write_ds(0x09,1
29、3);write_ds(0x0B, 0x26); /正常更新,二进制格式,24进制小时 void read_alarm()/读取12887闹钟值nmiao=read_ds(0x01);nfen=read_ds(0x03);nshi=read_ds(0x05);void init()/初始化函数uchar num;EA=1;EX0=1;IT0=1;flag=0;flag1=0;t0_num=0;flag_ri=0;/beep=0;s1num=0;week=1;lcden=0;/*.*/以下是首次设置ds12887时使用,以后不必在写入write_ds(0x0A,0x20); /打开振荡器/wri
30、te_ds(0x0B, 0x86); /禁止更新,接下来初始化数据,即写入时间,日期等 /write_ds(0x0B, 0x06); /正常更新,二进制格式,24进制小时 write_ds(0x0B, 0x26); /设置24小时模式,BCD格式,开启闹铃中断set_time();/设置默认闹钟时间write_com(0x38);/1602液晶初始化write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num16;num+) write_date(tablenum); delay(1);write_c
31、om(0x80+0x40); for(num=0;num11;num+) write_date(table1num);delay(1); void write_sfm(uchar add,char date) /1602液晶刷新时分秒函数char tens,ge;tens=date/10;ge=date%10;write_com(0x80+0x40+add);/ write_com(0x06);write_date(0x30+tens);write_date(0x30+ge);void write_nyr(uchar add,char date) /1602液晶刷新年月日 char shi,g
32、e; shi=date/10; ge=date%10; write_com(0x80+add); write_com(0x06); write_date(0x30+shi); write_date(0x30+ge);void write_week(char we)/写液晶星期显示函数write_com(0x80+12);/write_com(0x06);switch(we) case 1: write_date(M);delay(5); write_date(O);delay(5);write_date(N);break; case 2: write_date(T);delay(5); wri
33、te_date(U);delay(5);write_date(E);break; case 3: write_date(W);delay(5); write_date(E);delay(5);write_date(D);break; case 4: write_date(T);delay(5); write_date(H);delay(5);write_date(U);break; case 5: write_date(F);delay(5); write_date(R);delay(5);write_date(I);break; case 6: write_date(S);delay(5);
34、 write_date(A);delay(5);write_date(T);break; case 7: write_date(S);delay(5); write_date(U);delay(5);write_date(N);break;void keyscan()if(flag_ri=1)if(s1=0)|(s2=0)|(s3=0)|(s4=0)delay(5); if(s1=0)|(s2=0)|(s3=0)|(s4=0) while(!(s1&s2&s3&s4);di();flag_ri=0;/清除报警标志/beep=0; if(s1=0)delay(5);if(s1=0) s1num+
35、; if(flag1=1) if(s1num=4)s1num=1;flag=1;while(!s1);di();switch(s1num)/光标闪烁点定位case 1: write_com(0x80+0x40+10);write_com(0x0f);break;case 2: write_com(0x80+0x40+7);break;case 3: write_com(0x80+0x40+4);break;case 4: write_com(0x80+12);break;case 5: write_com(0x80+9);break;case 6: write_com(0x80+6);brea
36、k;case 7: write_com(0x80+3);break;case 8: s1num=0;write_com(0x0c);flag=0;write_ds(0x00,miao);write_ds(0x02,fen); write_ds(0x04,shi);write_ds(0x06,week);write_ds(0x07,day);write_ds(0x08,month);write_ds(0x09,year);break;if(s1num!=0) delay(1); if(s2=0) while(!s2);di();switch(s1num)/根据功能键次数调节 相应数值case 1
37、:miao+; if(miao=60) miao=0; write_sfm(0x0a,miao); write_com(0x80+0x40+10); if(flag1=0) write_ds(0,miao); break;case 2:fen+; if(fen=60) fen=0; write_sfm(0x07,fen); write_com(0x80+0x40+7); if(flag1=0) write_ds(2,fen); break;case 3:shi+; if(shi=24) shi=0; write_sfm(0x04,shi); write_com(0x80+0x40+4); if
38、(flag1=0) write_ds(4,shi); break;case 4:week+; if(week=8) week=1; write_week(week); write_com(0x80+12); write_ds(6,week); break;case 5:day+; if(day=32) day=1; write_nyr(0x09,day); write_com(0x80+9); write_ds(7,day); break;case 6:month+; if(month=13) month=1; write_nyr(0x06,month); write_com(0x80+6);
39、 write_ds(8,month); break;case 7:year+; if(year=100) year=0; write_nyr(0x03,year); write_com(0x80+3); write_ds(9,year); break;if(s3=0) delay(1); if(s3=0) while(!s3);di();switch(s1num) /根据功能键次数调节相应数值case 1:miao-; if(miao=-1) miao=59; write_sfm(0x0a,miao); write_com(0x80+0x40+10); if(flag1=0) write_ds(0,miao); break; case 2:fen-; if(fen=-1)