电子系统设计课设基于单片机和CPLD的数字时钟.docx
《电子系统设计课设基于单片机和CPLD的数字时钟.docx》由会员分享,可在线阅读,更多相关《电子系统设计课设基于单片机和CPLD的数字时钟.docx(33页珍藏版)》请在冰豆网上搜索。
电子系统设计课设基于单片机和CPLD的数字时钟
《电子系统设计》
课程设计报告
题目:
基于单片机和CPLD的数字时钟
姓名:
XXX
院系:
电力学院
专业:
电子科学与技术
学号:
XXXXXXXXX
指导老师:
XXXXXXXXX
完成时间:
2014年1月9日
设计题目
基于单片机和CPLD的数字时钟
设计要求
设计过程
(包括:
设计方案、上机设计与仿真结果、硬件实验方案及实验结果、收获和体会)
成绩评定
指导教师评语
课程设计等级
目录
第1章设计概述…………………………………………………………………3
1.1使用软件简介………………………………………………………….4
1.2设计目的及要求………………………………………………………….4
第二章总体设计…………………………………………………………………4
2.1设计框图………………………………………………………4
2.2设计框图概述…………………………………………………….5
第三章硬件设计………………………………………………………………5
3.1数字时钟的结构……………………………………………………….5
3.2数字时钟的功能实现……………………………………………………….7
3.3数字时钟的功能模块设计…………………………………………………….7
第四章程序框图和清单……………………………………………………………11
4.1程序框图……………………………………….……11
4.2程序……………………………………………………………….12
4.3清单……………………………………………………………….19
第五章实验结果和体会………………………………………………………………20
体会…………………………………………………………………………………22
第一章设计概述
1.1使用软件简介
a.使用汇编语言或C语言要使用编译器,以便把写好的程序编译为机器码,才能把HEX可执行文件写入单片机内。
KEILuVISION是众多单片机应用开发软件中最优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,甚至ARM,它集编辑,编译,仿真等于一体,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。
因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。
KEILuVision5是uVision4的升级版本,页面有了进一步的优化,使用起来更加的人性化。
b.仿真软件ProtuesProteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
迄今为止是世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。
在编译方面,它也支持IAR、Keil和MATLAB等多种编译。
c.综合工具ModelsimMentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。
它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。
1.2设计目的及要求
a、设计要求
(1)设计一个基于单片机和CPLD的数字时钟;
(2)根据性能指标,计算元件参数,选好元件,设计电路并画出电路图;对设计电路进行模拟与测试。
(3)撰写设计报告。
b、技术指标
使用单片机和CPLD设计,显示年、月、日、小时、分钟、秒,时间可以调整。
第二章总体设计
2.1设计框图
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进行锁存器设计.
锁存器代码:
moduleverilog_74hc573(LE1,OE_N1,D1,Q1,LE2,OE_N2,D2,Q2);
inputLE1,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;
assignD_r1=D1;
always@(OE_N1,LE1,D1)
begin
if(OE_N1)
begin
Q_r1<=8'hz;
end
elseif(LE1)
begin
Q_r1<=D_r1;
end
else
begin
Q_r1<=Q_r1;
end
end
assignQ1=Q_r1;
assignD_r2=D2;
always@(OE_N2,LE2,D2)
begin
if(OE_N2)
begin
Q_r2<=8'hz;
end
elseif(LE2)
begin
Q_r2<=D_r2;
end
else
begin
Q_r2<=Q_r2;
end
end
assignQ2=Q_r2;
endmodule
测试代码
`timescale1ns/1ns;
moduleverilog_74hc573_tb;
regle1,oe_n1;
reg[7:
0]d1;
wire[7:
0]q1;
initial
begin
le1=0;
oe_n1=0;
d1=8'b0000_1111;
end
always
begin
#5le1=1;
oe_n1=0;
#5d1=8'd1111_0000;
#5d1=8'd0000_1111;
#5le1=0;
oe_n1=0;
#5d1=8'd1010_0101;
#5d1=8'd0101_1010;
#5oe_n1=1;
le1=0;
#5d1=8'd1111_1111;
#5oe_n1=1;
le1=0;
#5d1=8'd1000_0001;
#5
d1=8'd0001_1110;
#5oe_n1=1;
le1=1;
#5d1=8'd0011_1100;
#5d1=8'd1100_0011;
end
verilog_74hc573
u1(.LE1(le1),.OE_N1(oe_n1),.D1(d1),.Q1(q1));
endmodule
仿真结果
第四章程序框图和清单
4.1程序框图
123
4.2程序
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineM1
#defineN10
sbitsp=P3^0;
sbitdscs=P2^4;
sbitdsas=P2^5;
sbitdsrw=P2^6;
sbitdsds=P2^7;
sbitduan=P2^0;
sbitwei=P2^1;
sbitk1=P3^4;
sbitk2=P3^5;
sbitk3=P3^6;
sbitk4=P3^7;
voiddelay(uint);
voidinit();
voidkeyscan();
voiddisplay(uchar,uchar,uchar);
voidwrite_ds(uchar,uchar);
voidset_time();
ucharread_ds(uchar);
ucharshi,fen,miao,month,day;
ucharyear,flag,k2_num,i;
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
voiddelay(uintx)
{
uinti,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
voidinit()
{
flag=0;
k2_num=0;
write_ds(0x0a,0x20);
write_ds(0x0b,0x26);
set_time();
}
voiddisplay(ucharsh,ucharfe,ucharmia)
{
ucharsg,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=table[ss];
duan=0;
P0=0xfe;
wei=1;
wei=0;
P0=0x00;
delay(M);
duan=1;
P0=table[sg];
duan=0;
P0=0xfd;
wei=1;
wei=0;
P0=0x00;
delay(M);
duan=1;
P0=table[10];
duan=0;
P0=0xfb;
wei=1;
wei=0;
P0=0x00;
delay(M);
duan=1;
P0=table[fs];
duan=0;
P0=0xf7;
wei=1;
wei=0;
P0=0x00;
delay(M);
duan=1;
P0=table[fg];
duan=0;
P0=0xef;
wei=1;
wei=0;
P0=0x00;
delay(M);
duan=1;
P0=table[10];
duan=0;
P0=0xdf;
wei=1;
wei=0;
P0=0x00;
delay(M);
duan=1;
P0=table[ms];
duan=0;
P0=0xbf;
wei=1;
wei=0;
P0=0x00;
delay(M);
duan=1;
P0=table[mg];
duan=0;
P0=0x7f;
wei=1;
wei=0;
P0=0x00;
delay(M);
}
voidwrite_ds(ucharadd,uchardate)
{
dsas=1;
dsds=1;
dsrw=1;
dscs=0;
P1=add;
dsas=0;
dsrw=0;
P1=date;
dsrw=1;
dsas=1;
dscs=1;
}
ucharread_ds(ucharadd)
{
uchards_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;
returnds_date;
}
voidset_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);
}
voidkeyscan()
{
if(k1==0)
{
uinti;
delay(5);
if(k1==0)
{
flag++;
if(flag>=2)
{
flag=0;
}
for(i=N;i>0;i--)
{
if(flag==0)
{
display(shi,fen,miao);
}
else
{
display(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);
}
else
{
display(year,month,day);
}
}
while(!
k2);
}
}
if(k2_num!
=0)
{
if(flag==0)
{
if(k3==0)
{
delay(5);
if(k3==0)
{
switch(k2_num)
{
case1:
write_ds(0,(miao+1));
break;
case2:
write_ds(2,(fen+1));
break;
case3:
write_ds(4,(shi+1));
break;
}
for(i=N;i>0;i--)
{
if(flag==0)
{
display(shi,fen,miao);
}
else
{
display(year,month,day);
}
}
while(!
k3);
}
}
if(k4==0)
{
delay(5);
if(k4==0)
{
switch(k2_num)
{
case1:
write_ds(0,(miao-1));
break;
case2:
write_ds(2,(fen-1));
break;
case3:
write_ds(4,(shi-1));
break;
}
for(i=N;i>0;i--)
{
if(flag==0)
{
display(shi,fen,miao);
}
else
{
display(year,month,day);
}
}
while(!
k4);
}
}
}
if(flag==1)
{
if(k3==0)
{
delay(5);
if(k3==0)
{
switch(k2_num)
{
case1:
write_ds(7,(day+1));
break;
case2:
write_ds(8,(month+1));
break;
case3:
write_ds(9,(year+1));
break;
}
for(i=N;i>0;i--)
{
if(flag==0)
{
display(shi,fen,miao);
}
else
{
display(year,month,day);
}
}
while(!
k3);
}
}
if(k4==0)
{
delay(5);
if(k4==0)
{
switch(k2_num)
{
case1:
write_ds(7,(day-1));
break;
case2:
write_ds(8,(month-1));
break;
case3:
write_ds(9,(year-1));
break;
}
for(i=N;i>0;i--)
{
if(flag==0)
{
display(shi,fen,miao);
}
else
{
display(year,month,day);
}
}
while(!
k4);
}
}
}
}
}
voidmain()
{
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);
}
else
{
display(year,month,day);
}
}
}
4.3清单
BillOfMaterialsFor数字钟
DesignTitle
:
数字钟
Author
:
Revision
:
DesignCreated
:
2013Äê12ÔÂ22ÈÕ
DesignLastModified
:
2014Äê1ÔÂ7ÈÕ
TotalPartsInDesign
:
11
2 Resistors
Quantity:
References
Value
OrderCode
2
R1,R2
500
3 Capacitors
Quantity:
References
Value
OrderCode
2
C1,C2
22p
1
C3
100u
MaplinVH12N
4 IntegratedCircuits
Quantity:
References
Value
OrderCode
1
U1
AT89C52
2
U2,U3
74HC573
1
U4
DS12887
2 Miscellaneous
Quantity:
References
Value
OrderCode
1
RP1
RESPACK-8
1
X1
CRYSTAL