基于单片机和CPLD的数字时钟课程设计(18页).docx
-基于单片机和CPLD的数字时钟课程设计-第 15 页电子系统设计课程设计报告题目:基于单片机和CPLD的数字时钟姓名: XXX院系: 电力学院专业:电子科学与技术学号: XXXXXXXXX指导老师:XXXXXXXXX 完成时间: 2014 年 1 月 9 日设计题目基于单片机和CPLD的数字时钟设计要求设计过程(包括:设计方案、上机设计与仿真结果、硬件实验方案及实验结果、收获和体会)成绩评定指导教师评语课程设计等级目 录第一章 设计概述 3 1.1使用软件简介 .41.2 设计目的及要求 .4第二章 总体设计 4 2.1 设计框图 42.2 设计框图概述 .5第三章 硬件设计 5 3.1数字时钟的结构 .53.2数字时钟的功能实现.73.3 数字时钟的功能模块设计.7第四章程序框图和清单 11 4.1 程序框图 .114.2 程序 .124.3 清单 .19第五章实验结果和体会 20体会22第一章 设计概述1.1使用软件简介a.使用汇编语言或C语言要使用编译器,以便把写好的程序编译为机器码,才能把HEX可执行文件写入单片机内。KEIL uVISION是众多单片机应用开发软件中最优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,甚至ARM,它集编辑,编译,仿真等于一体,它的界面和常用的微软VC+的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。KEIL uVision5是uVision4的升级版本,页面有了进一步的优化,使用起来更加的人性化。b.仿真软件Protues Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。迄今为止是世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MATLAB等多种编译。c.综合工具Modelsim Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。1.2设计目的及要求a、设计要求(1)设计一个基于单片机和CPLD的数字时钟;(2)根据性能指标,计算元件参数,选好元件,设计电路并画出电路图;对设计电路进行模拟与测试。(3)撰写设计报告。b、技术指标使用单片机和CPLD设计,显示年、月、日、小时、分钟、秒,时间可以调整。第二章 总体设计2.1设计框图按键数码管显示数码管驱动 时钟芯片DS12c887复位电路主控STC89C52晶振电路2.2设计框图概述a.晶振电路:12MHZ晶振和两个22PF的电容,产生标准脉冲信号。b.复位电路:利用它把电路恢复到起始状态。c.时钟芯片:本设计采用高精度时钟芯片DS12C887,自带晶体振荡器和锂电池。在没有外部电源的情况下可工作10年。在运行中,单片机从时钟芯片读取当前时间,然后送到数码管显示。d.数码管显示:本设计采用八段共阴极数码管,可以同时显示年月日或者时分秒。e.数码管驱动:选用两个74HC573锁存器,分别控制数码管的段码显示和位码显示。f.按键:采用四个独立按键,分别用来实现调整时间及其它功能。第三章 硬件设计3.1 数字时钟的结构运用protues软件进行仿真,keil软件与其调试显示时分秒显示年月日3.2 数字时钟的功能实现本设计一共使用四个独立按键来实现数字时钟的功能,其中k1是时分秒和年月日切换显示键,若当前显示是时分秒,按下k1,则切换显示到年月日;k2键为修改项选择键,按一下k2修改当前显示的第三位,按两下k2修改当前显示的第二位,按三下k2修改当前显示的第一位;k3和k4分别为增大和减小按键,来对修改项进行操作,只有在k2按下之后才有效。3.3 数字时钟的功能模块设计本设计中需要用到CPLD的有两个74HC573锁存器,下面用Modelsim进行锁存器设计.锁存器代码:module verilog_74hc573(LE1,OE_N1,D1,Q1,LE2,OE_N2,D2,Q2); input LE1,OE_N1,LE2,OE_N2; input 7:0 D1,D2; output 7:0 Q1,Q2; reg 7:0 Q_r1,Q_r2; wire 7:0 D_r1,D_r2; assign D_r1=D1; always(OE_N1,LE1,D1) begin if(OE_N1) begin Q_r1<=8'hz; end else if(LE1) begin Q_r1<=D_r1; end else begin Q_r1<=Q_r1; end end assign Q1=Q_r1; assign D_r2=D2; always(OE_N2,LE2,D2) begin if(OE_N2) begin Q_r2<=8'hz; end else if(LE2) begin Q_r2<=D_r2; end else begin Q_r2<=Q_r2; end end assign Q2=Q_r2;endmodule测试代码timescale 1ns/1ns; module verilog_74hc573_tb; reg le1,oe_n1; reg 7:0 d1; wire 7:0 q1;initial begin le1=0; oe_n1=0; d1=8'b0000_1111; end always begin #5 le1=1; oe_n1=0; #5 d1=8'd1111_0000; #5 d1=8'd0000_1111; #5 le1=0; oe_n1=0; #5 d1=8'd1010_0101; #5 d1=8'd0101_1010; #5 oe_n1=1; le1=0; #5 d1=8'd1111_1111; #5 oe_n1=1; le1=0; #5 d1=8'd1000_0001; #5 d1=8'd0001_1110; #5 oe_n1=1; le1=1;#5 d1=8'd0011_1100; #5 d1=8'd1100_0011; endverilog_74hc573u1( .LE1(le1), .OE_N1(oe_n1), .D1(d1), .Q1(q1); endmodule仿真结果第四章 程序框图和清单4.1程序框图开始 初始化STC89C52从DS12C887中读数据Flag=0?YN显示年月日显示时分秒键盘扫描 键盘扫描K1=1?K1=1?NYYYK2=1?K2=1?NNK2_num=?修改时/年修改分/月修改秒/天123K3=1,增大K4=1,减小4.2程序#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define M 1#define N 10sbit sp=P30;sbit dscs=P24;sbit dsas=P25;sbit dsrw=P26;sbit dsds=P27;sbit duan=P20;sbit wei=P21;sbit k1=P34;sbit k2=P35;sbit k3=P36;sbit k4=P37;void delay(uint);void init();void keyscan();void display(uchar,uchar,uchar);void write_ds(uchar,uchar);void set_time();uchar read_ds(uchar);uchar shi,fen,miao,month,day;uchar year,flag,k2_num,i;unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40;void delay(uint x)uint i,j;for(i=x;i>0;i-)for(j=110;j>0;j-);void init()flag=0;k2_num=0;write_ds(0x0a,0x20);write_ds(0x0b,0x26);set_time();void display(uchar sh,uchar fe,uchar mia)uchar sg,ss,fg,fs,mg,ms;sg=sh%10;ss=sh/10;fg=fe%10;fs=fe/10;mg=mia%10;ms=mia/10;duan=1;P0=tabless;duan=0;P0=0xfe;wei=1;wei=0;P0=0x00;delay(M);duan=1;P0=tablesg;duan=0;P0=0xfd;wei=1;wei=0;P0=0x00;delay(M);duan=1;P0=table10;duan=0;P0=0xfb;wei=1;wei=0;P0=0x00;delay(M);duan=1;P0=tablefs;duan=0;P0=0xf7;wei=1;wei=0;P0=0x00;delay(M);duan=1;P0=tablefg;duan=0;P0=0xef;wei=1;wei=0;P0=0x00;delay(M);duan=1;P0=table10;duan=0;P0=0xdf;wei=1;wei=0;P0=0x00;delay(M);duan=1;P0=tablems;duan=0;P0=0xbf;wei=1;wei=0;P0=0x00;delay(M);duan=1;P0=tablemg;duan=0;P0=0x7f;wei=1;wei=0;P0=0x00;delay(M);void write_ds(uchar add,uchar date)dsas=1;dsds=1;dsrw=1;dscs=0;P1=add;dsas=0;dsrw=0;P1=date;dsrw=1;dsas=1;dscs=1;uchar read_ds(uchar add)uchar ds_date;dscs=0;dsas=1;dsds=1;dsrw=1;P1=add;dsas=0;dsds=0;P1=0xff;ds_date=P1;dsas=1;dsds=1;dscs=1;return ds_date;void set_time()write_ds(0,0);write_ds(1,0);write_ds(2,0);write_ds(3,0);write_ds(4,12);write_ds(5,0);write_ds(6,0);write_ds(7,1);write_ds(8,1);write_ds(9,14);void keyscan()if(k1=0)uint i;delay(5);if(k1=0)flag+;if(flag>=2)flag=0;for(i=N;i>0;i-)if(flag=0)display(shi,fen,miao);elsedisplay(year,month,day);while(!k1);if(k2=0)delay(5);if(k2=0)k2_num+;if(k2_num>=4)k2_num=0;for(i=N;i>0;i-)if(flag=0)display(shi,fen,miao);elsedisplay(year,month,day);while(!k2);if(k2_num!=0)if(flag=0)if(k3=0)delay(5);if(k3=0)switch(k2_num)case 1: write_ds(0,(miao+1); break; case 2: write_ds(2,(fen+1); break; case 3: write_ds(4,(shi+1); break;for(i=N;i>0;i-)if(flag=0)display(shi,fen,miao);elsedisplay(year,month,day);while(!k3);if(k4=0)delay(5);if(k4=0)switch(k2_num)case 1: write_ds(0,(miao-1); break; case 2: write_ds(2,(fen-1); break; case 3: write_ds(4,(shi-1); break;for(i=N;i>0;i-)if(flag=0)display(shi,fen,miao);elsedisplay(year,month,day);while(!k4);if(flag=1)if(k3=0)delay(5);if(k3=0)switch(k2_num)case 1: write_ds(7,(day+1); break; case 2: write_ds(8,(month+1); break; case 3: write_ds(9,(year+1); break;for(i=N;i>0;i-)if(flag=0)display(shi,fen,miao);elsedisplay(year,month,day);while(!k3);if(k4=0)delay(5);if(k4=0)switch(k2_num)case 1: write_ds(7,(day-1); break; case 2: write_ds(8,(month-1); break; case 3: write_ds(9,(year-1); break;for(i=N;i>0;i-)if(flag=0)display(shi,fen,miao);elsedisplay(year,month,day);while(!k4);void main()init();while(1)keyscan();year=read_ds(9);month=read_ds(8);day=read_ds(7);shi=read_ds(4);fen=read_ds(2);miao=read_ds(0);if(flag=0)display(shi,fen,miao);elsedisplay(year,month,day);4.3清单Bill Of Materials For 数字钟 Design Title:数字钟Author:<XXX>Revision:<NONE>Design Created:2013Äê12ÔÂ22ÈÕDesign Last Modified:2014Äê1ÔÂ7ÈÕTotal Parts In Design:112 ResistorsQuantity:ReferencesValueOrder Code2R1, R2500 3 CapacitorsQuantity:ReferencesValueOrder Code2C1, C222p 1C3100uMaplin VH12N4 Integrated CircuitsQuantity:ReferencesValueOrder Code1U1AT89C52 2U2, U374HC573 1U4DS12887 2 MiscellaneousQuantity:ReferencesValueOrder Code1RP1RESPACK-8 1X1CRYSTAL 第五章实验结果和体会经过仿真,此次设计的数字时钟可以正常工作显示时分秒显示年月日仿真结果体会:通过这次设计,我深深体会到,干任何事情都要认真、细致、耐心。但是设计是一件很严谨的工作,而且时间又比较紧,我就不得不静下心思来,认真地搞设计。有两次我因为不小心计算错误前功尽弃而心烦意乱。但一想到自己已是一个成年人,应该有担当,有社会责任感,就又重拾信心继续算。就这样,不断地警示自己,鼓励自己,终于完成了这次设计。通过这次设计也磨砺了我的意志力和做事踏实认真的作风。 说老实话,设计真的有点累。但是当自己整理自己的设计成果的时候,那种少有的成功的喜悦让所有的倦意都吹散。犹如一阵春风沁人心脾,心旷神怡。我知道这是人生中的一小步,今后我会走得更加坚定。 短短两周的设计,我发觉自己所学的知识还很有限。这次设计,我翻阅了很多资料。越是看的书多,我就越觉得自己的专业知识很贫乏。在以后的学习中,我一定会更加努力,更加注重积累,为将来走向社会打好基础。 最后,我要衷心的感谢老师。两周的设计老师您一刻也没有休息,教室-图书馆-寝室三点一线的来回跑。是您耐心的给我们指导,是您一次又一次的鼓励我。真心的感谢您,老师!我一定再接再厉,更上一层楼